Loading packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java +3 −8 Original line number Diff line number Diff line Loading @@ -87,19 +87,14 @@ public class MagnificationSettingsController implements ComponentCallbacks { } /** * Shows magnification settings panel {@link WindowMagnificationSettings}. The panel ui would be * various for different magnification mode. * * @param mode The magnification mode * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN * Shows magnification settings panel {@link WindowMagnificationSettings}. */ void showMagnificationSettings(int mode) { void showMagnificationSettings() { if (!mWindowMagnificationSettings.isSettingPanelShowing()) { onConfigurationChanged(mContext.getResources().getConfiguration()); mContext.registerComponentCallbacks(this); } mWindowMagnificationSettings.showSettingPanel(mode); mWindowMagnificationSettings.showSettingPanel(); } void closeMagnificationSettings() { Loading packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +4 −6 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; Loading Loading @@ -169,8 +168,7 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback mModeSwitchesController.setClickListenerDelegate( displayId -> mHandler.post(() -> { showMagnificationSettingsPanel(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); showMagnificationSettingsPanel(displayId); })); } Loading Loading @@ -253,11 +251,11 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback } @MainThread void showMagnificationSettingsPanel(int displayId, int mode) { void showMagnificationSettingsPanel(int displayId) { final MagnificationSettingsController magnificationSettingsController = mMagnificationSettingsSupplier.get(displayId); if (magnificationSettingsController != null) { magnificationSettingsController.showMagnificationSettings(mode); magnificationSettingsController.showMagnificationSettings(); } } Loading Loading @@ -334,7 +332,7 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback @Override public void onClickSettingsButton(int displayId) { mHandler.post(() -> { showMagnificationSettingsPanel(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); showMagnificationSettingsPanel(displayId); }); } }; Loading packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java +83 −38 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; Loading @@ -27,6 +28,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.database.ContentObserver; import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Rect; Loading Loading @@ -101,8 +103,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest private static final float A11Y_SCALE_MIN_VALUE = 1.0f; private WindowMagnificationSettingsCallback mCallback; // the magnification mode that triggers showing the panel private int mTriggeringMode = ACCESSIBILITY_MAGNIFICATION_MODE_NONE; private ContentObserver mMagnificationCapabilityObserver; @Retention(RetentionPolicy.SOURCE) @IntDef({ Loading Loading @@ -142,6 +143,16 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mGestureDetector = new MagnificationGestureDetector(context, context.getMainThreadHandler(), this); mMagnificationCapabilityObserver = new ContentObserver( mContext.getMainThreadHandler()) { @Override public void onChange(boolean selfChange) { mSettingView.post(() -> { updateUIControlsIfNeeded(); }); } }; } private class ZoomSeekbarChangeListener implements SeekBar.OnSeekBarChangeListener { Loading Loading @@ -257,7 +268,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest @Override public boolean onFinish(float xOffset, float yOffset) { if (!mSingleTapDetected) { showSettingPanel(mTriggeringMode); showSettingPanel(); } mSingleTapDetected = false; return true; Loading Loading @@ -285,7 +296,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest return; } // Reset button status. // Unregister observer before removing view mSecureSettings.unregisterContentObserver(mMagnificationCapabilityObserver); mWindowManager.removeView(mSettingView); mIsVisible = false; if (resetPosition) { Loading @@ -297,16 +309,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mCallback.onSettingsPanelVisibilityChanged(/* shown= */ false); } /** * Shows magnification settings panel. The panel ui would be various for * different magnification mode. * * @param mode The magnification mode * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN */ public void showSettingPanel(int mode) { showSettingPanel(mode, true); public void showSettingPanel() { showSettingPanel(true); } public boolean isSettingPanelShowing() { Loading @@ -322,18 +326,15 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest } /** * Shows magnification panel for set magnification. * Shows the panel for magnification settings. * When the panel is going to be visible by calling this method, the layout position can be * reset depending on the flag. * * @param mode The magnification mode * @param resetPosition if the button position needs be reset * @param resetPosition if the panel position needs to be reset */ private void showSettingPanel(int mode, boolean resetPosition) { private void showSettingPanel(boolean resetPosition) { if (!mIsVisible) { updateUIControlsIfNeed(mode); mTriggeringMode = mode; updateUIControlsIfNeeded(); if (resetPosition) { mDraggableWindowBounds.set(getDraggableWindowBounds()); mParams.x = mDraggableWindowBounds.right; Loading @@ -342,6 +343,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mWindowManager.addView(mSettingView, mParams); mSecureSettings.registerContentObserverForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, mMagnificationCapabilityObserver, UserHandle.USER_CURRENT); // Exclude magnification switch button from system gesture area. setSystemGestureExclusion(); mIsVisible = true; Loading @@ -359,35 +365,74 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mContext.registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } private void updateUIControlsIfNeed(int mode) { if (mode == mTriggeringMode) { return; private int getMagnificationMode() { return mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT); } private int getMagnificationCapability() { return mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT); } private void updateUIControlsIfNeeded() { int capability = getMagnificationCapability(); int selectedButtonIndex = mLastSelectedButtonIndex; switch (mode) { case ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN: // set the edit button visibility to View.INVISIBLE to keep the height, to prevent // the size title from too close to the size buttons switch (capability) { case ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW: mEditButton.setVisibility(View.VISIBLE); mAllowDiagonalScrollingView.setVisibility(View.VISIBLE); mFullScreenButton.setVisibility(View.GONE); if (selectedButtonIndex == MagnificationSize.FULLSCREEN) { selectedButtonIndex = MagnificationSize.NONE; } break; case ACCESSIBILITY_MAGNIFICATION_MODE_ALL: int mode = getMagnificationMode(); mFullScreenButton.setVisibility(View.VISIBLE); if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { // set the edit button visibility to View.INVISIBLE to keep the height, to // prevent the size title from too close to the size buttons mEditButton.setVisibility(View.INVISIBLE); mAllowDiagonalScrollingView.setVisibility(View.GONE); // force the fullscreen button showing selectedButtonIndex = MagnificationSize.FULLSCREEN; break; case ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW: } else { // mode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW mEditButton.setVisibility(View.VISIBLE); mAllowDiagonalScrollingView.setVisibility(View.VISIBLE); if (selectedButtonIndex == MagnificationSize.FULLSCREEN) { selectedButtonIndex = MagnificationSize.NONE; } break; case ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN: // We will never fall into this case since we never show settings panel when // capability equals to ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN. // Currently, the case follows the UI controls when capability equals to // ACCESSIBILITY_MAGNIFICATION_MODE_ALL and mode equals to // ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, but we could also consider to // remove the whole icon button selections int the future since they are no use // for fullscreen only capability. mFullScreenButton.setVisibility(View.VISIBLE); // set the edit button visibility to View.INVISIBLE to keep the height, to // prevent the size title from too close to the size buttons mEditButton.setVisibility(View.INVISIBLE); mAllowDiagonalScrollingView.setVisibility(View.GONE); // force the fullscreen button showing selectedButtonIndex = MagnificationSize.FULLSCREEN; break; default: break; } updateSelectedButton(selectedButtonIndex); mSettingView.requestLayout(); } private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { Loading Loading @@ -474,11 +519,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mParams.accessibilityTitle = getAccessibilityWindowTitle(mContext); boolean showSettingPanelAfterThemeChange = mIsVisible; boolean showSettingPanelAfterConfigChange = mIsVisible; hideSettingPanel(/* resetPosition= */ false); inflateView(); if (showSettingPanelAfterThemeChange) { showSettingPanel(mTriggeringMode, /* resetPosition= */ false); if (showSettingPanelAfterConfigChange) { showSettingPanel(/* resetPosition= */ false); } return; } Loading packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java +2 −4 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; Loading Loading @@ -74,10 +73,9 @@ public class MagnificationSettingsControllerTest extends SysuiTestCase { @Test public void testShowSettingsPanel() { final int mode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; mMagnificationSettingsController.showMagnificationSettings(mode); mMagnificationSettingsController.showMagnificationSettings(); verify(mWindowMagnificationSettings).showSettingPanel(eq(mode)); verify(mWindowMagnificationSettings).showSettingPanel(); } @Test Loading packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java +96 −17 Original line number Diff line number Diff line Loading @@ -16,7 +16,10 @@ package com.android.systemui.accessibility; 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; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static com.google.common.truth.Truth.assertThat; Loading @@ -24,12 +27,17 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.IdRes; import android.content.Context; import android.content.pm.ActivityInfo; import android.database.ContentObserver; import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -102,7 +110,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_hasAccessibilityWindowTitle() { mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); final WindowManager.LayoutParams layoutPrams = mWindowManager.getLayoutParamsFromAttachedView(); Loading @@ -114,7 +125,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_windowMode_showEditButtonAndDiagonalView() { mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); final Button editButton = getInternalView(R.id.magnifier_edit_button); assertEquals(editButton.getVisibility(), View.VISIBLE); Loading @@ -125,7 +139,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_fullScreenMode_hideEditButtonAndDiagonalView() { mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); mWindowMagnificationSettings.showSettingPanel(); final Button editButton = getInternalView(R.id.magnifier_edit_button); assertEquals(editButton.getVisibility(), View.INVISIBLE); Loading @@ -134,10 +151,23 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { assertEquals(diagonalView.getVisibility(), View.GONE); } @Test public void showSettingPanel_windowOnlyCapability_hideFullscreenButton() { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); final View fullscreenButton = getInternalView(R.id.magnifier_full_button); assertThat(fullscreenButton.getVisibility()).isEqualTo(View.GONE); } @Test public void performClick_smallSizeButton_changeMagnifierSizeSmallAndSwitchToWindowMode() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verifyOnSetMagnifierSizeAndOnModeSwitch( R.id.magnifier_small_button, MAGNIFICATION_SIZE_SMALL); Loading @@ -145,8 +175,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void performClick_mediumSizeButton_changeMagnifierSizeMediumAndSwitchToWindowMode() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verifyOnSetMagnifierSizeAndOnModeSwitch( R.id.magnifier_medium_button, MAGNIFICATION_SIZE_MEDIUM); Loading @@ -154,8 +186,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void performClick_largeSizeButton_changeMagnifierSizeLargeAndSwitchToWindowMode() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verifyOnSetMagnifierSizeAndOnModeSwitch( R.id.magnifier_large_button, MAGNIFICATION_SIZE_LARGE); Loading @@ -178,8 +212,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { View fullScreenModeButton = getInternalView(R.id.magnifier_full_button); getInternalView(R.id.magnifier_panel_view); // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); // Perform click fullScreenModeButton.performClick(); Loading @@ -192,8 +228,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { public void performClick_editButton_setEditMagnifierSizeMode() { View editButton = getInternalView(R.id.magnifier_edit_button); // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); // Perform click editButton.performClick(); Loading @@ -208,8 +246,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { getInternalView(R.id.magnifier_horizontal_lock_switch); final boolean currentCheckedState = diagonalScrollingSwitch.isChecked(); // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); // Perform click diagonalScrollingSwitch.performClick(); Loading @@ -219,8 +259,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void onConfigurationChanged_selectedButtonIsStillSelected() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); View magnifierMediumButton = getInternalView(R.id.magnifier_medium_button); magnifierMediumButton.performClick(); Loading @@ -232,9 +274,46 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { assertThat(magnifierMediumButton.isSelected()).isTrue(); } @Test public void showSettingsPanel_observerRegistered() { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verify(mSecureSettings).registerContentObserverForUser( eq(ACCESSIBILITY_MAGNIFICATION_CAPABILITY), any(ContentObserver.class), eq(UserHandle.USER_CURRENT)); } @Test public void hideSettingsPanel_observerUnregistered() { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); mWindowMagnificationSettings.hideSettingPanel(); verify(mSecureSettings).unregisterContentObserver(any(ContentObserver.class)); } private <T extends View> T getInternalView(@IdRes int idRes) { T view = mSettingView.findViewById(idRes); assertNotNull(view); return view; } private void setupMagnificationCapabilityAndMode(int capability, int mode) { when(mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT)).thenReturn(capability); when(mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT)).thenReturn(mode); } } Loading
packages/SystemUI/src/com/android/systemui/accessibility/MagnificationSettingsController.java +3 −8 Original line number Diff line number Diff line Loading @@ -87,19 +87,14 @@ public class MagnificationSettingsController implements ComponentCallbacks { } /** * Shows magnification settings panel {@link WindowMagnificationSettings}. The panel ui would be * various for different magnification mode. * * @param mode The magnification mode * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN * Shows magnification settings panel {@link WindowMagnificationSettings}. */ void showMagnificationSettings(int mode) { void showMagnificationSettings() { if (!mWindowMagnificationSettings.isSettingPanelShowing()) { onConfigurationChanged(mContext.getResources().getConfiguration()); mContext.registerComponentCallbacks(this); } mWindowMagnificationSettings.showSettingPanel(mode); mWindowMagnificationSettings.showSettingPanel(); } void closeMagnificationSettings() { Loading
packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +4 −6 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; Loading Loading @@ -169,8 +168,7 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback mModeSwitchesController.setClickListenerDelegate( displayId -> mHandler.post(() -> { showMagnificationSettingsPanel(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); showMagnificationSettingsPanel(displayId); })); } Loading Loading @@ -253,11 +251,11 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback } @MainThread void showMagnificationSettingsPanel(int displayId, int mode) { void showMagnificationSettingsPanel(int displayId) { final MagnificationSettingsController magnificationSettingsController = mMagnificationSettingsSupplier.get(displayId); if (magnificationSettingsController != null) { magnificationSettingsController.showMagnificationSettings(mode); magnificationSettingsController.showMagnificationSettings(); } } Loading Loading @@ -334,7 +332,7 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback @Override public void onClickSettingsButton(int displayId) { mHandler.post(() -> { showMagnificationSettingsPanel(displayId, ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); showMagnificationSettingsPanel(displayId); }); } }; Loading
packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java +83 −38 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; Loading @@ -27,6 +28,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.database.ContentObserver; import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Rect; Loading Loading @@ -101,8 +103,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest private static final float A11Y_SCALE_MIN_VALUE = 1.0f; private WindowMagnificationSettingsCallback mCallback; // the magnification mode that triggers showing the panel private int mTriggeringMode = ACCESSIBILITY_MAGNIFICATION_MODE_NONE; private ContentObserver mMagnificationCapabilityObserver; @Retention(RetentionPolicy.SOURCE) @IntDef({ Loading Loading @@ -142,6 +143,16 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mGestureDetector = new MagnificationGestureDetector(context, context.getMainThreadHandler(), this); mMagnificationCapabilityObserver = new ContentObserver( mContext.getMainThreadHandler()) { @Override public void onChange(boolean selfChange) { mSettingView.post(() -> { updateUIControlsIfNeeded(); }); } }; } private class ZoomSeekbarChangeListener implements SeekBar.OnSeekBarChangeListener { Loading Loading @@ -257,7 +268,7 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest @Override public boolean onFinish(float xOffset, float yOffset) { if (!mSingleTapDetected) { showSettingPanel(mTriggeringMode); showSettingPanel(); } mSingleTapDetected = false; return true; Loading Loading @@ -285,7 +296,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest return; } // Reset button status. // Unregister observer before removing view mSecureSettings.unregisterContentObserver(mMagnificationCapabilityObserver); mWindowManager.removeView(mSettingView); mIsVisible = false; if (resetPosition) { Loading @@ -297,16 +309,8 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mCallback.onSettingsPanelVisibilityChanged(/* shown= */ false); } /** * Shows magnification settings panel. The panel ui would be various for * different magnification mode. * * @param mode The magnification mode * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW * @see android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN */ public void showSettingPanel(int mode) { showSettingPanel(mode, true); public void showSettingPanel() { showSettingPanel(true); } public boolean isSettingPanelShowing() { Loading @@ -322,18 +326,15 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest } /** * Shows magnification panel for set magnification. * Shows the panel for magnification settings. * When the panel is going to be visible by calling this method, the layout position can be * reset depending on the flag. * * @param mode The magnification mode * @param resetPosition if the button position needs be reset * @param resetPosition if the panel position needs to be reset */ private void showSettingPanel(int mode, boolean resetPosition) { private void showSettingPanel(boolean resetPosition) { if (!mIsVisible) { updateUIControlsIfNeed(mode); mTriggeringMode = mode; updateUIControlsIfNeeded(); if (resetPosition) { mDraggableWindowBounds.set(getDraggableWindowBounds()); mParams.x = mDraggableWindowBounds.right; Loading @@ -342,6 +343,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mWindowManager.addView(mSettingView, mParams); mSecureSettings.registerContentObserverForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, mMagnificationCapabilityObserver, UserHandle.USER_CURRENT); // Exclude magnification switch button from system gesture area. setSystemGestureExclusion(); mIsVisible = true; Loading @@ -359,35 +365,74 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mContext.registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } private void updateUIControlsIfNeed(int mode) { if (mode == mTriggeringMode) { return; private int getMagnificationMode() { return mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT); } private int getMagnificationCapability() { return mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT); } private void updateUIControlsIfNeeded() { int capability = getMagnificationCapability(); int selectedButtonIndex = mLastSelectedButtonIndex; switch (mode) { case ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN: // set the edit button visibility to View.INVISIBLE to keep the height, to prevent // the size title from too close to the size buttons switch (capability) { case ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW: mEditButton.setVisibility(View.VISIBLE); mAllowDiagonalScrollingView.setVisibility(View.VISIBLE); mFullScreenButton.setVisibility(View.GONE); if (selectedButtonIndex == MagnificationSize.FULLSCREEN) { selectedButtonIndex = MagnificationSize.NONE; } break; case ACCESSIBILITY_MAGNIFICATION_MODE_ALL: int mode = getMagnificationMode(); mFullScreenButton.setVisibility(View.VISIBLE); if (mode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) { // set the edit button visibility to View.INVISIBLE to keep the height, to // prevent the size title from too close to the size buttons mEditButton.setVisibility(View.INVISIBLE); mAllowDiagonalScrollingView.setVisibility(View.GONE); // force the fullscreen button showing selectedButtonIndex = MagnificationSize.FULLSCREEN; break; case ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW: } else { // mode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW mEditButton.setVisibility(View.VISIBLE); mAllowDiagonalScrollingView.setVisibility(View.VISIBLE); if (selectedButtonIndex == MagnificationSize.FULLSCREEN) { selectedButtonIndex = MagnificationSize.NONE; } break; case ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN: // We will never fall into this case since we never show settings panel when // capability equals to ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN. // Currently, the case follows the UI controls when capability equals to // ACCESSIBILITY_MAGNIFICATION_MODE_ALL and mode equals to // ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, but we could also consider to // remove the whole icon button selections int the future since they are no use // for fullscreen only capability. mFullScreenButton.setVisibility(View.VISIBLE); // set the edit button visibility to View.INVISIBLE to keep the height, to // prevent the size title from too close to the size buttons mEditButton.setVisibility(View.INVISIBLE); mAllowDiagonalScrollingView.setVisibility(View.GONE); // force the fullscreen button showing selectedButtonIndex = MagnificationSize.FULLSCREEN; break; default: break; } updateSelectedButton(selectedButtonIndex); mSettingView.requestLayout(); } private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { Loading Loading @@ -474,11 +519,11 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mParams.accessibilityTitle = getAccessibilityWindowTitle(mContext); boolean showSettingPanelAfterThemeChange = mIsVisible; boolean showSettingPanelAfterConfigChange = mIsVisible; hideSettingPanel(/* resetPosition= */ false); inflateView(); if (showSettingPanelAfterThemeChange) { showSettingPanel(mTriggeringMode, /* resetPosition= */ false); if (showSettingPanelAfterConfigChange) { showSettingPanel(/* resetPosition= */ false); } return; } Loading
packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationSettingsControllerTest.java +2 −4 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.systemui.accessibility; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; Loading Loading @@ -74,10 +73,9 @@ public class MagnificationSettingsControllerTest extends SysuiTestCase { @Test public void testShowSettingsPanel() { final int mode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; mMagnificationSettingsController.showMagnificationSettings(mode); mMagnificationSettingsController.showMagnificationSettings(); verify(mWindowMagnificationSettings).showSettingPanel(eq(mode)); verify(mWindowMagnificationSettings).showSettingPanel(); } @Test Loading
packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationSettingsTest.java +96 −17 Original line number Diff line number Diff line Loading @@ -16,7 +16,10 @@ package com.android.systemui.accessibility; 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; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static com.google.common.truth.Truth.assertThat; Loading @@ -24,12 +27,17 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.IdRes; import android.content.Context; import android.content.pm.ActivityInfo; import android.database.ContentObserver; import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; Loading Loading @@ -102,7 +110,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_hasAccessibilityWindowTitle() { mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); final WindowManager.LayoutParams layoutPrams = mWindowManager.getLayoutParamsFromAttachedView(); Loading @@ -114,7 +125,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_windowMode_showEditButtonAndDiagonalView() { mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); final Button editButton = getInternalView(R.id.magnifier_edit_button); assertEquals(editButton.getVisibility(), View.VISIBLE); Loading @@ -125,7 +139,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void showSettingPanel_fullScreenMode_hideEditButtonAndDiagonalView() { mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); mWindowMagnificationSettings.showSettingPanel(); final Button editButton = getInternalView(R.id.magnifier_edit_button); assertEquals(editButton.getVisibility(), View.INVISIBLE); Loading @@ -134,10 +151,23 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { assertEquals(diagonalView.getVisibility(), View.GONE); } @Test public void showSettingPanel_windowOnlyCapability_hideFullscreenButton() { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); final View fullscreenButton = getInternalView(R.id.magnifier_full_button); assertThat(fullscreenButton.getVisibility()).isEqualTo(View.GONE); } @Test public void performClick_smallSizeButton_changeMagnifierSizeSmallAndSwitchToWindowMode() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verifyOnSetMagnifierSizeAndOnModeSwitch( R.id.magnifier_small_button, MAGNIFICATION_SIZE_SMALL); Loading @@ -145,8 +175,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void performClick_mediumSizeButton_changeMagnifierSizeMediumAndSwitchToWindowMode() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verifyOnSetMagnifierSizeAndOnModeSwitch( R.id.magnifier_medium_button, MAGNIFICATION_SIZE_MEDIUM); Loading @@ -154,8 +186,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void performClick_largeSizeButton_changeMagnifierSizeLargeAndSwitchToWindowMode() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verifyOnSetMagnifierSizeAndOnModeSwitch( R.id.magnifier_large_button, MAGNIFICATION_SIZE_LARGE); Loading @@ -178,8 +212,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { View fullScreenModeButton = getInternalView(R.id.magnifier_full_button); getInternalView(R.id.magnifier_panel_view); // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); // Perform click fullScreenModeButton.performClick(); Loading @@ -192,8 +228,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { public void performClick_editButton_setEditMagnifierSizeMode() { View editButton = getInternalView(R.id.magnifier_edit_button); // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); // Perform click editButton.performClick(); Loading @@ -208,8 +246,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { getInternalView(R.id.magnifier_horizontal_lock_switch); final boolean currentCheckedState = diagonalScrollingSwitch.isChecked(); // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); // Perform click diagonalScrollingSwitch.performClick(); Loading @@ -219,8 +259,10 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { @Test public void onConfigurationChanged_selectedButtonIsStillSelected() { // Open view mWindowMagnificationSettings.showSettingPanel(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); View magnifierMediumButton = getInternalView(R.id.magnifier_medium_button); magnifierMediumButton.performClick(); Loading @@ -232,9 +274,46 @@ public class WindowMagnificationSettingsTest extends SysuiTestCase { assertThat(magnifierMediumButton.isSelected()).isTrue(); } @Test public void showSettingsPanel_observerRegistered() { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); verify(mSecureSettings).registerContentObserverForUser( eq(ACCESSIBILITY_MAGNIFICATION_CAPABILITY), any(ContentObserver.class), eq(UserHandle.USER_CURRENT)); } @Test public void hideSettingsPanel_observerUnregistered() { setupMagnificationCapabilityAndMode( /* capability= */ ACCESSIBILITY_MAGNIFICATION_MODE_ALL, /* mode= */ ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mWindowMagnificationSettings.showSettingPanel(); mWindowMagnificationSettings.hideSettingPanel(); verify(mSecureSettings).unregisterContentObserver(any(ContentObserver.class)); } private <T extends View> T getInternalView(@IdRes int idRes) { T view = mSettingView.findViewById(idRes); assertNotNull(view); return view; } private void setupMagnificationCapabilityAndMode(int capability, int mode) { when(mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT)).thenReturn(capability); when(mSecureSettings.getIntForUser( Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, ACCESSIBILITY_MAGNIFICATION_MODE_NONE, UserHandle.USER_CURRENT)).thenReturn(mode); } }