• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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