KeyboardThemeTests.java revision 3b12718537f40b262e5eeb5c8168d69b2afa6955
1/*
2 * Copyright (C) 2014 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.inputmethod.keyboard;
18
19import android.content.SharedPreferences;
20import android.os.Build.VERSION_CODES;
21import android.preference.PreferenceManager;
22import android.test.AndroidTestCase;
23import android.test.suitebuilder.annotation.SmallTest;
24
25@SmallTest
26public class KeyboardThemeTests extends AndroidTestCase {
27    private SharedPreferences mPrefs;
28
29    // TODO: Remove this constant once the *next* version becomes available.
30    private static final int VERSION_CODES_LXX = VERSION_CODES.CUR_DEVELOPMENT;
31
32    private static final int THEME_ID_NULL = -1;
33    private static final int THEME_ID_UNKNOWN = -2;
34    private static final int THEME_ID_ILLEGAL = -3;
35    private static final String ILLEGAL_THEME_ID_STRING = "ThisCausesNumberFormatExecption";
36    private static final int THEME_ID_ICS = KeyboardTheme.THEME_ID_ICS;
37    private static final int THEME_ID_KLP = KeyboardTheme.THEME_ID_KLP;
38    private static final int THEME_ID_LXX = KeyboardTheme.THEME_ID_LXX;
39
40    @Override
41    protected void setUp() throws Exception {
42        super.setUp();
43        mPrefs = PreferenceManager.getDefaultSharedPreferences(getContext());
44    }
45
46    /*
47     * Helper functions.
48     */
49
50    private static boolean isValidKeyboardThemeId(final int themeId) {
51        switch (themeId) {
52        case THEME_ID_ICS:
53        case THEME_ID_KLP:
54        case THEME_ID_LXX:
55            return true;
56        default:
57            return false;
58        }
59    }
60
61    private void setKeyboardThemePreference(final String prefKey, final int themeId) {
62        final String themeIdString = Integer.toString(themeId);
63        if (isValidKeyboardThemeId(themeId) || themeId == THEME_ID_UNKNOWN) {
64            // Set valid theme id to preference.
65            mPrefs.edit().putString(prefKey, themeIdString).apply();
66            return;
67        }
68        if (themeId == THEME_ID_NULL) {
69            // Simulate undefined preference.
70            mPrefs.edit().remove(prefKey).apply();
71            return;
72        }
73        // themeId == THEME_ID_ILLEGAL
74        // Simulate illegal format theme id in preference.
75        mPrefs.edit().putString(prefKey, ILLEGAL_THEME_ID_STRING).apply();
76    }
77
78    private void assertKeyboardTheme(final int sdkVersion, final int expectedThemeId) {
79        assertEquals(expectedThemeId, KeyboardTheme.getKeyboardTheme(mPrefs, sdkVersion).mThemeId);
80    }
81
82    /*
83     * Test keyboard theme preference on the same platform version and the same keyboard version.
84     */
85
86    private void assertKeyboardThemePreference(final int sdkVersion, final int oldThemeId,
87            final int expectedThemeId) {
88        final String prefKey = KeyboardTheme.getPreferenceKey(sdkVersion);
89        setKeyboardThemePreference(prefKey, oldThemeId);
90        assertKeyboardTheme(sdkVersion, expectedThemeId);
91    }
92
93    private void assertKeyboardThemePreferenceOnKlp(final int sdkVersion) {
94        final int defaultThemeId = THEME_ID_KLP;
95        assertKeyboardThemePreference(sdkVersion, THEME_ID_NULL, defaultThemeId);
96        assertKeyboardThemePreference(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
97        assertKeyboardThemePreference(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
98        assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX, THEME_ID_LXX);
99        assertKeyboardThemePreference(sdkVersion, THEME_ID_UNKNOWN, defaultThemeId);
100        assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
101    }
102
103    public void testKeyboardThemePreferenceOnKlp() {
104        assertKeyboardThemePreferenceOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
105        assertKeyboardThemePreferenceOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
106        assertKeyboardThemePreferenceOnKlp(VERSION_CODES.JELLY_BEAN);
107        assertKeyboardThemePreferenceOnKlp(VERSION_CODES.JELLY_BEAN_MR1);
108        assertKeyboardThemePreferenceOnKlp(VERSION_CODES.JELLY_BEAN_MR2);
109        assertKeyboardThemePreferenceOnKlp(VERSION_CODES.KITKAT);
110    }
111
112    private void assertKeyboardThemePreferenceOnLxx(final int sdkVersion) {
113        final int defaultThemeId = THEME_ID_LXX;
114        assertKeyboardThemePreference(sdkVersion, THEME_ID_NULL, defaultThemeId);
115        assertKeyboardThemePreference(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
116        assertKeyboardThemePreference(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
117        assertKeyboardThemePreference(sdkVersion, THEME_ID_LXX, THEME_ID_LXX);
118        assertKeyboardThemePreference(sdkVersion, THEME_ID_UNKNOWN, defaultThemeId);
119        assertKeyboardThemePreference(sdkVersion, THEME_ID_ILLEGAL, defaultThemeId);
120    }
121
122    public void testKeyboardThemePreferenceOnLxx() {
123        assertKeyboardThemePreferenceOnLxx(VERSION_CODES_LXX);
124    }
125
126    /*
127     * Test default keyboard theme based on the platform version.
128     */
129
130    private void assertDefaultKeyboardTheme(final int sdkVersion, final int oldThemeId,
131            final int expectedThemeId) {
132        final String oldPrefKey = KeyboardTheme.KLP_KEYBOARD_THEME_KEY;
133        setKeyboardThemePreference(oldPrefKey, oldThemeId);
134
135        final KeyboardTheme defaultTheme =
136                KeyboardTheme.getDefaultKeyboardTheme(mPrefs, sdkVersion);
137
138        assertNotNull(defaultTheme);
139        assertEquals(expectedThemeId, defaultTheme.mThemeId);
140        if (sdkVersion <= VERSION_CODES.KITKAT) {
141            // Old preference must be retained if it is valid. Otherwise it must be pruned.
142            assertEquals(isValidKeyboardThemeId(oldThemeId), mPrefs.contains(oldPrefKey));
143            return;
144        }
145        // Old preference must be removed.
146        assertFalse(mPrefs.contains(oldPrefKey));
147    }
148
149    private void assertDefaultKeyboardThemeOnKlp(final int sdkVersion) {
150        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_NULL, THEME_ID_KLP);
151        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
152        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
153        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_KLP);
154        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
155    }
156
157    public void testDefaultKeyboardThemeOnKlp() {
158        assertDefaultKeyboardThemeOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
159        assertDefaultKeyboardThemeOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
160        assertDefaultKeyboardThemeOnKlp(VERSION_CODES.JELLY_BEAN);
161        assertDefaultKeyboardThemeOnKlp(VERSION_CODES.JELLY_BEAN_MR1);
162        assertDefaultKeyboardThemeOnKlp(VERSION_CODES.JELLY_BEAN_MR2);
163        assertDefaultKeyboardThemeOnKlp(VERSION_CODES.KITKAT);
164    }
165
166    private void assertDefaultKeyboardThemeOnLxx(final int sdkVersion) {
167        // Forced to switch to LXX theme.
168        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_NULL, THEME_ID_LXX);
169        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ICS, THEME_ID_LXX);
170        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_KLP, THEME_ID_LXX);
171        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX);
172        assertDefaultKeyboardTheme(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX);
173    }
174
175    public void testDefaultKeyboardThemeOnLxx() {
176        assertDefaultKeyboardThemeOnLxx(VERSION_CODES_LXX);
177    }
178
179    /*
180     * Test keyboard theme preference while upgrading the keyboard that doesn't support LXX theme
181     * to the keyboard that supports LXX theme.
182     */
183
184    private void assertUpgradeKeyboardToLxxOn(final int sdkVersion, final int oldThemeId,
185            final int expectedThemeId) {
186        setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, oldThemeId);
187        // Clean up new keyboard theme preference to simulate "upgrade to LXX keyboard".
188        setKeyboardThemePreference(KeyboardTheme.LXX_KEYBOARD_THEME_KEY, THEME_ID_NULL);
189
190        final KeyboardTheme theme = KeyboardTheme.getKeyboardTheme(mPrefs, sdkVersion);
191
192        assertNotNull(theme);
193        assertEquals(expectedThemeId, theme.mThemeId);
194        if (sdkVersion <= VERSION_CODES.KITKAT) {
195            // New preference must not exist.
196            assertFalse(mPrefs.contains(KeyboardTheme.LXX_KEYBOARD_THEME_KEY));
197            // Old preference must be retained if it is valid. Otherwise it must be pruned.
198            assertEquals(isValidKeyboardThemeId(oldThemeId),
199                    mPrefs.contains(KeyboardTheme.KLP_KEYBOARD_THEME_KEY));
200            if (isValidKeyboardThemeId(oldThemeId)) {
201                // Old preference must have an expected value.
202                assertEquals(mPrefs.getString(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, null),
203                        Integer.toString(expectedThemeId));
204            }
205            return;
206        }
207        // Old preference must be removed.
208        assertFalse(mPrefs.contains(KeyboardTheme.KLP_KEYBOARD_THEME_KEY));
209        // New preference must not exist.
210        assertFalse(mPrefs.contains(KeyboardTheme.LXX_KEYBOARD_THEME_KEY));
211    }
212
213    private void assertUpgradeKeyboardToLxxOnKlp(final int sdkVersion) {
214        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_NULL, THEME_ID_KLP);
215        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ICS, THEME_ID_ICS);
216        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_KLP, THEME_ID_KLP);
217        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_KLP);
218        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
219    }
220
221    // Upgrading keyboard on I,J and K.
222    public void testUpgradeKeyboardToLxxOnKlp() {
223        assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH);
224        assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
225        assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.JELLY_BEAN);
226        assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.JELLY_BEAN_MR1);
227        assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.JELLY_BEAN_MR2);
228        assertUpgradeKeyboardToLxxOnKlp(VERSION_CODES.KITKAT);
229    }
230
231    private void assertUpgradeKeyboardToLxxOnLxx(final int sdkVersion) {
232        // Forced to switch to LXX theme.
233        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_NULL, THEME_ID_LXX);
234        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ICS, THEME_ID_LXX);
235        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_KLP, THEME_ID_LXX);
236        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX);
237        assertUpgradeKeyboardToLxxOn(sdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX);
238    }
239
240    // Upgrading keyboard on L.
241    public void testUpgradeKeyboardToLxxOnLxx() {
242        assertUpgradeKeyboardToLxxOnLxx(VERSION_CODES_LXX);
243    }
244
245    /*
246     * Test keyboard theme preference while upgrading platform version.
247     */
248
249    private void assertUpgradePlatformFromTo(final int oldSdkVersion, final int newSdkVersion,
250            final int oldThemeId, final int expectedThemeId) {
251        if (newSdkVersion < oldSdkVersion) {
252            // No need to test.
253            return;
254        }
255        // Clean up preferences.
256        setKeyboardThemePreference(KeyboardTheme.KLP_KEYBOARD_THEME_KEY, THEME_ID_NULL);
257        setKeyboardThemePreference(KeyboardTheme.LXX_KEYBOARD_THEME_KEY, THEME_ID_NULL);
258
259        final String oldPrefKey = KeyboardTheme.getPreferenceKey(oldSdkVersion);
260        setKeyboardThemePreference(oldPrefKey, oldThemeId);
261
262        assertKeyboardTheme(newSdkVersion, expectedThemeId);
263    }
264
265    private void assertUpgradePlatformFromKlpToKlp(final int oldSdkVersion,
266            final int newSdkVersion) {
267        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_KLP);
268        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_ICS);
269        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_KLP);
270        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_KLP);
271        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_KLP);
272    }
273
274    private void assertUpgradePlatformToKlpFrom(final int oldSdkVersion) {
275        assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.ICE_CREAM_SANDWICH);
276        assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
277        assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.JELLY_BEAN);
278        assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.JELLY_BEAN_MR1);
279        assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.JELLY_BEAN_MR2);
280        assertUpgradePlatformFromKlpToKlp(oldSdkVersion, VERSION_CODES.KITKAT);
281    }
282
283    // Update platform from I,J, and K to I,J, and K
284    public void testUpgradePlatformToKlpFromKlp() {
285        assertUpgradePlatformToKlpFrom(VERSION_CODES.ICE_CREAM_SANDWICH);
286        assertUpgradePlatformToKlpFrom(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
287        assertUpgradePlatformToKlpFrom(VERSION_CODES.JELLY_BEAN);
288        assertUpgradePlatformToKlpFrom(VERSION_CODES.JELLY_BEAN_MR1);
289        assertUpgradePlatformToKlpFrom(VERSION_CODES.JELLY_BEAN_MR2);
290        assertUpgradePlatformToKlpFrom(VERSION_CODES.KITKAT);
291    }
292
293    private void assertUpgradePlatformToLxxFrom(final int oldSdkVersion) {
294        // Forced to switch to LXX theme.
295        final int newSdkVersion = VERSION_CODES_LXX;
296        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX);
297        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_LXX);
298        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_LXX);
299        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX);
300        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX);
301    }
302
303    // Update platform from I,J, and K to L
304    public void testUpgradePlatformToLxx() {
305        assertUpgradePlatformToLxxFrom(VERSION_CODES.ICE_CREAM_SANDWICH);
306        assertUpgradePlatformToLxxFrom(VERSION_CODES.ICE_CREAM_SANDWICH_MR1);
307        assertUpgradePlatformToLxxFrom(VERSION_CODES.JELLY_BEAN);
308        assertUpgradePlatformToLxxFrom(VERSION_CODES.JELLY_BEAN_MR1);
309        assertUpgradePlatformToLxxFrom(VERSION_CODES.JELLY_BEAN_MR2);
310        assertUpgradePlatformToLxxFrom(VERSION_CODES.KITKAT);
311    }
312
313    // Update platform from L to L.
314    public void testUpgradePlatformToLxxFromLxx() {
315        final int oldSdkVersion = VERSION_CODES_LXX;
316        final int newSdkVersion = VERSION_CODES_LXX;
317        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_NULL, THEME_ID_LXX);
318        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ICS, THEME_ID_ICS);
319        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_KLP, THEME_ID_KLP);
320        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_UNKNOWN, THEME_ID_LXX);
321        assertUpgradePlatformFromTo(oldSdkVersion, newSdkVersion, THEME_ID_ILLEGAL, THEME_ID_LXX);
322    }
323}
324