diff options
18 files changed, 200 insertions, 166 deletions
diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl index adfeb6d11008..21b433465a3a 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 fd3c15889822..859e183d39fe 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); @@ -160,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. @@ -211,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 1739ba4b3a01..baabd95f5caa 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 @@ -329,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); } } @@ -380,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 f1d00ce218c2..928445bde8ff 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 e7eab7e462e1..602f817f826b 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,11 @@ 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, /* 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 1e1d4b7b2e5b..6ec5320bf4c3 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,20 @@ 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) { + 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); } - mCallback.onMagnifierScale(scale); } @Override @@ -201,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; } } @@ -322,7 +317,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 +368,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 +381,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 +420,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 +519,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/accessibility/WindowMagnificationSettingsCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettingsCallback.java index 3dbff5d7898f..2eee7a63ab21 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 e18161d658a8..a25e9a20f81c 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/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java b/packages/SystemUI/src/com/android/systemui/common/ui/view/SeekBarWithIconButtonsView.java index 277b4274bb82..f362831e8c88 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 @@ -171,6 +171,22 @@ public class SeekBarWithIconButtonsView extends LinearLayout { } /** + * 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. * Icon End will need to be enabled when the seekbar progress is less than Max. 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 caf230d4e793..67d6aa8e98cf 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 62a176c94d67..9eead6a422ac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java @@ -86,6 +86,14 @@ public class MagnificationSettingsControllerTest extends SysuiTestCase { } @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); @@ -145,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 31c09b8e7ec4..56f81606a282 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 275723be3859..eddb8d186d73 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,12 @@ 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; +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 +56,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 +81,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 +114,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); @@ -337,20 +341,6 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { } @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( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, @@ -359,19 +349,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 +375,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 +401,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 +415,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,52 +428,63 @@ 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(), /* updatePersistence= */ eq(false)); + } + + @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); + + verifyCallbackOnMagnifierScale(1f); + } - mWindowMagnificationSettings.mZoomSeekbar.setProgress(0); + @Test + public void onSeekBarProgressChangedToMax_fromUserTrue_callbackUpdated() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); + onChangeListener.onProgressChanged( + mZoomSeekbar.getSeekbar(), /* progress= */ 70, /* fromUser= */ true); - // 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(8f); } @Test - public void seekbarProgress_maxProgress_scaleAndCallbackUpdated() { - setupMagnificationCapabilityAndMode( - /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, - /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - mWindowMagnificationSettings.showSettingPanel(); + public void onSeekbarUserInteractionFinalized_persistedScaleUpdated() { + OnSeekBarWithIconButtonsChangeListener onChangeListener = + mZoomSeekbar.getOnSeekBarWithIconButtonsChangeListener(); - mWindowMagnificationSettings.mZoomSeekbar.setProgress(70); + mZoomSeekbar.setProgress(30); + onChangeListener.onUserInteractionFinalized( + mZoomSeekbar.getSeekbar(), + OnSeekBarWithIconButtonsChangeListener.ControlUnitType.SLIDER); - verifyScaleUpdatedInSecureSettings(8f); - verifyCallbackOnMagnifierScale(8f); + // should trigger callback to update magnifier scale and persist the scale + verify(mWindowMagnificationSettingsCallback) + .onMagnifierScale(/* scale= */ eq(4f), /* updatePersistence= */ eq(true)); } @Test @@ -485,35 +492,17 @@ 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); - - assertThat(mWindowMagnificationSettings.mZoomSeekbar.getProgress()).isEqualTo(30); - } + mWindowMagnificationSettings.setMagnificationScale(4f); - 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) { verify(mWindowMagnificationSettingsCallback) - .onMagnifierScale(mCallbackMagnifierScaleCaptor.capture()); + .onMagnifierScale(mCallbackMagnifierScaleCaptor.capture(), anyBoolean()); assertThat(mCallbackMagnifierScaleCaptor.getValue()).isWithin(0.01f).of(scale); } @@ -533,11 +522,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); - } } 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 db580742a68f..d75781aee26c 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 f6948e9cbb3b..effd8732d086 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 d96682c5529d..816f22f8c7b0 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 81dd96195ee0..d4c6fad99645 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 e8b337ab97a7..27e6ef199fe2 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 |