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