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