diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl index adfeb6d110083..21b433465a3a7 100644 --- a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl +++ b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl @@ -57,8 +57,9 @@ import android.graphics.Rect; * * @param displayId The logical display id. * @param scale the target scale, or {@link Float#NaN} to leave unchanged + * @param updatePersistence whether the new scale should be persisted in Settings */ - void onPerformScaleAction(int displayId, float scale); + void onPerformScaleAction(int displayId, float scale, boolean updatePersistence); /** * Called when the accessibility action is performed. diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java index 4052c9a772126..859e183d39fe7 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java @@ -164,8 +164,9 @@ public class MagnificationSettingsController implements ComponentCallbacks { * * @param displayId The logical display id. * @param scale Magnification scale value. + * @param updatePersistence whether the new scale should be persisted. */ - void onMagnifierScale(int displayId, float scale); + void onMagnifierScale(int displayId, float scale, boolean updatePersistence); /** * Called when magnification mode changed. @@ -215,9 +216,9 @@ public class MagnificationSettingsController implements ComponentCallbacks { } @Override - public void onMagnifierScale(float scale) { + public void onMagnifierScale(float scale, boolean updatePersistence) { mSettingsControllerCallback.onMagnifierScale(mDisplayId, - A11Y_ACTION_SCALE_RANGE.clamp(scale)); + A11Y_ACTION_SCALE_RANGE.clamp(scale), updatePersistence); } }; } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index dd5f1400ba90b..baabd95f5caa2 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -333,9 +333,10 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback } @Override - public void onPerformScaleAction(int displayId, float scale) { + public void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onPerformScaleAction(displayId, scale); + mWindowMagnificationConnectionImpl.onPerformScaleAction( + displayId, scale, updatePersistence); } } @@ -384,9 +385,10 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback } @Override - public void onMagnifierScale(int displayId, float scale) { + public void onMagnifierScale(int displayId, float scale, boolean updatePersistence) { if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onPerformScaleAction(displayId, scale); + mWindowMagnificationConnectionImpl.onPerformScaleAction( + displayId, scale, updatePersistence); } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java index f1d00ce218c2a..928445bde8ff1 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java @@ -129,10 +129,10 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S } } - void onPerformScaleAction(int displayId, float scale) { + void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { if (mConnectionCallback != null) { try { - mConnectionCallback.onPerformScaleAction(displayId, scale); + mConnectionCallback.onPerformScaleAction(displayId, scale, updatePersistence); } catch (RemoteException e) { Log.e(TAG, "Failed to inform performing scale action", e); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index 2fc0c2674d7fc..602f817f826b1 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -1511,7 +1511,8 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold private void performScale(float scale) { scale = A11Y_ACTION_SCALE_RANGE.clamp(scale); - mWindowMagnifierCallback.onPerformScaleAction(mDisplayId, scale); + mWindowMagnifierCallback.onPerformScaleAction( + mDisplayId, scale, /* updatePersistence= */ true); } } } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java index 916584b94a9cd..6ec5320bf4c34 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java @@ -170,8 +170,10 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest // Notify the service to update the magnifier scale only when the progress changed is // triggered by user interaction on seekbar if (fromUser) { - float scale = (progress / (float) mSeekBarMagnitude) + SCALE_MIN_VALUE; - mCallback.onMagnifierScale(scale); + final float scale = transformProgressToScale(progress); + // We don't need to update the persisted scale when the seekbar progress is + // changing. The update should be triggered when the changing is ended. + mCallback.onMagnifierScale(scale, /* updatePersistence= */ false); } } @@ -187,7 +189,14 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest @Override public void onUserInteractionFinalized(SeekBar seekBar, @ControlUnitType int control) { - // Do nothing + // Update the Settings persisted scale only when user interaction with seekbar ends + final int progress = seekBar.getProgress(); + final float scale = transformProgressToScale(progress); + mCallback.onMagnifierScale(scale, /* updatePersistence= */ true); + } + + private float transformProgressToScale(float progress) { + return (progress / (float) mSeekBarMagnitude) + SCALE_MIN_VALUE; } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java index 3dbff5d7898ff..2eee7a63ab215 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java @@ -52,8 +52,9 @@ public interface WindowMagnificationSettingsCallback { * Called when set magnification scale. * * @param scale Magnification scale value. + * @param updatePersistence whether the scale should be persisted */ - void onMagnifierScale(float scale); + void onMagnifierScale(float scale, boolean updatePersistence); /** * Called when magnification mode changed. diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java index e18161d658a89..a25e9a20f81c5 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java @@ -44,8 +44,9 @@ interface WindowMagnifierCallback { * * @param displayId The logical display id. * @param scale the target scale, or {@link Float#NaN} to leave unchanged + * @param updatePersistence whether the scale should be persisted */ - void onPerformScaleAction(int displayId, float scale); + void onPerformScaleAction(int displayId, float scale, boolean updatePersistence); /** * Called when the accessibility action is performed. diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java index 5bb25f82e7e29..9eead6a422ac5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java @@ -153,10 +153,11 @@ public class MagnificationSettingsControllerTest extends SysuiTestCase { @Test public void testPanelOnMagnifierScale_delegateToCallback() { final float scale = 3.0f; + final boolean updatePersistence = true; mMagnificationSettingsController.mWindowMagnificationSettingsCallback - .onMagnifierScale(scale); + .onMagnifierScale(scale, updatePersistence); verify(mMagnificationSettingControllerCallback).onMagnifierScale( - eq(mContext.getDisplayId()), eq(scale)); + eq(mContext.getDisplayId()), eq(scale), eq(updatePersistence)); } } 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 31c09b8e7ec44..56f81606a2826 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -645,10 +645,12 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { assertTrue( mirrorView.performAccessibilityAction(R.id.accessibility_action_zoom_out, null)); // Minimum scale is 1.0. - verify(mWindowMagnifierCallback).onPerformScaleAction(eq(displayId), eq(1.0f)); + verify(mWindowMagnifierCallback).onPerformScaleAction( + eq(displayId), /* scale= */ eq(1.0f), /* updatePersistence= */ eq(true)); assertTrue(mirrorView.performAccessibilityAction(R.id.accessibility_action_zoom_in, null)); - verify(mWindowMagnifierCallback).onPerformScaleAction(eq(displayId), eq(2.5f)); + verify(mWindowMagnifierCallback).onPerformScaleAction( + eq(displayId), /* scale= */ eq(2.5f), /* updatePersistence= */ eq(true)); // TODO: Verify the final state when the mirror surface is visible. assertTrue(mirrorView.performAccessibilityAction(R.id.accessibility_action_move_up, null)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java index 1da072f815c1d..eddb8d186d737 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java @@ -27,6 +27,7 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -438,7 +439,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { mZoomSeekbar.getSeekbar(), /* progress= */ 30, /* fromUser= */ false); verify(mWindowMagnificationSettingsCallback, never()) - .onMagnifierScale(/* scale= */ anyFloat()); + .onMagnifierScale(/* scale= */ anyFloat(), /* updatePersistence= */ eq(false)); } @Test @@ -471,6 +472,21 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { verifyCallbackOnMagnifierScale(8f); } + @Test + public void onSeekbarUserInteractionFinalized_persistedScaleUpdated() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); + + mZoomSeekbar.setProgress(30); + onChangeListener.onUserInteractionFinalized( + mZoomSeekbar.getSeekbar(), + OnSeekBarWithIconButtonsChangeListener.ControlUnitType.SLIDER); + + // should trigger callback to update magnifier scale and persist the scale + verify(mWindowMagnificationSettingsCallback) + .onMagnifierScale(/* scale= */ eq(4f), /* updatePersistence= */ eq(true)); + } + @Test public void seekbarProgress_scaleUpdatedAfterSettingPanelOpened_progressAlsoUpdated() { setupMagnificationCapabilityAndMode( @@ -486,7 +502,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { private void verifyCallbackOnMagnifierScale(float scale) { verify(mWindowMagnificationSettingsCallback) - .onMagnifierScale(mCallbackMagnifierScaleCaptor.capture()); + .onMagnifierScale(mCallbackMagnifierScaleCaptor.capture(), anyBoolean()); assertThat(mCallbackMagnifierScaleCaptor.getValue()).isWithin(0.01f).of(scale); } 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 db580742a68f6..d75781aee26c6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java @@ -163,13 +163,15 @@ public class WindowMagnificationTest extends SysuiTestCase { @Test public void onPerformScaleAction_enabled_notifyCallback() throws RemoteException { final float newScale = 4.0f; + final boolean updatePersistence = true; mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); mWindowMagnification.mWindowMagnifierCallback - .onPerformScaleAction(TEST_DISPLAY, newScale); + .onPerformScaleAction(TEST_DISPLAY, newScale, updatePersistence); - verify(mConnectionCallback).onPerformScaleAction(TEST_DISPLAY, newScale); + verify(mConnectionCallback).onPerformScaleAction( + eq(TEST_DISPLAY), eq(newScale), eq(updatePersistence)); } @Test @@ -249,10 +251,12 @@ public class WindowMagnificationTest extends SysuiTestCase { mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); final float scale = 3.0f; + final boolean updatePersistence = false; mWindowMagnification.mMagnificationSettingsControllerCallback.onMagnifierScale( - TEST_DISPLAY, scale); + TEST_DISPLAY, scale, updatePersistence); - verify(mConnectionCallback).onPerformScaleAction(eq(TEST_DISPLAY), eq(scale)); + verify(mConnectionCallback).onPerformScaleAction( + eq(TEST_DISPLAY), eq(scale), eq(updatePersistence)); } @Test 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 f6948e9cbb3ba..effd8732d086c 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -172,14 +172,18 @@ public class MagnificationController implements WindowMagnificationManager.Callb } @Override - public void onPerformScaleAction(int displayId, float scale) { + public void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { if (getFullScreenMagnificationController().isActivated(displayId)) { getFullScreenMagnificationController().setScaleAndCenter(displayId, scale, Float.NaN, Float.NaN, false, MAGNIFICATION_GESTURE_HANDLER_ID); - getFullScreenMagnificationController().persistScale(displayId); + if (updatePersistence) { + getFullScreenMagnificationController().persistScale(displayId); + } } else if (getWindowMagnificationMgr().isWindowMagnifierEnabled(displayId)) { getWindowMagnificationMgr().setScale(displayId, scale); - getWindowMagnificationMgr().persistScale(displayId); + if (updatePersistence) { + getWindowMagnificationMgr().persistScale(displayId); + } } } 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 d96682c5529d8..816f22f8c7b09 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -167,8 +167,9 @@ public class WindowMagnificationManager implements * * @param displayId The logical display id. * @param scale the target scale, or {@link Float#NaN} to leave unchanged + * @param updatePersistence whether the scale should be persisted */ - void onPerformScaleAction(int displayId, float scale); + void onPerformScaleAction(int displayId, float scale, boolean updatePersistence); /** * Called when the accessibility action is performed. @@ -977,14 +978,15 @@ public class WindowMagnificationManager implements } @Override - public void onPerformScaleAction(int displayId, float scale) { + public void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { if (mTrace.isA11yTracingEnabledForTypes( FLAGS_WINDOW_MAGNIFICATION_CONNECTION_CALLBACK)) { mTrace.logTrace(TAG + "ConnectionCallback.onPerformScaleAction", FLAGS_WINDOW_MAGNIFICATION_CONNECTION_CALLBACK, - "displayId=" + displayId + ";scale=" + scale); + "displayId=" + displayId + ";scale=" + scale + + ";updatePersistence=" + updatePersistence); } - mCallback.onPerformScaleAction(displayId, scale); + mCallback.onPerformScaleAction(displayId, scale, updatePersistence); } @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 81dd96195ee06..d4c6fad99645a 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 @@ -606,9 +606,10 @@ public class MagnificationControllerTest { public void onPerformScaleAction_fullScreenMagnifierEnabled_handleScaleChange() throws RemoteException { final float newScale = 4.0f; + final boolean updatePersistence = true; setMagnificationEnabled(MODE_FULLSCREEN); - mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale); + mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale, updatePersistence); verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), eq(newScale), anyFloat(), anyFloat(), anyBoolean(), anyInt()); @@ -619,12 +620,13 @@ public class MagnificationControllerTest { public void onPerformScaleAction_windowMagnifierEnabled_handleScaleChange() throws RemoteException { final float newScale = 4.0f; + final boolean updatePersistence = false; setMagnificationEnabled(MODE_WINDOW); - mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale); + mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale, updatePersistence); verify(mWindowMagnificationManager).setScale(eq(TEST_DISPLAY), eq(newScale)); - verify(mWindowMagnificationManager).persistScale(eq(TEST_DISPLAY)); + verify(mWindowMagnificationManager, never()).persistScale(eq(TEST_DISPLAY)); } @Test @@ -1310,9 +1312,9 @@ public class MagnificationControllerTest { } @Override - public void onPerformScaleAction(int displayId, float scale) { + public void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { if (mCallback != null) { - mCallback.onPerformScaleAction(displayId, scale); + mCallback.onPerformScaleAction(displayId, scale, updatePersistence); } } 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 e8b337ab97a7c..27e6ef199fe25 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 @@ -576,12 +576,15 @@ public class WindowMagnificationManagerTest { @Test public void onPerformScaleAction_magnifierEnabled_notifyAction() throws RemoteException { final float newScale = 4.0f; + final boolean updatePersistence = true; mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, NaN, NaN); - mMockConnection.getConnectionCallback().onPerformScaleAction(TEST_DISPLAY, newScale); + mMockConnection.getConnectionCallback().onPerformScaleAction( + TEST_DISPLAY, newScale, updatePersistence); - verify(mMockCallback).onPerformScaleAction(eq(TEST_DISPLAY), eq(newScale)); + verify(mMockCallback).onPerformScaleAction( + eq(TEST_DISPLAY), eq(newScale), eq(updatePersistence)); } @Test