From 6613d5fccb875cd2634784409dbaa0a80d08d9f2 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 10 Apr 2025 13:10:37 -0300 Subject: [PATCH] Fix nav bar spacing and coloring. --- .../thoughtcrime/securesms/MainActivity.kt | 17 ++++------ .../securesms/main/MainNavigation.kt | 12 ++++--- .../main/NavigationBarSpacerCompat.kt | 34 +++++++++++++++++++ .../thoughtcrime/securesms/util/ViewUtil.java | 16 +++++---- 4 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index 1dcd83e2ee..405ec6a21e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -10,7 +10,6 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.Intent -import android.os.Build import android.os.Bundle import android.view.MotionEvent import android.view.View @@ -177,15 +176,13 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { AppStartup.getInstance().onCriticalRenderEventStart() - if (Build.VERSION.SDK_INT > 21) { - enableEdgeToEdge( - navigationBarStyle = if (DynamicTheme.isDarkTheme(this)) { - SystemBarStyle.dark(0) - } else { - SystemBarStyle.light(0, 0) - } - ) - } + enableEdgeToEdge( + navigationBarStyle = if (DynamicTheme.isDarkTheme(this)) { + SystemBarStyle.dark(0) + } else { + SystemBarStyle.light(0, 0) + } + ) conversationListTabsViewModel diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigation.kt b/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigation.kt index efeab9abbb..6561b09201 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigation.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainNavigation.kt @@ -12,9 +12,10 @@ import androidx.compose.animation.core.tween import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape @@ -101,13 +102,12 @@ fun MainNavigationBar( state: MainNavigationState, onDestinationSelected: (MainNavigationDestination) -> Unit ) { - Box(modifier = Modifier.background(color = SignalTheme.colors.colorSurface2)) { + Column(modifier = Modifier.background(color = SignalTheme.colors.colorSurface2)) { NavigationBar( containerColor = SignalTheme.colors.colorSurface2, contentColor = MaterialTheme.colorScheme.onSurface, - modifier = Modifier - .navigationBarsPadding() - .height(if (state.compact) 48.dp else 80.dp) + modifier = Modifier.height(if (state.compact) 48.dp else 80.dp), + windowInsets = WindowInsets(0, 0, 0, 0) ) { val entries = remember(state.isStoriesFeatureEnabled) { if (state.isStoriesFeatureEnabled) { @@ -144,6 +144,8 @@ fun MainNavigationBar( ) } } + + NavigationBarSpacerCompat() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt b/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt new file mode 100644 index 0000000000..877fe217f2 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/main/NavigationBarSpacerCompat.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +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 +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import org.signal.core.util.DimensionUnit +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)) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java index af256d61b8..646bd9d037 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java @@ -385,15 +385,19 @@ public final class ViewUtil { if (Build.VERSION.SDK_INT > 29 && rootWindowInsets != null) { return rootWindowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom; } else { - int result = 0; - int resourceId = view.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); - if (resourceId > 0) { - result = view.getResources().getDimensionPixelSize(resourceId); - } - return result; + return getNavigationBarHeight(view.getResources()); } } + public static int getNavigationBarHeight(@NonNull Resources resources) { + int result = 0; + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = resources.getDimensionPixelSize(resourceId); + } + return result; + } + public static void hideKeyboard(@NonNull Context context, @NonNull View view) { InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(view.getWindowToken(), 0);