Merge "Hide fullscreen button in partial only mode" into udc-dev

This commit is contained in:
Candice Lo
2023-05-12 01:45:55 +00:00
committed by Android (Google) Code Review
6 changed files with 190 additions and 76 deletions

View File

@@ -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() {

View File

@@ -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;
@@ -169,8 +168,7 @@ public class WindowMagnification implements CoreStartable, CommandQueue.Callback
mModeSwitchesController.setClickListenerDelegate(
displayId -> mHandler.post(() -> {
showMagnificationSettingsPanel(displayId,
ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
showMagnificationSettingsPanel(displayId);
}));
}
@@ -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();
}
}
@@ -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);
});
}
};

View File

@@ -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;
@@ -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;
@@ -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({
@@ -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 {
@@ -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;
@@ -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) {
@@ -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() {
@@ -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;
@@ -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;
@@ -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) {
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;
} else { // mode = ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW
mEditButton.setVisibility(View.VISIBLE);
mAllowDiagonalScrollingView.setVisibility(View.VISIBLE);
}
break;
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
// 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;
case ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW:
mEditButton.setVisibility(View.VISIBLE);
mAllowDiagonalScrollingView.setVisibility(View.VISIBLE);
if (selectedButtonIndex == MagnificationSize.FULLSCREEN) {
selectedButtonIndex = MagnificationSize.NONE;
}
break;
default:
break;
}
updateSelectedButton(selectedButtonIndex);
mSettingView.requestLayout();
}
private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
@@ -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;
}

View File

@@ -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;
@@ -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

View File

@@ -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;
@@ -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;
@@ -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();
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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();
@@ -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();
@@ -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();
@@ -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();
@@ -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);
}
}

View File

@@ -184,8 +184,7 @@ public class WindowMagnificationTest extends SysuiTestCase {
mWindowMagnification.mWindowMagnifierCallback.onClickSettingsButton(TEST_DISPLAY);
waitForIdleSync();
verify(mMagnificationSettingsController).showMagnificationSettings(
eq(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW));
verify(mMagnificationSettingsController).showMagnificationSettings();
}
@Test