1 /*
2  * Copyright (C) 2023 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.regionalpreferences;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertTrue;
23 import static org.mockito.ArgumentMatchers.any;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.verify;
26 
27 import android.app.settings.SettingsEnums;
28 import android.content.Context;
29 import android.os.Bundle;
30 import android.os.LocaleList;
31 import android.os.Looper;
32 import android.util.AndroidRuntimeException;
33 
34 import androidx.preference.PreferenceManager;
35 import androidx.preference.PreferenceScreen;
36 import androidx.test.annotation.UiThreadTest;
37 import androidx.test.core.app.ApplicationProvider;
38 
39 import com.android.internal.app.LocalePicker;
40 import com.android.settings.testutils.FakeFeatureFactory;
41 import com.android.settings.widget.TickButtonPreference;
42 
43 import org.junit.After;
44 import org.junit.Before;
45 import org.junit.Test;
46 
47 import java.util.Locale;
48 
49 public class NumberingSystemItemControllerTest {
50     private Context mApplicationContext;
51     private NumberingSystemItemController mController;
52     private NumberingPreferencesFragment mFragment;
53     private PreferenceScreen mPreferenceScreen;
54     private LocaleList mCacheLocale;
55     private FakeFeatureFactory mFeatureFactory;
56 
57     @Before
58     @UiThreadTest
setUp()59     public void setUp() throws Exception {
60         if (Looper.myLooper() == null) {
61             Looper.prepare();
62         }
63         mApplicationContext = ApplicationProvider.getApplicationContext();
64         mFeatureFactory = FakeFeatureFactory.setupForTest();
65         mFragment = spy(new NumberingPreferencesFragment());
66         PreferenceManager preferenceManager = new PreferenceManager(mApplicationContext);
67         mPreferenceScreen = preferenceManager.createPreferenceScreen(mApplicationContext);
68         mCacheLocale = LocaleList.getDefault();
69     }
70 
71     @After
tearDown()72     public void tearDown() {
73         LocaleList.setDefault(mCacheLocale);
74         LocalePicker.updateLocales(mCacheLocale);
75     }
76 
77     @Test
78     @UiThreadTest
handlePreferenceTreeClick_languageSelect_launchFragment()79     public void handlePreferenceTreeClick_languageSelect_launchFragment() {
80         Bundle bundle = new Bundle();
81         bundle.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
82                 NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
83         bundle.putString(
84                 NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
85         TickButtonPreference preference = new TickButtonPreference(mApplicationContext);
86         preference.setKey("I_am_the_key");
87         mPreferenceScreen.addPreference(preference);
88         mController = new NumberingSystemItemController(mApplicationContext, bundle);
89         mController.setParentFragment(mFragment);
90         mController.displayPreference(mPreferenceScreen);
91 
92         boolean isCallingStartActivity = false;
93         try {
94             mController.handlePreferenceTreeClick(preference);
95         } catch (AndroidRuntimeException exception) {
96             isCallingStartActivity = true;
97         }
98 
99         assertTrue(isCallingStartActivity);
100         verify(mFeatureFactory.metricsFeatureProvider).action(
101                 mApplicationContext,
102                 SettingsEnums.ACTION_CHOOSE_LANGUAGE_FOR_NUMBERS_PREFERENCES);
103     }
104 
105     @Test
106     @UiThreadTest
handlePreferenceTreeClick_numbersSelect_preferenceHasTick()107     public void handlePreferenceTreeClick_numbersSelect_preferenceHasTick() {
108         Bundle bundle = new Bundle();
109         bundle.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
110                 NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
111         bundle.putString(
112                 NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
113         TickButtonPreference preference = new TickButtonPreference(mApplicationContext);
114         preference.setKey("test_key");
115         mPreferenceScreen.addPreference(preference);
116         mController = new NumberingSystemItemController(mApplicationContext, bundle);
117         mController.setParentFragment(mFragment);
118         mController.displayPreference(mPreferenceScreen);
119 
120         mController.handlePreferenceTreeClick(preference);
121 
122         verify(mFragment).setArguments(any());
123         verify(mFeatureFactory.metricsFeatureProvider).action(
124                 mApplicationContext, SettingsEnums.ACTION_SET_NUMBERS_PREFERENCES);
125     }
126 
127     @Test
128     @UiThreadTest
handlePreferenceTreeClick_numbersSelect_numberingSystemIsUpdated()129     public void handlePreferenceTreeClick_numbersSelect_numberingSystemIsUpdated() {
130         LocalePicker.updateLocales(LocaleList.forLanguageTags("en-US,zh-TW,ar-BH"));
131         Bundle bundle = new Bundle();
132         bundle.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
133                 NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
134         bundle.putString(
135                 NumberingSystemItemController.KEY_SELECTED_LANGUAGE, "ar-BH");
136         TickButtonPreference defaultPreference = new TickButtonPreference(mApplicationContext);
137         TickButtonPreference numberPreference = new TickButtonPreference(mApplicationContext);
138         defaultPreference.setKey("default");
139         numberPreference.setKey("latn");
140         mPreferenceScreen.addPreference(defaultPreference);
141         mPreferenceScreen.addPreference(numberPreference);
142         mController = new NumberingSystemItemController(mApplicationContext, bundle);
143         mController.setParentFragment(mFragment);
144         mController.displayPreference(mPreferenceScreen);
145 
146         mController.handlePreferenceTreeClick(numberPreference);
147 
148         assertThat(LocalePicker.getLocales().toLanguageTags()).contains(
149                 "en-US,zh-TW,ar-BH-u-nu-latn");
150     }
151 
152     @Test
153     @UiThreadTest
displayPreference_languageOptAndHas2LocaleWithSingleNu_showNothing()154     public void displayPreference_languageOptAndHas2LocaleWithSingleNu_showNothing() {
155         LocaleList.setDefault(LocaleList.forLanguageTags("en-US,zh-TW"));
156         Bundle bundle = new Bundle();
157         bundle.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
158                 NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
159         bundle.putString(
160                 NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
161         mController = new NumberingSystemItemController(mApplicationContext, bundle);
162         mController.setParentFragment(mFragment);
163 
164         mController.displayPreference(mPreferenceScreen);
165 
166         assertEquals(0, mPreferenceScreen.getPreferenceCount());
167     }
168 
169     @Test
170     @UiThreadTest
displayPreference_languageOptAndHas2LocaleWithMultiNu_showLocaleWithMultiNuOnly()171     public void displayPreference_languageOptAndHas2LocaleWithMultiNu_showLocaleWithMultiNuOnly() {
172         // ar-JO and dz-BT have multiple numbering systems.
173         LocaleList.setDefault(LocaleList.forLanguageTags("en-US,zh-TW,ar-JO,dz-BT"));
174         Bundle bundle = new Bundle();
175         bundle.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
176                 NumberingSystemItemController.ARG_VALUE_LANGUAGE_SELECT);
177         bundle.putString(
178                 NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
179         mController = new NumberingSystemItemController(mApplicationContext, bundle);
180         mController.setParentFragment(mFragment);
181 
182         mController.displayPreference(mPreferenceScreen);
183 
184         assertEquals(2, mPreferenceScreen.getPreferenceCount());
185     }
186 
187     @Test
188     @UiThreadTest
displayPreference_enUsNumbersOpt_show1Option()189     public void displayPreference_enUsNumbersOpt_show1Option() {
190         LocaleList.setDefault(LocaleList.forLanguageTags("en-US,zh-TW"));
191         Bundle bundle = new Bundle();
192         bundle.putString(RegionalPreferencesEntriesFragment.ARG_KEY_REGIONAL_PREFERENCE,
193                 NumberingSystemItemController.ARG_VALUE_NUMBERING_SYSTEM_SELECT);
194         bundle.putString(
195                 NumberingSystemItemController.KEY_SELECTED_LANGUAGE, Locale.US.toLanguageTag());
196         mController = new NumberingSystemItemController(mApplicationContext, bundle);
197         mController.setParentFragment(mFragment);
198 
199         mController.displayPreference(mPreferenceScreen);
200 
201         // en-US only has 1 numbering system.
202         assertEquals(1, mPreferenceScreen.getPreferenceCount());
203     }
204 }
205