From f56487e0cc5e28a8b5657b20099bb969b3aaf260 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Tue, 11 Jul 2023 09:00:26 +0900 Subject: [PATCH 01/27] Move to BookMarkScreen --- .../droidkaigi/confsched2023/KaigiApp.kt | 4 ++++ .../testing/robot/TimetableScreenRobot.kt | 1 + .../confsched2023/sessions/BookMarkScreen.kt | 19 +++++++++++++++++++ .../sessions/TimetableItemDetailScreen.kt | 3 +++ .../confsched2023/sessions/TimetableScreen.kt | 7 ++++++- .../sessions/component/TimetableTopArea.kt | 15 +++++++++++++++ 6 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt diff --git a/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt b/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt index 4c406a8e2..23a18158a 100644 --- a/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt +++ b/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt @@ -27,6 +27,7 @@ import io.github.droidkaigi.confsched2023.main.MainScreenTab.Timetable import io.github.droidkaigi.confsched2023.main.mainScreen import io.github.droidkaigi.confsched2023.main.mainScreenRoute import io.github.droidkaigi.confsched2023.sessions.navigateTimetableScreen +import io.github.droidkaigi.confsched2023.sessions.navigateToBookMarkScreen import io.github.droidkaigi.confsched2023.sessions.navigateToTimetableItemDetailScreen import io.github.droidkaigi.confsched2023.sessions.nestedSessionScreens import io.github.droidkaigi.confsched2023.sessions.sessionScreens @@ -76,6 +77,9 @@ private fun NavGraphBuilder.mainScreen(navController: NavHostController) { timetableitem.id, ) }, + onClickBookMarkIcon = { + navController.navigateToBookMarkScreen() + } ) composable(contributorsScreenRoute) { ContributorsScreen(hiltViewModel()) diff --git a/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt b/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt index 8cf0b800a..942fba7f3 100644 --- a/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt +++ b/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt @@ -37,6 +37,7 @@ class TimetableScreenRobot @Inject constructor( KaigiTheme { TimetableScreen( onTimetableItemClick = { }, + onClickBookMarkIcon = { }, ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt new file mode 100644 index 000000000..f5b4577fc --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -0,0 +1,19 @@ +package io.github.droidkaigi.confsched2023.sessions + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavController + +const val bookMarkScreenRoute = "bookMark" + +fun NavController.navigateToBookMarkScreen() { + navigate(bookMarkScreenRoute) +} + +@Composable +fun BookMarkScreen( + modifier: Modifier = Modifier, +) { + Text("ブックマーク画面") +} \ No newline at end of file diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt index 99eefd92a..476fef191 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt @@ -27,6 +27,9 @@ fun NavGraphBuilder.sessionScreens(onNavigationIconClick: () -> Unit) { onNavigationIconClick = onNavigationIconClick, ) } + composable(bookMarkScreenRoute) { + BookMarkScreen() + } } fun NavController.navigateToTimetableItemDetailScreen( diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt index 44304909a..c0b97ea55 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt @@ -30,10 +30,12 @@ import kotlin.math.roundToInt const val timetableScreenRoute = "timetable" fun NavGraphBuilder.nestedSessionScreens( onTimetableItemClick: (TimetableItem) -> Unit, + onClickBookMarkIcon: () -> Unit, ) { composable(timetableScreenRoute) { TimetableScreen( onTimetableItemClick = onTimetableItemClick, + onClickBookMarkIcon = onClickBookMarkIcon, ) } } @@ -47,6 +49,7 @@ const val TimetableScreenTestTag = "TimetableScreen" @Composable fun TimetableScreen( onTimetableItemClick: (TimetableItem) -> Unit, + onClickBookMarkIcon: () -> Unit, viewModel: TimetableScreenViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsState() @@ -61,6 +64,7 @@ fun TimetableScreen( snackbarHostState = snackbarHostState, onTimetableItemClick = onTimetableItemClick, onBookmarkClick = viewModel::onBookmarkClick, + onClickBookMarkIcon = onClickBookMarkIcon, onTimetableUiChangeClick = viewModel::onUiTypeChange, ) } @@ -75,6 +79,7 @@ private fun TimetableScreen( snackbarHostState: SnackbarHostState, onTimetableItemClick: (TimetableItem) -> Unit, onBookmarkClick: (TimetableItem) -> Unit, + onClickBookMarkIcon: () -> Unit, onTimetableUiChangeClick: () -> Unit, ) { val state = rememberTimetableScreenScrollState() @@ -89,7 +94,7 @@ private fun TimetableScreen( ) }, topBar = { - TimetableTopArea(state, onTimetableUiChangeClick) + TimetableTopArea(state, onTimetableUiChangeClick, onClickBookMarkIcon) }, containerColor = MaterialTheme.colorScheme.surfaceVariant, contentWindowInsets = WindowInsets(0.dp), diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt index 7b3ccbd43..897ad3ffd 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt @@ -6,7 +6,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AccountBox +import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.DateRange +import androidx.compose.material.icons.filled.Favorite import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -22,12 +25,14 @@ import androidx.compose.ui.unit.dp import io.github.droidkaigi.confsched2023.sessions.strings.SessionsStrings.Timetable const val TimetableUiTypeChangeButtonTestTag = "TimetableUiTypeChangeButton" +const val BookMarkIconTestTag = "BookMarkIconTestTag" @Composable @OptIn(ExperimentalMaterial3Api::class) fun TimetableTopArea( state: TimetableScreenScrollState, onTimetableUiChangeClick: () -> Unit, + onClickTopAreaBookMarkIcon: () -> Unit, modifier: Modifier = Modifier, ) { Column(modifier = modifier) { @@ -46,6 +51,16 @@ fun TimetableTopArea( contentDescription = Timetable.asString(), ) } + + IconButton( + modifier = Modifier.testTag(BookMarkIconTestTag), + onClick = { onClickTopAreaBookMarkIcon() }, + ) { + Icon( + imageVector = Icons.Default.Favorite, + contentDescription = Timetable.asString(), + ) + } }, colors = TopAppBarDefaults.largeTopAppBarColors( containerColor = MaterialTheme.colorScheme.surfaceVariant, From 86d24dd9a7b3f9066949ea19b90675f443b68660 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Tue, 11 Jul 2023 23:22:14 +0900 Subject: [PATCH 02/27] Fix lint error --- .../main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt | 2 +- .../github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt | 2 +- .../confsched2023/sessions/component/TimetableTopArea.kt | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt b/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt index 23a18158a..6124b316a 100644 --- a/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt +++ b/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt @@ -79,7 +79,7 @@ private fun NavGraphBuilder.mainScreen(navController: NavHostController) { }, onClickBookMarkIcon = { navController.navigateToBookMarkScreen() - } + }, ) composable(contributorsScreenRoute) { ContributorsScreen(hiltViewModel()) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index f5b4577fc..f6a602f2c 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -16,4 +16,4 @@ fun BookMarkScreen( modifier: Modifier = Modifier, ) { Text("ブックマーク画面") -} \ No newline at end of file +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt index 897ad3ffd..c89770988 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt @@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.AccountBox -import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.DateRange import androidx.compose.material.icons.filled.Favorite import androidx.compose.material3.ExperimentalMaterial3Api From c290a0ae4d121545cec397f55cc8fedae63d2823 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Tue, 11 Jul 2023 23:22:58 +0900 Subject: [PATCH 03/27] Fix the name of testTag --- .../confsched2023/sessions/component/TimetableTopArea.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt index c89770988..f82516339 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.unit.dp import io.github.droidkaigi.confsched2023.sessions.strings.SessionsStrings.Timetable const val TimetableUiTypeChangeButtonTestTag = "TimetableUiTypeChangeButton" -const val BookMarkIconTestTag = "BookMarkIconTestTag" +const val TimetableBookmarkIconTestTag = "TimetableBookmarkIconTestTag" @Composable @OptIn(ExperimentalMaterial3Api::class) @@ -51,7 +51,7 @@ fun TimetableTopArea( } IconButton( - modifier = Modifier.testTag(BookMarkIconTestTag), + modifier = Modifier.testTag(TimetableBookmarkIconTestTag), onClick = { onClickTopAreaBookMarkIcon() }, ) { Icon( From 7e04ea3ace7fb9728323a999b4721c6f4f3d1dff Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Tue, 11 Jul 2023 23:51:30 +0900 Subject: [PATCH 04/27] Add BookMarkScreenViewModel --- .../confsched2023/sessions/BookMarkScreen.kt | 24 ++++++++++-- .../sessions/BookMarkScreenViewModel.kt | 39 +++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index f6a602f2c..a81854df6 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -2,8 +2,11 @@ package io.github.droidkaigi.confsched2023.sessions import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController +import io.github.droidkaigi.confsched2023.model.Timetable const val bookMarkScreenRoute = "bookMark" @@ -11,9 +14,24 @@ fun NavController.navigateToBookMarkScreen() { navigate(bookMarkScreenRoute) } +data class BookMarkScreenUiState( + val bookMarkedTimeTable: Timetable +) + @Composable fun BookMarkScreen( - modifier: Modifier = Modifier, + viewModel: BookMarkScreenViewModel = hiltViewModel(), +) { + val uiState by viewModel.uiState.collectAsState() + + BookMarkScreen( + uiState = uiState + ) +} + +@Composable +private fun BookMarkScreen( + uiState: BookMarkScreenUiState, ) { - Text("ブックマーク画面") + Text("BookMark画面") } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt new file mode 100644 index 000000000..8791ec13a --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -0,0 +1,39 @@ +package io.github.droidkaigi.confsched2023.sessions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import io.github.droidkaigi.confsched2023.designsystem.strings.AppStrings +import io.github.droidkaigi.confsched2023.model.Filters +import io.github.droidkaigi.confsched2023.model.SessionsRepository +import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.ui.UserMessageStateHolder +import io.github.droidkaigi.confsched2023.ui.buildUiState +import io.github.droidkaigi.confsched2023.ui.handleErrorAndRetry +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.stateIn +import javax.inject.Inject + +@HiltViewModel +class BookMarkScreenViewModel @Inject constructor( + sessionsRepository: SessionsRepository, + userMessageStateHolder: UserMessageStateHolder, +) : ViewModel() { + + private val sessionsStateFlow: StateFlow = sessionsRepository + .getTimetableStream() + .handleErrorAndRetry( + AppStrings.Retry, + userMessageStateHolder, + ) + .stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = Timetable(), + ) + + val uiState: StateFlow = buildUiState(sessionsStateFlow) { + BookMarkScreenUiState(it.filtered(Filters(filterFavorite = true))) + } +} \ No newline at end of file From 43886bb83913d9b117d77f47d52f4f6a0023f261 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Tue, 11 Jul 2023 23:55:14 +0900 Subject: [PATCH 05/27] Fix lint error --- .../confsched2023/sessions/BookMarkScreenViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index 8791ec13a..a4011ac88 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -36,4 +36,4 @@ class BookMarkScreenViewModel @Inject constructor( val uiState: StateFlow = buildUiState(sessionsStateFlow) { BookMarkScreenUiState(it.filtered(Filters(filterFavorite = true))) } -} \ No newline at end of file +} From 68c1400de23c3c4de5ae8c04fe8a7bf06ba72f12 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Wed, 12 Jul 2023 00:04:02 +0900 Subject: [PATCH 06/27] Use sealed interface for UiState --- .../confsched2023/sessions/BookMarkScreen.kt | 33 ++++++++++++++++--- .../sessions/BookMarkScreenViewModel.kt | 7 +++- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index a81854df6..a3d654cb6 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -1,12 +1,18 @@ package io.github.droidkaigi.confsched2023.sessions +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.Empty +import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBookMark const val bookMarkScreenRoute = "bookMark" @@ -14,9 +20,13 @@ fun NavController.navigateToBookMarkScreen() { navigate(bookMarkScreenRoute) } -data class BookMarkScreenUiState( - val bookMarkedTimeTable: Timetable -) +sealed interface BookMarkScreenUiState { + object Empty : BookMarkScreenUiState + + data class ListBookMark( + val bookMarkedTimeline: Timetable, + ) : BookMarkScreenUiState +} @Composable fun BookMarkScreen( @@ -25,7 +35,7 @@ fun BookMarkScreen( val uiState by viewModel.uiState.collectAsState() BookMarkScreen( - uiState = uiState + uiState = uiState, ) } @@ -33,5 +43,18 @@ fun BookMarkScreen( private fun BookMarkScreen( uiState: BookMarkScreenUiState, ) { - Text("BookMark画面") + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.fillMaxSize(), + ) { + when (uiState) { + is Empty -> { + Text("Empty") + } + + is ListBookMark -> { + Text("ListBookMark") + } + } + } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index a4011ac88..ad775a828 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -34,6 +34,11 @@ class BookMarkScreenViewModel @Inject constructor( ) val uiState: StateFlow = buildUiState(sessionsStateFlow) { - BookMarkScreenUiState(it.filtered(Filters(filterFavorite = true))) + val bookMarkedTimetable = it.filtered(Filters(filterFavorite = true)) + if (bookMarkedTimetable.isEmpty()) { + BookMarkScreenUiState.Empty + } else { + BookMarkScreenUiState.ListBookMark(bookMarkedTimetable) + } } } From d275816eb47965262beabb28f48220c40b49b3d4 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Thu, 13 Jul 2023 00:53:10 +0900 Subject: [PATCH 07/27] Add Empty BookMarkScreen --- feature/sessions/build.gradle.kts | 1 + .../confsched2023/sessions/BookMarkScreen.kt | 41 ++++---- .../sessions/component/BookMarkTopArea.kt | 58 +++++++++++ .../sessions/section/BookMarkSheet.kt | 96 +++++++++++++++++++ gradle/libs.versions.toml | 2 +- 5 files changed, 178 insertions(+), 20 deletions(-) create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt diff --git a/feature/sessions/build.gradle.kts b/feature/sessions/build.gradle.kts index 37a8a09f7..02101d491 100644 --- a/feature/sessions/build.gradle.kts +++ b/feature/sessions/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation(libs.androidxLifecycleLifecycleRuntimeKtx) implementation(libs.androidxActivityActivityCompose) implementation(libs.composeCoil) + implementation(libs.composeConstraintLayout) androidTestImplementation(libs.composeUiTestJunit4) debugImplementation(libs.composeUiTooling) debugImplementation(libs.composeUiTestManifest) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index a3d654cb6..d3b6104cd 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -1,18 +1,20 @@ package io.github.droidkaigi.confsched2023.sessions -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Text +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import io.github.droidkaigi.confsched2023.model.Timetable -import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.Empty -import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBookMark +import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea +import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet const val bookMarkScreenRoute = "bookMark" @@ -39,22 +41,23 @@ fun BookMarkScreen( ) } +const val BookScreenTestTag = "TimetableScreenTestTag" + @Composable private fun BookMarkScreen( uiState: BookMarkScreenUiState, ) { - Box( - contentAlignment = Alignment.Center, - modifier = Modifier.fillMaxSize(), - ) { - when (uiState) { - is Empty -> { - Text("Empty") - } - - is ListBookMark -> { - Text("ListBookMark") - } - } + Scaffold( + modifier = Modifier.testTag(BookScreenTestTag), + topBar = { + BookMarkTopArea() + }, + containerColor = MaterialTheme.colorScheme.surface, + contentWindowInsets = WindowInsets(0.dp), + ) { padding -> + BookMarkSheet( + modifier = Modifier.padding(padding), + uiState = uiState, + ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt new file mode 100644 index 000000000..5724b591d --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt @@ -0,0 +1,58 @@ +package io.github.droidkaigi.confsched2023.sessions.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun BookMarkTopArea( + modifier: Modifier = Modifier, +) { + TopAppBar( + navigationIcon = { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .height(64.dp) + .width(48.dp), + ) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = null, + modifier = Modifier.size(24.dp), + ) + } + }, + title = { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.height(64.dp), + ) { + Text( + text = "Bookmark", + fontSize = 22.sp, + ) + } + }, + colors = TopAppBarDefaults.largeTopAppBarColors( + containerColor = MaterialTheme.colorScheme.surfaceVariant, + ), + ) +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt new file mode 100644 index 000000000..f33053066 --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -0,0 +1,96 @@ +package io.github.droidkaigi.confsched2023.sessions.section + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.constraintlayout.compose.ConstraintLayout +import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState +import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.Empty +import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBookMark + +@Composable +fun BookMarkSheet( + uiState: BookMarkScreenUiState, + modifier: Modifier = Modifier, +) { + Box( + contentAlignment = Alignment.Center, + modifier = modifier.fillMaxSize(), + ) { + when (uiState) { + is Empty -> { + EmptyView() + } + + is ListBookMark -> { + Text("ListBookMark") + } + } + } +} + +@Composable +private fun EmptyView() { + ConstraintLayout { + val (emptyText, icon) = createRefs() + Box( + modifier = Modifier + .size(84.dp) + .background( + color = MaterialTheme.colorScheme.secondaryContainer, + shape = RoundedCornerShape(24.dp), + ) + .constrainAs(icon) { + start.linkTo(parent.start) + end.linkTo(parent.end) + bottom.linkTo(emptyText.top, margin = 24.dp) + }, + contentAlignment = Alignment.Center, + ) { + Icon( + imageVector = Icons.Default.Favorite, + contentDescription = null, + ) + } + Column( + modifier = Modifier.constrainAs(emptyText) { + start.linkTo(parent.start) + end.linkTo(parent.end) + top.linkTo(parent.top) + bottom.linkTo(parent.bottom) + }, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Text( + text = "登録されたセッションがありません", + fontSize = 16.sp, + fontWeight = FontWeight(500), + lineHeight = 24.sp, + ) + Spacer(modifier = Modifier.size(8.dp)) + Text( + text = "気になるセッションをブックマークに追加して\n集めてみましょう!", + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.25.sp, + textAlign = TextAlign.Center, + ) + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 409dc7711..d9798fa06 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,7 +50,7 @@ composeUiTestManifest = { module = "androidx.compose.ui:ui-test-manifest", versi composeHiltNavigtation = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "composeHiltNavigatiaon" } composeLintCheck = { module = "com.slack.lint.compose:compose-lint-checks", version = "1.2.0" } composeCoil = { module = "io.coil-kt:coil-compose", version = "2.4.0" } - +composeConstraintLayout = { module = "androidx.constraintlayout:constraintlayout-compose", version = "1.0.1" } accompanistSystemUiController = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" } daggerHiltAndroid = { module = "com.google.dagger:hilt-android", version.ref = "dagger" } From 7657705fe5b472a666539a8d87d8524c165cc663 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Thu, 13 Jul 2023 09:34:27 +0900 Subject: [PATCH 08/27] Add List BookMarkScreen Roughly --- .../sessions/BookMarkScreenViewModel.kt | 2 +- .../sessions/section/BookMarkList.kt | 91 +++++++++++++++++++ .../sessions/section/BookMarkSheet.kt | 6 +- 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index ad775a828..ee5a5b2b1 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -34,7 +34,7 @@ class BookMarkScreenViewModel @Inject constructor( ) val uiState: StateFlow = buildUiState(sessionsStateFlow) { - val bookMarkedTimetable = it.filtered(Filters(filterFavorite = true)) + val bookMarkedTimetable = it.filtered(Filters(filterFavorite = false)) if (bookMarkedTimetable.isEmpty()) { BookMarkScreenUiState.Empty } else { diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt new file mode 100644 index 000000000..1c4b850e9 --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt @@ -0,0 +1,91 @@ +package io.github.droidkaigi.confsched2023.sessions.section + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Divider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage +import io.github.droidkaigi.confsched2023.model.Timetable + +@Composable +fun BookMarkList( + timetable: Timetable, + modifier: Modifier = Modifier, +) { + LazyColumn(modifier) { + items(timetable.timetableItems.timetableItems.sortedBy { it.day }) { timetableItem -> + Row(modifier = Modifier.padding(top = 10.dp)) { + Box(modifier = Modifier.size(42.dp)) + Column { + Row( + modifier = Modifier, + ) { + AssistChip( + onClick = { /*Do Nothing*/ }, + label = { Text(timetableItem.room.name.currentLangTitle) }, + ) + Spacer(modifier = Modifier.size(5.dp)) + AssistChip( + onClick = { /*Do Nothing*/ }, + label = { Text(timetableItem.day?.name.orEmpty()) }, + ) + } + Spacer(modifier = Modifier.size(5.dp)) + Text( + text = timetableItem.title.currentLangTitle, + fontSize = 22.sp, + lineHeight = 28.sp, + ) + Spacer(modifier = Modifier.size(8.dp)) + Column { + timetableItem.speakers.forEachIndexed { index, speaker -> + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + AsyncImage( + model = speaker.iconUrl, + contentDescription = null, + modifier = Modifier + .size(40.dp) + .clip(RoundedCornerShape(12.dp)) + .border(BorderStroke(1.dp, Color.Black)), + ) + Spacer(modifier = Modifier.size(10.dp)) + Text( + text = speaker.name, + fontSize = 14.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface, + ) + } + if (timetableItem.speakers.lastIndex != index) { + Spacer(modifier = Modifier.size(8.dp)) + } + } + } + Spacer(modifier = Modifier.size(15.dp)) + Divider() + } + } + } + } +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index f33053066..e9baa5cc2 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons @@ -39,7 +40,10 @@ fun BookMarkSheet( } is ListBookMark -> { - Text("ListBookMark") + BookMarkList( + timetable = uiState.bookMarkedTimeline, + modifier = Modifier.padding(start = 16.dp), + ) } } } From 24978d853797cfb3d008ca9013249d0d77c0c97d Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Sun, 16 Jul 2023 17:47:05 +0900 Subject: [PATCH 09/27] Add Filter Feature --- feature/sessions/build.gradle.kts | 1 + .../confsched2023/sessions/BookMarkScreen.kt | 14 ++ .../sessions/BookMarkScreenViewModel.kt | 49 ++++++- .../sessions/component/TimetableTopArea.kt | 4 +- .../sessions/section/BookMarkFilter.kt | 125 ++++++++++++++++++ .../sessions/section/BookMarkSheet.kt | 22 ++- gradle/libs.versions.toml | 1 + 7 files changed, 204 insertions(+), 12 deletions(-) create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkFilter.kt diff --git a/feature/sessions/build.gradle.kts b/feature/sessions/build.gradle.kts index 02101d491..469a7813d 100644 --- a/feature/sessions/build.gradle.kts +++ b/feature/sessions/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation(libs.androidxActivityActivityCompose) implementation(libs.composeCoil) implementation(libs.composeConstraintLayout) + implementation(libs.composeMaterialIcon) androidTestImplementation(libs.composeUiTestJunit4) debugImplementation(libs.composeUiTooling) debugImplementation(libs.composeUiTestManifest) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index d3b6104cd..9058e0bbd 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController +import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day import io.github.droidkaigi.confsched2023.model.Timetable import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet @@ -27,6 +28,7 @@ sealed interface BookMarkScreenUiState { data class ListBookMark( val bookMarkedTimeline: Timetable, + val currentDayFilter: List, ) : BookMarkScreenUiState } @@ -38,6 +40,10 @@ fun BookMarkScreen( BookMarkScreen( uiState = uiState, + onClickAllFilterChip = { viewModel.onClickAllFilterChip() }, + onClickDayFirstChip = { viewModel.onClickDayFirstChip() }, + onClickDaySecondChip = { viewModel.onClickDaySecondChip() }, + onClickDayThirdChip = { viewModel.onClickDayThirdChip() }, ) } @@ -46,6 +52,10 @@ const val BookScreenTestTag = "TimetableScreenTestTag" @Composable private fun BookMarkScreen( uiState: BookMarkScreenUiState, + onClickAllFilterChip: () -> Unit, + onClickDayFirstChip: () -> Unit, + onClickDaySecondChip: () -> Unit, + onClickDayThirdChip: () -> Unit, ) { Scaffold( modifier = Modifier.testTag(BookScreenTestTag), @@ -57,6 +67,10 @@ private fun BookMarkScreen( ) { padding -> BookMarkSheet( modifier = Modifier.padding(padding), + onClickAllFilterChip = onClickAllFilterChip, + onClickDayFirstChip = onClickDayFirstChip, + onClickDaySecondChip = onClickDaySecondChip, + onClickDayThirdChip = onClickDayThirdChip, uiState = uiState, ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index ee5a5b2b1..5d9f66a1d 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -4,15 +4,18 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import io.github.droidkaigi.confsched2023.designsystem.strings.AppStrings +import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day import io.github.droidkaigi.confsched2023.model.Filters import io.github.droidkaigi.confsched2023.model.SessionsRepository import io.github.droidkaigi.confsched2023.model.Timetable import io.github.droidkaigi.confsched2023.ui.UserMessageStateHolder import io.github.droidkaigi.confsched2023.ui.buildUiState import io.github.droidkaigi.confsched2023.ui.handleErrorAndRetry +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.update import javax.inject.Inject @HiltViewModel @@ -33,12 +36,46 @@ class BookMarkScreenViewModel @Inject constructor( initialValue = Timetable(), ) - val uiState: StateFlow = buildUiState(sessionsStateFlow) { - val bookMarkedTimetable = it.filtered(Filters(filterFavorite = false)) - if (bookMarkedTimetable.isEmpty()) { - BookMarkScreenUiState.Empty - } else { - BookMarkScreenUiState.ListBookMark(bookMarkedTimetable) + private val currentDayFilter = MutableStateFlow( + DroidKaigi2023Day.values().map { it }, + ) + + val uiState: StateFlow = + buildUiState(sessionsStateFlow, currentDayFilter) { sessionsStateFlow, currentDayFilter -> + val bookMarkedTimetable = sessionsStateFlow.filtered( + Filters( + days = currentDayFilter, + filterFavorite = false, + ), + ) + if (bookMarkedTimetable.isEmpty()) { + BookMarkScreenUiState.Empty + } else { + BookMarkScreenUiState.ListBookMark(bookMarkedTimetable, currentDayFilter) + } + } + + fun onClickAllFilterChip() { + currentDayFilter.update { + DroidKaigi2023Day.values().toList() + } + } + + fun onClickDayFirstChip() { + currentDayFilter.update { + listOf(DroidKaigi2023Day.Day1) + } + } + + fun onClickDaySecondChip() { + currentDayFilter.update { + listOf(DroidKaigi2023Day.Day2) + } + } + + fun onClickDayThirdChip() { + currentDayFilter.update { + listOf(DroidKaigi2023Day.Day3) } } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt index 46c0f4d77..ff4f73fae 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt @@ -8,7 +8,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.DateRange import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.outlined.Bookmark import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -67,7 +67,7 @@ fun TimetableTopArea( onClick = { onClickTopAreaBookMarkIcon() }, ) { Icon( - imageVector = Icons.Default.Favorite, + imageVector = Icons.Outlined.Bookmark, contentDescription = Timetable.asString(), ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkFilter.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkFilter.kt new file mode 100644 index 000000000..f63f3ea6f --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkFilter.kt @@ -0,0 +1,125 @@ +package io.github.droidkaigi.confsched2023.sessions.section + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.size +import androidx.compose.material3.AssistChip +import androidx.compose.material3.AssistChipDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day + +@Composable +fun BookMarkFilter( + currentDayFilter: List, + onClickAllFilterChip: () -> Unit, + onClickDayFirstChip: () -> Unit, + onClickDaySecondChip: () -> Unit, + onClickDayThirdChip: () -> Unit, + modifier: Modifier = Modifier, +) { + val selectedChipColor = AssistChipDefaults.assistChipColors( + containerColor = Color(0xFFCEE9DB), + ) + val selectedChipBoarderColor = AssistChipDefaults.assistChipBorder( + borderColor = Color(0xFF707974), + borderWidth = 0.dp, + ) + val isAll = currentDayFilter.size == DroidKaigi2023Day.values().size + val isDayFirst = + currentDayFilter.size == 1 && currentDayFilter.first() == DroidKaigi2023Day.Day1 + val isDaySecond = + currentDayFilter.size == 1 && currentDayFilter.first() == DroidKaigi2023Day.Day2 + val isDayThird = + currentDayFilter.size == 1 && currentDayFilter.first() == DroidKaigi2023Day.Day3 + Row(modifier) { + AssistChip( + onClick = onClickAllFilterChip, + label = { + Text( + text = "全て", + fontWeight = FontWeight(500), + fontSize = 17.sp, + ) + }, + colors = if (isAll) { + selectedChipColor + } else { + AssistChipDefaults.assistChipColors() + }, + border = if (isAll) { + selectedChipBoarderColor + } else { + AssistChipDefaults.assistChipBorder() + }, + ) + Spacer(modifier = Modifier.size(8.dp)) + AssistChip( + onClick = onClickDayFirstChip, + label = { + Text( + text = DroidKaigi2023Day.Day1.name, + fontWeight = FontWeight(500), + fontSize = 17.sp, + ) + }, + colors = if (isDayFirst) { + selectedChipColor + } else { + AssistChipDefaults.assistChipColors() + }, + border = if (isDayFirst) { + selectedChipBoarderColor + } else { + AssistChipDefaults.assistChipBorder() + }, + ) + Spacer(modifier = Modifier.size(8.dp)) + AssistChip( + onClick = onClickDaySecondChip, + label = { + Text( + text = DroidKaigi2023Day.Day2.name, + fontWeight = FontWeight(500), + fontSize = 17.sp, + ) + }, + colors = if (isDaySecond) { + selectedChipColor + } else { + AssistChipDefaults.assistChipColors() + }, + border = if (isDaySecond) { + selectedChipBoarderColor + } else { + AssistChipDefaults.assistChipBorder() + }, + ) + Spacer(modifier = Modifier.size(8.dp)) + AssistChip( + onClick = onClickDayThirdChip, + label = { + Text( + text = DroidKaigi2023Day.Day3.name, + fontWeight = FontWeight(500), + fontSize = 17.sp, + ) + }, + colors = if (isDayThird) { + selectedChipColor + } else { + AssistChipDefaults.assistChipColors() + }, + border = if (isDayThird) { + selectedChipBoarderColor + } else { + AssistChipDefaults.assistChipBorder() + }, + ) + } +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index e9baa5cc2..498a051f5 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -28,6 +28,10 @@ import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBoo @Composable fun BookMarkSheet( uiState: BookMarkScreenUiState, + onClickAllFilterChip: () -> Unit, + onClickDayFirstChip: () -> Unit, + onClickDaySecondChip: () -> Unit, + onClickDayThirdChip: () -> Unit, modifier: Modifier = Modifier, ) { Box( @@ -40,10 +44,20 @@ fun BookMarkSheet( } is ListBookMark -> { - BookMarkList( - timetable = uiState.bookMarkedTimeline, - modifier = Modifier.padding(start = 16.dp), - ) + Column { + BookMarkFilter( + currentDayFilter = uiState.currentDayFilter, + onClickAllFilterChip = onClickAllFilterChip, + onClickDayFirstChip = onClickDayFirstChip, + onClickDaySecondChip = onClickDaySecondChip, + onClickDayThirdChip = onClickDayThirdChip, + modifier = Modifier.padding(start = 16.dp), + ) + BookMarkList( + timetable = uiState.bookMarkedTimeline, + modifier = Modifier.padding(start = 16.dp), + ) + } } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 56267e65b..ccd9c79ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,6 +43,7 @@ composeUi = { module = "androidx.compose.ui:ui", version.ref = "compose" } composeNavigation = { module = "androidx.navigation:navigation-compose", version = "2.6.0" } composeRuntime = { module = "androidx.compose.runtime:runtime", version.ref = "compose" } composeMaterial = { module = "androidx.compose.material3:material3", version = "1.1.1" } +composeMaterialIcon = { module = "androidx.compose.material:material-icons-extended", version = "1.4.3" } composeUiToolingPreview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" } composeUiTestJunit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "compose" } composeUiTooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } From b8cc1441b020b7214c09e593d9753ad3151e5a55 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Sun, 16 Jul 2023 19:33:32 +0900 Subject: [PATCH 10/27] Toggle bookmark --- .../confsched2023/sessions/BookMarkScreen.kt | 8 +- .../sessions/BookMarkScreenViewModel.kt | 20 +++- .../{section => component}/BookMarkFilter.kt | 0 .../sessions/component/BookMarkItem.kt | 101 ++++++++++++++++++ .../sessions/section/BookMarkList.kt | 83 +++++--------- .../sessions/section/BookMarkSheet.kt | 3 + 6 files changed, 152 insertions(+), 63 deletions(-) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/{section => component}/BookMarkFilter.kt (100%) create mode 100644 feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index 9058e0bbd..4c28f7376 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -2,18 +2,19 @@ package io.github.droidkaigi.confsched2023.sessions import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.padding -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet @@ -40,6 +41,7 @@ fun BookMarkScreen( BookMarkScreen( uiState = uiState, + onClickBooMarkIcon = { viewModel.updateBookmark(it) }, onClickAllFilterChip = { viewModel.onClickAllFilterChip() }, onClickDayFirstChip = { viewModel.onClickDayFirstChip() }, onClickDaySecondChip = { viewModel.onClickDaySecondChip() }, @@ -52,6 +54,7 @@ const val BookScreenTestTag = "TimetableScreenTestTag" @Composable private fun BookMarkScreen( uiState: BookMarkScreenUiState, + onClickBooMarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, onClickDaySecondChip: () -> Unit, @@ -62,11 +65,12 @@ private fun BookMarkScreen( topBar = { BookMarkTopArea() }, - containerColor = MaterialTheme.colorScheme.surface, + containerColor = Color(0xFFECEEEB), contentWindowInsets = WindowInsets(0.dp), ) { padding -> BookMarkSheet( modifier = Modifier.padding(padding), + onClickBooMarkIcon = onClickBooMarkIcon, onClickAllFilterChip = onClickAllFilterChip, onClickDayFirstChip = onClickDayFirstChip, onClickDaySecondChip = onClickDaySecondChip, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index 5d9f66a1d..39d389de7 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -8,6 +8,7 @@ import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day import io.github.droidkaigi.confsched2023.model.Filters import io.github.droidkaigi.confsched2023.model.SessionsRepository import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.ui.UserMessageStateHolder import io.github.droidkaigi.confsched2023.ui.buildUiState import io.github.droidkaigi.confsched2023.ui.handleErrorAndRetry @@ -16,11 +17,12 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class BookMarkScreenViewModel @Inject constructor( - sessionsRepository: SessionsRepository, + private val sessionsRepository: SessionsRepository, userMessageStateHolder: UserMessageStateHolder, ) : ViewModel() { @@ -41,7 +43,10 @@ class BookMarkScreenViewModel @Inject constructor( ) val uiState: StateFlow = - buildUiState(sessionsStateFlow, currentDayFilter) { sessionsStateFlow, currentDayFilter -> + buildUiState( + sessionsStateFlow, + currentDayFilter, + ) { sessionsStateFlow, currentDayFilter -> val bookMarkedTimetable = sessionsStateFlow.filtered( Filters( days = currentDayFilter, @@ -51,7 +56,10 @@ class BookMarkScreenViewModel @Inject constructor( if (bookMarkedTimetable.isEmpty()) { BookMarkScreenUiState.Empty } else { - BookMarkScreenUiState.ListBookMark(bookMarkedTimetable, currentDayFilter) + BookMarkScreenUiState.ListBookMark( + bookMarkedTimetable, + currentDayFilter, + ) } } @@ -78,4 +86,10 @@ class BookMarkScreenViewModel @Inject constructor( listOf(DroidKaigi2023Day.Day3) } } + + fun updateBookmark(timetableItem: TimetableItemId) { + viewModelScope.launch { + sessionsRepository.toggleBookmark(timetableItem) + } + } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkFilter.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt similarity index 100% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkFilter.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt new file mode 100644 index 000000000..ea10efb74 --- /dev/null +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt @@ -0,0 +1,101 @@ +package io.github.droidkaigi.confsched2023.sessions.component + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons.Filled +import androidx.compose.material.icons.Icons.Outlined +import androidx.compose.material.icons.filled.Bookmark +import androidx.compose.material.icons.outlined.Bookmark +import androidx.compose.material3.AssistChip +import androidx.compose.material3.Divider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage +import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.model.TimetableItem +import io.github.droidkaigi.confsched2023.model.TimetableItemId + +@Composable +fun BookMarkItem( + timetable: Timetable, + timetableItem: TimetableItem, + onClickBooMarkIcon: (TimetableItemId) -> Unit, + modifier: Modifier = Modifier, +) { + Column(modifier) { + Row(verticalAlignment = Alignment.CenterVertically) { + Row(modifier = Modifier.weight(1F)) { + AssistChip( + onClick = { /*Do Nothing*/ }, + label = { Text(timetableItem.room.name.currentLangTitle) }, + ) + Spacer(modifier = Modifier.size(5.dp)) + AssistChip( + onClick = { /*Do Nothing*/ }, + label = { Text(timetableItem.day?.name.orEmpty()) }, + ) + } + Icon( + imageVector = if (timetable.bookmarks.contains(timetableItem.id)) { + Filled.Bookmark + } else { + Outlined.Bookmark + }, + contentDescription = null, + modifier = Modifier.clickable { + onClickBooMarkIcon(timetableItem.id) + }, + ) + } + Spacer(modifier = Modifier.size(5.dp)) + Text( + text = timetableItem.title.currentLangTitle, + fontSize = 22.sp, + lineHeight = 28.sp, + ) + Spacer(modifier = Modifier.size(8.dp)) + Column { + timetableItem.speakers.forEachIndexed { index, speaker -> + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + AsyncImage( + model = speaker.iconUrl, + contentDescription = null, + modifier = Modifier + .size(40.dp) + .clip(RoundedCornerShape(12.dp)) + .border(BorderStroke(1.dp, Color.Black)), + ) + Spacer(modifier = Modifier.size(10.dp)) + Text( + text = speaker.name, + fontSize = 14.sp, + fontWeight = FontWeight.Medium, + color = MaterialTheme.colorScheme.onSurface, + ) + } + if (timetableItem.speakers.lastIndex != index) { + Spacer(modifier = Modifier.size(8.dp)) + } + } + } + Spacer(modifier = Modifier.size(15.dp)) + Divider() + } +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt index 1c4b850e9..bf4fab81d 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt @@ -1,90 +1,57 @@ package io.github.droidkaigi.confsched2023.sessions.section -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.border -import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.AssistChip -import androidx.compose.material3.Divider -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import coil.compose.AsyncImage import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.model.TimetableItemId +import io.github.droidkaigi.confsched2023.sessions.component.BookMarkItem @Composable fun BookMarkList( timetable: Timetable, + onClickBooMarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, ) { - LazyColumn(modifier) { + LazyColumn(modifier.padding(end = 16.dp)) { items(timetable.timetableItems.timetableItems.sortedBy { it.day }) { timetableItem -> Row(modifier = Modifier.padding(top = 10.dp)) { - Box(modifier = Modifier.size(42.dp)) - Column { - Row( - modifier = Modifier, + Column( + modifier = Modifier.width(58.dp), + verticalArrangement = Arrangement.Center, + ) { + Spacer(modifier = Modifier.size(6.dp)) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, ) { - AssistChip( - onClick = { /*Do Nothing*/ }, - label = { Text(timetableItem.room.name.currentLangTitle) }, + Text( + text = timetableItem.startsTimeString, + fontWeight = FontWeight.Medium, ) - Spacer(modifier = Modifier.size(5.dp)) - AssistChip( - onClick = { /*Do Nothing*/ }, - label = { Text(timetableItem.day?.name.orEmpty()) }, + Text(text = "|") + Text( + text = timetableItem.endsTimeString, ) } - Spacer(modifier = Modifier.size(5.dp)) - Text( - text = timetableItem.title.currentLangTitle, - fontSize = 22.sp, - lineHeight = 28.sp, - ) - Spacer(modifier = Modifier.size(8.dp)) - Column { - timetableItem.speakers.forEachIndexed { index, speaker -> - Row( - verticalAlignment = Alignment.CenterVertically, - ) { - AsyncImage( - model = speaker.iconUrl, - contentDescription = null, - modifier = Modifier - .size(40.dp) - .clip(RoundedCornerShape(12.dp)) - .border(BorderStroke(1.dp, Color.Black)), - ) - Spacer(modifier = Modifier.size(10.dp)) - Text( - text = speaker.name, - fontSize = 14.sp, - fontWeight = FontWeight.Medium, - color = MaterialTheme.colorScheme.onSurface, - ) - } - if (timetableItem.speakers.lastIndex != index) { - Spacer(modifier = Modifier.size(8.dp)) - } - } - } - Spacer(modifier = Modifier.size(15.dp)) - Divider() } + BookMarkItem( + timetable = timetable, + timetableItem = timetableItem, + onClickBooMarkIcon = onClickBooMarkIcon, + ) } } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index 498a051f5..a5f04c6b3 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.constraintlayout.compose.ConstraintLayout +import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.Empty import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBookMark @@ -28,6 +29,7 @@ import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBoo @Composable fun BookMarkSheet( uiState: BookMarkScreenUiState, + onClickBooMarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, onClickDaySecondChip: () -> Unit, @@ -55,6 +57,7 @@ fun BookMarkSheet( ) BookMarkList( timetable = uiState.bookMarkedTimeline, + onClickBooMarkIcon = onClickBooMarkIcon, modifier = Modifier.padding(start = 16.dp), ) } From e637c4113944e40285cb32984c7ad5b625eea7e4 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Sun, 16 Jul 2023 20:42:29 +0900 Subject: [PATCH 11/27] Add OnBackPress --- .../confsched2023/sessions/TimetableItemDetailScreen.kt | 4 +++- .../confsched2023/sessions/component/BookMarkTopArea.kt | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt index 476fef191..f1a3ae214 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt @@ -28,7 +28,9 @@ fun NavGraphBuilder.sessionScreens(onNavigationIconClick: () -> Unit) { ) } composable(bookMarkScreenRoute) { - BookMarkScreen() + BookMarkScreen( + onClickBackPress = onNavigationIconClick + ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt index 5724b591d..07aa8e162 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt @@ -1,5 +1,6 @@ package io.github.droidkaigi.confsched2023.sessions.component +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height @@ -22,6 +23,7 @@ import androidx.compose.ui.unit.sp @OptIn(ExperimentalMaterial3Api::class) @Composable fun BookMarkTopArea( + onClickBackPress: () -> Unit, modifier: Modifier = Modifier, ) { TopAppBar( @@ -36,7 +38,11 @@ fun BookMarkTopArea( Icon( imageVector = Icons.Default.ArrowBack, contentDescription = null, - modifier = Modifier.size(24.dp), + modifier = Modifier + .size(24.dp) + .clickable { + onClickBackPress() + }, ) } }, From e2b91c8c35d317e9fdadeea594522576bb9fc5cc Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Sun, 16 Jul 2023 20:42:55 +0900 Subject: [PATCH 12/27] Show Filter in EmptyView --- .../confsched2023/sessions/BookMarkScreen.kt | 17 +++++-- .../sessions/BookMarkScreenViewModel.kt | 6 ++- .../sessions/section/BookMarkSheet.kt | 47 ++++++++++--------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index 4c28f7376..0a6a56698 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -25,22 +25,28 @@ fun NavController.navigateToBookMarkScreen() { } sealed interface BookMarkScreenUiState { - object Empty : BookMarkScreenUiState + + val currentDayFilter: List + + data class Empty( + override val currentDayFilter: List + ) : BookMarkScreenUiState data class ListBookMark( val bookMarkedTimeline: Timetable, - val currentDayFilter: List, + override val currentDayFilter: List ) : BookMarkScreenUiState } @Composable fun BookMarkScreen( + onClickBackPress: () -> Unit, viewModel: BookMarkScreenViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsState() - BookMarkScreen( uiState = uiState, + onClickBackPress = onClickBackPress, onClickBooMarkIcon = { viewModel.updateBookmark(it) }, onClickAllFilterChip = { viewModel.onClickAllFilterChip() }, onClickDayFirstChip = { viewModel.onClickDayFirstChip() }, @@ -54,6 +60,7 @@ const val BookScreenTestTag = "TimetableScreenTestTag" @Composable private fun BookMarkScreen( uiState: BookMarkScreenUiState, + onClickBackPress: () -> Unit, onClickBooMarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, @@ -63,14 +70,14 @@ private fun BookMarkScreen( Scaffold( modifier = Modifier.testTag(BookScreenTestTag), topBar = { - BookMarkTopArea() + BookMarkTopArea(onClickBackPress = onClickBackPress) }, containerColor = Color(0xFFECEEEB), contentWindowInsets = WindowInsets(0.dp), ) { padding -> BookMarkSheet( modifier = Modifier.padding(padding), - onClickBooMarkIcon = onClickBooMarkIcon, + onClickBookMarkIcon = onClickBooMarkIcon, onClickAllFilterChip = onClickAllFilterChip, onClickDayFirstChip = onClickDayFirstChip, onClickDaySecondChip = onClickDaySecondChip, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index 39d389de7..55519a5b9 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -50,11 +50,13 @@ class BookMarkScreenViewModel @Inject constructor( val bookMarkedTimetable = sessionsStateFlow.filtered( Filters( days = currentDayFilter, - filterFavorite = false, + filterFavorite = true, ), ) if (bookMarkedTimetable.isEmpty()) { - BookMarkScreenUiState.Empty + BookMarkScreenUiState.Empty( + currentDayFilter, + ) } else { BookMarkScreenUiState.ListBookMark( bookMarkedTimetable, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index a5f04c6b3..76d749f48 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -9,13 +9,13 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -29,38 +29,35 @@ import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBoo @Composable fun BookMarkSheet( uiState: BookMarkScreenUiState, - onClickBooMarkIcon: (TimetableItemId) -> Unit, + onClickBookMarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, onClickDaySecondChip: () -> Unit, onClickDayThirdChip: () -> Unit, modifier: Modifier = Modifier, ) { - Box( - contentAlignment = Alignment.Center, + Column( modifier = modifier.fillMaxSize(), ) { + BookMarkFilter( + currentDayFilter = uiState.currentDayFilter, + onClickAllFilterChip = onClickAllFilterChip, + onClickDayFirstChip = onClickDayFirstChip, + onClickDaySecondChip = onClickDaySecondChip, + onClickDayThirdChip = onClickDayThirdChip, + modifier = Modifier.padding(start = 16.dp), + ) when (uiState) { is Empty -> { EmptyView() } is ListBookMark -> { - Column { - BookMarkFilter( - currentDayFilter = uiState.currentDayFilter, - onClickAllFilterChip = onClickAllFilterChip, - onClickDayFirstChip = onClickDayFirstChip, - onClickDaySecondChip = onClickDaySecondChip, - onClickDayThirdChip = onClickDayThirdChip, - modifier = Modifier.padding(start = 16.dp), - ) - BookMarkList( - timetable = uiState.bookMarkedTimeline, - onClickBooMarkIcon = onClickBooMarkIcon, - modifier = Modifier.padding(start = 16.dp), - ) - } + BookMarkList( + timetable = uiState.bookMarkedTimeline, + onClickBooMarkIcon = onClickBookMarkIcon, + modifier = Modifier.padding(start = 16.dp), + ) } } } @@ -68,13 +65,15 @@ fun BookMarkSheet( @Composable private fun EmptyView() { - ConstraintLayout { + ConstraintLayout( + modifier = Modifier.fillMaxSize() + ) { val (emptyText, icon) = createRefs() Box( modifier = Modifier .size(84.dp) .background( - color = MaterialTheme.colorScheme.secondaryContainer, + color = Color(0xFFCEE9DB), shape = RoundedCornerShape(24.dp), ) .constrainAs(icon) { @@ -85,7 +84,7 @@ private fun EmptyView() { contentAlignment = Alignment.Center, ) { Icon( - imageVector = Icons.Default.Favorite, + imageVector = Icons.Default.Bookmark, contentDescription = null, ) } @@ -103,6 +102,7 @@ private fun EmptyView() { fontSize = 16.sp, fontWeight = FontWeight(500), lineHeight = 24.sp, + color = Color(0xFF191C1A), ) Spacer(modifier = Modifier.size(8.dp)) Text( @@ -111,6 +111,7 @@ private fun EmptyView() { lineHeight = 20.sp, letterSpacing = 0.25.sp, textAlign = TextAlign.Center, + color = Color(0xFF404944), ) } } From ae2027754c3a2a901d96f5ff47b26ef74c4cfb7a Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Sun, 16 Jul 2023 21:03:19 +0900 Subject: [PATCH 13/27] Sort BookMarkItems --- .../confsched2023/sessions/BookMarkScreen.kt | 11 +++++++---- .../sessions/BookMarkScreenViewModel.kt | 13 +++++++++---- .../sessions/TimetableItemDetailScreen.kt | 2 +- .../sessions/component/BookMarkItem.kt | 6 +++--- .../confsched2023/sessions/section/BookMarkList.kt | 11 +++++++---- .../confsched2023/sessions/section/BookMarkSheet.kt | 5 +++-- 6 files changed, 30 insertions(+), 18 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index 0a6a56698..50d15d355 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -13,10 +13,12 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day -import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet +import kotlinx.collections.immutable.PersistentList +import kotlinx.collections.immutable.PersistentSet const val bookMarkScreenRoute = "bookMark" @@ -29,12 +31,13 @@ sealed interface BookMarkScreenUiState { val currentDayFilter: List data class Empty( - override val currentDayFilter: List + override val currentDayFilter: List, ) : BookMarkScreenUiState data class ListBookMark( - val bookMarkedTimeline: Timetable, - override val currentDayFilter: List + val bookmarkedTimetableItemIds: PersistentSet, + val timetableItemList: PersistentList, + override val currentDayFilter: List, ) : BookMarkScreenUiState } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index 55519a5b9..da8c66fcb 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -12,6 +12,7 @@ import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.ui.UserMessageStateHolder import io.github.droidkaigi.confsched2023.ui.buildUiState import io.github.droidkaigi.confsched2023.ui.handleErrorAndRetry +import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -47,19 +48,23 @@ class BookMarkScreenViewModel @Inject constructor( sessionsStateFlow, currentDayFilter, ) { sessionsStateFlow, currentDayFilter -> - val bookMarkedTimetable = sessionsStateFlow.filtered( + val sortedBookmarkedTimetableItems = sessionsStateFlow.filtered( Filters( days = currentDayFilter, filterFavorite = true, ), - ) - if (bookMarkedTimetable.isEmpty()) { + ).timetableItems.sortedWith( + compareBy({ it.day?.name.orEmpty() }, { it.startsTimeString }), + ).toPersistentList() + + if (sortedBookmarkedTimetableItems.isEmpty()) { BookMarkScreenUiState.Empty( currentDayFilter, ) } else { BookMarkScreenUiState.ListBookMark( - bookMarkedTimetable, + sessionsStateFlow.bookmarks, + sortedBookmarkedTimetableItems, currentDayFilter, ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt index f1a3ae214..3c6604ece 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt @@ -29,7 +29,7 @@ fun NavGraphBuilder.sessionScreens(onNavigationIconClick: () -> Unit) { } composable(bookMarkScreenRoute) { BookMarkScreen( - onClickBackPress = onNavigationIconClick + onClickBackPress = onNavigationIconClick, ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt index ea10efb74..d085e29ec 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt @@ -26,13 +26,13 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.AsyncImage -import io.github.droidkaigi.confsched2023.model.Timetable import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItemId +import kotlinx.collections.immutable.PersistentSet @Composable fun BookMarkItem( - timetable: Timetable, + bookmarkedTimetableItemIds: PersistentSet, timetableItem: TimetableItem, onClickBooMarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, @@ -51,7 +51,7 @@ fun BookMarkItem( ) } Icon( - imageVector = if (timetable.bookmarks.contains(timetableItem.id)) { + imageVector = if (bookmarkedTimetableItemIds.contains(timetableItem.id)) { Filled.Bookmark } else { Outlined.Bookmark diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt index bf4fab81d..ae4570a6f 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt @@ -15,18 +15,21 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import io.github.droidkaigi.confsched2023.model.Timetable +import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.component.BookMarkItem +import kotlinx.collections.immutable.PersistentList +import kotlinx.collections.immutable.PersistentSet @Composable fun BookMarkList( - timetable: Timetable, + bookmarkedTimetableItemIds: PersistentSet, + timetableItems: PersistentList, onClickBooMarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, ) { LazyColumn(modifier.padding(end = 16.dp)) { - items(timetable.timetableItems.timetableItems.sortedBy { it.day }) { timetableItem -> + items(timetableItems) { timetableItem -> Row(modifier = Modifier.padding(top = 10.dp)) { Column( modifier = Modifier.width(58.dp), @@ -48,7 +51,7 @@ fun BookMarkList( } } BookMarkItem( - timetable = timetable, + bookmarkedTimetableItemIds = bookmarkedTimetableItemIds, timetableItem = timetableItem, onClickBooMarkIcon = onClickBooMarkIcon, ) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index 76d749f48..4a3e54e98 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -54,7 +54,8 @@ fun BookMarkSheet( is ListBookMark -> { BookMarkList( - timetable = uiState.bookMarkedTimeline, + bookmarkedTimetableItemIds = uiState.bookmarkedTimetableItemIds, + timetableItems = uiState.timetableItemList, onClickBooMarkIcon = onClickBookMarkIcon, modifier = Modifier.padding(start = 16.dp), ) @@ -66,7 +67,7 @@ fun BookMarkSheet( @Composable private fun EmptyView() { ConstraintLayout( - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize(), ) { val (emptyText, icon) = createRefs() Box( From b4e44bf9660bc1540795fb3c5bfddd6074382720 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 01:54:57 +0900 Subject: [PATCH 14/27] Fix TopBar --- .../confsched2023/sessions/BookMarkScreen.kt | 16 ++- .../sessions/BookMarkScreenViewModel.kt | 4 +- .../sessions/component/BookMarkFilter.kt | 2 +- .../sessions/component/BookMarkTopArea.kt | 107 ++++++++++++++---- .../sessions/section/BookMarkList.kt | 7 +- .../sessions/section/BookMarkSheet.kt | 4 + 6 files changed, 112 insertions(+), 28 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index 50d15d355..3baa2199a 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -2,6 +2,7 @@ package io.github.droidkaigi.confsched2023.sessions import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -28,16 +29,16 @@ fun NavController.navigateToBookMarkScreen() { sealed interface BookMarkScreenUiState { - val currentDayFilter: List + val currentDayFilter: PersistentList data class Empty( - override val currentDayFilter: List, + override val currentDayFilter: PersistentList, ) : BookMarkScreenUiState data class ListBookMark( val bookmarkedTimetableItemIds: PersistentSet, val timetableItemList: PersistentList, - override val currentDayFilter: List, + override val currentDayFilter: PersistentList, ) : BookMarkScreenUiState } @@ -70,16 +71,21 @@ private fun BookMarkScreen( onClickDaySecondChip: () -> Unit, onClickDayThirdChip: () -> Unit, ) { + val scrollState = rememberLazyListState() Scaffold( modifier = Modifier.testTag(BookScreenTestTag), topBar = { - BookMarkTopArea(onClickBackPress = onClickBackPress) + BookMarkTopArea( + scrollState = scrollState, + onClickBackPress = onClickBackPress, + ) }, - containerColor = Color(0xFFECEEEB), + containerColor = Color(0xFFF8FAF6), contentWindowInsets = WindowInsets(0.dp), ) { padding -> BookMarkSheet( modifier = Modifier.padding(padding), + scrollState = scrollState, onClickBookMarkIcon = onClickBooMarkIcon, onClickAllFilterChip = onClickAllFilterChip, onClickDayFirstChip = onClickDayFirstChip, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index da8c66fcb..4d50f44a8 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -59,13 +59,13 @@ class BookMarkScreenViewModel @Inject constructor( if (sortedBookmarkedTimetableItems.isEmpty()) { BookMarkScreenUiState.Empty( - currentDayFilter, + currentDayFilter.toPersistentList(), ) } else { BookMarkScreenUiState.ListBookMark( sessionsStateFlow.bookmarks, sortedBookmarkedTimetableItems, - currentDayFilter, + currentDayFilter.toPersistentList(), ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt index f63f3ea6f..216d71575 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt @@ -1,4 +1,4 @@ -package io.github.droidkaigi.confsched2023.sessions.section +package io.github.droidkaigi.confsched2023.sessions.component import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt index 07aa8e162..f71313cce 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt @@ -1,39 +1,113 @@ package io.github.droidkaigi.confsched2023.sessions.component +import android.util.Log import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.lerp +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.lerp import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.lerp import androidx.compose.ui.unit.sp -@OptIn(ExperimentalMaterial3Api::class) +@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) @Composable fun BookMarkTopArea( + scrollState: LazyListState, onClickBackPress: () -> Unit, modifier: Modifier = Modifier, ) { + val bigText = TextStyle( + fontSize = 32.sp, + fontWeight = FontWeight.Medium, + ) + val normalText = TextStyle( + fontSize = 22.sp, + fontWeight = FontWeight.Normal, + ) + + val fraction by remember { + derivedStateOf { + if (scrollState.firstVisibleItemIndex == 0) { + scrollState.firstVisibleItemScrollOffset / 500F + } else { + 1F + } + } + } + + val rowNum by remember { + derivedStateOf { + if (scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset / 500F < 1F) { + 1 + } else { + 2 + } + } + } + + val titlePadding by remember { + derivedStateOf { + if (scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset / 500F < 1F) { + 0.dp + } else { + 16.dp + } + } + } + + val titleTextStyle = lerp( + bigText, + normalText, + fraction, + ) + + val backgroundColor = lerp( + Color(0xFFCEE9DB), + Color(0xFFF8FAF6), + fraction, + ) + + val topBarHeight = lerp( + 94.dp, + 144.dp, + fraction, + ) + + Log.d("test", rowNum.toString()) + TopAppBar( - navigationIcon = { - Row( - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically, + navigationIcon = {}, + title = { + FlowRow( + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.Top, + maxItemsInEachRow = rowNum, modifier = Modifier - .height(64.dp) - .width(48.dp), + .height(topBarHeight) + .fillMaxWidth(), ) { Icon( imageVector = Icons.Default.ArrowBack, @@ -44,21 +118,16 @@ fun BookMarkTopArea( onClickBackPress() }, ) - } - }, - title = { - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.height(64.dp), - ) { Text( text = "Bookmark", - fontSize = 22.sp, + style = titleTextStyle, + modifier = Modifier.padding(titlePadding) ) } }, colors = TopAppBarDefaults.largeTopAppBarColors( - containerColor = MaterialTheme.colorScheme.surfaceVariant, + containerColor = backgroundColor, ), + modifier = Modifier.height(topBarHeight) ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt index ae4570a6f..2561eddc8 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -23,12 +24,16 @@ import kotlinx.collections.immutable.PersistentSet @Composable fun BookMarkList( + scrollState: LazyListState, bookmarkedTimetableItemIds: PersistentSet, timetableItems: PersistentList, onClickBooMarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, ) { - LazyColumn(modifier.padding(end = 16.dp)) { + LazyColumn( + state = scrollState, + modifier = modifier.padding(end = 16.dp), + ) { items(timetableItems) { timetableItem -> Row(modifier = Modifier.padding(top = 10.dp)) { Column( diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index 4a3e54e98..b2d3dc645 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Bookmark @@ -25,10 +26,12 @@ import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.Empty import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBookMark +import io.github.droidkaigi.confsched2023.sessions.component.BookMarkFilter @Composable fun BookMarkSheet( uiState: BookMarkScreenUiState, + scrollState: LazyListState, onClickBookMarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, @@ -54,6 +57,7 @@ fun BookMarkSheet( is ListBookMark -> { BookMarkList( + scrollState = scrollState, bookmarkedTimetableItemIds = uiState.bookmarkedTimetableItemIds, timetableItems = uiState.timetableItemList, onClickBooMarkIcon = onClickBookMarkIcon, From f36dedc23151c123c404cb1cc180b9f4bd1334b6 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 03:47:08 +0900 Subject: [PATCH 15/27] Fix TopBar --- .../sessions/component/BookMarkTopArea.kt | 102 +++++++++--------- 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt index f71313cce..c5e35774e 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt @@ -1,8 +1,10 @@ package io.github.droidkaigi.confsched2023.sessions.component import android.util.Log +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.fillMaxWidth @@ -15,9 +17,8 @@ import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -51,7 +52,7 @@ fun BookMarkTopArea( val fraction by remember { derivedStateOf { if (scrollState.firstVisibleItemIndex == 0) { - scrollState.firstVisibleItemScrollOffset / 500F + scrollState.firstVisibleItemScrollOffset / 520F } else { 1F } @@ -60,7 +61,7 @@ fun BookMarkTopArea( val rowNum by remember { derivedStateOf { - if (scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset / 500F < 1F) { + if (scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset / 520F < 1F) { 1 } else { 2 @@ -68,16 +69,6 @@ fun BookMarkTopArea( } } - val titlePadding by remember { - derivedStateOf { - if (scrollState.firstVisibleItemIndex == 0 && scrollState.firstVisibleItemScrollOffset / 500F < 1F) { - 0.dp - } else { - 16.dp - } - } - } - val titleTextStyle = lerp( bigText, normalText, @@ -85,49 +76,64 @@ fun BookMarkTopArea( ) val backgroundColor = lerp( - Color(0xFFCEE9DB), Color(0xFFF8FAF6), + Color(0xFFCEE9DB), fraction, ) val topBarHeight = lerp( - 94.dp, - 144.dp, + 156.dp, + 96.dp, + fraction, + ) + + val titlePaddingTop = lerp( + 16.dp, + 0.dp, fraction, ) - Log.d("test", rowNum.toString()) + val titlePaddingStart = lerp( + 0.dp, + 16.dp, + fraction, + ) + + SideEffect { + Log.d("test", titlePaddingTop.value.toString()) + Log.d("test", titlePaddingStart.value.toString()) + } - TopAppBar( - navigationIcon = {}, - title = { - FlowRow( - horizontalArrangement = Arrangement.Start, - verticalAlignment = Alignment.Top, - maxItemsInEachRow = rowNum, + Box( + modifier = Modifier + .height(topBarHeight) + .background(backgroundColor) + ) { + FlowRow( + horizontalArrangement = Arrangement.Start, + verticalAlignment = Alignment.CenterVertically, + maxItemsInEachRow = rowNum, + modifier = Modifier + .padding(start = 16.dp, top = 46.dp) + .fillMaxWidth(), + ) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = null, modifier = Modifier - .height(topBarHeight) - .fillMaxWidth(), - ) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = null, - modifier = Modifier - .size(24.dp) - .clickable { - onClickBackPress() - }, + .size(24.dp) + .clickable { + onClickBackPress() + }, + ) + Text( + text = "Bookmark", + style = titleTextStyle, + modifier = Modifier.padding( + start = if (titlePaddingStart >= 0.dp) titlePaddingStart else 0.dp, + top = if (titlePaddingTop >= 0.dp) titlePaddingTop else 0.dp ) - Text( - text = "Bookmark", - style = titleTextStyle, - modifier = Modifier.padding(titlePadding) - ) - } - }, - colors = TopAppBarDefaults.largeTopAppBarColors( - containerColor = backgroundColor, - ), - modifier = Modifier.height(topBarHeight) - ) + ) + } + } } From 5e61dc1643dca9210904e32abe4486c3b17a15da Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 04:20:29 +0900 Subject: [PATCH 16/27] Grouped ListItem By Time --- .../confsched2023/sessions/BookMarkScreen.kt | 3 +- .../sessions/BookMarkScreenViewModel.kt | 17 +++--- .../sessions/component/BookMarkTopArea.kt | 11 ++-- .../sessions/section/BookMarkList.kt | 52 ++++++++++--------- 4 files changed, 46 insertions(+), 37 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt index 3baa2199a..89a8814c2 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt @@ -19,6 +19,7 @@ import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet import kotlinx.collections.immutable.PersistentList +import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.PersistentSet const val bookMarkScreenRoute = "bookMark" @@ -37,7 +38,7 @@ sealed interface BookMarkScreenUiState { data class ListBookMark( val bookmarkedTimetableItemIds: PersistentSet, - val timetableItemList: PersistentList, + val timetableItemMap: PersistentMap>, override val currentDayFilter: PersistentList, ) : BookMarkScreenUiState } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt index 4d50f44a8..5c55d6f96 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt @@ -13,6 +13,7 @@ import io.github.droidkaigi.confsched2023.ui.UserMessageStateHolder import io.github.droidkaigi.confsched2023.ui.buildUiState import io.github.droidkaigi.confsched2023.ui.handleErrorAndRetry import kotlinx.collections.immutable.toPersistentList +import kotlinx.collections.immutable.toPersistentMap import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -48,23 +49,27 @@ class BookMarkScreenViewModel @Inject constructor( sessionsStateFlow, currentDayFilter, ) { sessionsStateFlow, currentDayFilter -> - val sortedBookmarkedTimetableItems = sessionsStateFlow.filtered( + val sortAndGroupedBookmarkedTimetableItems = sessionsStateFlow.filtered( Filters( days = currentDayFilter, filterFavorite = true, ), - ).timetableItems.sortedWith( - compareBy({ it.day?.name.orEmpty() }, { it.startsTimeString }), - ).toPersistentList() + ).timetableItems.groupBy { + it.startsTimeString + it.endsTimeString + }.mapValues { entries -> + entries.value.sortedWith( + compareBy({ it.day?.name.orEmpty() }, { it.startsTimeString }), + ) + }.toPersistentMap() - if (sortedBookmarkedTimetableItems.isEmpty()) { + if (sortAndGroupedBookmarkedTimetableItems.isEmpty()) { BookMarkScreenUiState.Empty( currentDayFilter.toPersistentList(), ) } else { BookMarkScreenUiState.ListBookMark( sessionsStateFlow.bookmarks, - sortedBookmarkedTimetableItems, + sortAndGroupedBookmarkedTimetableItems, currentDayFilter.toPersistentList(), ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt index c5e35774e..86ab164f6 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -33,7 +32,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.lerp import androidx.compose.ui.unit.sp -@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalLayoutApi::class) @Composable fun BookMarkTopArea( scrollState: LazyListState, @@ -105,9 +104,9 @@ fun BookMarkTopArea( } Box( - modifier = Modifier + modifier = modifier .height(topBarHeight) - .background(backgroundColor) + .background(backgroundColor), ) { FlowRow( horizontalArrangement = Arrangement.Start, @@ -131,8 +130,8 @@ fun BookMarkTopArea( style = titleTextStyle, modifier = Modifier.padding( start = if (titlePaddingStart >= 0.dp) titlePaddingStart else 0.dp, - top = if (titlePaddingTop >= 0.dp) titlePaddingTop else 0.dp - ) + top = if (titlePaddingTop >= 0.dp) titlePaddingTop else 0.dp, + ), ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt index 2561eddc8..f1853c4e9 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt @@ -9,7 +9,7 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -19,14 +19,14 @@ import androidx.compose.ui.unit.dp import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.component.BookMarkItem -import kotlinx.collections.immutable.PersistentList +import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.PersistentSet @Composable fun BookMarkList( scrollState: LazyListState, bookmarkedTimetableItemIds: PersistentSet, - timetableItems: PersistentList, + timetableItemMap: PersistentMap>, onClickBooMarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, ) { @@ -34,32 +34,36 @@ fun BookMarkList( state = scrollState, modifier = modifier.padding(end = 16.dp), ) { - items(timetableItems) { timetableItem -> - Row(modifier = Modifier.padding(top = 10.dp)) { - Column( - modifier = Modifier.width(58.dp), - verticalArrangement = Arrangement.Center, - ) { - Spacer(modifier = Modifier.size(6.dp)) + timetableItemMap.forEach { (_, values) -> + itemsIndexed(values) { index, timetableItem -> + Row(modifier = Modifier.padding(top = 10.dp)) { Column( - horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.width(58.dp), verticalArrangement = Arrangement.Center, ) { - Text( - text = timetableItem.startsTimeString, - fontWeight = FontWeight.Medium, - ) - Text(text = "|") - Text( - text = timetableItem.endsTimeString, - ) + if (index == 0) { + Spacer(modifier = Modifier.size(6.dp)) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text( + text = timetableItem.startsTimeString, + fontWeight = FontWeight.Medium, + ) + Text(text = "|") + Text( + text = timetableItem.endsTimeString, + ) + } + } } + BookMarkItem( + bookmarkedTimetableItemIds = bookmarkedTimetableItemIds, + timetableItem = timetableItem, + onClickBooMarkIcon = onClickBooMarkIcon, + ) } - BookMarkItem( - bookmarkedTimetableItemIds = bookmarkedTimetableItemIds, - timetableItem = timetableItem, - onClickBooMarkIcon = onClickBooMarkIcon, - ) } } } From f557aad1ddbe77ffb58b9550d7d9c665e6712a3e Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 04:20:36 +0900 Subject: [PATCH 17/27] Grouped ListItem By Time --- .../droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt index b2d3dc645..f1d49bc4a 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt @@ -59,7 +59,7 @@ fun BookMarkSheet( BookMarkList( scrollState = scrollState, bookmarkedTimetableItemIds = uiState.bookmarkedTimetableItemIds, - timetableItems = uiState.timetableItemList, + timetableItemMap = uiState.timetableItemMap, onClickBooMarkIcon = onClickBookMarkIcon, modifier = Modifier.padding(start = 16.dp), ) From 736fff79f8e9da47fe95a2e171e4c926b216c236 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 09:03:30 +0900 Subject: [PATCH 18/27] Add checkNavigateToBookmarkShot --- .../io/github/droidkaigi/confsched2023/KaigiAppTest.kt | 10 ++++++++++ .../testing/robot/TimetableScreenRobot.kt | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/app-android/src/test/java/io/github/droidkaigi/confsched2023/KaigiAppTest.kt b/app-android/src/test/java/io/github/droidkaigi/confsched2023/KaigiAppTest.kt index 318221987..14e8142fc 100644 --- a/app-android/src/test/java/io/github/droidkaigi/confsched2023/KaigiAppTest.kt +++ b/app-android/src/test/java/io/github/droidkaigi/confsched2023/KaigiAppTest.kt @@ -73,4 +73,14 @@ class KaigiAppTest { capture() } } + + @Test + fun checkNavigateToBookmarkShot() { + kaigiAppRobot(robotTestRule) { + timetableScreenRobot(robotTestRule) { + clickBookmarkButton() + } + capture() + } + } } diff --git a/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt b/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt index 22f6b6cd7..7fa83712c 100644 --- a/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt +++ b/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt @@ -14,6 +14,7 @@ import io.github.droidkaigi.confsched2023.designsystem.theme.KaigiTheme import io.github.droidkaigi.confsched2023.sessions.TimetableScreen import io.github.droidkaigi.confsched2023.sessions.TimetableScreenTestTag import io.github.droidkaigi.confsched2023.sessions.component.SearchButtonTestTag +import io.github.droidkaigi.confsched2023.sessions.component.TimetableBookmarkIconTestTag import io.github.droidkaigi.confsched2023.sessions.component.TimetableListItemTestTag import io.github.droidkaigi.confsched2023.sessions.component.TimetableUiTypeChangeButtonTestTag import io.github.droidkaigi.confsched2023.testing.RobotTestRule @@ -74,6 +75,12 @@ class TimetableScreenRobot @Inject constructor( .performClick() } + fun clickBookmarkButton() { + composeTestRule + .onNode(hasTestTag(TimetableBookmarkIconTestTag)) + .performClick() + } + fun scrollTimetable() { composeTestRule .onNode(hasTestTag(TimetableScreenTestTag)) From b4fe6872400bd7d03ed5a589484e349d3e916084 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 09:56:58 +0900 Subject: [PATCH 19/27] Replace BookMark to Bookmark --- .../droidkaigi/confsched2023/KaigiApp.kt | 6 +-- .../testing/robot/TimetableScreenRobot.kt | 2 +- .../{BookMarkScreen.kt => BookmarkScreen.kt} | 38 +++++++++---------- ...iewModel.kt => BookmarkScreenViewModel.kt} | 8 ++-- .../sessions/TimetableItemDetailScreen.kt | 4 +- .../confsched2023/sessions/TimetableScreen.kt | 12 +++--- .../{BookMarkFilter.kt => BookmarkFilter.kt} | 2 +- .../{BookMarkItem.kt => BookmarkItem.kt} | 6 +-- ...{BookMarkTopArea.kt => BookmarkTopArea.kt} | 2 +- .../sessions/component/TimetableTopArea.kt | 4 +- .../{BookMarkList.kt => BookmarkList.kt} | 8 ++-- .../{BookMarkSheet.kt => BookmarkSheet.kt} | 22 +++++------ 12 files changed, 57 insertions(+), 57 deletions(-) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/{BookMarkScreen.kt => BookmarkScreen.kt} (80%) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/{BookMarkScreenViewModel.kt => BookmarkScreenViewModel.kt} (94%) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/{BookMarkFilter.kt => BookmarkFilter.kt} (99%) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/{BookMarkItem.kt => BookmarkItem.kt} (96%) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/{BookMarkTopArea.kt => BookmarkTopArea.kt} (99%) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/{BookMarkList.kt => BookmarkList.kt} (95%) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/{BookMarkSheet.kt => BookmarkSheet.kt} (89%) diff --git a/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt b/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt index 4051f146a..7ad5e53b9 100644 --- a/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt +++ b/app-android/src/main/java/io/github/droidkaigi/confsched2023/KaigiApp.kt @@ -28,7 +28,7 @@ import io.github.droidkaigi.confsched2023.main.mainScreen import io.github.droidkaigi.confsched2023.main.mainScreenRoute import io.github.droidkaigi.confsched2023.sessions.navigateSearchScreen import io.github.droidkaigi.confsched2023.sessions.navigateTimetableScreen -import io.github.droidkaigi.confsched2023.sessions.navigateToBookMarkScreen +import io.github.droidkaigi.confsched2023.sessions.navigateToBookmarkScreen import io.github.droidkaigi.confsched2023.sessions.navigateToTimetableItemDetailScreen import io.github.droidkaigi.confsched2023.sessions.nestedSessionScreens import io.github.droidkaigi.confsched2023.sessions.searchScreen @@ -87,8 +87,8 @@ private fun NavGraphBuilder.mainScreen(navController: NavHostController) { timetableitem.id, ) }, - onClickBookMarkIcon = { - navController.navigateToBookMarkScreen() + onClickBookmarkIcon = { + navController.navigateToBookmarkScreen() }, ) composable(contributorsScreenRoute) { diff --git a/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt b/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt index 7fa83712c..4bbbbcee6 100644 --- a/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt +++ b/core/testing/src/main/java/io/github/droidkaigi/confsched2023/testing/robot/TimetableScreenRobot.kt @@ -40,7 +40,7 @@ class TimetableScreenRobot @Inject constructor( TimetableScreen( onSearchClick = { }, onTimetableItemClick = { }, - onClickBookMarkIcon = { }, + onClickBookmarkIcon = { }, ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookmarkScreen.kt similarity index 80% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookmarkScreen.kt index 89a8814c2..64d09a6c0 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookmarkScreen.kt @@ -16,40 +16,40 @@ import androidx.navigation.NavController import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItemId -import io.github.droidkaigi.confsched2023.sessions.component.BookMarkTopArea -import io.github.droidkaigi.confsched2023.sessions.section.BookMarkSheet +import io.github.droidkaigi.confsched2023.sessions.component.BookmarkTopArea +import io.github.droidkaigi.confsched2023.sessions.section.BookmarkSheet import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.PersistentSet -const val bookMarkScreenRoute = "bookMark" +const val bookmarkScreenRoute = "bookmark" -fun NavController.navigateToBookMarkScreen() { - navigate(bookMarkScreenRoute) +fun NavController.navigateToBookmarkScreen() { + navigate(bookmarkScreenRoute) } -sealed interface BookMarkScreenUiState { +sealed interface BookmarkScreenUiState { val currentDayFilter: PersistentList data class Empty( override val currentDayFilter: PersistentList, - ) : BookMarkScreenUiState + ) : BookmarkScreenUiState - data class ListBookMark( + data class ListBookmark( val bookmarkedTimetableItemIds: PersistentSet, val timetableItemMap: PersistentMap>, override val currentDayFilter: PersistentList, - ) : BookMarkScreenUiState + ) : BookmarkScreenUiState } @Composable -fun BookMarkScreen( +fun BookmarkScreen( onClickBackPress: () -> Unit, - viewModel: BookMarkScreenViewModel = hiltViewModel(), + viewModel: BookmarkScreenViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsState() - BookMarkScreen( + BookmarkScreen( uiState = uiState, onClickBackPress = onClickBackPress, onClickBooMarkIcon = { viewModel.updateBookmark(it) }, @@ -60,11 +60,11 @@ fun BookMarkScreen( ) } -const val BookScreenTestTag = "TimetableScreenTestTag" +const val BookmarkScreenTestTag = "BookmarkScreenTestTag" @Composable -private fun BookMarkScreen( - uiState: BookMarkScreenUiState, +private fun BookmarkScreen( + uiState: BookmarkScreenUiState, onClickBackPress: () -> Unit, onClickBooMarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, @@ -74,9 +74,9 @@ private fun BookMarkScreen( ) { val scrollState = rememberLazyListState() Scaffold( - modifier = Modifier.testTag(BookScreenTestTag), + modifier = Modifier.testTag(BookmarkScreenTestTag), topBar = { - BookMarkTopArea( + BookmarkTopArea( scrollState = scrollState, onClickBackPress = onClickBackPress, ) @@ -84,10 +84,10 @@ private fun BookMarkScreen( containerColor = Color(0xFFF8FAF6), contentWindowInsets = WindowInsets(0.dp), ) { padding -> - BookMarkSheet( + BookmarkSheet( modifier = Modifier.padding(padding), scrollState = scrollState, - onClickBookMarkIcon = onClickBooMarkIcon, + onClickBookmarkIcon = onClickBooMarkIcon, onClickAllFilterChip = onClickAllFilterChip, onClickDayFirstChip = onClickDayFirstChip, onClickDaySecondChip = onClickDaySecondChip, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookmarkScreenViewModel.kt similarity index 94% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookmarkScreenViewModel.kt index 5c55d6f96..dfbe5ffbe 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookMarkScreenViewModel.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/BookmarkScreenViewModel.kt @@ -23,7 +23,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class BookMarkScreenViewModel @Inject constructor( +class BookmarkScreenViewModel @Inject constructor( private val sessionsRepository: SessionsRepository, userMessageStateHolder: UserMessageStateHolder, ) : ViewModel() { @@ -44,7 +44,7 @@ class BookMarkScreenViewModel @Inject constructor( DroidKaigi2023Day.values().map { it }, ) - val uiState: StateFlow = + val uiState: StateFlow = buildUiState( sessionsStateFlow, currentDayFilter, @@ -63,11 +63,11 @@ class BookMarkScreenViewModel @Inject constructor( }.toPersistentMap() if (sortAndGroupedBookmarkedTimetableItems.isEmpty()) { - BookMarkScreenUiState.Empty( + BookmarkScreenUiState.Empty( currentDayFilter.toPersistentList(), ) } else { - BookMarkScreenUiState.ListBookMark( + BookmarkScreenUiState.ListBookmark( sessionsStateFlow.bookmarks, sortAndGroupedBookmarkedTimetableItems, currentDayFilter.toPersistentList(), diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt index 3c6604ece..29028eeb0 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableItemDetailScreen.kt @@ -27,8 +27,8 @@ fun NavGraphBuilder.sessionScreens(onNavigationIconClick: () -> Unit) { onNavigationIconClick = onNavigationIconClick, ) } - composable(bookMarkScreenRoute) { - BookMarkScreen( + composable(bookmarkScreenRoute) { + BookmarkScreen( onClickBackPress = onNavigationIconClick, ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt index 12c4adcc5..1b35e3c22 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/TimetableScreen.kt @@ -31,13 +31,13 @@ const val timetableScreenRoute = "timetable" fun NavGraphBuilder.nestedSessionScreens( onSearchClick: () -> Unit, onTimetableItemClick: (TimetableItem) -> Unit, - onClickBookMarkIcon: () -> Unit, + onClickBookmarkIcon: () -> Unit, ) { composable(timetableScreenRoute) { TimetableScreen( onSearchClick = onSearchClick, onTimetableItemClick = onTimetableItemClick, - onClickBookMarkIcon = onClickBookMarkIcon, + onClickBookmarkIcon = onClickBookmarkIcon, ) } } @@ -52,7 +52,7 @@ const val TimetableScreenTestTag = "TimetableScreen" fun TimetableScreen( onSearchClick: () -> Unit, onTimetableItemClick: (TimetableItem) -> Unit, - onClickBookMarkIcon: () -> Unit, + onClickBookmarkIcon: () -> Unit, viewModel: TimetableScreenViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsState() @@ -67,7 +67,7 @@ fun TimetableScreen( snackbarHostState = snackbarHostState, onTimetableItemClick = onTimetableItemClick, onBookmarkClick = viewModel::onBookmarkClick, - onClickBookMarkIcon = onClickBookMarkIcon, + onClickBookmarkIcon = onClickBookmarkIcon, onSearchClick = onSearchClick, onTimetableUiChangeClick = viewModel::onUiTypeChange, ) @@ -83,7 +83,7 @@ private fun TimetableScreen( snackbarHostState: SnackbarHostState, onTimetableItemClick: (TimetableItem) -> Unit, onBookmarkClick: (TimetableItem) -> Unit, - onClickBookMarkIcon: () -> Unit, + onClickBookmarkIcon: () -> Unit, onSearchClick: () -> Unit, onTimetableUiChangeClick: () -> Unit, ) { @@ -103,7 +103,7 @@ private fun TimetableScreen( state, onTimetableUiChangeClick, onSearchClick, - onClickBookMarkIcon, + onClickBookmarkIcon, ) }, containerColor = MaterialTheme.colorScheme.surfaceVariant, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilter.kt similarity index 99% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilter.kt index 216d71575..a7c33445f 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkFilter.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilter.kt @@ -15,7 +15,7 @@ import androidx.compose.ui.unit.sp import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day @Composable -fun BookMarkFilter( +fun BookmarkFilter( currentDayFilter: List, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt similarity index 96% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt index d085e29ec..e55e84b44 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkItem.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt @@ -31,10 +31,10 @@ import io.github.droidkaigi.confsched2023.model.TimetableItemId import kotlinx.collections.immutable.PersistentSet @Composable -fun BookMarkItem( +fun BookmarkItem( bookmarkedTimetableItemIds: PersistentSet, timetableItem: TimetableItem, - onClickBooMarkIcon: (TimetableItemId) -> Unit, + onClickBoomarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, ) { Column(modifier) { @@ -58,7 +58,7 @@ fun BookMarkItem( }, contentDescription = null, modifier = Modifier.clickable { - onClickBooMarkIcon(timetableItem.id) + onClickBoomarkIcon(timetableItem.id) }, ) } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt similarity index 99% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt index 86ab164f6..b1a6ce279 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookMarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.unit.sp @OptIn(ExperimentalLayoutApi::class) @Composable -fun BookMarkTopArea( +fun BookmarkTopArea( scrollState: LazyListState, onClickBackPress: () -> Unit, modifier: Modifier = Modifier, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt index ff4f73fae..01a648870 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt @@ -34,7 +34,7 @@ fun TimetableTopArea( state: TimetableScreenScrollState, onTimetableUiChangeClick: () -> Unit, onSearchClick: () -> Unit, - onClickTopAreaBookMarkIcon: () -> Unit, + onClickTopAreaBookmarkIcon: () -> Unit, modifier: Modifier = Modifier, ) { Column(modifier = modifier) { @@ -64,7 +64,7 @@ fun TimetableTopArea( } IconButton( modifier = Modifier.testTag(TimetableBookmarkIconTestTag), - onClick = { onClickTopAreaBookMarkIcon() }, + onClick = { onClickTopAreaBookmarkIcon() }, ) { Icon( imageVector = Icons.Outlined.Bookmark, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkList.kt similarity index 95% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkList.kt index f1853c4e9..3309333e5 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkList.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkList.kt @@ -18,12 +18,12 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItemId -import io.github.droidkaigi.confsched2023.sessions.component.BookMarkItem +import io.github.droidkaigi.confsched2023.sessions.component.BookmarkItem import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.PersistentSet @Composable -fun BookMarkList( +fun BookmarkList( scrollState: LazyListState, bookmarkedTimetableItemIds: PersistentSet, timetableItemMap: PersistentMap>, @@ -58,10 +58,10 @@ fun BookMarkList( } } } - BookMarkItem( + BookmarkItem( bookmarkedTimetableItemIds = bookmarkedTimetableItemIds, timetableItem = timetableItem, - onClickBooMarkIcon = onClickBooMarkIcon, + onClickBoomarkIcon = onClickBooMarkIcon, ) } } diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt similarity index 89% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt index f1d49bc4a..be70cb38f 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookMarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt @@ -23,16 +23,16 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.constraintlayout.compose.ConstraintLayout import io.github.droidkaigi.confsched2023.model.TimetableItemId -import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState -import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.Empty -import io.github.droidkaigi.confsched2023.sessions.BookMarkScreenUiState.ListBookMark -import io.github.droidkaigi.confsched2023.sessions.component.BookMarkFilter +import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState +import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState.Empty +import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState.ListBookmark +import io.github.droidkaigi.confsched2023.sessions.component.BookmarkFilter @Composable -fun BookMarkSheet( - uiState: BookMarkScreenUiState, +fun BookmarkSheet( + uiState: BookmarkScreenUiState, scrollState: LazyListState, - onClickBookMarkIcon: (TimetableItemId) -> Unit, + onClickBookmarkIcon: (TimetableItemId) -> Unit, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, onClickDaySecondChip: () -> Unit, @@ -42,7 +42,7 @@ fun BookMarkSheet( Column( modifier = modifier.fillMaxSize(), ) { - BookMarkFilter( + BookmarkFilter( currentDayFilter = uiState.currentDayFilter, onClickAllFilterChip = onClickAllFilterChip, onClickDayFirstChip = onClickDayFirstChip, @@ -55,12 +55,12 @@ fun BookMarkSheet( EmptyView() } - is ListBookMark -> { - BookMarkList( + is ListBookmark -> { + BookmarkList( scrollState = scrollState, bookmarkedTimetableItemIds = uiState.bookmarkedTimetableItemIds, timetableItemMap = uiState.timetableItemMap, - onClickBooMarkIcon = onClickBookMarkIcon, + onClickBooMarkIcon = onClickBookmarkIcon, modifier = Modifier.padding(start = 16.dp), ) } From 135e6c490c393168d9d733b2613f5b1c17b59caf Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 10:11:18 +0900 Subject: [PATCH 20/27] Add Preview and Fix border --- .../{BookmarkFilter.kt => BookmarkFilters.kt} | 28 +++++++++++++++++-- .../sessions/component/BookmarkItem.kt | 24 +++++++++++++++- .../sessions/section/BookmarkSheet.kt | 4 +-- 3 files changed, 50 insertions(+), 6 deletions(-) rename feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/{BookmarkFilter.kt => BookmarkFilters.kt} (82%) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilter.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt similarity index 82% rename from feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilter.kt rename to feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt index a7c33445f..eebae8568 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilter.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt @@ -5,18 +5,24 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size import androidx.compose.material3.AssistChip import androidx.compose.material3.AssistChipDefaults +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import io.github.droidkaigi.confsched2023.designsystem.theme.KaigiTheme +import io.github.droidkaigi.confsched2023.designsystem.theme.md_theme_light_outline import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day +import kotlinx.collections.immutable.PersistentList +import kotlinx.collections.immutable.toPersistentList @Composable -fun BookmarkFilter( - currentDayFilter: List, +fun BookmarkFilters( + currentDayFilter: PersistentList, onClickAllFilterChip: () -> Unit, onClickDayFirstChip: () -> Unit, onClickDaySecondChip: () -> Unit, @@ -27,7 +33,7 @@ fun BookmarkFilter( containerColor = Color(0xFFCEE9DB), ) val selectedChipBoarderColor = AssistChipDefaults.assistChipBorder( - borderColor = Color(0xFF707974), + borderColor = md_theme_light_outline, borderWidth = 0.dp, ) val isAll = currentDayFilter.size == DroidKaigi2023Day.values().size @@ -123,3 +129,19 @@ fun BookmarkFilter( ) } } + +@Preview +@Composable +fun BookmarkFiltersPreview() { + KaigiTheme { + Surface { + BookmarkFilters( + currentDayFilter = DroidKaigi2023Day.values().toList().toPersistentList(), + onClickAllFilterChip = {}, + onClickDayFirstChip = {}, + onClickDaySecondChip = {}, + onClickDayThirdChip = {}, + ) + } + } +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt index e55e84b44..8f41f7a58 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt @@ -16,6 +16,7 @@ import androidx.compose.material3.AssistChip import androidx.compose.material3.Divider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -23,12 +24,19 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil.compose.AsyncImage +import io.github.droidkaigi.confsched2023.designsystem.theme.KaigiTheme +import io.github.droidkaigi.confsched2023.designsystem.theme.md_theme_light_outline import io.github.droidkaigi.confsched2023.model.TimetableItem +import io.github.droidkaigi.confsched2023.model.TimetableItem.Session +import io.github.droidkaigi.confsched2023.model.TimetableItem.Session.Companion import io.github.droidkaigi.confsched2023.model.TimetableItemId +import io.github.droidkaigi.confsched2023.model.fake import kotlinx.collections.immutable.PersistentSet +import kotlinx.collections.immutable.toPersistentSet @Composable fun BookmarkItem( @@ -80,7 +88,7 @@ fun BookmarkItem( modifier = Modifier .size(40.dp) .clip(RoundedCornerShape(12.dp)) - .border(BorderStroke(1.dp, Color.Black)), + .border(BorderStroke(1.dp, md_theme_light_outline),RoundedCornerShape(12.dp)), ) Spacer(modifier = Modifier.size(10.dp)) Text( @@ -99,3 +107,17 @@ fun BookmarkItem( Divider() } } + +@Preview +@Composable +fun BookmarkItemPreview() { + KaigiTheme { + Surface { + BookmarkItem( + bookmarkedTimetableItemIds = emptyList().toPersistentSet(), + timetableItem = Session.fake(), + onClickBoomarkIcon = {}, + ) + } + } +} \ No newline at end of file diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt index be70cb38f..52a890e1a 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt @@ -26,7 +26,7 @@ import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState.Empty import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState.ListBookmark -import io.github.droidkaigi.confsched2023.sessions.component.BookmarkFilter +import io.github.droidkaigi.confsched2023.sessions.component.BookmarkFilters @Composable fun BookmarkSheet( @@ -42,7 +42,7 @@ fun BookmarkSheet( Column( modifier = modifier.fillMaxSize(), ) { - BookmarkFilter( + BookmarkFilters( currentDayFilter = uiState.currentDayFilter, onClickAllFilterChip = onClickAllFilterChip, onClickDayFirstChip = onClickDayFirstChip, From d0b76b2611a39cc90c778ee5062a3f205032ae40 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 10:21:18 +0900 Subject: [PATCH 21/27] Fix ChipBorder --- .../sessions/component/BookmarkItem.kt | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt index 8f41f7a58..34f35e02d 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt @@ -13,6 +13,8 @@ import androidx.compose.material.icons.Icons.Outlined import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.outlined.Bookmark import androidx.compose.material3.AssistChip +import androidx.compose.material3.AssistChipDefaults +import androidx.compose.material3.ChipBorder import androidx.compose.material3.Divider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -30,9 +32,18 @@ import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import io.github.droidkaigi.confsched2023.designsystem.theme.KaigiTheme import io.github.droidkaigi.confsched2023.designsystem.theme.md_theme_light_outline +import io.github.droidkaigi.confsched2023.designsystem.theme.room_hall_a +import io.github.droidkaigi.confsched2023.designsystem.theme.room_hall_b +import io.github.droidkaigi.confsched2023.designsystem.theme.room_hall_c +import io.github.droidkaigi.confsched2023.designsystem.theme.room_hall_d +import io.github.droidkaigi.confsched2023.designsystem.theme.room_hall_e +import io.github.droidkaigi.confsched2023.model.RoomType.RoomHallA +import io.github.droidkaigi.confsched2023.model.RoomType.RoomHallB +import io.github.droidkaigi.confsched2023.model.RoomType.RoomHallC +import io.github.droidkaigi.confsched2023.model.RoomType.RoomHallD +import io.github.droidkaigi.confsched2023.model.RoomType.RoomHallE import io.github.droidkaigi.confsched2023.model.TimetableItem import io.github.droidkaigi.confsched2023.model.TimetableItem.Session -import io.github.droidkaigi.confsched2023.model.TimetableItem.Session.Companion import io.github.droidkaigi.confsched2023.model.TimetableItemId import io.github.droidkaigi.confsched2023.model.fake import kotlinx.collections.immutable.PersistentSet @@ -45,12 +56,35 @@ fun BookmarkItem( onClickBoomarkIcon: (TimetableItemId) -> Unit, modifier: Modifier = Modifier, ) { + val roomChipBackgroundColor = when (timetableItem.room.type) { + RoomHallA -> room_hall_a + RoomHallB -> room_hall_b + RoomHallC -> room_hall_c + RoomHallD -> room_hall_d + RoomHallE -> room_hall_e + else -> Color.White + } Column(modifier) { Row(verticalAlignment = Alignment.CenterVertically) { Row(modifier = Modifier.weight(1F)) { AssistChip( onClick = { /*Do Nothing*/ }, - label = { Text(timetableItem.room.name.currentLangTitle) }, + label = { + Text( + timetableItem.room.name.currentLangTitle, + fontWeight = FontWeight.Medium, + fontSize = 12.sp, + color = Color.White + ) + }, + colors = AssistChipDefaults.assistChipColors( + containerColor = roomChipBackgroundColor + ), + border = AssistChipDefaults.assistChipBorder( + borderColor = Color.Transparent, + disabledBorderColor = Color.Transparent, + borderWidth = 0.dp, + ), ) Spacer(modifier = Modifier.size(5.dp)) AssistChip( @@ -88,7 +122,10 @@ fun BookmarkItem( modifier = Modifier .size(40.dp) .clip(RoundedCornerShape(12.dp)) - .border(BorderStroke(1.dp, md_theme_light_outline),RoundedCornerShape(12.dp)), + .border( + BorderStroke(1.dp, md_theme_light_outline), + RoundedCornerShape(12.dp) + ), ) Spacer(modifier = Modifier.size(10.dp)) Text( From 341706c7178db242a6bd904af493af43f82803a6 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 10:24:23 +0900 Subject: [PATCH 22/27] Fix ChipStyle --- .../sessions/component/BookmarkFilters.kt | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt index eebae8568..94bf5cc29 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt @@ -47,11 +47,7 @@ fun BookmarkFilters( AssistChip( onClick = onClickAllFilterChip, label = { - Text( - text = "全て", - fontWeight = FontWeight(500), - fontSize = 17.sp, - ) + ChipInnerText("全て") }, colors = if (isAll) { selectedChipColor @@ -68,11 +64,7 @@ fun BookmarkFilters( AssistChip( onClick = onClickDayFirstChip, label = { - Text( - text = DroidKaigi2023Day.Day1.name, - fontWeight = FontWeight(500), - fontSize = 17.sp, - ) + ChipInnerText(DroidKaigi2023Day.Day1.name) }, colors = if (isDayFirst) { selectedChipColor @@ -89,11 +81,7 @@ fun BookmarkFilters( AssistChip( onClick = onClickDaySecondChip, label = { - Text( - text = DroidKaigi2023Day.Day2.name, - fontWeight = FontWeight(500), - fontSize = 17.sp, - ) + ChipInnerText(DroidKaigi2023Day.Day2.name) }, colors = if (isDaySecond) { selectedChipColor @@ -110,11 +98,7 @@ fun BookmarkFilters( AssistChip( onClick = onClickDayThirdChip, label = { - Text( - text = DroidKaigi2023Day.Day3.name, - fontWeight = FontWeight(500), - fontSize = 17.sp, - ) + ChipInnerText(DroidKaigi2023Day.Day3.name) }, colors = if (isDayThird) { selectedChipColor @@ -130,6 +114,15 @@ fun BookmarkFilters( } } +@Composable +private fun ChipInnerText(name: String) { + Text( + text = name, + fontWeight = FontWeight.Medium, + fontSize = 14.sp, + ) +} + @Preview @Composable fun BookmarkFiltersPreview() { From 02986bfb5b0173224bb7658733dc8f0faea65667 Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 10:27:50 +0900 Subject: [PATCH 23/27] Fix modifier of BookmarkSheet --- .../confsched2023/sessions/component/BookmarkItem.kt | 9 ++++----- .../confsched2023/sessions/section/BookmarkSheet.kt | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt index 34f35e02d..3f3ac90b7 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkItem.kt @@ -14,7 +14,6 @@ import androidx.compose.material.icons.filled.Bookmark import androidx.compose.material.icons.outlined.Bookmark import androidx.compose.material3.AssistChip import androidx.compose.material3.AssistChipDefaults -import androidx.compose.material3.ChipBorder import androidx.compose.material3.Divider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -74,11 +73,11 @@ fun BookmarkItem( timetableItem.room.name.currentLangTitle, fontWeight = FontWeight.Medium, fontSize = 12.sp, - color = Color.White + color = Color.White, ) }, colors = AssistChipDefaults.assistChipColors( - containerColor = roomChipBackgroundColor + containerColor = roomChipBackgroundColor, ), border = AssistChipDefaults.assistChipBorder( borderColor = Color.Transparent, @@ -124,7 +123,7 @@ fun BookmarkItem( .clip(RoundedCornerShape(12.dp)) .border( BorderStroke(1.dp, md_theme_light_outline), - RoundedCornerShape(12.dp) + RoundedCornerShape(12.dp), ), ) Spacer(modifier = Modifier.size(10.dp)) @@ -157,4 +156,4 @@ fun BookmarkItemPreview() { ) } } -} \ No newline at end of file +} diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt index 52a890e1a..7bfe4a975 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt @@ -40,7 +40,9 @@ fun BookmarkSheet( modifier: Modifier = Modifier, ) { Column( - modifier = modifier.fillMaxSize(), + modifier = modifier + .fillMaxSize() + .padding(start = 16.dp), ) { BookmarkFilters( currentDayFilter = uiState.currentDayFilter, @@ -48,7 +50,6 @@ fun BookmarkSheet( onClickDayFirstChip = onClickDayFirstChip, onClickDaySecondChip = onClickDaySecondChip, onClickDayThirdChip = onClickDayThirdChip, - modifier = Modifier.padding(start = 16.dp), ) when (uiState) { is Empty -> { @@ -61,7 +62,6 @@ fun BookmarkSheet( bookmarkedTimetableItemIds = uiState.bookmarkedTimetableItemIds, timetableItemMap = uiState.timetableItemMap, onClickBooMarkIcon = onClickBookmarkIcon, - modifier = Modifier.padding(start = 16.dp), ) } } From 3191ac30f4e68e7ba87284f59682d12146f5b32e Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 10:48:03 +0900 Subject: [PATCH 24/27] Define const string value in SessionsStrings --- .../sessions/component/BookmarkTopArea.kt | 10 ++-------- .../confsched2023/sessions/section/BookmarkSheet.kt | 8 +++++--- .../confsched2023/sessions/strings/SessionsStrings.kt | 10 +++++++++- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt index b1a6ce279..7be6f715f 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt @@ -1,6 +1,5 @@ package io.github.droidkaigi.confsched2023.sessions.component -import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -17,7 +16,6 @@ import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember @@ -31,6 +29,7 @@ import androidx.compose.ui.text.lerp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.lerp import androidx.compose.ui.unit.sp +import io.github.droidkaigi.confsched2023.sessions.strings.SessionsStrings @OptIn(ExperimentalLayoutApi::class) @Composable @@ -98,11 +97,6 @@ fun BookmarkTopArea( fraction, ) - SideEffect { - Log.d("test", titlePaddingTop.value.toString()) - Log.d("test", titlePaddingStart.value.toString()) - } - Box( modifier = modifier .height(topBarHeight) @@ -126,7 +120,7 @@ fun BookmarkTopArea( }, ) Text( - text = "Bookmark", + text = SessionsStrings.Bookmark.asString(), style = titleTextStyle, modifier = Modifier.padding( start = if (titlePaddingStart >= 0.dp) titlePaddingStart else 0.dp, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt index 7bfe4a975..869d24a27 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/section/BookmarkSheet.kt @@ -27,6 +27,8 @@ import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState.Empty import io.github.droidkaigi.confsched2023.sessions.BookmarkScreenUiState.ListBookmark import io.github.droidkaigi.confsched2023.sessions.component.BookmarkFilters +import io.github.droidkaigi.confsched2023.sessions.strings.SessionsStrings.BookmarkedItemNotFound +import io.github.droidkaigi.confsched2023.sessions.strings.SessionsStrings.BookmarkedItemNotFoundSideNote @Composable fun BookmarkSheet( @@ -103,15 +105,15 @@ private fun EmptyView() { horizontalAlignment = Alignment.CenterHorizontally, ) { Text( - text = "登録されたセッションがありません", + text = BookmarkedItemNotFound.asString(), fontSize = 16.sp, - fontWeight = FontWeight(500), + fontWeight = FontWeight.Medium, lineHeight = 24.sp, color = Color(0xFF191C1A), ) Spacer(modifier = Modifier.size(8.dp)) Text( - text = "気になるセッションをブックマークに追加して\n集めてみましょう!", + text = BookmarkedItemNotFoundSideNote.asString(), fontSize = 14.sp, lineHeight = 20.sp, letterSpacing = 0.25.sp, diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt index 83b87c4fe..66bc1ce9d 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt @@ -14,7 +14,9 @@ sealed class SessionsStrings : Strings(Bindings) { object EventDay : SessionsStrings() object Category : SessionsStrings() object SearchResultNotFound : SessionsStrings() - + object Bookmark : SessionsStrings() + object BookmarkedItemNotFound : SessionsStrings() + object BookmarkedItemNotFoundSideNote : SessionsStrings() private object Bindings : StringsBindings( Lang.Japanese to { item, _ -> when (item) { @@ -26,7 +28,10 @@ sealed class SessionsStrings : Strings(Bindings) { UserIcon -> "ユーザーアイコン" EventDay -> "開催日" Category -> "カテゴリー" + Bookmark -> "Bookmark" SearchResultNotFound -> "この検索条件に一致する結果はありません" + BookmarkedItemNotFound -> "登録されたセッションがありません" + BookmarkedItemNotFoundSideNote -> "気になるセッションをブックマークに追加して\n集めてみましょう!" } }, Lang.English to { item, bindings -> @@ -40,6 +45,9 @@ sealed class SessionsStrings : Strings(Bindings) { EventDay -> "Day" Category -> "Category" SearchResultNotFound -> "Nothing matched your search criteria" + Bookmark -> "Bookmark" + BookmarkedItemNotFound -> "No sessions registered" + BookmarkedItemNotFoundSideNote -> "Add the sessions you are interested in to your bookmarks \n and collect them!" } }, default = Lang.Japanese, From 4b3e70dc82e7604ea7ec68f0ebcbb207201d1c3d Mon Sep 17 00:00:00 2001 From: "tomonori.matsukawa" Date: Mon, 17 Jul 2023 10:54:06 +0900 Subject: [PATCH 25/27] Define const string value in SessionsStrings --- .../confsched2023/sessions/component/BookmarkFilters.kt | 3 ++- .../confsched2023/sessions/strings/SessionsStrings.kt | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt index 94bf5cc29..30b006f6c 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkFilters.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.unit.sp import io.github.droidkaigi.confsched2023.designsystem.theme.KaigiTheme import io.github.droidkaigi.confsched2023.designsystem.theme.md_theme_light_outline import io.github.droidkaigi.confsched2023.model.DroidKaigi2023Day +import io.github.droidkaigi.confsched2023.sessions.strings.SessionsStrings import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.toPersistentList @@ -47,7 +48,7 @@ fun BookmarkFilters( AssistChip( onClick = onClickAllFilterChip, label = { - ChipInnerText("全て") + ChipInnerText(SessionsStrings.BookmarkFilterAllChip.asString()) }, colors = if (isAll) { selectedChipColor diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt index 66bc1ce9d..95b19eefd 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/strings/SessionsStrings.kt @@ -15,6 +15,7 @@ sealed class SessionsStrings : Strings(Bindings) { object Category : SessionsStrings() object SearchResultNotFound : SessionsStrings() object Bookmark : SessionsStrings() + object BookmarkFilterAllChip : SessionsStrings() object BookmarkedItemNotFound : SessionsStrings() object BookmarkedItemNotFoundSideNote : SessionsStrings() private object Bindings : StringsBindings( @@ -29,6 +30,7 @@ sealed class SessionsStrings : Strings(Bindings) { EventDay -> "開催日" Category -> "カテゴリー" Bookmark -> "Bookmark" + BookmarkFilterAllChip -> "全て" SearchResultNotFound -> "この検索条件に一致する結果はありません" BookmarkedItemNotFound -> "登録されたセッションがありません" BookmarkedItemNotFoundSideNote -> "気になるセッションをブックマークに追加して\n集めてみましょう!" @@ -46,6 +48,7 @@ sealed class SessionsStrings : Strings(Bindings) { Category -> "Category" SearchResultNotFound -> "Nothing matched your search criteria" Bookmark -> "Bookmark" + BookmarkFilterAllChip -> "All" BookmarkedItemNotFound -> "No sessions registered" BookmarkedItemNotFoundSideNote -> "Add the sessions you are interested in to your bookmarks \n and collect them!" } From 87a42daa1498d732ea375319733a00a0f38fa1f2 Mon Sep 17 00:00:00 2001 From: Takahiro Menju Date: Tue, 18 Jul 2023 10:10:47 +0900 Subject: [PATCH 26/27] Add FIXME --- .../confsched2023/sessions/component/BookmarkTopArea.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt index 7be6f715f..6db076a0d 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/BookmarkTopArea.kt @@ -123,6 +123,7 @@ fun BookmarkTopArea( text = SessionsStrings.Bookmark.asString(), style = titleTextStyle, modifier = Modifier.padding( + // FIXME: If we don't use this `if` expresson, a crash happen start = if (titlePaddingStart >= 0.dp) titlePaddingStart else 0.dp, top = if (titlePaddingTop >= 0.dp) titlePaddingTop else 0.dp, ), From 7afc39eabd58c276a59987aa4e4dedfcfe861866 Mon Sep 17 00:00:00 2001 From: Takahiro Menju Date: Tue, 18 Jul 2023 10:11:37 +0900 Subject: [PATCH 27/27] Add FIXME --- .../confsched2023/sessions/component/TimetableTopArea.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt index 01a648870..c495b87c1 100644 --- a/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt +++ b/feature/sessions/src/main/java/io/github/droidkaigi/confsched2023/sessions/component/TimetableTopArea.kt @@ -67,6 +67,7 @@ fun TimetableTopArea( onClick = { onClickTopAreaBookmarkIcon() }, ) { Icon( + // FIXME: We would like to use Filled Icon here imageVector = Icons.Outlined.Bookmark, contentDescription = Timetable.asString(), )