Extract the logic of MagnificationMode to the controller
To move the preference to the upper layer, we extract all logics to its controller. We move all tests to the test files and add server tests to verify the behaviour of edit shortcut dialog. Bug: 182992338 Test: atest MagnificationModePreferenceControllerTest Change-Id: I34c4361e2e116a22c3e34bd35c8ac8cac752ab96
This commit is contained in:
@@ -56,4 +56,11 @@ public final class MagnificationCapabilitiesTest {
|
||||
R.string.accessibility_magnification_area_settings_full_screen_summary);
|
||||
assertThat(actualString).isEqualTo(expectedString);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getCapabilities_unset_defaultValue() {
|
||||
final int windowCapabilities = MagnificationCapabilities.getCapabilities(mContext);
|
||||
assertThat(windowCapabilities).isEqualTo(
|
||||
MagnificationCapabilities.MagnificationMode.FULLSCREEN);
|
||||
}
|
||||
}
|
||||
|
@@ -16,40 +16,143 @@
|
||||
|
||||
package com.android.settings.accessibility;
|
||||
|
||||
import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
|
||||
|
||||
import static com.android.settings.accessibility.AccessibilityEditDialogUtils.CustomButton;
|
||||
import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
|
||||
import static com.android.settings.accessibility.MagnificationModePreferenceController.MagnificationModeInfo;
|
||||
import static com.android.settings.accessibility.MagnificationPreferenceFragment.ON;
|
||||
|
||||
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 android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.shadow.ShadowDashboardFragment;
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = ShadowDashboardFragment.class)
|
||||
public class MagnificationModePreferenceControllerTest {
|
||||
private static final String PREF_KEY = "screen_magnification_mode";
|
||||
private static final String KEY_CAPABILITY =
|
||||
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY;
|
||||
private static final int WINDOW_SCREEN_VALUE = 2;
|
||||
private static final int ALL_VALUE = 3;
|
||||
private static final int MAGNIFICATION_MODE_DEFAULT = MagnificationMode.ALL;
|
||||
|
||||
@Rule
|
||||
public MockitoRule mocks = MockitoJUnit.rule();
|
||||
|
||||
@Mock
|
||||
private PreferenceScreen mScreen;
|
||||
private Context mContext;
|
||||
private TestMagnificationSettingsFragment mFragment;
|
||||
private MagnificationModePreferenceController mController;
|
||||
private Preference mModePreference;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mController = new MagnificationModePreferenceController(mContext, PREF_KEY);
|
||||
mScreen = spy(new PreferenceScreen(mContext, null));
|
||||
mModePreference = new Preference(mContext);
|
||||
mFragment = spy(new TestMagnificationSettingsFragment(mController));
|
||||
|
||||
doReturn(mScreen).when(mFragment).getPreferenceScreen();
|
||||
doReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)).when(
|
||||
mFragment).getChildFragmentManager();
|
||||
mContext.setTheme(R.style.Theme_AppCompat);
|
||||
doReturn(mModePreference).when(mScreen).findPreference(PREF_KEY);
|
||||
MagnificationCapabilities.setCapabilities(mContext, MAGNIFICATION_MODE_DEFAULT);
|
||||
showPreferenceOnTheScreen(null);
|
||||
mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void settingsModeIsDefault_checkedModeInDialogIsDefault() {
|
||||
assertThat(getCheckedModeFromDialog()).isEqualTo(
|
||||
MAGNIFICATION_MODE_DEFAULT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void choseModeIsDifferentFromInSettings_checkedModeInDialogIsExpected() {
|
||||
performItemClickWith(MagnificationMode.WINDOW);
|
||||
|
||||
assertThat(getCheckedModeFromDialog()).isEqualTo(MagnificationMode.WINDOW);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dialogIsReCreated_settingsModeIsAllAndChoseWindowMode_checkedModeIsWindow() {
|
||||
showPreferenceOnTheScreen(null);
|
||||
performItemClickWith(MagnificationMode.WINDOW);
|
||||
|
||||
reshowPreferenceOnTheScreen();
|
||||
mFragment.showDialog(MagnificationModePreferenceController.DIALOG_MAGNIFICATION_MODE);
|
||||
|
||||
assertThat(getCheckedModeFromDialog()).isEqualTo(
|
||||
MagnificationMode.WINDOW);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void chooseWindowMode_tripleTapEnabled_showSwitchShortcutDialog() {
|
||||
enableTripleTap();
|
||||
|
||||
performItemClickWith(MagnificationMode.WINDOW);
|
||||
|
||||
verify(mFragment).showDialog(
|
||||
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void chooseModeAll_modeAllInSettingsAndTripleTapEnabled_notShowShortcutDialog() {
|
||||
enableTripleTap();
|
||||
MagnificationCapabilities.setCapabilities(mContext,
|
||||
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
|
||||
mFragment.onCreate(Bundle.EMPTY);
|
||||
mFragment.onCreateDialog(MagnificationModePreferenceController.DIALOG_MAGNIFICATION_MODE);
|
||||
|
||||
performItemClickWith(MagnificationMode.ALL);
|
||||
|
||||
verify(mFragment, never()).showDialog(
|
||||
MagnificationModePreferenceController.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onSwitchShortcutDialogPositiveButtonClicked_TripleTapEnabled_TripleTapDisabled() {
|
||||
enableTripleTap();
|
||||
|
||||
mController.onSwitchShortcutDialogButtonClicked(CustomButton.POSITIVE);
|
||||
|
||||
assertThat(MagnificationModePreferenceController.isTripleTapEnabled(mContext)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSummary_saveWindowScreen_shouldReturnWindowScreenSummary() {
|
||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||
KEY_CAPABILITY, WINDOW_SCREEN_VALUE);
|
||||
MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.WINDOW);
|
||||
|
||||
assertThat(mController.getSummary())
|
||||
.isEqualTo(mContext.getString(
|
||||
@@ -58,11 +161,93 @@ public class MagnificationModePreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void getSummary_saveAll_shouldReturnAllSummary() {
|
||||
Settings.Secure.putInt(mContext.getContentResolver(),
|
||||
KEY_CAPABILITY, ALL_VALUE);
|
||||
MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.ALL);
|
||||
|
||||
assertThat(mController.getSummary())
|
||||
.isEqualTo(mContext.getString(
|
||||
R.string.accessibility_magnification_area_settings_all_summary));
|
||||
}
|
||||
|
||||
private int getCheckedModeFromDialog() {
|
||||
final ListView listView = mController.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 = mController.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);
|
||||
}
|
||||
|
||||
private void reshowPreferenceOnTheScreen() {
|
||||
final Bundle bundle = new Bundle();
|
||||
mFragment.onSaveInstanceState(bundle);
|
||||
mFragment.onDetach();
|
||||
showPreferenceOnTheScreen(bundle);
|
||||
|
||||
}
|
||||
|
||||
private void showPreferenceOnTheScreen(Bundle savedInstanceState) {
|
||||
mFragment.onAttach(mContext);
|
||||
mFragment.onCreate(savedInstanceState);
|
||||
mController.displayPreference(mScreen);
|
||||
}
|
||||
|
||||
private static class TestMagnificationSettingsFragment extends MagnificationSettingsFragment {
|
||||
|
||||
TestMagnificationSettingsFragment(AbstractPreferenceController... controllers) {
|
||||
// Add given controllers for injection. Although controllers will be added in
|
||||
// onAttach(). use(AbstractPreferenceController.class) returns the first added one.
|
||||
for (int i = 0; i < controllers.length; i++) {
|
||||
addPreferenceController(controllers[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
// Simulate the observable behaviour because ShadowDashFragment doesn't call
|
||||
// super.create.
|
||||
|
||||
getSettingsLifecycle().onCreate(icicle);
|
||||
getSettingsLifecycle().handleLifecycleEvent(ON_CREATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void showDialog(int dialogId) {
|
||||
super.showDialog(dialogId);
|
||||
// In current fragment architecture, we could assume onCreateDialog is called directly.
|
||||
onCreateDialog(dialogId);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addPreferenceController(AbstractPreferenceController controller) {
|
||||
super.addPreferenceController(controller);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -16,201 +16,34 @@
|
||||
|
||||
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;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.provider.Settings;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.shadow.ShadowDashboardFragment;
|
||||
import com.android.settings.testutils.XmlTestUtils;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** Tests for {@link MagnificationSettingsFragment} */
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = ShadowDashboardFragment.class)
|
||||
public class MagnificationSettingsFragmentTest {
|
||||
|
||||
@Rule
|
||||
public MockitoRule mocks = MockitoJUnit.rule();
|
||||
|
||||
@Mock
|
||||
private PreferenceManager mPreferenceManager;
|
||||
|
||||
private static final String EXTRA_CAPABILITY =
|
||||
MagnificationSettingsFragment.EXTRA_CAPABILITY;
|
||||
|
||||
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||
private TestMagnificationSettingsFragment mFragment;
|
||||
|
||||
@Before
|
||||
public void setUpFragment() {
|
||||
mFragment = spy(new TestMagnificationSettingsFragment());
|
||||
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
|
||||
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
|
||||
doReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)).when(
|
||||
mFragment).getChildFragmentManager();
|
||||
mContext.setTheme(R.style.Theme_AppCompat);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_capabilitiesInBundle_checkedModeInDialogIsExpected() {
|
||||
final Bundle windowModeSavedInstanceState = new Bundle();
|
||||
windowModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
|
||||
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
|
||||
|
||||
mFragment.onCreate(windowModeSavedInstanceState);
|
||||
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
|
||||
|
||||
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.WINDOW);
|
||||
}
|
||||
|
||||
@Test
|
||||
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(getChoseModeFromDialog()).isEqualTo(MagnificationMode.FULLSCREEN);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_choseModeIsDifferentFromInSettings_ShowUsersChoseModeInDialog() {
|
||||
final Bundle allModeSavedInstanceState = new Bundle();
|
||||
allModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
|
||||
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);
|
||||
|
||||
MagnificationCapabilities.setCapabilities(mContext,
|
||||
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
|
||||
mFragment.onCreate(allModeSavedInstanceState);
|
||||
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
|
||||
|
||||
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.ALL);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateDialog_emptySettingsAndBundle_checkedModeInDialogIsDefaultValue() {
|
||||
mFragment.onCreate(Bundle.EMPTY);
|
||||
mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);
|
||||
|
||||
assertThat(getChoseModeFromDialog()).isEqualTo(MagnificationMode.FULLSCREEN);
|
||||
}
|
||||
|
||||
@Test
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public static class TestMagnificationSettingsFragment extends MagnificationSettingsFragment {
|
||||
public TestMagnificationSettingsFragment() {}
|
||||
|
||||
@Override
|
||||
protected void showDialog(int dialogId) {
|
||||
super.showDialog(dialogId);
|
||||
}
|
||||
public void getNonIndexableKeys_existInXmlLayout() {
|
||||
final List<String> niks =
|
||||
ShortcutsSettingsFragment.SEARCH_INDEX_DATA_PROVIDER
|
||||
.getNonIndexableKeys(mContext);
|
||||
final List<String> keys =
|
||||
XmlTestUtils.getKeysFromPreferenceXml(mContext,
|
||||
R.xml.accessibility_magnification_service_settings);
|
||||
assertThat(keys).containsAtLeastElementsIn(niks);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user