diff options
9 files changed, 126 insertions, 17 deletions
diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl index 62d029bd1be6..8a30f8cebc3d 100644 --- a/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl +++ b/core/java/android/view/accessibility/IWindowMagnificationConnection.aidl @@ -103,6 +103,13 @@ oneway interface IWindowMagnificationConnection { void removeMagnificationButton(int displayId); /** + * Requests System UI remove magnification settings panel on the specified display. + * + * @param displayId the logical display id. + */ + void removeMagnificationSettingsPanel(int displayId); + + /** * Sets {@link IWindowMagnificationConnectionCallback} to receive the request or the callback. * * @param callback the interface to be called. diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java index 18e576e3e611..c081893eac8b 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java @@ -94,6 +94,11 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S } @Override + public void removeMagnificationSettingsPanel(int display) { + mHandler.post(() -> mWindowMagnification.hideMagnificationSettingsPanel(display)); + } + + @Override public void setConnectionCallback(IWindowMagnificationConnectionCallback callback) { mConnectionCallback = callback; } 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 f32c0eb495ba..eff8c019efb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java @@ -16,6 +16,7 @@ package com.android.systemui.accessibility; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -68,6 +69,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { @Mock private WindowMagnificationController mWindowMagnificationController; @Mock + private MagnificationSettingsController mMagnificationSettingsController; + @Mock private ModeSwitchesController mModeSwitchesController; @Mock private SysUiState mSysUiState; @@ -97,6 +100,8 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { mDisplayTracker, getContext().getSystemService(DisplayManager.class)); mWindowMagnification.mMagnificationControllerSupplier = new FakeControllerSupplier( mContext.getSystemService(DisplayManager.class)); + mWindowMagnification.mMagnificationSettingsSupplier = new FakeSettingsSupplier( + mContext.getSystemService(DisplayManager.class)); mWindowMagnification.requestWindowMagnificationConnection(true); assertNotNull(mIWindowMagnificationConnection); @@ -151,6 +156,9 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { @Test public void showMagnificationButton() throws RemoteException { + // magnification settings panel should not be showing + assertFalse(mWindowMagnification.isMagnificationSettingsPanelShowing(TEST_DISPLAY)); + mIWindowMagnificationConnection.showMagnificationButton(TEST_DISPLAY, Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); waitForIdleSync(); @@ -167,6 +175,14 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { verify(mModeSwitchesController).removeButton(TEST_DISPLAY); } + @Test + public void removeMagnificationSettingsPanel() throws RemoteException { + mIWindowMagnificationConnection.removeMagnificationSettingsPanel(TEST_DISPLAY); + waitForIdleSync(); + + verify(mMagnificationSettingsController).closeMagnificationSettings(); + } + private class FakeControllerSupplier extends DisplayIdIndexSupplier<WindowMagnificationController> { @@ -179,5 +195,18 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { return mWindowMagnificationController; } } + + private class FakeSettingsSupplier extends + DisplayIdIndexSupplier<MagnificationSettingsController> { + + FakeSettingsSupplier(DisplayManager displayManager) { + super(displayManager); + } + + @Override + protected MagnificationSettingsController createInstance(Display display) { + return mMagnificationSettingsController; + } + } } 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 4753a545adb0..1cd851f5f84a 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -173,7 +173,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb @Override public void onAccessibilityActionPerformed(int displayId) { - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); } @Override @@ -190,21 +190,22 @@ public class MagnificationController implements WindowMagnificationManager.Callb if (mMagnificationCapabilities != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) { return; } - if (isActivated(displayId, mode)) { - getWindowMagnificationMgr().showMagnificationButton(displayId, mode); - } + updateMagnificationUIControls(displayId, mode); } - private void updateMagnificationButton(int displayId, int mode) { + private void updateMagnificationUIControls(int displayId, int mode) { final boolean isActivated = isActivated(displayId, mode); - final boolean showButton; + final boolean showUIControls; synchronized (mLock) { - showButton = isActivated && mMagnificationCapabilities + showUIControls = isActivated && mMagnificationCapabilities == Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; } - if (showButton) { + if (showUIControls) { + // we only need to show magnification button, the settings panel showing should be + // triggered only on sysui side. getWindowMagnificationMgr().showMagnificationButton(displayId, mode); } else { + getWindowMagnificationMgr().removeMagnificationSettingsPanel(displayId); getWindowMagnificationMgr().removeMagnificationButton(displayId); } } @@ -427,7 +428,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb public void onRequestMagnificationSpec(int displayId, int serviceId) { final WindowMagnificationManager windowMagnificationManager; synchronized (mLock) { - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); windowMagnificationManager = mWindowMagnificationMgr; } if (windowMagnificationManager != null) { @@ -456,7 +457,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb } logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, duration); } - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); } @Override @@ -554,7 +555,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb } logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, duration); } - updateMagnificationButton(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + updateMagnificationUIControls(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); } private void disableWindowMagnificationIfNeeded(int displayId) { @@ -872,7 +873,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb mAms.notifyMagnificationChanged(mDisplayId, region, configBuilder.build()); } } - updateMagnificationButton(mDisplayId, mTargetMode); + updateMagnificationUIControls(mDisplayId, mTargetMode); if (mTransitionCallBack != null) { mTransitionCallBack.onResult(mDisplayId, success); } @@ -900,7 +901,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb setExpiredAndRemoveFromListLocked(); setTransitionState(mDisplayId, null); applyMagnificationModeLocked(mCurrentMode); - updateMagnificationButton(mDisplayId, mCurrentMode); + updateMagnificationUIControls(mDisplayId, mCurrentMode); if (mTransitionCallBack != null) { mTransitionCallBack.onResult(mDisplayId, true); } diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java index 041eece5ce48..1202cfadb44e 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapper.java @@ -185,6 +185,22 @@ class WindowMagnificationConnectionWrapper { return true; } + boolean removeMagnificationSettingsPanel(int displayId) { + if (mTrace.isA11yTracingEnabledForTypes(FLAGS_WINDOW_MAGNIFICATION_CONNECTION)) { + mTrace.logTrace(TAG + ".removeMagnificationSettingsPanel", + FLAGS_WINDOW_MAGNIFICATION_CONNECTION, "displayId=" + displayId); + } + try { + mConnection.removeMagnificationSettingsPanel(displayId); + } catch (RemoteException e) { + if (DBG) { + Slog.e(TAG, "Error calling removeMagnificationSettingsPanel()", e); + } + return false; + } + return true; + } + boolean setConnectionCallback(IWindowMagnificationConnectionCallback connectionCallback) { if (mTrace.isA11yTracingEnabledForTypes( FLAGS_WINDOW_MAGNIFICATION_CONNECTION 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 d9391f422dc7..ce18b2cf9bad 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -779,8 +779,10 @@ public class WindowMagnificationManager implements * @return {@code true} if the event was handled, {@code false} otherwise */ public boolean showMagnificationButton(int displayId, int magnificationMode) { - return mConnectionWrapper != null && mConnectionWrapper.showMagnificationButton( - displayId, magnificationMode); + synchronized (mLock) { + return mConnectionWrapper != null + && mConnectionWrapper.showMagnificationButton(displayId, magnificationMode); + } } /** @@ -790,8 +792,23 @@ public class WindowMagnificationManager implements * @return {@code true} if the event was handled, {@code false} otherwise */ public boolean removeMagnificationButton(int displayId) { - return mConnectionWrapper != null && mConnectionWrapper.removeMagnificationButton( - displayId); + synchronized (mLock) { + return mConnectionWrapper != null + && mConnectionWrapper.removeMagnificationButton(displayId); + } + } + + /** + * Requests System UI remove magnification settings panel on the specified display. + * + * @param displayId The logical display id. + * @return {@code true} if the event was handled, {@code false} otherwise + */ + public boolean removeMagnificationSettingsPanel(int displayId) { + synchronized (mLock) { + return mConnectionWrapper != null + && mConnectionWrapper.removeMagnificationSettingsPanel(displayId); + } } /** 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 bbcb376180b7..d982a711cfdf 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 @@ -1035,6 +1035,25 @@ public class MagnificationControllerTest { } @Test + public void disableWindowMode_windowEnabled_removeMagnificationSettingsPanel() + throws RemoteException { + setMagnificationEnabled(MODE_WINDOW); + + mWindowMagnificationManager.disableWindowMagnification(TEST_DISPLAY, false); + + verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY)); + } + + @Test + public void onFullScreenDeactivated_fullScreenEnabled_removeMagnificationSettingsPanel() + throws RemoteException { + setMagnificationEnabled(MODE_FULLSCREEN); + mScreenMagnificationController.reset(TEST_DISPLAY, /* animate= */ true); + + verify(mWindowMagnificationManager).removeMagnificationSettingsPanel(eq(TEST_DISPLAY)); + } + + @Test public void imeWindowStateShown_windowMagnifying_logWindowMode() { MagnificationController spyController = spy(mMagnificationController); spyController.onWindowMagnificationActivationState(TEST_DISPLAY, true); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java index 4b77764c41e5..2357e65871e6 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationConnectionWrapperTest.java @@ -116,6 +116,12 @@ public class WindowMagnificationConnectionWrapperTest { } @Test + public void removeMagnificationSettingsPanel() throws RemoteException { + mConnectionWrapper.removeMagnificationSettingsPanel(TEST_DISPLAY); + verify(mConnection).removeMagnificationSettingsPanel(eq(TEST_DISPLAY)); + } + + @Test public void setMirrorWindowCallback() throws RemoteException { mConnectionWrapper.setConnectionCallback(mCallback); verify(mConnection).setConnectionCallback(mCallback); 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 d841dfc2d54b..b0fd64976c48 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 @@ -537,6 +537,15 @@ public class WindowMagnificationManagerTest { } @Test + public void removeMagnificationSettingsPanel_hasConnection_invokeConnectionMethod() + throws RemoteException { + mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); + + mWindowMagnificationManager.removeMagnificationSettingsPanel(TEST_DISPLAY); + verify(mMockConnection.getConnection()).removeMagnificationSettingsPanel(TEST_DISPLAY); + } + + @Test public void pointersInWindow_magnifierEnabled_returnCorrectValue() throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN); |