• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.language;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static org.mockito.Matchers.any;
21 import static org.mockito.Mockito.doReturn;
22 import static org.mockito.Mockito.mock;
23 import static org.mockito.Mockito.spy;
24 import static org.mockito.Mockito.times;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.when;
27 
28 import android.app.Activity;
29 import android.app.admin.DevicePolicyManager;
30 import android.arch.lifecycle.LifecycleObserver;
31 import android.content.ComponentName;
32 import android.content.ContentResolver;
33 import android.content.Context;
34 import android.content.pm.PackageManager;
35 import android.content.res.Resources;
36 import android.hardware.input.InputManager;
37 import android.os.UserManager;
38 import android.provider.Settings;
39 import android.view.autofill.AutofillManager;
40 import android.view.inputmethod.InputMethodInfo;
41 import android.view.inputmethod.InputMethodManager;
42 import android.view.textservice.TextServicesManager;
43 
44 import com.android.settings.R;
45 import com.android.settings.dashboard.SummaryLoader;
46 import com.android.settings.testutils.SettingsRobolectricTestRunner;
47 import com.android.settings.testutils.XmlTestUtils;
48 import com.android.settingslib.core.AbstractPreferenceController;
49 import com.android.settingslib.core.lifecycle.Lifecycle;
50 
51 import org.junit.Before;
52 import org.junit.Test;
53 import org.junit.runner.RunWith;
54 import org.mockito.Answers;
55 import org.mockito.Mock;
56 import org.mockito.MockitoAnnotations;
57 import org.robolectric.RuntimeEnvironment;
58 
59 import java.util.ArrayList;
60 import java.util.List;
61 
62 @RunWith(SettingsRobolectricTestRunner.class)
63 public class LanguageAndInputSettingsTest {
64 
65     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
66     private Activity mActivity;
67     @Mock
68     private PackageManager mPackageManager;
69     @Mock
70     private InputManager mIm;
71     @Mock
72     private InputMethodManager mImm;
73     @Mock
74     private DevicePolicyManager mDpm;
75     @Mock
76     private InputMethodManager mInputMethodManager;
77     @Mock
78     private AutofillManager mAutofillManager;
79     private TestFragment mFragment;
80 
81     @Before
setUp()82     public void setUp() {
83         MockitoAnnotations.initMocks(this);
84         when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mock(UserManager.class));
85         when(mActivity.getSystemService(Context.INPUT_SERVICE))
86                 .thenReturn(mock(InputManager.class));
87         when(mActivity.getSystemService(Context.INPUT_SERVICE)).thenReturn(mIm);
88         when(mActivity.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE))
89                 .thenReturn(mock(TextServicesManager.class));
90         when(mActivity.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(mDpm);
91         when(mActivity.getSystemService(Context.INPUT_METHOD_SERVICE)).thenReturn(mImm);
92         when((Object) mActivity.getSystemService(AutofillManager.class))
93                 .thenReturn(mAutofillManager);
94         mFragment = new TestFragment(mActivity);
95     }
96 
97     @Test
testGetPreferenceScreenResId()98     public void testGetPreferenceScreenResId() {
99         assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.language_and_input);
100     }
101 
102     @Test
testGetPreferenceControllers_shouldRegisterLifecycleObservers()103     public void testGetPreferenceControllers_shouldRegisterLifecycleObservers() {
104         final List<AbstractPreferenceController> controllers =
105                 mFragment.createPreferenceControllers(mActivity);
106         int lifecycleObserverCount = 0;
107         for (AbstractPreferenceController controller : controllers) {
108             if (controller instanceof LifecycleObserver) {
109                 lifecycleObserverCount++;
110             }
111         }
112         verify(mFragment.getLifecycle(), times(lifecycleObserverCount))
113                 .addObserver(any(LifecycleObserver.class));
114     }
115 
116     @Test
testGetPreferenceControllers_shouldAllBeCreated()117     public void testGetPreferenceControllers_shouldAllBeCreated() {
118         final List<AbstractPreferenceController> controllers =
119                 mFragment.createPreferenceControllers(mActivity);
120 
121         assertThat(controllers.isEmpty()).isFalse();
122     }
123 
124     @Test
testSummary_shouldSetToCurrentImeName()125     public void testSummary_shouldSetToCurrentImeName() {
126         final Activity activity = mock(Activity.class);
127         final SummaryLoader loader = mock(SummaryLoader.class);
128         final ComponentName componentName = new ComponentName("pkg", "cls");
129         final ContentResolver cr = activity.getContentResolver();
130         Settings.Secure.putString(cr, Settings.Secure.DEFAULT_INPUT_METHOD,
131                 componentName.flattenToString());
132         when(activity.getSystemService(Context.INPUT_METHOD_SERVICE))
133                 .thenReturn(mInputMethodManager);
134         when(activity.getPackageManager()).thenReturn(mPackageManager);
135         final List<InputMethodInfo> imis = new ArrayList<>();
136         imis.add(mock(InputMethodInfo.class));
137         when(imis.get(0).getPackageName()).thenReturn(componentName.getPackageName());
138         when(mInputMethodManager.getInputMethodList()).thenReturn(imis);
139 
140         SummaryLoader.SummaryProvider provider = LanguageAndInputSettings.SUMMARY_PROVIDER_FACTORY
141                 .createSummaryProvider(activity, loader);
142 
143         provider.setListening(true);
144 
145         verify(imis.get(0)).loadLabel(mPackageManager);
146         verify(loader).setSummary(provider, null);
147     }
148 
149     @Test
testNonIndexableKeys_existInXmlLayout()150     public void testNonIndexableKeys_existInXmlLayout() {
151         final Context context = spy(RuntimeEnvironment.application);
152         final Resources res = spy(RuntimeEnvironment.application.getResources());
153         final InputManager inputManager = mock(InputManager.class);
154         final TextServicesManager textServicesManager = mock(TextServicesManager.class);
155         when(inputManager.getInputDeviceIds()).thenReturn(new int[0]);
156         doReturn(inputManager).when(context).getSystemService(Context.INPUT_SERVICE);
157         doReturn(textServicesManager).when(context)
158             .getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
159         doReturn(res).when(context).getResources();
160         doReturn(false).when(res)
161                 .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
162         final List<String> niks =
163             LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(context);
164         LanguageAndInputSettings settings = new LanguageAndInputSettings();
165         final int xmlId = settings.getPreferenceScreenResId();
166 
167         final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
168 
169         assertThat(keys).containsAllIn(niks);
170     }
171 
172     @Test
testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen()173     public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
174         final Context context = spy(RuntimeEnvironment.application);
175         final TextServicesManager textServicesManager = mock(TextServicesManager.class);
176         doReturn(textServicesManager).when(context)
177             .getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
178         final LanguageAndInputSettings fragment = new LanguageAndInputSettings();
179         final List<String> preferenceScreenKeys =
180             XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId());
181         final List<String> preferenceKeys = new ArrayList<>();
182 
183         for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
184             preferenceKeys.add(controller.getPreferenceKey());
185         }
186 
187         assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys);
188     }
189 
190     /**
191      * Test fragment to expose lifecycle and context so we can verify behavior for observables.
192      */
193     public static class TestFragment extends LanguageAndInputSettings {
194 
195         private Lifecycle mLifecycle;
196         private Context mContext;
197 
TestFragment(Context context)198         public TestFragment(Context context) {
199             mContext = context;
200             mLifecycle = mock(Lifecycle.class);
201         }
202 
203         @Override
getContext()204         public Context getContext() {
205             return mContext;
206         }
207 
208         @Override
getLifecycle()209         public Lifecycle getLifecycle() {
210             if (mLifecycle == null) {
211                 return super.getLifecycle();
212             }
213             return mLifecycle;
214         }
215     }
216 }
217