From 03a80292e575813cd83825b300fae8a6ac9f21a5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jul 2023 15:14:53 +0200 Subject: [PATCH 1/6] ignore typo. --- .idea/dictionaries/shared.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/.idea/dictionaries/shared.xml b/.idea/dictionaries/shared.xml index dc5f8f7504..fd825db3f0 100644 --- a/.idea/dictionaries/shared.xml +++ b/.idea/dictionaries/shared.xml @@ -8,6 +8,7 @@ onboarding placeables showkase + snackbar textfields From af323d863655a76f9ada103e75cf4ec123baa985 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jul 2023 15:34:15 +0200 Subject: [PATCH 2/6] Show Snackbar once the verification is finish in the correct screen (#812) --- .../impl/root/PreferencesRootPresenter.kt | 8 +++++++- .../impl/root/PreferencesRootState.kt | 4 +++- .../impl/root/PreferencesRootStateProvider.kt | 5 ++++- .../impl/root/PreferencesRootView.kt | 17 ++++++++++++++++- .../components/preferences/PreferenceScreen.kt | 2 ++ 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt index 7afa2a67da..66ff62ee2b 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt @@ -28,6 +28,8 @@ import androidx.compose.runtime.saveable.rememberSaveable import io.element.android.features.logout.api.LogoutPreferencePresenter import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.meta.BuildType +import io.element.android.libraries.designsystem.utils.SnackbarDispatcher +import io.element.android.libraries.designsystem.utils.collectSnackbarMessageAsState import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.getCurrentUser @@ -43,6 +45,7 @@ class PreferencesRootPresenter @Inject constructor( private val sessionVerificationService: SessionVerificationService, private val buildType: BuildType, private val versionFormatter: VersionFormatter, + private val snackbarDispatcher: SnackbarDispatcher, ) : Presenter { @Composable @@ -54,6 +57,8 @@ class PreferencesRootPresenter @Inject constructor( initialLoad(matrixUser) } + val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() + // Session verification status (unknown, not verified, verified) val sessionVerifiedStatus by sessionVerificationService.sessionVerifiedStatus.collectAsState() val sessionIsNotVerified by remember { @@ -67,7 +72,8 @@ class PreferencesRootPresenter @Inject constructor( myUser = matrixUser.value, version = versionFormatter.get(), showCompleteVerification = sessionIsNotVerified, - showDeveloperSettings = showDeveloperSettings + showDeveloperSettings = showDeveloperSettings, + snackbarMessage = snackbarMessage, ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt index 8760550fd0..2b0963c53c 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt @@ -17,6 +17,7 @@ package io.element.android.features.preferences.impl.root import io.element.android.features.logout.api.LogoutPreferenceState +import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.matrix.api.user.MatrixUser data class PreferencesRootState( @@ -24,5 +25,6 @@ data class PreferencesRootState( val myUser: MatrixUser?, val version: String, val showCompleteVerification: Boolean, - val showDeveloperSettings: Boolean + val showDeveloperSettings: Boolean, + val snackbarMessage: SnackbarMessage?, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt index 4f9626bcbd..9dbd54ffff 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt @@ -17,11 +17,14 @@ package io.element.android.features.preferences.impl.root import io.element.android.features.logout.api.aLogoutPreferenceState +import io.element.android.libraries.designsystem.utils.SnackbarMessage +import io.element.android.libraries.ui.strings.CommonStrings fun aPreferencesRootState() = PreferencesRootState( logoutState = aLogoutPreferenceState(), myUser = null, version = "Version 1.1 (1)", showCompleteVerification = true, - showDeveloperSettings = true + showDeveloperSettings = true, + snackbarMessage = SnackbarMessage(CommonStrings.common_verification_complete), ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt index f1e6e7de61..745e001b6d 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt @@ -24,6 +24,9 @@ import androidx.compose.material.icons.outlined.DeveloperMode import androidx.compose.material.icons.outlined.Help import androidx.compose.material.icons.outlined.InsertChart import androidx.compose.material.icons.outlined.VerifiedUser +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Snackbar +import androidx.compose.material3.SnackbarHost import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -39,6 +42,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.preview.LargeHeightPreview import io.element.android.libraries.designsystem.theme.components.Divider import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.utils.rememberSnackbarHostState import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.MatrixUserProvider import io.element.android.libraries.theme.ElementTheme @@ -55,11 +59,22 @@ fun PreferencesRootView( onOpenDeveloperSettings: () -> Unit, modifier: Modifier = Modifier, ) { + val snackbarHostState = rememberSnackbarHostState(snackbarMessage = state.snackbarMessage) + // Include pref from other modules PreferenceView( modifier = modifier, onBackPressed = onBackPressed, - title = stringResource(id = CommonStrings.common_settings) + title = stringResource(id = CommonStrings.common_settings), + snackbarHost = { + SnackbarHost(snackbarHostState) { data -> + Snackbar( + snackbarData = data, + containerColor = MaterialTheme.colorScheme.surfaceVariant, + contentColor = MaterialTheme.colorScheme.primary + ) + } + } ) { UserPreferences(state.myUser) if (state.showCompleteVerification) { diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceScreen.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceScreen.kt index 7a6eaf327d..5c44d48f24 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceScreen.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/preferences/PreferenceScreen.kt @@ -50,6 +50,7 @@ fun PreferenceView( title: String, modifier: Modifier = Modifier, onBackPressed: () -> Unit = {}, + snackbarHost: @Composable () -> Unit = {}, content: @Composable ColumnScope.() -> Unit, ) { Scaffold( @@ -64,6 +65,7 @@ fun PreferenceView( onBackPressed = onBackPressed, ) }, + snackbarHost = snackbarHost, content = { Column( modifier = Modifier From 7fef7552343c1dfb198df0985c65c607ca32ac29 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jul 2023 15:35:16 +0200 Subject: [PATCH 3/6] Use the CoroutineScope from the LaunchedEffect. --- .../element/android/libraries/designsystem/utils/Snackbar.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt index c24268852d..ce1181887e 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt @@ -69,14 +69,13 @@ fun SnackbarDispatcher.collectSnackbarMessageAsState(): State @Composable fun rememberSnackbarHostState(snackbarMessage: SnackbarMessage?): SnackbarHostState { val snackbarHostState = remember { SnackbarHostState() } - val coroutineScope = rememberCoroutineScope() val snackbarMessageText = snackbarMessage?.let { stringResource(id = snackbarMessage.messageResId) } val dispatcher = LocalSnackbarDispatcher.current LaunchedEffect(snackbarMessage) { if (snackbarMessageText == null) return@LaunchedEffect - coroutineScope.launch { + launch { snackbarHostState.showSnackbar( message = snackbarMessageText, duration = snackbarMessage.duration, From cd469e67bd512b2bebb37e0cd18e5f7a29d7a9cb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jul 2023 15:39:43 +0200 Subject: [PATCH 4/6] Fix Snackbar colors. --- .../features/preferences/impl/root/PreferencesRootView.kt | 3 --- .../io/element/android/features/roomlist/impl/RoomListView.kt | 2 -- 2 files changed, 5 deletions(-) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt index 745e001b6d..01d790f8b9 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt @@ -24,7 +24,6 @@ import androidx.compose.material.icons.outlined.DeveloperMode import androidx.compose.material.icons.outlined.Help import androidx.compose.material.icons.outlined.InsertChart import androidx.compose.material.icons.outlined.VerifiedUser -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Snackbar import androidx.compose.material3.SnackbarHost import androidx.compose.runtime.Composable @@ -70,8 +69,6 @@ fun PreferencesRootView( SnackbarHost(snackbarHostState) { data -> Snackbar( snackbarData = data, - containerColor = MaterialTheme.colorScheme.surfaceVariant, - contentColor = MaterialTheme.colorScheme.primary ) } } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 17b2b80cb9..657648df42 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -231,8 +231,6 @@ fun RoomListContent( SnackbarHost(snackbarHostState) { data -> Snackbar( snackbarData = data, - containerColor = MaterialTheme.colorScheme.surfaceVariant, - contentColor = MaterialTheme.colorScheme.primary ) } }, From 4b90904bc0b9f8685275206ebd9af5fa2b952c05 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jul 2023 16:15:59 +0200 Subject: [PATCH 5/6] Cleanup --- .../io/element/android/libraries/designsystem/utils/Snackbar.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt index ce1181887e..f4e44779d1 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/Snackbar.kt @@ -25,7 +25,6 @@ import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.res.stringResource import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow From 6eab2ea6947d62410540c5bfaddfedca381a95fe Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 7 Jul 2023 16:22:42 +0200 Subject: [PATCH 6/6] Fix test. --- .../preferences/impl/root/PreferencesRootPresenterTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt index 58931e25d7..f3cf23599f 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt @@ -23,6 +23,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.features.logout.impl.DefaultLogoutPreferencePresenter import io.element.android.libraries.architecture.Async import io.element.android.libraries.core.meta.BuildType +import io.element.android.libraries.designsystem.utils.SnackbarDispatcher import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.test.AN_AVATAR_URL import io.element.android.libraries.matrix.test.A_USER_NAME @@ -41,7 +42,8 @@ class PreferencesRootPresenterTest { matrixClient, FakeSessionVerificationService(), BuildType.DEBUG, - FakeVersionFormatter() + FakeVersionFormatter(), + SnackbarDispatcher(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present()