From 443463aca89af5eb21f5a67a9059d1edbe8fec5c Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 28 Oct 2025 14:51:20 -0300 Subject: [PATCH] Set pane role when we move to a fullscreen anchor. --- .../thoughtcrime/securesms/MainActivity.kt | 32 +++++++++++-------- .../securesms/main/MainNavigationViewModel.kt | 9 +++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index 61f84a8c5a..e621b949d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -67,8 +67,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.merge import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.signal.core.ui.compose.theme.SignalTheme @@ -448,22 +446,30 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner mainNavigationViewModel.onPaneAnchorChanged(isFullScreenPane) } - LaunchedEffect(paneExpansionState, detailOnlyAnchor, listOnlyAnchor, wrappedNavigator) { - mainNavigationViewModel.detailLocation.collect { - if (paneExpansionState.currentAnchor == listOnlyAnchor) { - paneExpansionState.animateTo(detailOnlyAnchor) + LaunchedEffect(paneExpansionState.currentAnchor) { + when (paneExpansionState.currentAnchor) { + listOnlyAnchor -> { + mainNavigationViewModel.setFocusedPane(ThreePaneScaffoldRole.Secondary) } + detailOnlyAnchor -> { + mainNavigationViewModel.setFocusedPane(ThreePaneScaffoldRole.Primary) + } + else -> Unit } } - LaunchedEffect(paneExpansionState, detailOnlyAnchor, listOnlyAnchor, wrappedNavigator) { - val a = mainNavigationViewModel.mainNavigationState.map { it.currentListLocation } - val b = mainNavigationViewModel.tabClickEvents + val paneFocusRequest by mainNavigationViewModel.paneFocusRequests.collectAsStateWithLifecycle(null) + LaunchedEffect(paneFocusRequest) { + if (paneFocusRequest == null) { + return@LaunchedEffect + } - merge(a, b).collect { - if (paneExpansionState.currentAnchor == detailOnlyAnchor) { - paneExpansionState.animateTo(listOnlyAnchor) - } + if (paneFocusRequest == ThreePaneScaffoldRole.Secondary && paneExpansionState.currentAnchor == detailOnlyAnchor) { + paneExpansionState.animateTo(listOnlyAnchor) + } + + if (paneFocusRequest == ThreePaneScaffoldRole.Primary && paneExpansionState.currentAnchor == listOnlyAnchor) { + paneExpansionState.animateTo(detailOnlyAnchor) } } 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 b19a7d333e..d20c273cd7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigationViewModel.kt @@ -81,13 +81,15 @@ class MainNavigationViewModel( * This is Rx because these are still accessed from Java. */ private val internalTabClickEvents: MutableSharedFlow = MutableSharedFlow() - val tabClickEvents: SharedFlow = internalTabClickEvents val tabClickEventsObservable: Observable = internalTabClickEvents.asObservable() private var earlyNavigationListLocationRequested: MainNavigationListLocation? = null var earlyNavigationDetailLocationRequested: MainNavigationDetailLocation? = null private set + private val internalPaneFocusRequests = MutableSharedFlow() + val paneFocusRequests: SharedFlow = internalPaneFocusRequests + private var earlyFocusedPaneRequested: ThreePaneScaffoldRole? = null /** @@ -180,6 +182,10 @@ class MainNavigationViewModel( navigatorScope?.launch { navigator?.navigateTo(roleToGoTo) } + + viewModelScope.launch { + internalPaneFocusRequests.emit(roleToGoTo) + } } /** @@ -278,6 +284,7 @@ class MainNavigationViewModel( viewModelScope.launch { val currentTab = internalMainNavigationState.value.currentListLocation if (currentTab == destination) { + internalPaneFocusRequests.emit(ThreePaneScaffoldRole.Secondary) internalTabClickEvents.emit(destination) } else { setFocusedPane(ThreePaneScaffoldRole.Secondary)