Add support for resizing pane on main activity.

This commit is contained in:
Alex Hart
2025-08-22 09:00:29 -03:00
committed by Michelle Tang
parent 47fb0deca4
commit 114524adc6
3 changed files with 140 additions and 28 deletions

View File

@@ -25,6 +25,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.BoxWithConstraintsScope
@@ -36,10 +37,8 @@ import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective
import androidx.compose.material3.adaptive.layout.rememberPaneExpansionState
import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator
import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -145,8 +144,10 @@ import org.thoughtcrime.securesms.util.SplashScreenUtil
import org.thoughtcrime.securesms.util.TopToastPopup
import org.thoughtcrime.securesms.util.Util
import org.thoughtcrime.securesms.util.viewModel
import org.thoughtcrime.securesms.window.AppPaneDragHandle
import org.thoughtcrime.securesms.window.AppScaffold
import org.thoughtcrime.securesms.window.WindowSizeClass
import org.thoughtcrime.securesms.window.rememberAppScaffoldNavigator
import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState
class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner, MainNavigator.NavigatorProvider, Material3OnScrollHelperBinder, ConversationListFragment.Callback, CallLogFragment.Callback {
@@ -318,9 +319,12 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
MainContainer {
val wrappedNavigator = rememberNavigator(windowSizeClass, contentLayoutData, maxWidth)
val paneExpansionState = rememberPaneExpansionState()
val mutableInteractionSource = remember { MutableInteractionSource() }
AppScaffold(
navigator = wrappedNavigator,
paneExpansionState = paneExpansionState,
bottomNavContent = {
if (isNavigationVisible) {
Column(
@@ -379,6 +383,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
modifier = Modifier.fillMaxSize()
)
}
MainNavigationListLocation.ARCHIVE -> {
val state = key(destination) { rememberFragmentState() }
AndroidFragment(
@@ -387,6 +392,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
modifier = Modifier.fillMaxSize()
)
}
MainNavigationListLocation.CALLS -> {
val state = key(destination) { rememberFragmentState() }
AndroidFragment(
@@ -395,6 +401,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
modifier = Modifier.fillMaxSize()
)
}
MainNavigationListLocation.STORIES -> {
val state = key(destination) { rememberFragmentState() }
AndroidFragment(
@@ -448,7 +455,12 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
},
paneExpansionDragHandle = if (contentLayoutData.hasDragHandle()) {
{ }
{
AppPaneDragHandle(
paneExpansionState = paneExpansionState,
mutableInteractionSource = mutableInteractionSource
)
}
} else null
)
}
@@ -488,14 +500,10 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
contentLayoutData: MainContentLayoutData,
maxWidth: Dp
): ThreePaneScaffoldNavigator<Any> {
val scaffoldNavigator = rememberListDetailPaneScaffoldNavigator<Any>(
scaffoldDirective = calculatePaneScaffoldDirective(
currentWindowAdaptiveInfo()
).copy(
maxHorizontalPartitions = if (windowSizeClass.isSplitPane()) 2 else 1,
horizontalPartitionSpacerSize = contentLayoutData.partitionWidth,
defaultPanePreferredWidth = contentLayoutData.rememberDefaultPanePreferredWidth(maxWidth)
)
val scaffoldNavigator = rememberAppScaffoldNavigator(
isSplitPane = windowSizeClass.isSplitPane(),
horizontalPartitionSpacerSize = contentLayoutData.partitionWidth,
defaultPanePreferredWidth = contentLayoutData.rememberDefaultPanePreferredWidth(maxWidth)
)
val coroutine = rememberCoroutineScope()
@@ -506,6 +514,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
is MainNavigationDetailLocation.Conversation -> {
startActivity(detailLocation.intent)
}
MainNavigationDetailLocation.Empty -> Unit
}
}
@@ -524,7 +533,9 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
val modifier = if (windowSizeClass.isSplitPane()) {
Modifier.systemBarsPadding().displayCutoutPadding()
Modifier
.systemBarsPadding()
.displayCutoutPadding()
} else {
Modifier
}