Apply display cutout for chat list.

This commit is contained in:
Alex Hart
2025-04-15 15:24:09 -03:00
parent 250ac481c8
commit efac6990c8
3 changed files with 41 additions and 17 deletions

View File

@@ -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)
}

View File

@@ -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))
}

View File

@@ -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