From e32e3e48f1b28178701deadd4dce5d996da67c2c Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Fri, 18 Apr 2025 10:50:50 +0200 Subject: [PATCH 1/2] Save useToken between config changes --- .../src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt b/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt index e43225671..6c631a322 100644 --- a/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt +++ b/demo-app/src/main/java/com/gravatar/demoapp/ui/AvatarUpdateTab.kt @@ -77,7 +77,7 @@ import kotlinx.coroutines.withContext fun AvatarUpdateTab(modifier: Modifier = Modifier) { var userEmail by remember { mutableStateOf(BuildConfig.DEMO_EMAIL) } var userToken by remember { mutableStateOf(BuildConfig.DEMO_BEARER_TOKEN) } - var useToken by remember { mutableStateOf(false) } + var useToken by rememberSaveable { mutableStateOf(false) } var tokenVisible by remember { mutableStateOf(false) } val context = LocalContext.current var showBottomSheet by rememberSaveable { mutableStateOf(false) } From 78837cc1f1f0cccabfb9a799fe1e57b21875b3cc Mon Sep 17 00:00:00 2001 From: AdamGrzybkowski Date: Fri, 18 Apr 2025 11:22:53 +0200 Subject: [PATCH 2/2] Move the DisposalEffect to set in-memory state to a higher up composable When restoring the state after the activity got killed, the NavController would immidiately launch the previous destination even before running the DisposableEffect. Moving the effect up fixes this timing issue. --- .../quickeditor/ui/editor/GravatarQuickEditorPage.kt | 10 ---------- .../bottomsheet/GravatarQuickEditorBottomSheet.kt | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorPage.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorPage.kt index 18178d526..a1b95fd1b 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorPage.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/GravatarQuickEditorPage.kt @@ -7,7 +7,6 @@ import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn import androidx.compose.animation.shrinkVertically import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.NavType @@ -16,7 +15,6 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.navigation import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument -import com.gravatar.quickeditor.QuickEditorContainer import com.gravatar.quickeditor.ui.alttext.AltTextPage import com.gravatar.quickeditor.ui.avatarpicker.AvatarPicker import com.gravatar.quickeditor.ui.navigation.EditorNavDestinations @@ -111,14 +109,6 @@ internal fun GravatarQuickEditorPage( ) { val navController = rememberNavController() - DisposableEffect(authToken) { - QuickEditorContainer.getInstance().useInMemoryTokenStorage() - - onDispose { - QuickEditorContainer.getInstance().resetUseInMemoryTokenStorage() - } - } - NavHost( navController, startDestination = QuickEditorPage.SPLASH.name, diff --git a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt index 44b6b85b2..0a76bf338 100644 --- a/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt +++ b/gravatar-quickeditor/src/main/java/com/gravatar/quickeditor/ui/editor/bottomsheet/GravatarQuickEditorBottomSheet.kt @@ -23,6 +23,7 @@ import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -42,6 +43,7 @@ import com.composables.core.SheetDetent import com.composables.core.SheetDetent.Companion.FullyExpanded import com.composables.core.SheetDetent.Companion.Hidden import com.composables.core.rememberModalBottomSheetState +import com.gravatar.quickeditor.QuickEditorContainer import com.gravatar.quickeditor.ui.components.QEDragHandle import com.gravatar.quickeditor.ui.editor.AuthenticationMethod import com.gravatar.quickeditor.ui.editor.AvatarPickerContentLayout @@ -100,6 +102,16 @@ internal fun GravatarQuickEditorBottomSheet( } } + DisposableEffect(Unit) { + if (authenticationMethod is AuthenticationMethod.Bearer) { + QuickEditorContainer.getInstance().useInMemoryTokenStorage() + } + + onDispose { + QuickEditorContainer.getInstance().resetUseInMemoryTokenStorage() + } + } + CompositionLocalProvider(LocalGravatarTheme provides mainGravatarTheme) { GravatarModalBottomSheet( onDismiss = onDismiss,