From b5aac103c82f6caa17aad2f8ca8627d599001719 Mon Sep 17 00:00:00 2001 From: mincheli Date: Tue, 25 May 2021 08:33:56 +0800 Subject: [PATCH] Adjusts the draggable bounds with the display cutcout Some models support different display cutout by default. To make the magnification switch button not to overlap the display cutout and systemBars, we have to adjust the draggable bounds with the display cutout window insets. Bug: 189054814 Test: atest MagnificationModeSwitchTest, Manual test, Enable magnification settings and show the switch button. Go to System settings > Developer options > Display cutout Chaneg the cutout settings to monitor if the UI is expected Change-Id: Iaa0ae0ad828e8460ff1e62b1b6e4616245b86b58 --- .../MagnificationModeSwitch.java | 20 ++++++++++--------- .../MagnificationModeSwitchTest.java | 16 ++++++++++++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java index 964b135d7b50c..99cf095ef61d8 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java @@ -18,6 +18,7 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import android.annotation.NonNull; import android.annotation.UiContext; @@ -36,6 +37,7 @@ import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; +import android.view.WindowMetrics; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; @@ -362,21 +364,21 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL PixelFormat.TRANSPARENT); params.gravity = Gravity.TOP | Gravity.LEFT; params.accessibilityTitle = getAccessibilityWindowTitle(context); + params.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; return params; } private Rect getDraggableWindowBounds() { final int layoutMargin = mContext.getResources().getDimensionPixelSize( R.dimen.magnification_switch_button_margin); - final Rect boundRect = new Rect(mWindowManager.getCurrentWindowMetrics().getBounds()); - final Insets systemBars = - mWindowManager.getCurrentWindowMetrics().getWindowInsets() - .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars()); - final Rect insets = new Rect(layoutMargin, - systemBars.top + layoutMargin, - mParams.width + layoutMargin, - mParams.height + layoutMargin + systemBars.bottom); - boundRect.inset(insets); + final WindowMetrics windowMetrics = mWindowManager.getCurrentWindowMetrics(); + final Insets windowInsets = windowMetrics.getWindowInsets().getInsetsIgnoringVisibility( + WindowInsets.Type.systemBars() | WindowInsets.Type.displayCutout()); + final Rect boundRect = new Rect(windowMetrics.getBounds()); + boundRect.offsetTo(0, 0); + boundRect.inset(0, 0, mParams.width, mParams.height); + boundRect.inset(windowInsets); + boundRect.inset(layoutMargin, layoutMargin); return boundRect; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java index 936ec8021f5e7..2f3d62ae2bde6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java @@ -22,6 +22,7 @@ import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_UP; +import static android.view.WindowInsets.Type.displayCutout; import static android.view.WindowInsets.Type.systemBars; import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK; @@ -223,7 +224,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } @Test - public void onApplyWindowInsetsWithWindowInsetsChange_buttonIsShowing_draggableBoundsChanged() { + public void onSystemBarsInsetsChanged_buttonIsShowing_draggableBoundsChanged() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); final Rect oldDraggableBounds = new Rect(mMagnificationModeSwitch.mDraggableWindowBounds); @@ -235,6 +236,19 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { assertNotEquals(oldDraggableBounds, mMagnificationModeSwitch.mDraggableWindowBounds); } + @Test + public void onDisplayCutoutInsetsChanged_buttonIsShowing_draggableBoundsChanged() { + mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + final Rect oldDraggableBounds = new Rect(mMagnificationModeSwitch.mDraggableWindowBounds); + + mWindowManager.setWindowInsets(new WindowInsets.Builder() + .setInsetsIgnoringVisibility(displayCutout(), Insets.of(20, 30, 20, 30)) + .build()); + mSpyImageView.onApplyWindowInsets(WindowInsets.CONSUMED); + + assertNotEquals(oldDraggableBounds, mMagnificationModeSwitch.mDraggableWindowBounds); + } + @Test public void onDraggingGestureFinish_buttonIsShowing_stickToRightEdge() { final int windowHalfWidth =