diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index 510a5d398f..1357d6023f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -415,6 +415,26 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner } } + val scope = rememberCoroutineScope() + BackHandler(paneExpansionState.currentAnchor == detailOnlyAnchor) { + scope.launch { + paneExpansionState.animateTo(listOnlyAnchor) + } + } + + LaunchedEffect(paneExpansionState.currentAnchor, detailOnlyAnchor, listOnlyAnchor, detailAndListAnchor) { + val isFullScreenPane = when (paneExpansionState.currentAnchor) { + listOnlyAnchor, detailOnlyAnchor -> { + true + } + else -> { + false + } + } + + mainNavigationViewModel.onPaneAnchorChanged(isFullScreenPane) + } + LaunchedEffect(paneExpansionState, detailOnlyAnchor, listOnlyAnchor, wrappedNavigator) { mainNavigationViewModel.detailLocation.collect { if (paneExpansionState.currentAnchor == listOnlyAnchor) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 502d451289..ba641d26bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -261,6 +261,7 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModelV2 import org.thoughtcrime.securesms.longmessage.LongMessageFragment import org.thoughtcrime.securesms.main.MainNavigationListLocation +import org.thoughtcrime.securesms.main.MainNavigationViewModel import org.thoughtcrime.securesms.main.VerticalInsets import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory @@ -491,6 +492,8 @@ class ConversationFragment : private val shareDataTimestampViewModel: ShareDataTimestampViewModel by activityViewModels() + private val mainNavigationViewModel: MainNavigationViewModel by activityViewModels() + private val inlineQueryController: InlineQueryResultsControllerV2 by lazy { InlineQueryResultsControllerV2( this, @@ -1401,16 +1404,37 @@ class ConversationFragment : } private fun presentNavigationIconForNormal() { - if (!resources.getWindowSizeClass().isSplitPane()) { + if (WindowSizeClass.isLargeScreenSupportEnabled()) { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + mainNavigationViewModel.isFullScreenPane.collect { isFullScreenPane -> + updateNavigationIconForNormal(isFullScreenPane) + } + } + } + } else { + updateNavigationIconForNormal(true) + } + } + + private fun updateNavigationIconForNormal(isFullScreenPane: Boolean) { + if (!resources.getWindowSizeClass().isSplitPane() || isFullScreenPane) { binding.toolbar.setNavigationIcon(R.drawable.symbol_arrow_start_24) binding.toolbar.setNavigationContentDescription(R.string.ConversationFragment__content_description_back_button) binding.toolbar.setNavigationOnClickListener { binding.root.hideKeyboard(composeText) requireActivity().onBackPressedDispatcher.onBackPressed() } + binding.toolbar.setContentInsetsRelative( + 46.dp, + binding.toolbar.contentInsetEnd + ) } else { binding.toolbar.navigationIcon = null - binding.toolbar.contentInsetStartWithNavigation = 0 + binding.toolbar.setContentInsetsRelative( + 24.dp, + binding.toolbar.contentInsetEnd + ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigationViewModel.kt index 22d7901969..5de9e45c08 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigationViewModel.kt @@ -69,6 +69,9 @@ class MainNavigationViewModel( private val internalMainNavigationState = MutableStateFlow(MainNavigationState(currentListLocation = initialListLocation)) val mainNavigationState: StateFlow = internalMainNavigationState + private val internalIsFullScreenPane = MutableStateFlow(false) + val isFullScreenPane: StateFlow = internalIsFullScreenPane + /** * This is Rx because these are still accessed from Java. */ @@ -121,6 +124,10 @@ class MainNavigationViewModel( } } + fun onPaneAnchorChanged(isFullScreenPane: Boolean) { + internalIsFullScreenPane.update { isFullScreenPane } + } + /** * Sets the navigator on the view-model. This wraps the given navigator in our own delegating implementation * such that we can react to navigateTo/Back signals and maintain proper state for internalDetailLocation.