From efac6990c835c7a955d3090378fd76718e9d2250 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 15 Apr 2025 15:24:09 -0300 Subject: [PATCH] Apply display cutout for chat list. --- .../thoughtcrime/securesms/MainActivity.kt | 33 +++++++++++++++++-- .../main/NavigationBarSpacerCompat.kt | 18 +++------- .../securesms/window/AppScaffold.kt | 7 ++-- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index 405ec6a21e..a987c4627f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -23,13 +23,17 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.BoxWithConstraintsScope import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.displayCutoutPadding import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi import androidx.compose.material3.adaptive.layout.ThreePaneScaffoldRole import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator +import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.key @@ -39,7 +43,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.fragment.app.DialogFragment import androidx.fragment.compose.AndroidFragment @@ -245,7 +248,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner } } - SignalTheme(isDarkMode = DynamicTheme.isDarkTheme(LocalContext.current)) { + MainContainer { AppScaffold( navigator = scaffoldNavigator, bottomNavContent = { @@ -339,6 +342,32 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner lifecycleDisposable += vitalsViewModel.vitalsState.subscribe(this::presentVitalsState) } + @Composable + private fun MainContainer(content: @Composable BoxWithConstraintsScope.() -> Unit) { + val windowSizeClass = WindowSizeClass.rememberWindowSizeClass() + val modifier = if (windowSizeClass.isLandscape()) { + Modifier.displayCutoutPadding() + } else { + Modifier + } + + val backgroundColor = if (windowSizeClass.isCompact()) { + MaterialTheme.colorScheme.surface + } else { + SignalTheme.colors.colorSurface1 + } + + SignalTheme(isDarkMode = DynamicTheme.isDarkTheme(this)) { + BoxWithConstraints( + modifier = Modifier + .background(color = backgroundColor) + .then(modifier) + ) { + content() + } + } + } + override fun getIntent(): Intent { return super.getIntent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt b/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt index 877fe217f2..62aad858ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt @@ -5,12 +5,8 @@ package org.thoughtcrime.securesms.main -import android.os.Build import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -21,14 +17,10 @@ import org.thoughtcrime.securesms.util.ViewUtil @Composable fun NavigationBarSpacerCompat() { - if (Build.VERSION.SDK_INT > 23) { - Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars)) - } else { - val resources = LocalContext.current.resources - val navigationBarHeight = remember(resources) { - DimensionUnit.PIXELS.toDp(ViewUtil.getNavigationBarHeight(resources).toFloat()).dp - } - - Spacer(Modifier.height(navigationBarHeight)) + val resources = LocalContext.current.resources + val navigationBarHeight = remember(resources) { + DimensionUnit.PIXELS.toDp(ViewUtil.getNavigationBarHeight(resources).toFloat()).dp } + + Spacer(Modifier.height(navigationBarHeight)) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt b/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt index 1998fd9ea3..ac7c59bd52 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt @@ -65,8 +65,9 @@ enum class WindowSizeClass( fun isMedium(): Boolean = this == MEDIUM_PORTRAIT || this == MEDIUM_LANDSCAPE fun isExtended(): Boolean = this == EXTENDED_PORTRAIT || this == EXTENDED_LANDSCAPE - companion object { + fun isLandscape(): Boolean = this == COMPACT_LANDSCAPE || this == MEDIUM_LANDSCAPE || this == EXTENDED_LANDSCAPE + companion object { @OptIn(ExperimentalWindowCoreApi::class) fun Resources.getWindowSizeClass(): WindowSizeClass { val orientation = configuration.orientation @@ -98,7 +99,9 @@ enum class WindowSizeClass( val orientation = LocalConfiguration.current.orientation if (forceCompact) { - return getCompactSizeClassForOrientation(orientation) + return remember(orientation) { + getCompactSizeClassForOrientation(orientation) + } } val wsc = currentWindowAdaptiveInfo().windowSizeClass