1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.accessibility; 18 19 import static com.android.settings.accessibility.AccessibilityUtil.State.ON; 20 21 import static com.google.common.truth.Truth.assertThat; 22 23 import static org.mockito.Mockito.never; 24 import static org.mockito.Mockito.verify; 25 26 import android.content.Context; 27 import android.content.DialogInterface; 28 import android.os.Bundle; 29 import android.provider.Settings; 30 import android.text.SpannableString; 31 import android.text.TextUtils; 32 import android.view.View; 33 import android.widget.AdapterView; 34 import android.widget.ListView; 35 import android.widget.TextView; 36 37 import androidx.preference.Preference; 38 import androidx.preference.PreferenceManager; 39 import androidx.preference.PreferenceScreen; 40 import androidx.test.core.app.ApplicationProvider; 41 42 import com.android.settings.R; 43 import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; 44 import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode; 45 import com.android.settings.accessibility.MagnificationModePreferenceController.MagnificationModeInfo; 46 import com.android.settings.utils.AnnotationSpan; 47 48 import org.junit.Before; 49 import org.junit.Rule; 50 import org.junit.Test; 51 import org.junit.runner.RunWith; 52 import org.mockito.Spy; 53 import org.mockito.junit.MockitoJUnit; 54 import org.mockito.junit.MockitoRule; 55 import org.robolectric.RobolectricTestRunner; 56 57 /** Tests for {@link MagnificationModePreferenceController}. */ 58 @RunWith(RobolectricTestRunner.class) 59 public class MagnificationModePreferenceControllerTest { 60 private static final String PREF_KEY = "screen_magnification_mode"; 61 private static final int MAGNIFICATION_MODE_DEFAULT = MagnificationMode.ALL; 62 63 @Rule 64 public MockitoRule mocks = MockitoJUnit.rule(); 65 66 private PreferenceScreen mScreen; 67 private Context mContext; 68 private MagnificationModePreferenceController mController; 69 private Preference mModePreference; 70 @Spy 71 private TestDialogHelper mDialogHelper = new TestDialogHelper(); 72 73 @Before setUp()74 public void setUp() { 75 mContext = ApplicationProvider.getApplicationContext(); 76 mContext.setTheme(androidx.appcompat.R.style.Theme_AppCompat); 77 final PreferenceManager preferenceManager = new PreferenceManager(mContext); 78 mScreen = preferenceManager.createPreferenceScreen(mContext); 79 mModePreference = new Preference(mContext); 80 mModePreference.setKey(PREF_KEY); 81 mScreen.addPreference(mModePreference); 82 MagnificationCapabilities.setCapabilities(mContext, MAGNIFICATION_MODE_DEFAULT); 83 mController = new MagnificationModePreferenceController(mContext, PREF_KEY); 84 mController.setDialogHelper(mDialogHelper); 85 mDialogHelper.setDialogDelegate(mController); 86 showPreferenceOnTheScreen(null); 87 } 88 89 @Test clickPreference_settingsModeIsDefault_checkedModeInDialogIsDefault()90 public void clickPreference_settingsModeIsDefault_checkedModeInDialogIsDefault() { 91 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 92 93 assertThat(getCheckedModeFromDialog()).isEqualTo(MAGNIFICATION_MODE_DEFAULT); 94 } 95 96 @Test choseModeIsDifferentFromInSettings_checkedModeInDialogIsExpected()97 public void choseModeIsDifferentFromInSettings_checkedModeInDialogIsExpected() { 98 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 99 100 performItemClickWith(MagnificationMode.WINDOW); 101 102 assertThat(getCheckedModeFromDialog()).isEqualTo(MagnificationMode.WINDOW); 103 } 104 105 @Test dialogIsReCreated_settingsModeIsAllAndChoseWindowMode_checkedModeIsWindow()106 public void dialogIsReCreated_settingsModeIsAllAndChoseWindowMode_checkedModeIsWindow() { 107 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 108 performItemClickWith(MagnificationMode.WINDOW); 109 110 reshowPreferenceOnTheScreen(); 111 mDialogHelper.showDialog(DialogEnums.DIALOG_MAGNIFICATION_MODE); 112 113 assertThat(getCheckedModeFromDialog()).isEqualTo( 114 MagnificationMode.WINDOW); 115 } 116 117 @Test chooseFullscreenMode_tripleTapEnabled_notShowTripleTapWarningDialog()118 public void chooseFullscreenMode_tripleTapEnabled_notShowTripleTapWarningDialog() { 119 enableTripleTap(); 120 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 121 122 performItemClickWith(MagnificationMode.FULLSCREEN); 123 mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(), 124 DialogInterface.BUTTON_POSITIVE); 125 126 verify(mDialogHelper, never()).showDialog( 127 DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING); 128 } 129 130 @Test chooseWindowMode_tripleTapEnabled_showTripleTapWarningDialog()131 public void chooseWindowMode_tripleTapEnabled_showTripleTapWarningDialog() { 132 enableTripleTap(); 133 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 134 135 performItemClickWith(MagnificationMode.WINDOW); 136 mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(), 137 DialogInterface.BUTTON_POSITIVE); 138 139 verify(mDialogHelper).showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING); 140 } 141 142 @Test chooseAllMode_tripleTapEnabled_showTripleTapWarningDialog()143 public void chooseAllMode_tripleTapEnabled_showTripleTapWarningDialog() { 144 enableTripleTap(); 145 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 146 147 performItemClickWith(MagnificationMode.ALL); 148 mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(), 149 DialogInterface.BUTTON_POSITIVE); 150 151 verify(mDialogHelper).showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING); 152 } 153 154 @Test onTripleTapWarningDialogNegativeButtonClicked_showModeDialog()155 public void onTripleTapWarningDialogNegativeButtonClicked_showModeDialog() { 156 mDialogHelper.showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING); 157 158 mController.onMagnificationTripleTapWarningDialogNegativeButtonClicked( 159 mDialogHelper.getDialog(), DialogInterface.BUTTON_NEGATIVE); 160 161 verify(mDialogHelper).showDialog(DialogEnums.DIALOG_MAGNIFICATION_MODE); 162 } 163 164 @Test onTripleTapWarningDialogPositiveButtonClicked_chooseAllMode_returnAllSummary()165 public void onTripleTapWarningDialogPositiveButtonClicked_chooseAllMode_returnAllSummary() { 166 enableTripleTap(); 167 mModePreference.getOnPreferenceClickListener().onPreferenceClick(mModePreference); 168 performItemClickWith(MagnificationMode.ALL); 169 mController.onMagnificationModeDialogPositiveButtonClicked(mDialogHelper.getDialog(), 170 DialogInterface.BUTTON_POSITIVE); 171 172 mController.onMagnificationTripleTapWarningDialogPositiveButtonClicked( 173 mDialogHelper.getDialog(), DialogInterface.BUTTON_POSITIVE); 174 175 final String allSummary = mContext.getString( 176 R.string.accessibility_magnification_area_settings_all_summary); 177 assertThat(TextUtils.equals(mController.getSummary(), allSummary)).isTrue(); 178 } 179 180 @Test checkSpansInTripleTapWarningDialog_existAnnotationSpan()181 public void checkSpansInTripleTapWarningDialog_existAnnotationSpan() { 182 mDialogHelper.showDialog(DialogEnums.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING); 183 final View contentView = mDialogHelper.getDialog().findViewById(android.R.id.content); 184 final TextView messageView = contentView.findViewById(R.id.message); 185 final CharSequence textInTripleTapWarningDialog = messageView.getText(); 186 187 final AnnotationSpan[] annotationSpans = 188 ((SpannableString) textInTripleTapWarningDialog).getSpans(/*queryStart= */ 0, 189 textInTripleTapWarningDialog.length(), AnnotationSpan.class); 190 191 assertThat(annotationSpans[0]).isNotNull(); 192 } 193 194 @Test getSummary_saveWindowScreen_shouldReturnWindowScreenSummary()195 public void getSummary_saveWindowScreen_shouldReturnWindowScreenSummary() { 196 MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.WINDOW); 197 198 final String windowSummary = mContext.getString( 199 R.string.accessibility_magnification_area_settings_window_screen_summary); 200 assertThat(TextUtils.equals(mController.getSummary(), windowSummary)).isTrue(); 201 } 202 203 @Test getSummary_saveAll_shouldReturnAllSummary()204 public void getSummary_saveAll_shouldReturnAllSummary() { 205 MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.ALL); 206 207 final String allSummary = mContext.getString( 208 R.string.accessibility_magnification_area_settings_all_summary); 209 assertThat(TextUtils.equals(mController.getSummary(), allSummary)).isTrue(); 210 } 211 getCheckedModeFromDialog()212 private int getCheckedModeFromDialog() { 213 final ListView listView = mController.mMagnificationModesListView; 214 assertThat(listView).isNotNull(); 215 216 final int checkedPosition = listView.getCheckedItemPosition(); 217 final MagnificationModeInfo modeInfo = 218 (MagnificationModeInfo) listView.getAdapter().getItem(checkedPosition); 219 return modeInfo.mMagnificationMode; 220 } 221 performItemClickWith(@agnificationMode int mode)222 private void performItemClickWith(@MagnificationMode int mode) { 223 final ListView listView = mController.mMagnificationModesListView; 224 assertThat(listView).isNotNull(); 225 226 int modeIndex = AdapterView.NO_ID; 227 // Index 0 is header. 228 for (int i = 1; i < listView.getAdapter().getCount(); i++) { 229 final MagnificationModeInfo modeInfo = 230 (MagnificationModeInfo) listView.getAdapter().getItem(i); 231 if (modeInfo.mMagnificationMode == mode) { 232 modeIndex = i; 233 break; 234 } 235 } 236 if (modeIndex == AdapterView.NO_ID) { 237 throw new RuntimeException("The mode is not in the list."); 238 } 239 240 listView.performItemClick(listView.getChildAt(modeIndex), modeIndex, modeIndex); 241 } 242 enableTripleTap()243 private void enableTripleTap() { 244 Settings.Secure.putInt(mContext.getContentResolver(), 245 Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ON); 246 } 247 reshowPreferenceOnTheScreen()248 private void reshowPreferenceOnTheScreen() { 249 final Bundle bundle = new Bundle(); 250 mController.onSaveInstanceState(bundle); 251 showPreferenceOnTheScreen(bundle); 252 } 253 showPreferenceOnTheScreen(Bundle savedInstanceState)254 private void showPreferenceOnTheScreen(Bundle savedInstanceState) { 255 mController.onCreate(savedInstanceState); 256 mController.displayPreference(mScreen); 257 } 258 } 259