LanguageAndInputSettingsTest.java revision 55ce7de7d06d9fd8ec153c4b6f5300fbe9349990
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 static com.google.common.truth.Truth.assertThat;
20
21import static org.mockito.Matchers.any;
22import static org.mockito.Mockito.doReturn;
23import static org.mockito.Mockito.mock;
24import static org.mockito.Mockito.spy;
25import static org.mockito.Mockito.times;
26import static org.mockito.Mockito.verify;
27import static org.mockito.Mockito.when;
28
29import android.app.Activity;
30import android.app.admin.DevicePolicyManager;
31import android.content.ComponentName;
32import android.content.ContentResolver;
33import android.content.Context;
34import android.content.pm.PackageManager;
35import android.content.res.Resources;
36import android.hardware.input.InputManager;
37import android.os.UserManager;
38import android.provider.Settings;
39import android.view.autofill.AutofillManager;
40import android.view.inputmethod.InputMethodInfo;
41import android.view.inputmethod.InputMethodManager;
42import android.view.textservice.TextServicesManager;
43
44import com.android.settings.R;
45import com.android.settings.TestConfig;
46import com.android.settings.dashboard.SummaryLoader;
47import com.android.settings.testutils.SettingsRobolectricTestRunner;
48import com.android.settings.testutils.XmlTestUtils;
49import com.android.settings.testutils.shadow.ShadowSecureSettings;
50import com.android.settingslib.core.AbstractPreferenceController;
51import com.android.settingslib.core.lifecycle.Lifecycle;
52import com.android.settingslib.core.lifecycle.LifecycleObserver;
53
54import org.junit.Before;
55import org.junit.Test;
56import org.junit.runner.RunWith;
57import org.mockito.Answers;
58import org.mockito.Mock;
59import org.mockito.MockitoAnnotations;
60import org.robolectric.RuntimeEnvironment;
61import org.robolectric.annotation.Config;
62
63import java.util.ArrayList;
64import java.util.List;
65
66@RunWith(SettingsRobolectricTestRunner.class)
67@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
68public class LanguageAndInputSettingsTest {
69
70    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
71    private Activity mActivity;
72    @Mock
73    private PackageManager mPackageManager;
74    @Mock
75    private InputManager mIm;
76    @Mock
77    private InputMethodManager mImm;
78    @Mock
79    private DevicePolicyManager mDpm;
80    @Mock
81    private InputMethodManager mInputMethodManager;
82    @Mock
83    private AutofillManager mAutofillManager;
84    private TestFragment mFragment;
85
86    @Before
87    public void setUp() {
88        MockitoAnnotations.initMocks(this);
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<AbstractPreferenceController> controllers =
110                mFragment.getPreferenceControllers(mActivity);
111        int lifecycleObserverCount = 0;
112        for (AbstractPreferenceController 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    public void testGetPreferenceControllers_shouldAllBeCreated() {
123        final List<AbstractPreferenceController> controllers =
124                mFragment.getPreferenceControllers(mActivity);
125
126        assertThat(controllers.isEmpty()).isFalse();
127    }
128
129    @Test
130    @Config(shadows = {
131            ShadowSecureSettings.class,
132    })
133    public void testSummary_shouldSetToCurrentImeName() {
134        final Activity activity = mock(Activity.class);
135        final SummaryLoader loader = mock(SummaryLoader.class);
136        final ComponentName componentName = new ComponentName("pkg", "cls");
137        final ContentResolver cr = activity.getContentResolver();
138        Settings.Secure.putString(cr, 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    public void testNonIndexableKeys_existInXmlLayout() {
159        final Context context = spy(RuntimeEnvironment.application);
160        final Resources res = spy(RuntimeEnvironment.application.getResources());
161        //(InputManager) context.getSystemService(Context.INPUT_SERVICE);
162        InputManager manager = mock(InputManager.class);
163        when(manager.getInputDeviceIds()).thenReturn(new int[]{});
164        doReturn(manager).when(context).getSystemService(Context.INPUT_SERVICE);
165        doReturn(res).when(context).getResources();
166        doReturn(false).when(res)
167            .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
168        final List<String> niks = LanguageAndInputSettings.SEARCH_INDEX_DATA_PROVIDER
169                .getNonIndexableKeys(context);
170        final int xmlId = (new LanguageAndInputSettings()).getPreferenceScreenResId();
171
172        final List<String> keys = XmlTestUtils.getKeysFromPreferenceXml(context, xmlId);
173
174        assertThat(keys).containsAllIn(niks);
175    }
176
177    @Test
178    public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() {
179        final Context context = RuntimeEnvironment.application;
180        final LanguageAndInputSettings fragment = new LanguageAndInputSettings();
181        final List<String> preferenceScreenKeys = XmlTestUtils.getKeysFromPreferenceXml(context,
182                fragment.getPreferenceScreenResId());
183        final List<String> preferenceKeys = new ArrayList<>();
184
185        for (AbstractPreferenceController controller : fragment.getPreferenceControllers(context)) {
186            preferenceKeys.add(controller.getPreferenceKey());
187        }
188
189        assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys);
190    }
191
192    /**
193     * Test fragment to expose lifecycle and context so we can verify behavior for observables.
194     */
195    public static class TestFragment extends LanguageAndInputSettings {
196
197        private Lifecycle mLifecycle;
198        private Context mContext;
199
200        public TestFragment(Context context) {
201            mContext = context;
202            mLifecycle = mock(Lifecycle.class);
203        }
204
205        @Override
206        public Context getContext() {
207            return mContext;
208        }
209
210        @Override
211        protected Lifecycle getLifecycle() {
212            if (mLifecycle == null) {
213                return super.getLifecycle();
214            }
215            return mLifecycle;
216        }
217    }
218}
219