diff options
5 files changed, 69 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index 911bf9ef757b..a705ec784c9a 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -37,6 +37,7 @@ import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.statusbar.CommandQueue; import javax.inject.Inject; @@ -66,7 +67,8 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall @Inject public WindowMagnification(Context context, @Main Handler mainHandler, - CommandQueue commandQueue, ModeSwitchesController modeSwitchesController) { + CommandQueue commandQueue, ModeSwitchesController modeSwitchesController, + NavigationModeController navigationModeController) { super(context); mHandler = mainHandler; mLastConfiguration = new Configuration(context.getResources().getConfiguration()); @@ -77,6 +79,9 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall final WindowMagnificationController controller = new WindowMagnificationController(mContext, mHandler, new SfVsyncFrameCallbackProvider(), null, new SurfaceControl.Transaction(), this); + final int navBarMode = navigationModeController.addListener( + controller::onNavigationModeChanged); + controller.onNavigationModeChanged(navBarMode); mWindowMagnificationAnimationController = new WindowMagnificationAnimationController( mContext, controller); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index 3832ff307d20..c3474bb7ca57 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -17,6 +17,8 @@ package com.android.systemui.accessibility; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import android.annotation.NonNull; import android.annotation.Nullable; @@ -117,6 +119,9 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold // The boundary of magnification frame. private final Rect mMagnificationFrameBoundary = new Rect(); + private int mNavBarMode; + private int mNavGestureHeight; + private final SfVsyncFrameCallbackProvider mSfVsyncFrameProvider; private Choreographer.FrameCallback mMirrorViewGeometryVsyncCallback; private Locale mLocale; @@ -195,6 +200,19 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold R.dimen.magnification_drag_view_size); mOuterBorderSize = mResources.getDimensionPixelSize( R.dimen.magnification_outer_border_margin); + updateNavigationBarDimensions(); + } + + private void updateNavigationBarDimensions() { + if (!supportsSwipeUpGesture()) { + mNavGestureHeight = 0; + return; + } + mNavGestureHeight = (mDisplaySize.x > mDisplaySize.y) + ? mResources.getDimensionPixelSize( + com.android.internal.R.dimen.navigation_bar_height_landscape) + : mResources.getDimensionPixelSize( + com.android.internal.R.dimen.navigation_bar_gesture_height); } /** @@ -239,6 +257,13 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } } + /** Handles MirrorWindow position when the navigation bar mode changed. */ + public void onNavigationModeChanged(int mode) { + mNavBarMode = mode; + updateNavigationBarDimensions(); + updateMirrorViewLayout(); + } + /** Handles MirrorWindow position when the device rotation changed. */ private void onRotate() { final Display display = mContext.getDisplay(); @@ -246,6 +271,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold display.getRealSize(mDisplaySize); setMagnificationFrameBoundary(); mRotation = display.getRotation(); + updateNavigationBarDimensions(); if (!isWindowVisible()) { return; @@ -401,15 +427,23 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold * moved close to the screen edges. */ private void updateMirrorViewLayout() { + if (!isWindowVisible()) { + return; + } + final int maxMirrorViewX = mDisplaySize.x - mMirrorView.getWidth(); + final int maxMirrorViewY = mDisplaySize.y - mMirrorView.getHeight() - mNavGestureHeight; WindowManager.LayoutParams params = (WindowManager.LayoutParams) mMirrorView.getLayoutParams(); params.x = mMagnificationFrame.left - mMirrorSurfaceMargin; params.y = mMagnificationFrame.top - mMirrorSurfaceMargin; + // If nav bar mode supports swipe-up gesture, the Y position of mirror view should not + // overlap nav bar window to prevent window-dragging obscured. + if (supportsSwipeUpGesture()) { + params.y = Math.min(params.y, maxMirrorViewY); + } // Translates MirrorView position to make MirrorSurfaceView that is inside MirrorView // able to move close to the screen edges. - final int maxMirrorViewX = mDisplaySize.x - mMirrorView.getWidth(); - final int maxMirrorViewY = mDisplaySize.y - mMirrorView.getHeight(); final float translationX; final float translationY; if (params.x < 0) { @@ -621,6 +655,10 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold return mMirrorView != null; } + private boolean supportsSwipeUpGesture() { + return mNavBarMode == NAV_BAR_MODE_2BUTTON || mNavBarMode == NAV_BAR_MODE_GESTURAL; + } + private CharSequence formatStateDescription(float scale) { // Cache the locale-appropriate NumberFormat. Configuration locale is guaranteed // non-null, so the first time this is called we will always get the appropriate diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java index 1e969c226ff1..fa78d1cc0191 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java @@ -36,6 +36,7 @@ import android.view.accessibility.IWindowMagnificationConnectionCallback; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.statusbar.CommandQueue; import org.junit.Before; @@ -65,6 +66,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { @Mock private ModeSwitchesController mModeSwitchesController; @Mock + private NavigationModeController mNavigationModeController; + @Mock private IRemoteMagnificationAnimationCallback mAnimationCallback; private IWindowMagnificationConnection mIWindowMagnificationConnection; private WindowMagnification mWindowMagnification; @@ -79,7 +82,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { }).when(mAccessibilityManager).setWindowMagnificationConnection( any(IWindowMagnificationConnection.class)); mWindowMagnification = new WindowMagnification(getContext(), - getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController); + getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, + mNavigationModeController); mWindowMagnification.mWindowMagnificationAnimationController = mWindowMagnificationAnimationController; mWindowMagnification.requestWindowMagnificationConnection(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java index c6440f4290fd..5f2fd697b86d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -17,6 +17,7 @@ package com.android.systemui.accessibility; import static android.view.Choreographer.FrameCallback; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import static org.hamcrest.Matchers.containsString; @@ -28,6 +29,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; @@ -294,4 +296,15 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { assertTrue( mMirrorView.performAccessibilityAction(R.id.accessibility_action_move_left, null)); } + + @Test + public void onNavigationModeChanged_updateMirrorViewLayout() { + mInstrumentation.runOnMainSync(() -> { + mWindowMagnificationController.enableWindowMagnification(Float.NaN, Float.NaN, + Float.NaN); + mWindowMagnificationController.onNavigationModeChanged(NAV_BAR_MODE_GESTURAL); + }); + + verify(mWindowManager).updateViewLayout(eq(mMirrorView), any()); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java index 936558bca2d2..4a0e216ae87e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java @@ -35,6 +35,7 @@ import android.view.accessibility.IWindowMagnificationConnectionCallback; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.statusbar.CommandQueue; import org.junit.Before; @@ -53,6 +54,8 @@ public class WindowMagnificationTest extends SysuiTestCase { private AccessibilityManager mAccessibilityManager; @Mock private ModeSwitchesController mModeSwitchesController; + @Mock + private NavigationModeController mNavigationModeController; private CommandQueue mCommandQueue; private WindowMagnification mWindowMagnification; @@ -63,7 +66,8 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue = new CommandQueue(getContext()); mWindowMagnification = new WindowMagnification(getContext(), - getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController); + getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, + mNavigationModeController); mWindowMagnification.start(); } |