diff options
| author | 2021-04-07 03:25:32 +0000 | |
|---|---|---|
| committer | 2021-04-07 03:25:32 +0000 | |
| commit | 7d8ae59fee9f4b88fe86fed843e5dc8a49ba9afd (patch) | |
| tree | 8caf6db910b55d481cebf2552838f925cdb4e103 | |
| parent | 086a0be6b2a360f9c823a596cba50867101a5a0f (diff) | |
| parent | 80a35549c84d053efa9df0d74958db0f79bda7b9 (diff) | |
Merge "Updates magnification button after an accessibility action is performed" into sc-dev
11 files changed, 138 insertions, 29 deletions
diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl index d0ab004d6cf3..1cb6825e426e 100644 --- a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl +++ b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl @@ -60,4 +60,11 @@ import android.graphics.Rect; */ void onPerformScaleAction(int displayId, float scale); + /** + * Called when the accessibility action is performed. + * + * @param displayId The logical display id. + */ + void onAccessibilityActionPerformed(int displayId); + } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index cdd69429132a..4f5fdc90e929 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -195,6 +195,13 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall } @Override + public void onAccessibilityActionPerformed(int displayId) { + if (mWindowMagnificationConnectionImpl != null) { + mWindowMagnificationConnectionImpl.onAccessibilityActionPerformed(displayId); + } + } + + @Override public void requestWindowMagnificationConnection(boolean connect) { if (connect) { setWindowMagnificationConnection(); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java index be7d75724442..2d620ab9e3c9 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java @@ -120,4 +120,14 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S } } } + + void onAccessibilityActionPerformed(int displayId) { + if (mConnectionCallback != null) { + try { + mConnectionCallback.onAccessibilityActionPerformed(displayId); + } catch (RemoteException e) { + Log.e(TAG, "Failed to inform an accessibility action is already performed", e); + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index 2b666f13efcc..48beea3804a4 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -756,31 +756,23 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold final float scale = mScale + A11Y_CHANGE_SCALE_DIFFERENCE; mWindowMagnifierCallback.onPerformScaleAction(mDisplayId, A11Y_ACTION_SCALE_RANGE.clamp(scale)); - return true; - } - if (action == R.id.accessibility_action_zoom_out) { + } else if (action == R.id.accessibility_action_zoom_out) { final float scale = mScale - A11Y_CHANGE_SCALE_DIFFERENCE; mWindowMagnifierCallback.onPerformScaleAction(mDisplayId, A11Y_ACTION_SCALE_RANGE.clamp(scale)); - return true; - } - if (action == R.id.accessibility_action_move_up) { + } else if (action == R.id.accessibility_action_move_up) { move(0, -mSourceBounds.height()); - return true; - } - if (action == R.id.accessibility_action_move_down) { + } else if (action == R.id.accessibility_action_move_down) { move(0, mSourceBounds.height()); - return true; - } - if (action == R.id.accessibility_action_move_left) { + } else if (action == R.id.accessibility_action_move_left) { move(-mSourceBounds.width(), 0); - return true; - } - if (action == R.id.accessibility_action_move_right) { + } else if (action == R.id.accessibility_action_move_right) { move(mSourceBounds.width(), 0); - return true; + } else { + return false; } - return false; + mWindowMagnifierCallback.onAccessibilityActionPerformed(mDisplayId); + return true; } } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java index fb1d1b6d7816..628a5e88b89e 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java @@ -46,4 +46,11 @@ interface WindowMagnifierCallback { * @param scale the target scale, or {@link Float#NaN} to leave unchanged */ void onPerformScaleAction(int displayId, float scale); + + /** + * Called when the accessibility action is performed. + * + * @param displayId The logical display id. + */ + void onAccessibilityActionPerformed(int displayId); } 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 9659610e7115..d3a2d2e3b5cc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -303,6 +303,19 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { } @Test + public void performA11yActions_visible_notifyAccessibilityActionPerformed() { + final int displayId = mContext.getDisplayId(); + mInstrumentation.runOnMainSync(() -> { + mWindowMagnificationController.enableWindowMagnification(2.5f, Float.NaN, + Float.NaN); + }); + + mMirrorView.performAccessibilityAction(R.id.accessibility_action_move_up, null); + + verify(mWindowMagnifierCallback).onAccessibilityActionPerformed(eq(displayId)); + } + + @Test public void onNavigationModeChanged_updateMirrorViewLayout() { mInstrumentation.runOnMainSync(() -> { mWindowMagnificationController.enableWindowMagnification(Float.NaN, Float.NaN, 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 ad1ce76cc36c..78331143af94 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java @@ -118,6 +118,16 @@ public class WindowMagnificationTest extends SysuiTestCase { } @Test + public void onAccessibilityActionPerformed_enabled_notifyCallback() throws RemoteException { + mCommandQueue.requestWindowMagnificationConnection(true); + waitForIdleSync(); + + mWindowMagnification.onAccessibilityActionPerformed(Display.DEFAULT_DISPLAY); + + verify(mConnectionCallback).onAccessibilityActionPerformed(eq(Display.DEFAULT_DISPLAY)); + } + + @Test public void onConfigurationChanged_updateModeSwitches() { final Configuration config = new Configuration(); config.densityDpi = Configuration.DENSITY_DPI_ANY; diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index 80408518d84e..f9aecd739d33 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -119,6 +119,11 @@ public class MagnificationController implements WindowMagnificationManager.Callb } @Override + public void onAccessibilityActionPerformed(int displayId) { + updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + } + + @Override public void onTouchInteractionStart(int displayId, int mode) { handleUserInteractionChanged(displayId, mode); } @@ -148,8 +153,13 @@ public class MagnificationController implements WindowMagnificationManager.Callb } private void updateMagnificationButton(int displayId, int mode) { - if (isActivated(displayId, mode) && mMagnificationCapabilities - == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) { + final boolean isActivated = isActivated(displayId, mode); + final boolean showButton; + synchronized (mLock) { + showButton = isActivated && mMagnificationCapabilities + == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; + } + if (showButton) { getWindowMagnificationMgr().showMagnificationButton(displayId, mode); } else { getWindowMagnificationMgr().removeMagnificationButton(displayId); @@ -430,13 +440,22 @@ public class MagnificationController implements WindowMagnificationManager.Callb private boolean isActivated(int displayId, int mode) { boolean isActivated = false; - if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN - && mFullScreenMagnificationController != null) { - isActivated = mFullScreenMagnificationController.isMagnifying(displayId) - || mFullScreenMagnificationController.isForceShowMagnifiableBounds(displayId); - } else if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW - && mWindowMagnificationMgr != null) { - isActivated = mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId); + if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { + synchronized (mLock) { + if (mFullScreenMagnificationController == null) { + return false; + } + isActivated = mFullScreenMagnificationController.isMagnifying(displayId) + || mFullScreenMagnificationController.isForceShowMagnifiableBounds( + displayId); + } + } else if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW) { + synchronized (mLock) { + if (mWindowMagnificationMgr == null) { + return false; + } + isActivated = mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId); + } } return isActivated; } diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java index 86f61eef2e7a..938cb73dac79 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -95,6 +95,13 @@ public class WindowMagnificationManager implements void onPerformScaleAction(int displayId, float scale); /** + * Called when the accessibility action is performed. + * + * @param displayId The logical display id. + */ + void onAccessibilityActionPerformed(int displayId); + + /** * Called when the state of the magnification activation is changed. * * @param displayId The logical display id. @@ -536,9 +543,12 @@ public class WindowMagnificationManager implements @Override public void onPerformScaleAction(int displayId, float scale) { - synchronized (mLock) { - mCallback.onPerformScaleAction(displayId, scale); - } + mCallback.onPerformScaleAction(displayId, scale); + } + + @Override + public void onAccessibilityActionPerformed(int displayId) { + mCallback.onAccessibilityActionPerformed(displayId); } @Override diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index 81be2e7d8cea..b7f5f4da9d9d 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -331,6 +331,29 @@ public class MagnificationControllerTest { } @Test + public void onAccessibilityActionPerformed_magnifierEnabled_showMagnificationButton() + throws RemoteException { + setMagnificationEnabled(MODE_WINDOW); + + mMagnificationController.onAccessibilityActionPerformed(TEST_DISPLAY); + + verify(mWindowMagnificationManager).showMagnificationButton(eq(TEST_DISPLAY), + eq(MODE_WINDOW)); + } + + @Test + public void onAccessibilityActionPerformed_capabilityNotAll_removeMagnificationButton() + throws RemoteException { + mMagnificationController.setMagnificationCapabilities( + ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + setMagnificationEnabled(MODE_WINDOW); + + mMagnificationController.onAccessibilityActionPerformed(TEST_DISPLAY); + + verify(mWindowMagnificationManager).removeMagnificationButton(eq(TEST_DISPLAY)); + } + + @Test public void onWindowMagnificationActivationState_windowActivated_logWindowDuration() { mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java index ffa0185b4542..a20272ab438d 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java @@ -313,6 +313,17 @@ public class WindowMagnificationManagerTest { } @Test + public void onAccessibilityActionPerformed_magnifierEnabled_notifyAction() + throws RemoteException { + mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); + mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN); + + mMockConnection.getConnectionCallback().onAccessibilityActionPerformed(TEST_DISPLAY); + + verify(mMockCallback).onAccessibilityActionPerformed(eq(TEST_DISPLAY)); + } + + @Test public void binderDied_windowMagnifierIsEnabled_resetState() throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, NaN, NaN); |