diff --git a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java index a7c67dc592..783b27aea7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java @@ -139,7 +139,7 @@ public final class AvatarPreviewActivity extends PassphraseRequiredActivity { findViewById(android.R.id.content).setOnClickListener(v -> fullscreenHelper.toggleUiVisibility()); - fullscreenHelper.configureToolbarSpacer(findViewById(R.id.toolbar_cutout_spacer)); + fullscreenHelper.configureToolbarLayout(findViewById(R.id.toolbar_cutout_spacer), toolbar); fullscreenHelper.showAndHideWithSystemUI(getWindow(), findViewById(R.id.toolbar_layout)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java index 71cb8ee38d..90ff8709d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MediaPreviewActivity.java @@ -288,7 +288,7 @@ public final class MediaPreviewActivity extends PassphraseRequiredActivity anchorMarginsToBottomInsets(detailsContainer); - fullscreenHelper.configureToolbarSpacer(findViewById(R.id.toolbar_cutout_spacer)); + fullscreenHelper.configureToolbarLayout(findViewById(R.id.toolbar_cutout_spacer), findViewById(R.id.toolbar)); fullscreenHelper.showAndHideWithSystemUI(getWindow(), detailsContainer, toolbarLayout); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java index 5b50d9f7c9..3141409061 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FullscreenHelper.java @@ -1,18 +1,26 @@ package org.thoughtcrime.securesms.util; +import android.annotation.SuppressLint; import android.app.Activity; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.content.res.Resources; import android.os.Build; +import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import androidx.annotation.NonNull; +import androidx.core.graphics.Insets; +import androidx.core.view.DisplayCutoutCompat; import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; /** * Encapsulates logic to properly show/hide system UI/chrome in a full screen setting. Also - * handles adjusting to notched devices as long as you call {@link #configureToolbarSpacer(View)}. + * handles adjusting to notched devices as long as you call {@link #configureToolbarLayout(View, View)}. */ public final class FullscreenHelper { @@ -28,9 +36,11 @@ public final class FullscreenHelper { showSystemUI(); } - public void configureToolbarSpacer(@NonNull View spacer) { + public void configureToolbarLayout(@NonNull View spacer, @NonNull View toolbar) { if (Build.VERSION.SDK_INT == 19) { setSpacerHeight(spacer, ViewUtil.getStatusBarHeight(spacer)); + int[] padding = makePaddingValuesForAPI19(); + toolbar.setPadding(padding[0], 0, padding[1], 0); return; } @@ -38,6 +48,12 @@ public final class FullscreenHelper { setSpacerHeight(view, insets.getSystemWindowInsetTop()); return insets; }); + + ViewCompat.setOnApplyWindowInsetsListener(toolbar, (view, insets) -> { + int[] padding = makePaddingValues(insets); + toolbar.setPadding(padding[0], 0, padding[1], 0); + return insets; + }); } private void setSpacerHeight(@NonNull View spacer, int height) { @@ -49,6 +65,41 @@ public final class FullscreenHelper { spacer.setVisibility(View.VISIBLE); } + @SuppressLint("SwitchIntDef") + private int[] makePaddingValuesForAPI19() { + int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); + if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) { + return new int[]{0, 0}; + } + + Resources resources = activity.getResources(); + int statusBarHeightId = resources.getIdentifier("status_bar_height", "dimen", "android"); + int navBarHeightId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + int statusBarHeight = resources.getDimensionPixelSize(statusBarHeightId); + int navBarHeight = resources.getDimensionPixelSize(navBarHeightId); + + switch (rotation) { + case Surface.ROTATION_90: + return new int[]{statusBarHeight, navBarHeight}; + case Surface.ROTATION_270: + return new int[]{navBarHeight, statusBarHeight}; + default: + return new int[]{0, 0}; + } + } + + private int[] makePaddingValues(WindowInsetsCompat insets) { + Insets tappable = insets.getTappableElementInsets(); + DisplayCutoutCompat cutout = insets.getDisplayCutout(); + + int leftPad = cutout == null ? tappable.left + : Math.max(tappable.left, cutout.getSafeInsetLeft()); + int rightPad = cutout == null ? tappable.right + : Math.max(tappable.right, cutout.getSafeInsetRight()); + + return new int[]{leftPad, rightPad}; + } + public void showAndHideWithSystemUI(@NonNull Window window, @NonNull View... views) { window.getDecorView().setOnSystemUiVisibilityChangeListener(visibility -> { boolean hide = (visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;