Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -138,26 +138,13 @@ fun MainScreen(
onSignOutClick: () -> Unit,
onSessionClick: (String) -> Unit,
) {
val user: User? by viewModel.user.collectAsStateWithLifecycle()
val days: List<WearDaySchedule>? by viewModel.days.collectAsStateWithLifecycle()
val sessionsDay1: List<UISession>? by viewModel.sessionsDay1.collectAsState(initial = null)
val sessionsDay2: List<UISession>? 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<UISession>? by viewModel.sessionsDay1.collectAsStateWithLifecycle()
val sessionsDay2: List<UISession>? by viewModel.sessionsDay2.collectAsStateWithLifecycle()

PagerScreen(
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -126,46 +125,32 @@ class MainViewModel(
initialValue = null
)

val sessionsDay1: Flow<List<UISession>?> =
val sessionsDay1: StateFlow<List<UISession>?> =
sessions.map { sessions -> sessions?.filter { it.session.startsAt.date == DAY_1_DATE } }
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = null
)

val sessionsDay2: Flow<List<UISession>?> =
val sessionsDay2: StateFlow<List<UISession>?> =
sessions.map { sessions -> sessions?.filter { it.session.startsAt.date == DAY_2_DATE } }


val days: StateFlow<List<WearDaySchedule>?> =
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),
initialValue = null
)

/**
* 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<WearDaySchedule>): 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() {
Expand All @@ -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<UISession>,
)

private fun Agenda.toUISessions(favoriteSessions: Set<String>): List<UISession> {
val speakersById = speakers.associateBy { it.id }
val roomsById = rooms.associateBy { it.id }
Expand Down
Loading