diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index 9a66eded59..843054aa7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -38,6 +38,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarDuration import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi import androidx.compose.material3.adaptive.layout.PaneExpansionAnchor +import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole import androidx.compose.material3.adaptive.layout.rememberPaneExpansionState import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator import androidx.compose.runtime.Composable @@ -46,6 +47,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -345,11 +347,17 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner val mutableInteractionSource = remember { MutableInteractionSource() } LaunchedEffect(mainNavigationDetailLocation) { - if (paneExpansionState.currentAnchor == listOnlyAnchor) { + if (paneExpansionState.currentAnchor == listOnlyAnchor && wrappedNavigator.currentDestination?.pane == ThreePaneScaffoldRole.Primary) { paneExpansionState.animateTo(detailOnlyAnchor) } } + LaunchedEffect(mainNavigationState.currentListLocation) { + if (paneExpansionState.currentAnchor == detailOnlyAnchor && wrappedNavigator.currentDestination?.pane == ThreePaneScaffoldRole.Secondary) { + paneExpansionState.animateTo(listOnlyAnchor) + } + } + AppScaffold( navigator = wrappedNavigator, paneExpansionState = paneExpansionState, diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/MainBottomChrome.kt b/app/src/main/java/org/thoughtcrime/securesms/main/MainBottomChrome.kt index 6228cfffaa..d9b5bb9c9b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainBottomChrome.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainBottomChrome.kt @@ -20,9 +20,9 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview import org.signal.core.ui.compose.Dialogs import org.signal.core.ui.compose.Previews -import org.signal.core.ui.compose.SignalPreview import org.signal.core.ui.compose.Snackbars import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.megaphone.Megaphone @@ -93,7 +93,9 @@ fun MainBottomChrome( callback = callback ) } + } + if (state.mainToolbarMode == MainToolbarMode.FULL) { MainMegaphoneContainer( state = state.megaphoneState, controller = megaphoneActionController, @@ -101,7 +103,6 @@ fun MainBottomChrome( ) } - val windowSizeClass = WindowSizeClass.rememberWindowSizeClass() val snackBarModifier = if (windowSizeClass.isCompact() && state.mainToolbarMode == MainToolbarMode.BASIC) { Modifier.navigationBarsPadding() } else { @@ -151,7 +152,12 @@ private fun MainSnackbar( } } -@SignalPreview +@Preview(device = "spec:width=360dp,height=640dp,orientation=portrait") +@Preview(device = "spec:width=640dp,height=360dp,orientation=landscape") +@Preview(device = "spec:width=600dp,height=1024dp,orientation=portrait") +@Preview(device = "spec:width=1024dp,height=600dp,orientation=landscape") +@Preview(device = "spec:width=840dp,height=1280dp,orientation=portrait") +@Preview(device = "spec:width=1280dp,height=840dp,orientation=landscape") @Composable fun MainBottomChromePreview() { Previews.Preview { diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/MainMegaphoneContainer.kt b/app/src/main/java/org/thoughtcrime/securesms/main/MainMegaphoneContainer.kt index 9e61566d13..27fea2a201 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainMegaphoneContainer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainMegaphoneContainer.kt @@ -7,12 +7,10 @@ package org.thoughtcrime.securesms.main import android.app.Activity import android.content.Intent -import android.content.res.Configuration import androidx.compose.animation.AnimatedVisibility import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalConfiguration import androidx.fragment.app.DialogFragment import org.signal.core.ui.compose.Previews import org.signal.core.ui.compose.SignalPreview @@ -20,6 +18,7 @@ import org.thoughtcrime.securesms.megaphone.Megaphone import org.thoughtcrime.securesms.megaphone.MegaphoneActionController import org.thoughtcrime.securesms.megaphone.MegaphoneComponent import org.thoughtcrime.securesms.megaphone.Megaphones +import org.thoughtcrime.securesms.window.WindowSizeClass data class MainMegaphoneState( val megaphone: Megaphone = Megaphone.NONE, @@ -45,9 +44,9 @@ fun MainMegaphoneContainer( controller: MegaphoneActionController, onMegaphoneVisible: (Megaphone) -> Unit ) { - val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE - val visible = remember(isLandscape, state) { - !(state.megaphone == Megaphone.NONE || state.mainToolbarMode != MainToolbarMode.FULL || isLandscape) + val windowSizeClass = WindowSizeClass.rememberWindowSizeClass() + val visible = remember(windowSizeClass, state) { + !(state.megaphone == Megaphone.NONE || state.mainToolbarMode != MainToolbarMode.FULL || windowSizeClass == WindowSizeClass.COMPACT_LANDSCAPE) } AnimatedVisibility(visible = visible) { @@ -57,8 +56,8 @@ fun MainMegaphoneContainer( ) } - LaunchedEffect(state, isLandscape) { - if (state.megaphone == Megaphone.NONE || state.mainToolbarMode == MainToolbarMode.BASIC || isLandscape) { + LaunchedEffect(state, windowSizeClass) { + if (state.megaphone == Megaphone.NONE || state.mainToolbarMode == MainToolbarMode.BASIC || windowSizeClass == WindowSizeClass.COMPACT_LANDSCAPE) { return@LaunchedEffect }