From 8d492d895e2f334fd761be172b7d6414ff794d24 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Wed, 20 Jul 2022 16:26:38 +0200 Subject: [PATCH] Apply navigation bars insets to the fullscreen dialog This CL ensures that we apply the navigation/task bars instead of fullscreen dialogs animated by DialogLaunchAnimator to the fullscreen View (that is the parent of the dialog content + background) and not to the Dialog DecorView. This prevents the dialog from being clipped by the navigation/task bars insets when animating. Bug: 232063468 Test: Manual Change-Id: I3e98205a2b3da0f5536a48601b39620e7933b9c9 --- .../animation/DialogLaunchAnimator.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt index dbdbdf6ee2ba5..2f36ab9aa93dc 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt @@ -515,11 +515,20 @@ private class AnimatedDialog( dialogContentWithBackground.setTransitionVisibility(View.INVISIBLE) // Make sure the dialog is visible instantly and does not do any window animation. - window.attributes.windowAnimations = R.style.Animation_LaunchAnimation + val attributes = window.attributes + attributes.windowAnimations = R.style.Animation_LaunchAnimation // Ensure that the animation is not clipped by the display cut-out when animating this // dialog into an app. - window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS + attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS + + // Ensure that the animation is not clipped by the navigation/task bars when animating this + // dialog into an app. + val wasFittingNavigationBars = + attributes.fitInsetsTypes and WindowInsets.Type.navigationBars() != 0 + attributes.fitInsetsTypes = + attributes.fitInsetsTypes and WindowInsets.Type.navigationBars().inv() + window.attributes = window.attributes // We apply the insets ourselves to make sure that the paddings are set on the correct @@ -527,7 +536,13 @@ private class AnimatedDialog( window.setDecorFitsSystemWindows(false) val viewWithInsets = (dialogContentWithBackground.parent as ViewGroup) viewWithInsets.setOnApplyWindowInsetsListener { view, windowInsets -> - val insets = windowInsets.getInsets(WindowInsets.Type.displayCutout()) + val type = if (wasFittingNavigationBars) { + WindowInsets.Type.displayCutout() or WindowInsets.Type.navigationBars() + } else { + WindowInsets.Type.displayCutout() + } + + val insets = windowInsets.getInsets(type) view.setPadding(insets.left, insets.top, insets.right, insets.bottom) WindowInsets.CONSUMED }