diff --git a/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java b/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java
index fd16cfd0d..c0628b5e2 100644
--- a/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java
+++ b/src/main/java/org/thoughtcrime/securesms/BaseActionBarActivity.java
@@ -45,6 +45,19 @@ public abstract class BaseActionBarActivity extends AppCompatActivity {
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
+ // Apply window insets for edge-to-edge display
+ // The toolbar/app bar should extend behind the status bar with padding applied
+ View toolbar = findViewById(R.id.toolbar);
+ if (toolbar != null) {
+ // Check if toolbar is inside an AppBarLayout
+ View parent = (View) toolbar.getParent();
+ if (parent instanceof com.google.android.material.appbar.AppBarLayout) {
+ ViewUtil.applyWindowInsets(parent, true, true, true, false);
+ } else {
+ ViewUtil.applyWindowInsets(toolbar, true, true, true, false);
+ }
+ }
+
// For activities without a custom toolbar, apply insets to status_bar_background view
View statusBarBackground = findViewById(R.id.status_bar_background);
if (statusBarBackground != null) {
diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java
index b58982ced..79839993b 100644
--- a/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java
+++ b/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java
@@ -111,7 +111,7 @@ public class ConversationListFragment extends BaseConversationListFragment
// allow content to be drawn behind the navigation bar
list.setClipToPadding(false);
// add padding to avoid content hidden behind system bars
- ViewUtil.applyWindowInsets(list);
+ ViewUtil.applyWindowInsets(list, true, archive, true, true);
if (archive) {
fab.setVisibility(View.GONE);
diff --git a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
index dcebfc061..cb1ee8436 100644
--- a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
+++ b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
@@ -297,6 +297,18 @@ public class ViewUtil {
return selection;
}
+ /**
+ * Get combined insets from status bar, navigation bar and display cutout areas.
+ *
+ * @param windowInsets The window insets to extract from
+ * @return Combined insets using the maximum values from system bars and display cutout
+ */
+ private static Insets getCombinedInsets(@NonNull WindowInsetsCompat windowInsets) {
+ Insets systemBars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ Insets displayCutout = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout());
+ return Insets.max(systemBars, displayCutout);
+ }
+
/**
* Apply window insets to a view by adding margin to avoid drawing it behind system bars.
* Convenience method that applies insets to all sides.
@@ -334,7 +346,7 @@ public class ViewUtil {
}
ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> {
- Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ Insets insets = getCombinedInsets(windowInsets);
// Retrieve the original margin values from tags with null checks
Integer leftTag = (Integer) v.getTag(R.id.tag_window_insets_margin_left);
@@ -398,7 +410,7 @@ public class ViewUtil {
}
ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> {
- Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ Insets insets = getCombinedInsets(windowInsets);
// Retrieve the original padding values from tags with null checks
Integer leftTag = (Integer) v.getTag(R.id.tag_window_insets_padding_left);
@@ -434,7 +446,7 @@ public class ViewUtil {
*/
public static void applyWindowInsetsAsHeight(@NonNull View view) {
ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> {
- Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ Insets insets = getCombinedInsets(windowInsets);
android.view.ViewGroup.LayoutParams params = v.getLayoutParams();
if (params != null) {
diff --git a/src/main/res/layout/conversation_list_activity.xml b/src/main/res/layout/conversation_list_activity.xml
index 78e5b568c..dab3f40d9 100644
--- a/src/main/res/layout/conversation_list_activity.xml
+++ b/src/main/res/layout/conversation_list_activity.xml
@@ -4,8 +4,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@id/container"
android:orientation="vertical"
- android:background="?attr/colorPrimary"
- android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -13,7 +11,7 @@
android:id="@+id/toolbar"
android:layout_alignParentTop="true"
android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
+ android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:contentInsetStart="0dp"
@@ -95,9 +93,7 @@
+ android:layout_height="match_parent"/>