From 197b3378fe56269f78efc363cc4b4362f1740af6 Mon Sep 17 00:00:00 2001 From: BoD Date: Sat, 28 Mar 2026 13:45:42 +0100 Subject: [PATCH] Wear: fix going to the correct day right away when opening the app, and simplify a bit --- .../wear/ui/main/MainActivity.kt | 23 ++------ .../wear/ui/main/MainViewModel.kt | 55 ++++++------------- 2 files changed, 22 insertions(+), 56 deletions(-) diff --git a/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainActivity.kt b/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainActivity.kt index 9b2e8e2f..a9a33afc 100644 --- a/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainActivity.kt +++ b/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainActivity.kt @@ -138,26 +138,13 @@ fun MainScreen( onSignOutClick: () -> Unit, onSessionClick: (String) -> Unit, ) { - val user: User? by viewModel.user.collectAsStateWithLifecycle() - val days: List? by viewModel.days.collectAsStateWithLifecycle() - val sessionsDay1: List? by viewModel.sessionsDay1.collectAsState(initial = null) - val sessionsDay2: List? by viewModel.sessionsDay2.collectAsState(initial = null) - val pagerState: PagerState = rememberPagerState( - initialPage = 0, - pageCount = { 1 + (days?.size ?: 0) } + initialPage = viewModel.getConferenceDay() + 1, + pageCount = { 3 }, ) - - // Scroll to the current conference day once days are loaded - LaunchedEffect(days) { - val loadedDays = days - if (loadedDays != null && loadedDays.isNotEmpty()) { - val targetPage = viewModel.getConferenceDay(loadedDays) + 1 - if (pagerState.currentPage == 0) { - pagerState.scrollToPage(targetPage) - } - } - } + val user: User? by viewModel.user.collectAsStateWithLifecycle() + val sessionsDay1: List? by viewModel.sessionsDay1.collectAsStateWithLifecycle() + val sessionsDay2: List? by viewModel.sessionsDay2.collectAsStateWithLifecycle() PagerScreen( modifier = Modifier diff --git a/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainViewModel.kt b/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainViewModel.kt index 176000d1..86d8b61c 100644 --- a/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainViewModel.kt +++ b/wearApp/src/main/java/fr/paug/androidmakers/wear/ui/main/MainViewModel.kt @@ -15,7 +15,6 @@ import fr.androidmakers.domain.model.User import fr.androidmakers.domain.repo.BookmarksRepository import fr.androidmakers.domain.repo.SessionsRepository import fr.androidmakers.domain.repo.UserRepository -import fr.androidmakers.domain.utils.formatMediumDate import fr.paug.androidmakers.wear.data.LocalPreferencesRepository import fr.paug.androidmakers.wear.ui.session.UISession import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -27,22 +26,22 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.datetime.DateTimeUnit -import kotlin.time.Clock import kotlinx.datetime.LocalDate import kotlinx.datetime.Month import kotlinx.datetime.TimeZone import kotlinx.datetime.plus import kotlinx.datetime.todayIn +import kotlin.time.Clock private val TAG = MainViewModel::class.java.simpleName @@ -70,8 +69,8 @@ class MainViewModel( // Sync bookmarks when user changes or sync is triggered @OptIn(ExperimentalCoroutinesApi::class) combine(user, bookmarksSyncTrigger) { currentUser, _ -> currentUser } - .flatMapLatest { currentUser -> - flow { emit(maybeSyncBookmarks(currentUser)) } + .mapLatest { currentUser -> + maybeSyncBookmarks(currentUser) } .launchIn(viewModelScope) @@ -126,7 +125,7 @@ class MainViewModel( initialValue = null ) - val sessionsDay1: Flow?> = + val sessionsDay1: StateFlow?> = sessions.map { sessions -> sessions?.filter { it.session.startsAt.date == DAY_1_DATE } } .stateIn( scope = viewModelScope, @@ -134,23 +133,8 @@ class MainViewModel( initialValue = null ) - val sessionsDay2: Flow?> = + val sessionsDay2: StateFlow?> = sessions.map { sessions -> sessions?.filter { it.session.startsAt.date == DAY_2_DATE } } - - - val days: StateFlow?> = - sessions.map { sessions -> - sessions - ?.groupBy { it.session.startsAt.date } - ?.toSortedMap() - ?.map { (date, daySessions) -> - WearDaySchedule( - title = date.formatMediumDate(), - date = date, - sessions = daySessions - ) - } - } .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), @@ -158,14 +142,15 @@ class MainViewModel( ) /** - * Get the day of the conference to display initially, based on the current date. - * Returns the index of the first day that is today or in the future, - * or the last day index if all days are in the past. + * Get the day of the conference, based on the current date. + * If the date is the first day of the conference or earlier, returns 0, otherwise returns 1. */ - fun getConferenceDay(days: List): Int { - val today = Clock.System.todayIn(TimeZone.currentSystemDefault()) - val index = days.indexOfFirst { it.date >= today } - return if (index >= 0) index else days.lastIndex.coerceAtLeast(0) + fun getConferenceDay(): Int { + return if (Clock.System.todayIn(TimeZone.currentSystemDefault()) <= DAY_1_DATE) { + 0 + } else { + 1 + } } fun signOut() { @@ -183,17 +168,11 @@ class MainViewModel( companion object { private const val MESSAGE_SYNC_BOOKMARKS = "syncBookmarks" - val DAY_1_DATE = LocalDate(year = 2026, month = Month.APRIL, day = 9) - val DAY_2_DATE = DAY_1_DATE.plus(1, DateTimeUnit.DAY) + private val DAY_1_DATE = LocalDate(year = 2026, month = Month.APRIL, day = 9) + private val DAY_2_DATE = DAY_1_DATE.plus(1, DateTimeUnit.DAY) } } -data class WearDaySchedule( - val title: String, - val date: LocalDate, - val sessions: List, -) - private fun Agenda.toUISessions(favoriteSessions: Set): List { val speakersById = speakers.associateBy { it.id } val roomsById = rooms.associateBy { it.id }