diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java index 68a29ff78..b5e6ecdee 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListArchiveActivity.java @@ -23,7 +23,6 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar protected void onCreate(Bundle icicle, boolean ready) { setContentView(R.layout.activity_conversation_list_archive); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setElevation(0); // TODO: use custom toolbar instead if (isRelayingMessageContent(this)) { getSupportActionBar().setTitle(isSharing(this) ? R.string.chat_share_with_title : R.string.forward_to); getSupportActionBar().setSubtitle(R.string.chat_archived_label); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java index ea928ec74..b58982ced 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListFragment.java @@ -108,6 +108,11 @@ public class ConversationListFragment extends BaseConversationListFragment emptyState = ViewUtil.findById(view, R.id.empty_state); emptySearch = ViewUtil.findById(view, R.id.empty_search); + // allow content to be drawn behind the navigation bar + list.setClipToPadding(false); + // add padding to avoid content hidden behind system bars + ViewUtil.applyWindowInsets(list); + if (archive) { fab.setVisibility(View.GONE); TextView emptyTitle = ViewUtil.findById(view, R.id.empty_title); @@ -115,6 +120,8 @@ public class ConversationListFragment extends BaseConversationListFragment } else { fab.setVisibility(View.VISIBLE); } + // Apply insets to prevent fab from being covered by system bars + ViewUtil.applyWindowInsetsAsMargin(fab); list.setHasFixedSize(true); list.setLayoutManager(new LinearLayoutManager(getActivity())); diff --git a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java index e377e298c..dcebfc061 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java +++ b/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java @@ -297,6 +297,74 @@ public class ViewUtil { return selection; } + /** + * Apply window insets to a view by adding margin to avoid drawing it behind system bars. + * Convenience method that applies insets to all sides. + * + * @param view The view to apply insets to + */ + public static void applyWindowInsetsAsMargin(@NonNull View view) { + applyWindowInsetsAsMargin(view, true, true, true, true); + } + + /** + * Apply window insets to a view by adding margin to avoid drawing it behind system bars. + * + * This method stores the original margin values in view tags to ensure that + * margin doesn't accumulate on multiple inset applications. + * + * @param view The view to apply insets to + * @param left Whether to apply left inset + * @param top Whether to apply top inset + * @param right Whether to apply right inset + * @param bottom Whether to apply bottom inset + */ + public static void applyWindowInsetsAsMargin(@NonNull View view, boolean left, boolean top, boolean right, boolean bottom) { + // Store the original margin as a tag only if not already stored + // This prevents losing the true original margin on subsequent calls + if (view.getTag(R.id.tag_window_insets_margin_left) == null) { + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (params instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams marginParams = (ViewGroup.MarginLayoutParams) params; + view.setTag(R.id.tag_window_insets_margin_left, marginParams.leftMargin); + view.setTag(R.id.tag_window_insets_margin_top, marginParams.topMargin); + view.setTag(R.id.tag_window_insets_margin_right, marginParams.rightMargin); + view.setTag(R.id.tag_window_insets_margin_bottom, marginParams.bottomMargin); + } + } + + ViewCompat.setOnApplyWindowInsetsListener(view, (v, windowInsets) -> { + Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + + // Retrieve the original margin values from tags with null checks + Integer leftTag = (Integer) v.getTag(R.id.tag_window_insets_margin_left); + Integer topTag = (Integer) v.getTag(R.id.tag_window_insets_margin_top); + Integer rightTag = (Integer) v.getTag(R.id.tag_window_insets_margin_right); + Integer bottomTag = (Integer) v.getTag(R.id.tag_window_insets_margin_bottom); + int baseMarginLeft = leftTag != null ? leftTag : 0; + int baseMarginTop = topTag != null ? topTag : 0; + int baseMarginRight = rightTag != null ? rightTag : 0; + int baseMarginBottom = bottomTag != null ? bottomTag : 0; + + ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); + if (layoutParams instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams marginParams = (ViewGroup.MarginLayoutParams) layoutParams; + marginParams.leftMargin = baseMarginLeft + insets.left; + marginParams.topMargin = baseMarginTop + insets.top; + marginParams.rightMargin = baseMarginRight + insets.right; + marginParams.bottomMargin = baseMarginBottom + insets.bottom; + v.setLayoutParams(marginParams); + } + + return windowInsets; + }); + + // Request the initial insets to be dispatched if the view is attached + if (view.isAttachedToWindow()) { + ViewCompat.requestApplyInsets(view); + } + } + /** * Apply window insets to a view by adding padding to avoid drawing elements behind system bars. * Convenience method that applies insets to all sides. diff --git a/src/main/res/layout/activity_conversation_list_archive.xml b/src/main/res/layout/activity_conversation_list_archive.xml index 5dc280304..acddaa01c 100644 --- a/src/main/res/layout/activity_conversation_list_archive.xml +++ b/src/main/res/layout/activity_conversation_list_archive.xml @@ -1,15 +1,14 @@ - + + - + diff --git a/src/main/res/values/ids.xml b/src/main/res/values/ids.xml index 8fd950072..04bea7171 100644 --- a/src/main/res/values/ids.xml +++ b/src/main/res/values/ids.xml @@ -5,4 +5,10 @@ + + + + + +