Change Magnification Mode Settings UI

To support new settings UI, we change the UI from scrollview
to listview to simplify UI initialization.

Bug: 182118397
Test: atest MagnificationSettingsFragmentTest
      and manual test.
Change-Id: Ib65dc139ba54f2281e5cb7e2dc55b3574ad2c733
This commit is contained in:
ryanlwlin
2021-03-15 15:30:55 +08:00
parent 993b820a76
commit 0272002335
16 changed files with 723 additions and 232 deletions

View File

@@ -16,12 +16,15 @@
package com.android.settings.accessibility;
import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import static com.android.settings.accessibility.MagnificationPreferenceFragment.ON;
import static com.android.settings.accessibility.MagnificationSettingsFragment.MagnificationModeInfo;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -29,7 +32,8 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceManager;
@@ -77,7 +81,7 @@ public class MagnificationSettingsFragmentTest {
}
@Test
public void onCreateDialog_capabilitiesInBundle_matchCheckBoxStatus() {
public void onCreateDialog_capabilitiesInBundle_checkedModeInDialogIsExpected() {
final Bundle windowModeSavedInstanceState = new Bundle();
windowModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
@@ -85,23 +89,21 @@ public class MagnificationSettingsFragmentTest {
mFragment.onCreate(windowModeSavedInstanceState);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isFalse();
assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isTrue();
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.WINDOW);
}
@Test
public void onCreateDialog_capabilitiesInSettings_matchCheckBoxStatus() {
public void onCreateDialog_capabilitiesInSetting_checkedModeInDialogIsExpected() {
MagnificationCapabilities.setCapabilities(mContext,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
mFragment.onCreate(Bundle.EMPTY);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isTrue();
assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isFalse();
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.FULLSCREEN);
}
@Test
public void onCreateDialog_capabilitiesInSettingsAndBundle_matchBundleValueCheckBoxStatus() {
public void onCreateDialog_choseModeIsDifferentFromInSettings_ShowUsersChoseModeInDialog() {
final Bundle allModeSavedInstanceState = new Bundle();
allModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
@@ -111,37 +113,93 @@ public class MagnificationSettingsFragmentTest {
mFragment.onCreate(allModeSavedInstanceState);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isTrue();
assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isTrue();
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.ALL);
}
@Test
public void onCreateDialog_emptySettingsAndBundle_matchDefaultValueCheckBoxStatus() {
public void onCreateDialog_emptySettingsAndBundle_checkedModeInDialogIsDefaultValue() {
mFragment.onCreate(Bundle.EMPTY);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
// Compare to default Capabilities
assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isTrue();
assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isFalse();
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.FULLSCREEN);
}
@Test
public void checkWindowModeCheckBox_tripleTapEnabled_showSwitchShortcutDialog() {
public void chooseWindowMode_tripleTapEnabled_showSwitchShortcutDialog() {
enableTripleTap();
final Bundle fullScreenModeSavedInstanceState = new Bundle();
fullScreenModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
mFragment.onCreate(fullScreenModeSavedInstanceState);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
enableTripleTap();
final View dialogWidowView = mFragment.mDialog.findViewById(R.id.magnify_window_screen);
final View dialogWindowTextArea = dialogWidowView.findViewById(R.id.container);
dialogWindowTextArea.performClick();
performItemClickWith(MagnificationMode.WINDOW);
verify(mFragment).showDialog(
MagnificationSettingsFragment.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
}
@Test
public void chooseModeAll_tripleTapEnabled_showSwitchShortcutDialog() {
enableTripleTap();
final Bundle fullScreenModeSavedInstanceState = new Bundle();
fullScreenModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
mFragment.onCreate(fullScreenModeSavedInstanceState);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
performItemClickWith(MagnificationMode.ALL);
verify(mFragment).showDialog(
MagnificationSettingsFragment.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
}
@Test
public void chooseWindowMode_WindowModeInSettingsAndTripleTapEnabled_notShowShortCutDialog() {
enableTripleTap();
MagnificationCapabilities.setCapabilities(mContext,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
mFragment.onCreate(Bundle.EMPTY);
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
performItemClickWith(MagnificationMode.WINDOW);
verify(mFragment, never()).showDialog(
MagnificationSettingsFragment.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
}
private int getChoseModeFromDialog() {
final ListView listView = mFragment.mMagnificationModesListView;
assertThat(listView).isNotNull();
final int checkedPosition = listView.getCheckedItemPosition();
final MagnificationModeInfo modeInfo =
(MagnificationModeInfo) listView.getAdapter().getItem(
checkedPosition);
return modeInfo.mMagnificationMode;
}
private void performItemClickWith(@MagnificationMode int mode) {
final ListView listView = mFragment.mMagnificationModesListView;
assertThat(listView).isNotNull();
int modeIndex = AdapterView.NO_ID;
// Index 0 is header.
for (int i = 1; i < listView.getAdapter().getCount(); i++) {
final MagnificationModeInfo modeInfo =
(MagnificationModeInfo) listView.getAdapter().getItem(i);
if (modeInfo.mMagnificationMode == mode) {
modeIndex = i;
break;
}
}
if (modeIndex == AdapterView.NO_ID) {
throw new RuntimeException("The mode is not in the list.");
}
listView.performItemClick(listView.getChildAt(modeIndex), modeIndex, modeIndex);
}
private void enableTripleTap() {
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ON);