From 9892c4392e3361fd41463c75cfaad3d02fee920e Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 12 Aug 2020 13:00:48 -0400 Subject: [PATCH] Fix janky avatar preview transition for notched devices. --- .../securesms/AvatarPreviewActivity.java | 46 +++++++++++++++++-- .../layout/contact_photo_preview_activity.xml | 8 +++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java index 10cdb642d..3156dda22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms; +import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -9,7 +10,10 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.transition.TransitionInflater; +import android.view.DisplayCutout; import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; @@ -72,15 +76,19 @@ public final class AvatarPreviewActivity extends PassphraseRequiredActivity { getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.full_screen_avatar_image_return_transition_set)); } - Toolbar toolbar = findViewById(R.id.toolbar); - - ImageView avatar = findViewById(R.id.avatar); + Toolbar toolbar = findViewById(R.id.toolbar); + ImageView avatar = findViewById(R.id.avatar); setSupportActionBar(toolbar); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + if (Build.VERSION.SDK_INT >= 28) { + getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + toolbar.getViewTreeObserver().addOnGlobalLayoutListener(new DisplayCutoutAdjuster(toolbar, findViewById(R.id.toolbar_cutout_spacer))); + } + showSystemUI(); getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -180,4 +188,36 @@ public final class AvatarPreviewActivity extends PassphraseRequiredActivity { onBackPressed(); return true; } + + /** + * Adjust a spacer for the toolbar when a display cutout is detected. Runs within + * a layout listener because the activity delays view attachment due to the transitions + * and needs to update on device rotation. + */ + @TargetApi(28) + private static class DisplayCutoutAdjuster implements ViewTreeObserver.OnGlobalLayoutListener { + + private final View view; + private final View spacer; + + private DisplayCutoutAdjuster(@NonNull View view, @NonNull View spacer) { + this.view = view; + this.spacer = spacer; + } + + @Override + public void onGlobalLayout() { + if (view.getRootWindowInsets() == null) { + return; + } + + DisplayCutout cutout = view.getRootWindowInsets().getDisplayCutout(); + if (cutout != null) { + ViewGroup.LayoutParams params = spacer.getLayoutParams(); + params.height = cutout.getSafeInsetTop(); + spacer.setLayoutParams(params); + spacer.setVisibility(View.VISIBLE); + } + } + } } diff --git a/app/src/main/res/layout/contact_photo_preview_activity.xml b/app/src/main/res/layout/contact_photo_preview_activity.xml index 1fed20c45..63870e169 100644 --- a/app/src/main/res/layout/contact_photo_preview_activity.xml +++ b/app/src/main/res/layout/contact_photo_preview_activity.xml @@ -14,7 +14,7 @@ android:adjustViewBounds="true" android:scaleType="centerCrop" android:transitionName="avatar" - tools:src="@drawable/ic_signal_downloading" /> + tools:src="@tools:sample/avatars" /> + +