Skip to content
This repository has been archived by the owner on Mar 18, 2024. It is now read-only.

Commit

Permalink
Change history navigation
Browse files Browse the repository at this point in the history
  • Loading branch information
AnkitSuda committed Nov 21, 2022
1 parent 231a5a6 commit 6c3f7b4
Show file tree
Hide file tree
Showing 10 changed files with 377 additions and 188 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.ankitsuda.base.utils.generateId
import com.ankitsuda.rebound.domain.LogSetType
import com.ankitsuda.rebound.domain.entities.*
import kotlinx.coroutines.flow.Flow
import java.time.LocalDate
import java.time.LocalDateTime

@Dao
Expand Down Expand Up @@ -150,6 +151,14 @@ interface WorkoutsDao {
@Query("SELECT COUNT(*) as count, start_at as date FROM workouts WHERE date(start_at / 1000,'unixepoch') >= date(:dateStart / 1000,'unixepoch') AND date(start_at / 1000,'unixepoch') <= date(:dateEnd / 1000,'unixepoch') AND is_hidden = 0 AND in_progress = 0 GROUP BY start_at")
fun getWorkoutsCountOnDateRange(dateStart: Long, dateEnd: Long): Flow<List<CountWithDate>>

@Query("""
SELECT SUM(count) FROM (SELECT COUNT(*) as count FROM workouts WHERE
date(start_at / 1000,'unixepoch') >= date(:dateStart / 1000,'unixepoch') AND
date(start_at / 1000,'unixepoch') <= date(:dateEnd / 1000,'unixepoch')
AND is_hidden = 0 AND in_progress = 0 GROUP BY start_at)
""")
fun getWorkoutsCountOnMonthOnDateRangeAlt(dateStart: Long, dateEnd: Long): Flow<Long>

@Query("""
SELECT SUM(count) FROM (SELECT COUNT(*) as count FROM workouts WHERE
date(start_at / 10000,'unixepoch') >= date(:date / 10000,'unixepoch') AND
Expand Down Expand Up @@ -198,6 +207,17 @@ AND is_hidden = 0 AND in_progress = 0 GROUP BY start_at)
@Query("UPDATE exercise_workout_junctions SET superset_id = :supersetId WHERE id = :junctionId")
suspend fun updateExerciseWorkoutJunctionSupersetId(junctionId: String, supersetId: Int?)

@Query(
"""
SELECT * FROM workouts w
WHERE
date(start_at / 1000,'unixepoch') >= date(:dateStart / 1000,'unixepoch') AND date(start_at / 1000,'unixepoch') <= date(:dateEnd / 1000,'unixepoch')
AND w.is_hidden = 0 AND w.in_progress = 0
ORDER BY w.completed_at DESC
"""
)
fun getWorkoutsWithExtraInfoAltPaged(dateStart: Long, dateEnd: Long): PagingSource<Int, WorkoutWithExtraInfoAlt>

@Query(
"""
SELECT * FROM workouts w
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,19 @@ class WorkoutsRepository @Inject constructor(

// fun getWorkoutsWithExtraInfoAlt() = workoutsDao.getWorkoutsWithExtraInfoAlt()

fun getWorkoutsWithExtraInfoPaged() =
fun getWorkoutsWithExtraInfoPaged(
dateStart: LocalDate? = null,
dateEnd: LocalDate? = null
) =
Pager(PagingConfig(pageSize = 15)) {
workoutsDao.getWorkoutsWithExtraInfoAltPaged()
if (dateStart != null && dateEnd != null) {
workoutsDao.getWorkoutsWithExtraInfoAltPaged(
dateStart.toEpochMillis(),
dateEnd.toEpochMillis()
)
} else {
workoutsDao.getWorkoutsWithExtraInfoAltPaged()
}
}
.flow.map {
it.map { item ->
Expand All @@ -293,7 +303,7 @@ class WorkoutsRepository @Inject constructor(
}

fun getWorkoutsWithExtraInfo() =
workoutsDao.getWorkoutsWithExtraInfoAlt()
workoutsDao.getWorkoutsWithExtraInfoAlt()
.map {
it.map { item ->
val logEntries = item.junctions?.flatMap { j -> j.logEntries }
Expand All @@ -312,6 +322,12 @@ class WorkoutsRepository @Inject constructor(
dateEnd = dateEnd.toEpochMillis()
)

fun getWorkoutsCountOnMonthOnDateRangeAlt(dateStart: LocalDate, dateEnd: LocalDate) =
workoutsDao.getWorkoutsCountOnMonthOnDateRangeAlt(
dateStart = dateStart.toEpochMillis(),
dateEnd = dateEnd.toEpochMillis()
)

fun getWorkoutsCountOnMonth(date: Long) =
workoutsDao.getWorkoutsCountOnMonth(
date = date
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@ import com.ankitsuda.base.utils.toEpochMillis
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
import com.google.accompanist.navigation.material.bottomSheet
import java.time.LocalDate
import java.time.Year
import java.util.*

const val DATE_KEY = "date"
const val DAY_KEY = "day"
const val MONTH_KEY = "month"
const val YEAR_KEY = "year"
const val SELECTED_DATE_KEY = "selected_date"
const val WORKOUT_ID_KEY = "workout_id"
const val EXERCISE_ID_KEY = "exercise_id"
Expand Down Expand Up @@ -107,20 +111,44 @@ sealed class LeafScreen(
) : LeafScreen(route = route, root = root)

data class History(
override val route: String = "history?$DATE_KEY={$DATE_KEY}",
override val route: String = "history?$DAY_KEY={$DAY_KEY}&$MONTH_KEY={$MONTH_KEY}&$YEAR_KEY={${YEAR_KEY}}",
override val root: TabRootScreen = TabRootScreen.HistoryTab
) :
LeafScreen(
route = route,
root = root,
arguments = listOf(
navArgument(DATE_KEY) {
nullable = true
type = NavType.StringType
navArgument(DAY_KEY) {
type = NavType.IntType
nullable = false
defaultValue = -1
},
navArgument(MONTH_KEY) {
type = NavType.IntType
nullable = false
defaultValue = -1
},
navArgument(YEAR_KEY) {
type = NavType.IntType
nullable = false
defaultValue = -1
}
)) {
fun createRoute(date: Date, root: TabRootScreen = TabRootScreen.HistoryTab) =
"${root.route}/history?$DATE_KEY=${date.time}"
companion object {
fun createRoute(
day: Int,
month: Int,
year: Int,
root: TabRootScreen = TabRootScreen.HistoryTab
) =
"${root.route}/history?$DAY_KEY=$day&$MONTH_KEY=$month&$YEAR_KEY=$year"

fun createRoute(month: Int, year: Int, root: TabRootScreen = TabRootScreen.HistoryTab) =
"${root.route}/history?$DAY_KEY=-1&$MONTH_KEY=$month&$YEAR_KEY=$year"

fun createRoute(year: Int, root: TabRootScreen = TabRootScreen.HistoryTab) =
"${root.route}/history?$DAY_KEY=-1&$MONTH_KEY=-1&$YEAR_KEY=$year"
}
}

data class Workout(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,36 @@ package com.ankitsuda.rebound.ui.calendar
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Close
import androidx.compose.material.icons.outlined.ArrowBack
import androidx.compose.material.icons.outlined.Today
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.ankitsuda.base.utils.toEpochMillis
import com.ankitsuda.base.utils.generateId
import com.ankitsuda.base.utils.toLocalDate
import com.ankitsuda.navigation.DATE_KEY
import com.ankitsuda.navigation.SELECTED_DATE_KEY
import com.ankitsuda.navigation.*
import com.ankitsuda.rebound.ui.calendar.components.CalendarMonthItem
import com.ankitsuda.rebound.ui.calendar.components.CalendarYearHeader
import com.ankitsuda.rebound.ui.components.TopBar
import com.ankitsuda.rebound.ui.components.TopBarIconButton
import kotlinx.coroutines.launch
import me.onebone.toolbar.CollapsingToolbarScaffold
import me.onebone.toolbar.ScrollStrategy
import me.onebone.toolbar.rememberCollapsingToolbarScaffoldState
import java.time.LocalDate
import java.time.Month
import java.time.Year

@Composable
fun CalendarScreen(
navController: NavController,
navigator: Navigator = LocalNavigator.current,
viewModel: CalendarScreenViewModel = hiltViewModel()
) {
val selectedDate =
Expand Down Expand Up @@ -86,8 +89,8 @@ fun CalendarScreen(
strictLeftIconAlignToStart = true,
leftIconBtn = {
TopBarIconButton(
icon = Icons.Outlined.Close,
title = stringResource(id = R.string.close_calendar)
icon = Icons.Outlined.ArrowBack,
title = stringResource(id = R.string.back)
) {
navController.popBackStack()
}
Expand All @@ -112,20 +115,45 @@ fun CalendarScreen(
.fillMaxSize()
.background(MaterialTheme.colors.background)
) {
items(calendar, key = { "${it.month}_${it.year}" }) {
val month = it
CalendarMonthItem(
month = month,
selectedDate = selectedDate,
countsWithDate = countsWithDate ?: emptyList(),
onClickOnDay = { dateItem ->
navController.previousBackStackEntry?.savedStateHandle?.set(
DATE_KEY,
dateItem.date.toEpochMillis()

for (item in calendar) {
if (item.month == Month.JANUARY.value) {
item(key = "year_header_${item.year}") {
CalendarYearHeader(
year = Year.of(item.year),
onClick = {
navigator.navigate(
LeafScreen.History.createRoute(
year = item.year,
)
)
}
)
navController.popBackStack()
})
}
}
item(key = "month_block_${item.month}_${item.year}") {
CalendarMonthItem(
month = item,
selectedDate = selectedDate,
countsWithDate = countsWithDate ?: emptyList(),
onClickOnMonth = { monthItem ->
navigator.navigate(
LeafScreen.History.createRoute(
month = monthItem.month,
year = monthItem.year,
)
)
},
onClickOnDay = { dateItem ->
navigator.navigate(
LeafScreen.History.createRoute(
day = dateItem.day,
month = dateItem.date.monthValue,
year = dateItem.date.year,
)
)
}
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,6 @@ class CalendarScreenViewModel @Inject constructor(
private val workoutsRepository: WorkoutsRepository,
private val prefs: PrefStorage
) : ViewModel() {
// private var _calendar: SnapshotStateList<CalendarMonth> = mutableStateListOf()
// val calendar = _calendar

private var _calendar = MutableStateFlow<List<CalendarMonth>?>(null)
val calendar = _calendar.asStateFlow()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.ankitsuda.base.util.*
import com.ankitsuda.base.utils.extensions.toArrayList
import com.ankitsuda.base.utils.generateId
import com.ankitsuda.base.utils.toLocalDate
import com.ankitsuda.common.compose.LocalAppSettings
import com.ankitsuda.rebound.domain.entities.CountWithDate
Expand All @@ -49,6 +50,7 @@ import java.util.*
import com.ankitsuda.common.compose.R
import com.ankitsuda.rebound.ui.theme.ReboundTheme
import java.time.DayOfWeek
import java.time.Year
import java.time.format.TextStyle
import java.time.temporal.WeekFields

Expand All @@ -59,7 +61,8 @@ fun CalendarMonthItem(
month: CalendarMonth,
countsWithDate: List<CountWithDate>,
selectedDate: LocalDate,
onClickOnDay: (CalendarDay) -> Unit
onClickOnDay: (CalendarDay) -> Unit,
onClickOnMonth: (CalendarMonth) -> Unit
) {
val firstDayOfWeek = LocalAppSettings.current.firstDayOfWeek

Expand Down Expand Up @@ -88,7 +91,12 @@ fun CalendarMonthItem(
.fillMaxWidth()
.padding(start = 8.dp, end = 8.dp)
) {
CalendarMonthHeader(month.yearMonth.format(monthFormatter))
CalendarMonthHeader(
text = month.yearMonth.format(monthFormatter),
onClick = {
onClickOnMonth(month)
}
)

Row(modifier = Modifier.fillMaxWidth()) {
for (name in dayNames) {
Expand All @@ -97,7 +105,7 @@ fun CalendarMonthItem(
}

for (week in month.weekDays) {
key(week) {
key("${month.yearMonth}_week_${month.weekDays.indexOf(week)}") {
Row(
modifier = Modifier
.defaultMinSize(256.dp)
Expand All @@ -112,7 +120,7 @@ fun CalendarMonthItem(
val formattedDay = day.date.format(dayFormatter)


key("${day.date.dayOfMonth}_${day.date.month}_${day.date.year}") {
key("${day.date.dayOfMonth}_${day.date.month.value}_${day.date.year}") {
CalendarDayItem(
text = formattedDay,
modifier = Modifier.weight(
Expand All @@ -139,7 +147,7 @@ fun CalendarMonthItem(
}

@Composable
fun ColumnScope.CalendarMonthHeader(text: String) {
fun ColumnScope.CalendarMonthHeader(text: String, onClick: () -> Unit) {
Text(
text = text,
style = MaterialTheme.typography.body1,
Expand All @@ -148,11 +156,27 @@ fun ColumnScope.CalendarMonthHeader(text: String) {
color = LocalThemeState.current.onBackgroundColor,
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = onClick)
.padding(20.dp)
.align(Alignment.CenterHorizontally)
)
}

@Composable
fun CalendarYearHeader(year: Year, onClick: () -> Unit) {
Text(
text = year.toString(),
style = MaterialTheme.typography.body1,
textAlign = TextAlign.Center,
fontSize = 20.sp,
color = LocalThemeState.current.onBackgroundColor,
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = onClick)
.padding(20.dp)
)
}

@Composable
fun RowScope.CalendarDayNameItem(text: String) {
Text(
Expand Down
Loading

0 comments on commit 6c3f7b4

Please sign in to comment.