Skip to content

Commit

Permalink
Small temporary rework on bookmarks (Android)
Browse files Browse the repository at this point in the history
  • Loading branch information
Antoine Robiez committed Mar 7, 2024
1 parent 0311514 commit c1c3951
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import fr.androidmakers.domain.interactor.GetAfterpartyVenueUseCase
import fr.androidmakers.domain.interactor.GetAgendaUseCase
import fr.androidmakers.domain.interactor.GetConferenceVenueUseCase
import fr.androidmakers.domain.interactor.SyncBookmarksUseCase
import fr.androidmakers.domain.repo.BookmarksRepository
import fr.androidmakers.domain.repo.PartnersRepository
import fr.androidmakers.domain.repo.RoomsRepository
import fr.androidmakers.domain.repo.SessionsRepository
Expand Down Expand Up @@ -33,7 +34,7 @@ class AndroidMakersApplication : Application() {
lateinit var sessionsRepository: SessionsRepository
lateinit var speakersRepository: SpeakersRepository

lateinit var bookmarksStore: BookmarksDataStoreRepository
lateinit var bookmarksStore: BookmarksRepository

lateinit var openFeedback: OpenFeedback

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,20 +282,28 @@ class DaySchedule(
val sessions: List<UISession>
)

@Composable
internal fun agendaToDays(agenda: Agenda): List<DaySchedule> {
// TODO move it to a viewmodel
val favoriteSessions by AndroidMakersApplication.instance().bookmarksStore.getFavoriteSessions().collectAsState(emptySet())
return agenda.sessions.values.groupBy { it.startsAt.date }
.entries
.map {
DaySchedule(
title = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(it.key.toJavaLocalDate()),
date = it.key,
sessions = it.value.sortedBy { it.startsAt }.map { it.toUISession(agenda.rooms, agenda.speakers) }
sessions = it.value.sortedBy { it.startsAt }
.map { it.toUISession(agenda.rooms, agenda.speakers, favoriteSessions.contains(it.id)) }
)
}
}


fun Session.toUISession(rooms: Map<String, Room>, speakers: Map<String, Speaker>): UISession {
fun Session.toUISession(
rooms: Map<String, Room>,
speakers: Map<String, Speaker>,
isFavorite: Boolean
): UISession {
return UISession(
id = id,
title = title,
Expand All @@ -306,6 +314,7 @@ fun Session.toUISession(rooms: Map<String, Room>, speakers: Map<String, Speaker>
room = rooms.get(roomId)!!.name,
speakers = this.speakers.mapNotNull { speakers[it]?.toUISpeaker() },
isServiceSession = isServiceSession,
isFavorite = isFavorite
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import androidx.compose.material3.Tab
import androidx.compose.material3.TabRow
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
Expand All @@ -22,7 +24,9 @@ import fr.paug.androidmakers.ui.components.SwipeRefreshableLceLayout
import fr.paug.androidmakers.ui.model.UISession
import fr.paug.androidmakers.util.SessionFilter
import fr.paug.androidmakers.util.TimeUtils
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.util.*


Expand Down Expand Up @@ -82,6 +86,12 @@ fun AgendaPager(
if (items.isEmpty()) {
EmptyLayout()
} else {
// TODO move it in a viewmodel
val favoriteSessions by AndroidMakersApplication.instance().bookmarksStore.getFavoriteSessions()
.collectAsState(emptySet())
items.filter { favoriteSessions.contains(it.id) }.forEach {
it.isFavorite = true
}
AgendaColumn(
sessionsPerStartTime = addSeparators(LocalContext.current, items),
onSessionClicked = onSessionClicked
Expand Down Expand Up @@ -129,7 +139,8 @@ private fun List<UISession>.filter(
for (filter in filterList) {
when (filter.type) {
SessionFilter.FilterType.BOOKMARK -> {
if (AndroidMakersApplication.instance().bookmarksStore.isBookmarked(session.id)) {
val bookmarked = AndroidMakersApplication.instance().bookmarksStore.isBookmarked(session.id)
if (runBlocking { bookmarked.first() }) {
sessionsByFilterType[filter.type]?.add(session)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,18 +103,17 @@ fun AgendaRow(
trailingContent = {
if (!uiSession.isServiceSession) {
Box {
val isBookmarked =
AndroidMakersApplication.instance().bookmarksStore.subscribe(uiSession.id).collectAsState(false)
val imageVector = if (isBookmarked.value) Icons.Rounded.BookmarkRemove
val isBookmarked = uiSession.isFavorite
val imageVector = if (isBookmarked) Icons.Rounded.BookmarkRemove
else Icons.Rounded.BookmarkAdd

val tint by animateColorAsState(
if (isBookmarked.value) AMColor.bookmarked
if (isBookmarked) AMColor.bookmarked
else Color.LightGray
)

IconToggleButton(
checked = isBookmarked.value,
checked = isBookmarked,
onCheckedChange = {
runBlocking {
AndroidMakersApplication.instance().bookmarksStore.setBookmarked(uiSession.id, it)
Expand Down Expand Up @@ -166,5 +165,6 @@ private val fakeUiSession = UISession(
room = "Moebius",
startDate = Instant.parse("2022-04-25T09:00:00+02:00"),
endDate = Instant.parse("2022-04-25T10:00:00+02:00"),
isServiceSession = false
isServiceSession = false,
isFavorite = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class SessionDetailViewModel(
val sessionDetailState = combine(
AndroidMakersApplication.instance().sessionsRepository.getSession(sessionId),
AndroidMakersApplication.instance().roomsRepository.getRoom(roomId),
AndroidMakersApplication.instance().bookmarksStore.subscribe(sessionId),
AndroidMakersApplication.instance().bookmarksStore.isBookmarked(sessionId),
) { session, room, isBookmarked ->

val exception = session.exceptionOrNull() ?: room.exceptionOrNull()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class UISession(
val roomId: String,
val speakers: List<Speaker>,
val isServiceSession: Boolean,
var isFavorite: Boolean,
) {
class Speaker(val name: String)
}
Expand All @@ -23,4 +24,4 @@ class UIVenue(
val coordinates: String?,
val descriptionEn: String,
val descriptionFr: String,
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,13 @@ class BookmarksDataStoreRepository(
save()
}

override fun isBookmarked(id: String): Boolean {
return bookmarkedSessions.contains(id)
override fun isBookmarked(id: String): Flow<Boolean> {
return dataStore.data.map { prefs ->
val set = prefs[stringSetPreferencesKey(PREF_SELECTED_SESSIONS)] ?: emptySet()
set.contains(id)
}
}

override fun subscribe(id: String): Flow<Boolean> =
dataStore.data.map { prefs ->
val sessions = prefs[stringSetPreferencesKey(PREF_SELECTED_SESSIONS)]
sessions?.contains(id) ?: false
}

private suspend fun save() {
dataStore.edit { prefs ->
prefs[stringSetPreferencesKey(PREF_SELECTED_SESSIONS)] = bookmarkedSessions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,5 @@ data class Session(
val startsAt: LocalDateTime,
val endsAt: LocalDateTime,
val roomId: String,
val isServiceSession: Boolean
val isServiceSession: Boolean,
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import kotlinx.coroutines.flow.Flow

interface BookmarksRepository {
suspend fun setBookmarked(sessionId: String, bookmarked: Boolean)
fun isBookmarked(id: String): Boolean

fun subscribe(id: String): Flow<Boolean>
fun isBookmarked(id: String): Flow<Boolean>

suspend fun merge(bookmarks: Set<String>)

Expand Down

0 comments on commit c1c3951

Please sign in to comment.