From 96261a5373386831df7f8286096f0d920c29d221 Mon Sep 17 00:00:00 2001 From: Roy Chou Date: Fri, 9 Jun 2023 14:59:43 +0000 Subject: [PATCH 1/2] chore(#MagSettingsPanel): make seekbar index reflect the controlling magnifier scale Originally the panel has content observer to let seekbar progress sync with Settings persisted scale. With previous cl that we notify WindowMagnification the controlling magnifier scale updated, we can make the seekbar index update with notified new scale. Therefore, the seekbar index could reflect the actual controlling magnifier scale. Also, if the seekbar triggers onProgressChanged with fromUser false, which means the progress changed is not by the user interaction but by the notifying of the magnifier scale changed, we don't need to trigger the callback to change the magnifier scale. Besides, we remove the persisting scale logic in WindowMagnificationSettings. Since the persisted scale would be updated when the callback onPerformScaleAction is triggered in framework service side, we don't need the duplicated update in sysui side. Bug: 286340381 Bug: 286342154 Test: manually atest IWindowMagnificationConnectionTest atest MagnificationSettingsControllerTest atest WindowMagnificationControllerTest atest WindowMagnificationSettingsTest atest MagnificationControllerTest Change-Id: Ibf78c90bc282225c2cd7670a52cb3a5e686d7d3f Merged-In: Ibf78c90bc282225c2cd7670a52cb3a5e686d7d3f --- .../MagnificationSettingsController.java | 4 + .../accessibility/WindowMagnification.java | 4 + .../WindowMagnificationController.java | 13 +- .../WindowMagnificationSettings.java | 58 +++---- .../ui/view/SeekBarWithIconButtonsView.java | 16 ++ .../IWindowMagnificationConnectionTest.java | 1 + .../MagnificationSettingsControllerTest.java | 8 + .../WindowMagnificationSettingsTest.java | 142 +++++++----------- 8 files changed, 115 insertions(+), 131 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java index fd3c158898227..4052c9a772126 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java @@ -107,6 +107,10 @@ public class MagnificationSettingsController implements ComponentCallbacks { return mWindowMagnificationSettings.isSettingPanelShowing(); } + void setMagnificationScale(float scale) { + mWindowMagnificationSettings.setMagnificationScale(scale); + } + @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { final int configDiff = newConfig.diff(mConfiguration); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index 1739ba4b3a012..dd5f1400ba90b 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -310,6 +310,10 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback return; } scales.put(displayId, scale); + + final MagnificationSettingsController magnificationSettingsController = + mMagnificationSettingsSupplier.get(displayId); + magnificationSettingsController.setMagnificationScale(scale); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index e7eab7e462e1f..2fc0c2674d7fc 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -1491,13 +1491,9 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold // Simulate tapping the drag view so it opens the Settings. handleSingleTap(mDragView); } else if (action == R.id.accessibility_action_zoom_in) { - final float scale = mScale + A11Y_CHANGE_SCALE_DIFFERENCE; - mWindowMagnifierCallback.onPerformScaleAction(mDisplayId, - A11Y_ACTION_SCALE_RANGE.clamp(scale)); + performScale(mScale + A11Y_CHANGE_SCALE_DIFFERENCE); } 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)); + performScale(mScale - A11Y_CHANGE_SCALE_DIFFERENCE); } else if (action == R.id.accessibility_action_move_up) { move(0, -mSourceBounds.height()); } else if (action == R.id.accessibility_action_move_down) { @@ -1512,5 +1508,10 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold mWindowMagnifierCallback.onAccessibilityActionPerformed(mDisplayId); return true; } + + private void performScale(float scale) { + scale = A11Y_ACTION_SCALE_RANGE.clamp(scale); + mWindowMagnifierCallback.onPerformScaleAction(mDisplayId, scale); + } } } \ 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 1e1d4b7b2e5b2..916584b94a9cd 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java @@ -57,7 +57,6 @@ import android.widget.SeekBar; import android.widget.Switch; import android.widget.TextView; -import com.android.internal.accessibility.common.MagnificationConstants; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.systemui.R; @@ -89,14 +88,12 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest private final MagnificationGestureDetector mGestureDetector; private boolean mSingleTapDetected = false; - @VisibleForTesting - SeekBarWithIconButtonsView mZoomSeekbar; + private SeekBarWithIconButtonsView mZoomSeekbar; private LinearLayout mAllowDiagonalScrollingView; private TextView mAllowDiagonalScrollingTitle; private Switch mAllowDiagonalScrollingSwitch; private LinearLayout mPanelView; private LinearLayout mSettingView; - private LinearLayout mButtonView; private ImageButton mSmallButton; private ImageButton mMediumButton; private ImageButton mLargeButton; @@ -110,10 +107,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest * magnitude = 10 means, for every 1 scale increase, 10 progress increase in seekbar. */ private int mSeekBarMagnitude; + private float mScale = SCALE_MIN_VALUE; + private WindowMagnificationSettingsCallback mCallback; private ContentObserver mMagnificationCapabilityObserver; - private ContentObserver mMagnificationScaleObserver; @Retention(RetentionPolicy.SOURCE) @IntDef({ @@ -163,30 +161,18 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest }); } }; - mMagnificationScaleObserver = new ContentObserver( - mContext.getMainThreadHandler()) { - @Override - public void onChange(boolean selfChange) { - setScaleSeekbar(getMagnificationScale()); - } - }; } private class ZoomSeekbarChangeListener implements SeekBarWithIconButtonsView.OnSeekBarWithIconButtonsChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - float scale = (progress / (float) mSeekBarMagnitude) + SCALE_MIN_VALUE; - // Update persisted scale only when scale >= PERSISTED_SCALE_MIN_VALUE const. - // We assume if the scale is lower than the PERSISTED_SCALE_MIN_VALUE, there will be - // no obvious magnification effect. - if (scale >= MagnificationConstants.PERSISTED_SCALE_MIN_VALUE) { - mSecureSettings.putFloatForUser( - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, - scale, - UserHandle.USER_CURRENT); + // 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); } - mCallback.onMagnifierScale(scale); } @Override @@ -322,7 +308,6 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest // Unregister observer before removing view mSecureSettings.unregisterContentObserver(mMagnificationCapabilityObserver); - mSecureSettings.unregisterContentObserver(mMagnificationScaleObserver); mWindowManager.removeView(mSettingView); mIsVisible = false; if (resetPosition) { @@ -374,7 +359,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest private void showSettingPanel(boolean resetPosition) { if (!mIsVisible) { updateUIControlsIfNeeded(); - setScaleSeekbar(getMagnificationScale()); + setScaleSeekbar(mScale); if (resetPosition) { mDraggableWindowBounds.set(getDraggableWindowBounds()); mParams.x = mDraggableWindowBounds.right; @@ -387,10 +372,6 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, mMagnificationCapabilityObserver, UserHandle.USER_CURRENT); - mSecureSettings.registerContentObserverForUser( - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, - mMagnificationScaleObserver, - UserHandle.USER_CURRENT); // Exclude magnification switch button from system gesture area. setSystemGestureExclusion(); @@ -430,11 +411,17 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest UserHandle.USER_CURRENT); } - private float getMagnificationScale() { - return mSecureSettings.getFloatForUser( - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, - SCALE_MIN_VALUE, - UserHandle.USER_CURRENT); + /** + * Only called from outside to notify the controlling magnifier scale changed + * + * @param scale The new controlling magnifier scale + */ + public void setMagnificationScale(float scale) { + mScale = scale; + + if (isSettingPanelShowing()) { + setScaleSeekbar(scale); + } } private void updateUIControlsIfNeeded() { @@ -523,10 +510,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mZoomSeekbar.setMax((int) (mZoomSeekbar.getChangeMagnitude() * (SCALE_MAX_VALUE - SCALE_MIN_VALUE))); mSeekBarMagnitude = mZoomSeekbar.getChangeMagnitude(); - float scale = mSecureSettings.getFloatForUser( - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 0, - UserHandle.USER_CURRENT); - setScaleSeekbar(scale); + setScaleSeekbar(mScale); mZoomSeekbar.setOnSeekBarWithIconButtonsChangeListener(new ZoomSeekbarChangeListener()); mAllowDiagonalScrollingView = diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java index 277b4274bb827..f362831e8c883 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java +++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java @@ -170,6 +170,22 @@ public class SeekBarWithIconButtonsView extends LinearLayout { mSeekBarListener.setOnSeekBarWithIconButtonsChangeListener(onSeekBarChangeListener); } + /** + * Only for testing. Get previous set mOnSeekBarChangeListener to the seekbar. + */ + @VisibleForTesting + public OnSeekBarWithIconButtonsChangeListener getOnSeekBarWithIconButtonsChangeListener() { + return mSeekBarListener.mOnSeekBarChangeListener; + } + + /** + * Only for testing. Get {@link #mSeekbar} in the layout. + */ + @VisibleForTesting + public SeekBar getSeekbar() { + return mSeekbar; + } + /** * Start and End icons might need to be updated when there is a change in seekbar progress. * Icon Start will need to be enabled when the seekbar progress is larger than 0. 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 caf230d4e7931..67d6aa8e98cf5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java @@ -198,6 +198,7 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { assertTrue(mWindowMagnification.mUsersScales.contains(testUserId)); assertEquals(mWindowMagnification.mUsersScales.get(testUserId).get(TEST_DISPLAY), (Float) testScale); + verify(mMagnificationSettingsController).setMagnificationScale(eq(testScale)); } private class FakeControllerSupplier extends 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 62a176c94d677..5bb25f82e7e29 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java @@ -85,6 +85,14 @@ public class MagnificationSettingsControllerTest extends SysuiTestCase { verify(mWindowMagnificationSettings).hideSettingPanel(); } + @Test + public void testSetMagnificationScale() { + final float scale = 3.0f; + mMagnificationSettingsController.setMagnificationScale(scale); + + verify(mWindowMagnificationSettings).setMagnificationScale(eq(scale)); + } + @Test public void testOnConfigurationChanged_notifySettingsPanel() { mMagnificationSettingsController.onConfigurationChanged(ActivityInfo.CONFIG_DENSITY); 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 275723be3859b..1da072f815c1d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java @@ -16,7 +16,6 @@ package com.android.systemui.accessibility; -import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; @@ -28,10 +27,11 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -55,10 +55,11 @@ import android.widget.LinearLayout; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; -import com.android.internal.accessibility.common.MagnificationConstants; import com.android.internal.graphics.SfVsyncFrameCallbackProvider; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView; +import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView.OnSeekBarWithIconButtonsChangeListener; import com.android.systemui.util.settings.SecureSettings; import org.junit.After; @@ -79,6 +80,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { private static final int MAGNIFICATION_SIZE_LARGE = 3; private ViewGroup mSettingView; + private SeekBarWithIconButtonsView mZoomSeekbar; @Mock private AccessibilityManager mAccessibilityManager; @Mock @@ -111,6 +113,7 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { mSecureSettings); mSettingView = mWindowMagnificationSettings.getSettingView(); + mZoomSeekbar = mSettingView.findViewById(R.id.magnifier_zoom_slider); mSecureSettingsScaleCaptor = ArgumentCaptor.forClass(Float.class); mSecureSettingsNameCaptor = ArgumentCaptor.forClass(String.class); mSecureSettingsUserHandleCaptor = ArgumentCaptor.forClass(Integer.class); @@ -336,20 +339,6 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { eq(UserHandle.USER_CURRENT)); } - @Test - public void showSettingsPanel_observerForMagnificationScaleRegistered() { - setupMagnificationCapabilityAndMode( - /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, - /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - - mWindowMagnificationSettings.showSettingPanel(); - - verify(mSecureSettings).registerContentObserverForUser( - eq(ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE), - any(ContentObserver.class), - eq(UserHandle.USER_CURRENT)); - } - @Test public void hideSettingsPanel_observerUnregistered() { setupMagnificationCapabilityAndMode( @@ -359,19 +348,25 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { mWindowMagnificationSettings.showSettingPanel(); mWindowMagnificationSettings.hideSettingPanel(); - verify(mSecureSettings, times(2)).unregisterContentObserver(any(ContentObserver.class)); + verify(mSecureSettings).unregisterContentObserver(any(ContentObserver.class)); } @Test public void seekbarProgress_justInflated_maxValueAndProgressSetCorrectly() { - setupScaleInSecureSettings(0f); - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(0); - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getMax()).isEqualTo(70); + mWindowMagnificationSettings.setMagnificationScale(2f); + mWindowMagnificationSettings.inflateView(); + + // inflateView() would create new settingsView in WindowMagnificationSettings so we + // need to retrieve the new mZoomSeekbar + mSettingView = mWindowMagnificationSettings.getSettingView(); + mZoomSeekbar = mSettingView.findViewById(R.id.magnifier_zoom_slider); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(10); + assertThat(mZoomSeekbar.getMax()).isEqualTo(70); } @Test public void seekbarProgress_minMagnification_seekbarProgressIsCorrect() { - setupScaleInSecureSettings(0f); + mWindowMagnificationSettings.setMagnificationScale(1f); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); @@ -379,24 +374,24 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { mWindowMagnificationSettings.showSettingPanel(); // Seekbar index from 0 to 70. 1.0f scale (A11Y_SCALE_MIN_VALUE) would correspond to 0. - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(0); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(0); } @Test public void seekbarProgress_belowMinMagnification_seekbarProgressIsZero() { - setupScaleInSecureSettings(0f); + mWindowMagnificationSettings.setMagnificationScale(0f); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(0); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(0); } @Test public void seekbarProgress_magnificationBefore_seekbarProgressIsHalf() { - setupScaleInSecureSettings(4f); + mWindowMagnificationSettings.setMagnificationScale(4f); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); @@ -405,12 +400,12 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { // float scale : from 1.0f to 8.0f, seekbar index from 0 to 70. // 4.0f would correspond to 30. - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(30); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(30); } @Test public void seekbarProgress_maxMagnificationBefore_seekbarProgressIsMax() { - setupScaleInSecureSettings(8f); + mWindowMagnificationSettings.setMagnificationScale(8f); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); @@ -419,12 +414,12 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { // 8.0f is max magnification {@link MagnificationScaleProvider#MAX_SCALE}. // Max zoom seek bar is 70. - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(70); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(70); } @Test public void seekbarProgress_aboveMaxMagnificationBefore_seekbarProgressIsMax() { - setupScaleInSecureSettings(9f); + mWindowMagnificationSettings.setMagnificationScale(9f); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); @@ -432,51 +427,47 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { mWindowMagnificationSettings.showSettingPanel(); // Max zoom seek bar is 70. - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(70); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(70); } @Test - public void seekbarProgress_progressChangedRoughlyHalf_scaleAndCallbackUpdated() { - setupMagnificationCapabilityAndMode( - /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, - /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - mWindowMagnificationSettings.showSettingPanel(); + public void onSeekBarProgressChanged_fromUserFalse_callbackNotTriggered() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); + onChangeListener.onProgressChanged( + mZoomSeekbar.getSeekbar(), /* progress= */ 30, /* fromUser= */ false); - mWindowMagnificationSettings.mZoomSeekbar.setProgress(30); + verify(mWindowMagnificationSettingsCallback, never()) + .onMagnifierScale(/* scale= */ anyFloat()); + } + + @Test + public void onSeekBarProgressChangedToRoughlyHalf_fromUserTrue_callbackUpdated() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); + onChangeListener.onProgressChanged( + mZoomSeekbar.getSeekbar(), /* progress= */ 30, /* fromUser= */ true); - verifyScaleUpdatedInSecureSettings(4f); verifyCallbackOnMagnifierScale(4f); } @Test - public void seekbarProgress_minProgress_callbackUpdated() { - setupMagnificationCapabilityAndMode( - /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, - /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - mWindowMagnificationSettings.showSettingPanel(); - // Set progress to non-zero first so onProgressChanged can be triggered upon setting to 0. - mWindowMagnificationSettings.mZoomSeekbar.setProgress(30); + public void onSeekBarProgressChangedToMin_fromUserTrue_callbackUpdated() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); + onChangeListener.onProgressChanged( + mZoomSeekbar.getSeekbar(), /* progress= */ 0, /* fromUser= */ true); - mWindowMagnificationSettings.mZoomSeekbar.setProgress(0); - - // For now, secure settings will not be updated for values < 1.3f. Follow up on this later. - verify(mWindowMagnificationSettingsCallback, times(2)) - .onMagnifierScale(mCallbackMagnifierScaleCaptor.capture()); - var capturedArgs = mCallbackMagnifierScaleCaptor.getAllValues(); - assertThat(capturedArgs).hasSize(2); - assertThat(capturedArgs.get(1)).isWithin(0.01f).of(1f); + verifyCallbackOnMagnifierScale(1f); } @Test - public void seekbarProgress_maxProgress_scaleAndCallbackUpdated() { - setupMagnificationCapabilityAndMode( - /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, - /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - mWindowMagnificationSettings.showSettingPanel(); + public void onSeekBarProgressChangedToMax_fromUserTrue_callbackUpdated() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); + onChangeListener.onProgressChanged( + mZoomSeekbar.getSeekbar(), /* progress= */ 70, /* fromUser= */ true); - mWindowMagnificationSettings.mZoomSeekbar.setProgress(70); - - verifyScaleUpdatedInSecureSettings(8f); verifyCallbackOnMagnifierScale(8f); } @@ -485,30 +476,12 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - var contentObserverCaptor = ArgumentCaptor.forClass(ContentObserver.class); mWindowMagnificationSettings.showSettingPanel(); - verify(mSecureSettings).registerContentObserverForUser( - eq(ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE), - contentObserverCaptor.capture(), - eq(UserHandle.USER_CURRENT)); // Simulate outside changes. - setupScaleInSecureSettings(4f); - // Simulate callback due to outside change. - contentObserverCaptor.getValue().onChange(/* selfChange= */ false); + mWindowMagnificationSettings.setMagnificationScale(4f); - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(30); - } - - private void verifyScaleUpdatedInSecureSettings(float scale) { - verify(mSecureSettings).putFloatForUser( - mSecureSettingsNameCaptor.capture(), - mSecureSettingsScaleCaptor.capture(), - mSecureSettingsUserHandleCaptor.capture()); - assertThat(mSecureSettingsScaleCaptor.getValue()).isWithin(0.01f).of(scale); - assertThat(mSecureSettingsNameCaptor.getValue()) - .isEqualTo(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE); - assertThat(mSecureSettingsUserHandleCaptor.getValue()).isEqualTo(UserHandle.USER_CURRENT); + assertThat(mZoomSeekbar.getProgress()).isEqualTo(30); } private void verifyCallbackOnMagnifierScale(float scale) { @@ -533,11 +506,4 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { anyInt(), eq(UserHandle.USER_CURRENT))).thenReturn(mode); } - - private void setupScaleInSecureSettings(float scale) { - when(mSecureSettings.getFloatForUser( - ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, - MagnificationConstants.SCALE_MIN_VALUE, - UserHandle.USER_CURRENT)).thenReturn(scale); - } } From 58b977cfd1dcd2b9d631cb1e12212cfd1f8e7bfe Mon Sep 17 00:00:00 2001 From: Roy Chou Date: Thu, 22 Jun 2023 17:02:15 +0000 Subject: [PATCH 2/2] chore(#MagSettingsPanel): change persisting scale timing Originally the Settings presisted scale is updated when the panel seekbar progress is changed or the window magnifier scale is changed by accessibility actions. In WindowMagnificationController we keep the same behavior. In WindowMagnificationSettings, per b/286176069 we change to only update the persisted scale with the seekbar final progress when the user interaction on seekbar is ended. We change the onPerformScaleAction parameters so when sysui call the service to change the magnifier scale, we can decide if the persisted scale should be updated. Bug: 286176069 Test: manually atest WindowMagnificationTest atest MagnificationSettingsControllerTest atest WindowMagnificationSettingsTest atest WindowMagnificationControllerTest atest WindowMagnificationManagerTest atest MagnificationControllerTest Change-Id: I995a059c6575298eeae095fb3daa9f037916014a Merged-In: I995a059c6575298eeae095fb3daa9f037916014a --- ...WindowMagnificationConnectionCallback.aidl | 3 ++- .../MagnificationSettingsController.java | 7 ++++--- .../accessibility/WindowMagnification.java | 10 ++++++---- .../WindowMagnificationConnectionImpl.java | 4 ++-- .../WindowMagnificationController.java | 3 ++- .../WindowMagnificationSettings.java | 15 +++++++++++--- .../WindowMagnificationSettingsCallback.java | 3 ++- .../WindowMagnifierCallback.java | 3 ++- .../MagnificationSettingsControllerTest.java | 5 +++-- .../WindowMagnificationControllerTest.java | 6 ++++-- .../WindowMagnificationSettingsTest.java | 20 +++++++++++++++++-- .../WindowMagnificationTest.java | 12 +++++++---- .../MagnificationController.java | 10 +++++++--- .../WindowMagnificationManager.java | 10 ++++++---- .../MagnificationControllerTest.java | 12 ++++++----- .../WindowMagnificationManagerTest.java | 7 +++++-- 16 files changed, 90 insertions(+), 40 deletions(-) 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