• 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 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.Mockito.doReturn;
23 import static org.mockito.Mockito.mock;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.times;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.when;
28 
29 import android.app.Activity;
30 import android.app.admin.DevicePolicyManager;
31 import android.content.Context;
32 import android.content.res.Resources;
33 import android.hardware.input.InputManager;
34 import android.os.UserManager;
35 import android.view.autofill.AutofillManager;
36 import android.view.inputmethod.InputMethodManager;
37 import android.view.textservice.TextServicesManager;
38 
39 import androidx.lifecycle.LifecycleObserver;
40 
41 import com.android.settings.R;
42 import com.android.settings.testutils.XmlTestUtils;
43 import com.android.settingslib.core.AbstractPreferenceController;
44 import com.android.settingslib.core.lifecycle.Lifecycle;
45 
46 import org.junit.Before;
47 import org.junit.Test;
48 import org.junit.runner.RunWith;
49 import org.mockito.Answers;
50 import org.mockito.Mock;
51 import org.mockito.MockitoAnnotations;
52 import org.robolectric.RobolectricTestRunner;
53 import org.robolectric.RuntimeEnvironment;
54 
55 import java.util.ArrayList;
56 import java.util.List;
57 
58 @RunWith(RobolectricTestRunner.class)
59 public class LanguageAndInputSettingsTest {
60 
61     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
62     private Activity mActivity;
63     @Mock
64     private InputManager mIm;
65     @Mock
66     private InputMethodManager mImm;
67     @Mock
68     private DevicePolicyManager mDpm;
69     @Mock
70     private AutofillManager mAutofillManager;
71     private TestFragment mFragment;
72 
73     @Before
setUp()74     public void setUp() {
75         MockitoAnnotations.initMocks(this);
76         when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mock(UserManager.class));
77         when(mActivity.getSystemService(Context.INPUT_SERVICE))
78                 .thenReturn(mock(InputManager.class));
79         when(mActivity.getSystemService(Context.INPUT_SERVICE)).thenReturn(mIm);
80         when(mActivity.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE))
81                 .thenReturn(mock(TextServicesManager.class));
82         when(mActivity.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(mDpm);
83         when(mActivity.getSystemService(Context.INPUT_METHOD_SERVICE)).thenReturn(mImm);
84         when((Object) mActivity.getSystemService(AutofillManager.class))
85                 .thenReturn(mAutofillManager);
86         mFragment = new TestFragment(mActivity);
87     }
88 
89     @Test
testGetPreferenceScreenResId()90     public void testGetPreferenceScreenResId() {
91         assertThat(mFragment.getPreferenceScreenResId()).isEqualTo(R.xml.language_and_input);
92     }
93 
94     @Test
testGetPreferenceControllers_shouldRegisterLifecycleObservers()95     public void testGetPreferenceControllers_shouldRegisterLifecycleObservers() {
96         final List<AbstractPreferenceController> controllers =
97                 mFragment.createPreferenceControllers(mActivity);
98         int lifecycleObserverCount = 0;
99         for (AbstractPreferenceController controller : controllers) {
100             if (controller instanceof LifecycleObserver) {
101                 lifecycleObserverCount++;
102             }
103         }
104         verify(mFragment.getSettingsLifecycle(), times(lifecycleObserverCount))
105                 .addObserver(any(LifecycleObserver.class));
106     }
107 
108     @Test
testGetPreferenceControllers_shouldAllBeCreated()109     public void testGetPreferenceControllers_shouldAllBeCreated() {
110         final List<AbstractPreferenceController> controllers =
111                 mFragment.createPreferenceControllers(mActivity);
112 
113         assertThat(controllers.isEmpty()).isFalse();
114     }
115 
116     @Test
testNonIndexableKeys_existInXmlLayout()117     public void testNonIndexableKeys_existInXmlLayout() {
118         final Context context = spy(RuntimeEnvironment.application);
119         final Resources res = spy(RuntimeEnvironment.application.getResources());
120         final InputManager inputManager = mock(InputManager.class);
121         final TextServicesManager textServicesManager = mock(TextServicesManager.class);
122         when(inputManager.getInputDeviceIds()).thenReturn(new int[0]);
123         doReturn(inputManager).when(context).getSystemService(Context.INPUT_SERVICE);
124         doReturn(textServicesManager).when(context)
125             .getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
126         doReturn(res).when(context).getResources();
127         doReturn(false).when(res)
128                 .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
129         final List<String> niks =
130             LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(context);
131         LanguageAndInputSettings settings = new LanguageAndInputSettings();
132         final int xmlId = settings.getPreferenceScreenResId();
133 
134         final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
135 
136         assertThat(keys).containsAtLeastElementsIn(niks);
137     }
138 
139     @Test
testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen()140     public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
141         final Context context = spy(RuntimeEnvironment.application);
142         final TextServicesManager textServicesManager = mock(TextServicesManager.class);
143         doReturn(textServicesManager).when(context)
144             .getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE);
145         final LanguageAndInputSettings fragment = new LanguageAndInputSettings();
146         final List<String> preferenceScreenKeys =
147             XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId());
148         final List<String> preferenceKeys = new ArrayList<>();
149 
150         for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) {
151             preferenceKeys.add(controller.getPreferenceKey());
152         }
153 
154         assertThat(preferenceScreenKeys).containsAtLeastElementsIn(preferenceKeys);
155     }
156 
157     /**
158      * Test fragment to expose lifecycle and context so we can verify behavior for observables.
159      */
160     public static class TestFragment extends LanguageAndInputSettings {
161 
162         private Lifecycle mLifecycle;
163         private Context mContext;
164 
TestFragment(Context context)165         public TestFragment(Context context) {
166             mContext = context;
167             mLifecycle = mock(Lifecycle.class);
168         }
169 
170         @Override
getContext()171         public Context getContext() {
172             return mContext;
173         }
174 
175         @Override
getSettingsLifecycle()176         public Lifecycle getSettingsLifecycle() {
177             if (mLifecycle == null) {
178                 return super.getSettingsLifecycle();
179             }
180             return mLifecycle;
181         }
182     }
183 }
184