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
This commit is contained in:
mincheli
2021-05-25 08:33:56 +08:00
parent 0a40c03eb1
commit b5aac103c8
2 changed files with 26 additions and 10 deletions

View File

@@ -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;
}

View File

@@ -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 =