Skip to content

Commit 2f0e871

Browse files
committed
androidApp: schedule: Initial support for searching sessions
Signed-off-by: Aayush Gupta <[email protected]>
1 parent b6a72a4 commit 2f0e871

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

androidApp/src/main/java/app/opass/ccip/android/ui/screens/event/EventViewModel.kt

+15
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import app.opass.ccip.helpers.PortalHelper
1515
import app.opass.ccip.network.models.eventconfig.EventConfig
1616
import app.opass.ccip.network.models.fastpass.Attendee
1717
import app.opass.ccip.network.models.schedule.Schedule
18+
import app.opass.ccip.network.models.schedule.Session
1819
import dagger.hilt.android.lifecycle.HiltViewModel
1920
import dagger.hilt.android.qualifiers.ApplicationContext
2021
import javax.inject.Inject
@@ -44,6 +45,9 @@ class EventViewModel @Inject constructor(
4445
private val _isRefreshing = MutableStateFlow(false)
4546
val isRefreshing = _isRefreshing.asStateFlow()
4647

48+
private val _searchResult: MutableStateFlow<List<Session>> = MutableStateFlow(emptyList())
49+
val searchResult = _searchResult.asStateFlow()
50+
4751
fun getEventConfig(eventId: String, forceReload: Boolean = false) {
4852
viewModelScope.launch {
4953
try {
@@ -65,13 +69,24 @@ class EventViewModel @Inject constructor(
6569
viewModelScope.launch {
6670
try {
6771
_schedule.value = portalHelper.getSchedule(eventId, forceReload)
72+
_searchResult.value = _schedule.value?.sessions ?: emptyList()
6873
} catch (exception: Exception) {
6974
Log.e(TAG, "Failed to fetch schedules", exception)
7075
_schedule.value = null
7176
}
7277
}
7378
}
7479

80+
fun search(query: String) {
81+
if (query.isNotBlank()) {
82+
_searchResult.value = _schedule.value!!.sessions.filter { session ->
83+
session.title.contains(query, true) || session.speakers.any { it.contains(query, true) }
84+
}
85+
} else {
86+
_searchResult.value = _schedule.value!!.sessions
87+
}
88+
}
89+
7590
private fun getAttendee(eventId: String, forceReload: Boolean = false) {
7691
viewModelScope.launch {
7792
try {

androidApp/src/main/java/app/opass/ccip/android/ui/screens/schedule/ScheduleScreen.kt

+25-7
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,13 @@ import androidx.compose.runtime.getValue
2323
import androidx.compose.runtime.rememberCoroutineScope
2424
import androidx.compose.ui.Modifier
2525
import androidx.compose.ui.platform.LocalContext
26-
import androidx.compose.ui.res.stringResource
2726
import androidx.compose.ui.tooling.preview.Preview
2827
import androidx.compose.ui.util.fastForEachIndexed
2928
import androidx.hilt.navigation.compose.hiltViewModel
3029
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3130
import app.opass.ccip.android.R
31+
import app.opass.ccip.android.ui.composable.SearchAppBarComposable
3232
import app.opass.ccip.android.ui.composable.SessionComposable
33-
import app.opass.ccip.android.ui.composable.TopAppBarComposable
3433
import app.opass.ccip.android.ui.screens.event.EventViewModel
3534
import app.opass.ccip.network.models.schedule.Session
3635
import kotlinx.coroutines.launch
@@ -44,6 +43,7 @@ fun ScheduleScreen(
4443
) {
4544
val context = LocalContext.current
4645
val schedule by viewModel.schedule.collectAsStateWithLifecycle()
46+
val searchResult by viewModel.searchResult.collectAsStateWithLifecycle()
4747

4848
LaunchedEffect(key1 = Unit) { viewModel.getSchedule(eventId) }
4949

@@ -55,8 +55,10 @@ fun ScheduleScreen(
5555
DateUtils.FORMAT_SHOW_DATE
5656
)
5757
} ?: emptyMap(),
58+
searchResult = searchResult,
5859
onNavigateUp = onNavigateUp,
5960
onNavigateToSession = onNavigateToSession,
61+
onSearch = { query -> viewModel.search(query) },
6062
onFormatDateTime = { time ->
6163
DateUtils.formatDateTime(
6264
context,
@@ -70,17 +72,33 @@ fun ScheduleScreen(
7072
@Composable
7173
private fun ScreenContent(
7274
sessions: Map<String, List<Session>> = emptyMap(),
75+
searchResult: List<Session> = emptyList(),
7376
onNavigateUp: () -> Unit = {},
7477
onNavigateToSession: (sessionId: String) -> Unit = {},
75-
onFormatDateTime: (time: String) -> String = { "" }
78+
onFormatDateTime: (time: String) -> String = { "" },
79+
onSearch: (query: String) -> Unit = {},
7680
) {
7781
Scaffold(
7882
modifier = Modifier.fillMaxSize(),
7983
topBar = {
80-
TopAppBarComposable(
81-
title = stringResource(id = R.string.schedule),
82-
onNavigate = onNavigateUp
83-
)
84+
SearchAppBarComposable(
85+
searchHint = R.string.search_session,
86+
isEnabled = sessions.isNotEmpty(),
87+
onSearch = onSearch,
88+
onNavigateUp = onNavigateUp
89+
) {
90+
LazyColumn {
91+
items(items = searchResult, key = { s -> s.id }) { session ->
92+
SessionComposable(
93+
title = session.title,
94+
startTime = onFormatDateTime(session.start),
95+
endTime = onFormatDateTime(session.end),
96+
room = session.room,
97+
onClicked = { onNavigateToSession(session.id) }
98+
)
99+
}
100+
}
101+
}
84102
}
85103
) { paddingValues ->
86104
val tabData = sessions.keys.toList()

androidApp/src/main/res/values/strings.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<!-- EventPreviewScreen -->
1010
<string name="select_event">Select event</string>
11-
<string name="search_event">Search events</string>
11+
<string name="search_event">Search for events</string>
1212

1313
<!-- EventScreen -->
1414
<string name="switch_language">Switch language</string>
@@ -43,6 +43,7 @@
4343
<!-- ScheduleScreen -->
4444
<string name="schedule">Schedule</string>
4545
<string name="na" translatable="false">N/A</string>
46+
<string name="search_session">Search for sessions</string>
4647

4748
<!-- SessionScreen -->
4849
<string name="session">Session</string>

0 commit comments

Comments
 (0)