1 /* 2 * Copyright (C) 2019 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.server.accessibility; 18 19 import static android.accessibilityservice.AccessibilityService.SHOW_MODE_AUTO; 20 import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE; 21 import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HARD_KEYBOARD_OVERRIDDEN; 22 import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HIDDEN; 23 import static android.accessibilityservice.AccessibilityService.SHOW_MODE_IGNORE_HARD_KEYBOARD; 24 import static android.content.pm.PackageManager.FEATURE_WINDOW_MAGNIFICATION; 25 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; 26 import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; 27 import static android.view.accessibility.AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED; 28 import static android.view.accessibility.AccessibilityManager.STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED; 29 import static android.view.accessibility.AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED; 30 31 import static com.android.server.accessibility.AccessibilityUserState.doesShortcutTargetsStringContain; 32 33 import static junit.framework.Assert.assertEquals; 34 import static junit.framework.Assert.assertFalse; 35 import static junit.framework.Assert.assertNull; 36 import static junit.framework.Assert.assertTrue; 37 38 import static org.mockito.ArgumentMatchers.eq; 39 import static org.mockito.Mockito.never; 40 import static org.mockito.Mockito.verify; 41 import static org.mockito.Mockito.when; 42 43 import android.accessibilityservice.AccessibilityServiceInfo; 44 import android.content.ComponentName; 45 import android.content.Context; 46 import android.content.pm.PackageManager; 47 import android.content.res.Resources; 48 import android.graphics.Color; 49 import android.provider.Settings; 50 import android.test.mock.MockContentResolver; 51 import android.testing.DexmakerShareClassLoaderRule; 52 import android.util.ArraySet; 53 import android.view.Display; 54 55 import androidx.test.InstrumentationRegistry; 56 57 import com.android.internal.R; 58 import com.android.internal.util.test.FakeSettingsProvider; 59 60 import org.junit.After; 61 import org.junit.Before; 62 import org.junit.Rule; 63 import org.junit.Test; 64 import org.mockito.Mock; 65 import org.mockito.MockitoAnnotations; 66 67 /** Tests for AccessibilityUserState */ 68 public class AccessibilityUserStateTest { 69 70 private static final ComponentName COMPONENT_NAME = 71 new ComponentName("com.android.server.accessibility", "AccessibilityUserStateTest"); 72 private static final ComponentName COMPONENT_NAME1 = 73 new ComponentName("com.android.server.accessibility", 74 "com.android.server.accessibility.AccessibilityUserStateTest1"); 75 private static final ComponentName COMPONENT_NAME2 = 76 new ComponentName("com.android.server.accessibility", 77 "com.android.server.accessibility.AccessibilityUserStateTest2"); 78 79 // Values of setting key SHOW_IME_WITH_HARD_KEYBOARD 80 private static final int STATE_HIDE_IME = 0; 81 private static final int STATE_SHOW_IME = 1; 82 83 private static final int USER_ID = 42; 84 85 private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY; 86 87 // Mock package-private class AccessibilityServiceConnection 88 @Rule public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule = 89 new DexmakerShareClassLoaderRule(); 90 91 @Mock private AccessibilityServiceInfo mMockServiceInfo; 92 93 @Mock private AccessibilityServiceConnection mMockConnection; 94 95 @Mock private AccessibilityUserState.ServiceInfoChangeListener mMockListener; 96 97 @Mock private PackageManager mMockPackageManager; 98 99 @Mock private Context mMockContext; 100 101 private MockContentResolver mMockResolver; 102 103 private AccessibilityUserState mUserState; 104 105 private int mFocusStrokeWidthDefaultValue; 106 private int mFocusColorDefaultValue; 107 108 @Before setUp()109 public void setUp() { 110 final Resources resources = InstrumentationRegistry.getContext().getResources(); 111 112 MockitoAnnotations.initMocks(this); 113 FakeSettingsProvider.clearSettingsProvider(); 114 mMockResolver = new MockContentResolver(); 115 mMockResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); 116 when(mMockContext.getContentResolver()).thenReturn(mMockResolver); 117 when(mMockServiceInfo.getComponentName()).thenReturn(COMPONENT_NAME); 118 when(mMockConnection.getServiceInfo()).thenReturn(mMockServiceInfo); 119 when(mMockContext.getResources()).thenReturn(resources); 120 when(mMockContext.getPackageManager()).thenReturn(mMockPackageManager); 121 when(mMockPackageManager.hasSystemFeature(FEATURE_WINDOW_MAGNIFICATION)).thenReturn(true); 122 123 mFocusStrokeWidthDefaultValue = 124 resources.getDimensionPixelSize(R.dimen.accessibility_focus_highlight_stroke_width); 125 mFocusColorDefaultValue = resources.getColor(R.color.accessibility_focus_highlight_color); 126 127 mUserState = new AccessibilityUserState(USER_ID, mMockContext, mMockListener); 128 } 129 130 @After tearDown()131 public void tearDown() { 132 FakeSettingsProvider.clearSettingsProvider(); 133 } 134 135 @Test onSwitchToAnotherUser_userStateClearedNonDefaultValues()136 public void onSwitchToAnotherUser_userStateClearedNonDefaultValues() { 137 mUserState.getBoundServicesLocked().add(mMockConnection); 138 mUserState.getBindingServicesLocked().add(COMPONENT_NAME); 139 mUserState.setLastSentClientStateLocked( 140 STATE_FLAG_ACCESSIBILITY_ENABLED 141 | STATE_FLAG_TOUCH_EXPLORATION_ENABLED 142 | STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED); 143 mUserState.setNonInteractiveUiTimeoutLocked(30); 144 mUserState.setInteractiveUiTimeoutLocked(30); 145 mUserState.mEnabledServices.add(COMPONENT_NAME); 146 mUserState.mTouchExplorationGrantedServices.add(COMPONENT_NAME); 147 mUserState.mAccessibilityShortcutKeyTargets.add(COMPONENT_NAME.flattenToString()); 148 mUserState.mAccessibilityButtonTargets.add(COMPONENT_NAME.flattenToString()); 149 mUserState.setTargetAssignedToAccessibilityButton(COMPONENT_NAME.flattenToString()); 150 mUserState.setTouchExplorationEnabledLocked(true); 151 mUserState.setDisplayMagnificationEnabledLocked(true); 152 mUserState.setAutoclickEnabledLocked(true); 153 mUserState.setUserNonInteractiveUiTimeoutLocked(30); 154 mUserState.setUserInteractiveUiTimeoutLocked(30); 155 mUserState.setMagnificationModeLocked(TEST_DISPLAY, 156 ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); 157 mUserState.setFocusAppearanceLocked(20, Color.BLUE); 158 159 mUserState.onSwitchToAnotherUserLocked(); 160 161 verify(mMockConnection).unbindLocked(); 162 assertTrue(mUserState.getBoundServicesLocked().isEmpty()); 163 assertTrue(mUserState.getBindingServicesLocked().isEmpty()); 164 assertEquals(-1, mUserState.getLastSentClientStateLocked()); 165 assertEquals(0, mUserState.getNonInteractiveUiTimeoutLocked()); 166 assertEquals(0, mUserState.getInteractiveUiTimeoutLocked()); 167 assertTrue(mUserState.mEnabledServices.isEmpty()); 168 assertTrue(mUserState.mTouchExplorationGrantedServices.isEmpty()); 169 assertTrue(mUserState.mAccessibilityShortcutKeyTargets.isEmpty()); 170 assertTrue(mUserState.mAccessibilityButtonTargets.isEmpty()); 171 assertNull(mUserState.getTargetAssignedToAccessibilityButton()); 172 assertFalse(mUserState.isTouchExplorationEnabledLocked()); 173 assertFalse(mUserState.isDisplayMagnificationEnabledLocked()); 174 assertFalse(mUserState.isAutoclickEnabledLocked()); 175 assertEquals(0, mUserState.getUserNonInteractiveUiTimeoutLocked()); 176 assertEquals(0, mUserState.getUserInteractiveUiTimeoutLocked()); 177 assertEquals(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, 178 mUserState.getMagnificationModeLocked(TEST_DISPLAY)); 179 assertEquals(mFocusStrokeWidthDefaultValue, mUserState.getFocusStrokeWidthLocked()); 180 assertEquals(mFocusColorDefaultValue, mUserState.getFocusColorLocked()); 181 assertTrue(mUserState.isMagnificationFollowTypingEnabled()); 182 assertFalse(mUserState.isAlwaysOnMagnificationEnabled()); 183 } 184 185 @Test addService_connectionAlreadyAdded_notAddAgain()186 public void addService_connectionAlreadyAdded_notAddAgain() { 187 mUserState.getBoundServicesLocked().add(mMockConnection); 188 189 mUserState.addServiceLocked(mMockConnection); 190 191 verify(mMockConnection, never()).onAdded(); 192 } 193 194 @Test addService_connectionNotYetAddedToBoundService_addAndNotifyServices()195 public void addService_connectionNotYetAddedToBoundService_addAndNotifyServices() { 196 when(mMockConnection.getComponentName()).thenReturn(COMPONENT_NAME); 197 198 mUserState.addServiceLocked(mMockConnection); 199 200 verify(mMockConnection).onAdded(); 201 assertTrue(mUserState.getBoundServicesLocked().contains(mMockConnection)); 202 assertEquals(mMockConnection, mUserState.mComponentNameToServiceMap.get(COMPONENT_NAME)); 203 verify(mMockListener).onServiceInfoChangedLocked(eq(mUserState)); 204 } 205 206 @Test reconcileSoftKeyboardMode_whenStateNotMatchSettings_setBothDefault()207 public void reconcileSoftKeyboardMode_whenStateNotMatchSettings_setBothDefault() { 208 // When soft kb show mode is hidden in settings and is auto in state. 209 putSecureIntForUser(Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, 210 SHOW_MODE_HIDDEN, USER_ID); 211 212 mUserState.reconcileSoftKeyboardModeWithSettingsLocked(); 213 214 assertEquals(SHOW_MODE_AUTO, mUserState.getSoftKeyboardShowModeLocked()); 215 assertEquals(SHOW_MODE_AUTO, getSecureIntForUser( 216 Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, USER_ID)); 217 assertNull(mUserState.getServiceChangingSoftKeyboardModeLocked()); 218 } 219 220 @Test 221 public void reconcileSoftKeyboardMode_stateIgnoreHardKb_settingsShowImeHardKb_setAutoOverride()222 reconcileSoftKeyboardMode_stateIgnoreHardKb_settingsShowImeHardKb_setAutoOverride() { 223 // When show mode is ignore hard kb without original hard kb value 224 // and show ime with hard kb is hide 225 putSecureIntForUser(Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, 226 SHOW_MODE_IGNORE_HARD_KEYBOARD, USER_ID); 227 mUserState.setSoftKeyboardModeLocked(SHOW_MODE_IGNORE_HARD_KEYBOARD, COMPONENT_NAME); 228 putSecureIntForUser(Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 229 STATE_HIDE_IME, USER_ID); 230 231 mUserState.reconcileSoftKeyboardModeWithSettingsLocked(); 232 233 assertEquals(SHOW_MODE_AUTO | SHOW_MODE_HARD_KEYBOARD_OVERRIDDEN, 234 getSecureIntForUser(Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, USER_ID)); 235 assertNull(mUserState.getServiceChangingSoftKeyboardModeLocked()); 236 } 237 238 @Test removeService_serviceChangingSoftKeyboardMode_removeAndSetSoftKbModeAuto()239 public void removeService_serviceChangingSoftKeyboardMode_removeAndSetSoftKbModeAuto() { 240 mUserState.setServiceChangingSoftKeyboardModeLocked(COMPONENT_NAME); 241 mUserState.mComponentNameToServiceMap.put(COMPONENT_NAME, mMockConnection); 242 mUserState.setSoftKeyboardModeLocked(SHOW_MODE_HIDDEN, COMPONENT_NAME); 243 244 mUserState.removeServiceLocked(mMockConnection); 245 246 assertFalse(mUserState.getBoundServicesLocked().contains(mMockConnection)); 247 verify(mMockConnection).onRemoved(); 248 assertEquals(SHOW_MODE_AUTO, mUserState.getSoftKeyboardShowModeLocked()); 249 assertNull(mUserState.mComponentNameToServiceMap.get(COMPONENT_NAME)); 250 verify(mMockListener).onServiceInfoChangedLocked(eq(mUserState)); 251 } 252 253 @Test serviceDisconnected_removeServiceAndAddToCrashed()254 public void serviceDisconnected_removeServiceAndAddToCrashed() { 255 when(mMockConnection.getComponentName()).thenReturn(COMPONENT_NAME); 256 mUserState.addServiceLocked(mMockConnection); 257 258 mUserState.serviceDisconnectedLocked(mMockConnection); 259 260 assertFalse(mUserState.getBoundServicesLocked().contains(mMockConnection)); 261 assertTrue(mUserState.getCrashedServicesLocked().contains(COMPONENT_NAME)); 262 } 263 264 @Test setSoftKeyboardMode_withInvalidShowMode_shouldKeepDefaultAuto()265 public void setSoftKeyboardMode_withInvalidShowMode_shouldKeepDefaultAuto() { 266 final int invalidShowMode = SHOW_MODE_HIDDEN | SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE; 267 268 assertFalse(mUserState.setSoftKeyboardModeLocked(invalidShowMode, null)); 269 270 assertEquals(SHOW_MODE_AUTO, mUserState.getSoftKeyboardShowModeLocked()); 271 } 272 273 @Test setSoftKeyboardMode_newModeSameWithCurrentState_returnTrue()274 public void setSoftKeyboardMode_newModeSameWithCurrentState_returnTrue() { 275 when(mMockConnection.getComponentName()).thenReturn(COMPONENT_NAME); 276 mUserState.addServiceLocked(mMockConnection); 277 278 assertTrue(mUserState.setSoftKeyboardModeLocked(SHOW_MODE_AUTO, null)); 279 } 280 281 @Test setSoftKeyboardMode_withIgnoreHardKb_whenHardKbOverridden_returnFalseAdNoChange()282 public void setSoftKeyboardMode_withIgnoreHardKb_whenHardKbOverridden_returnFalseAdNoChange() { 283 putSecureIntForUser(Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, 284 SHOW_MODE_AUTO | SHOW_MODE_HARD_KEYBOARD_OVERRIDDEN, USER_ID); 285 286 assertFalse(mUserState.setSoftKeyboardModeLocked(SHOW_MODE_IGNORE_HARD_KEYBOARD, null)); 287 288 assertEquals(SHOW_MODE_AUTO, mUserState.getSoftKeyboardShowModeLocked()); 289 } 290 291 @Test 292 public void setSoftKeyboardMode_withIgnoreHardKb_whenShowImeWithHardKb_setOriginalHardKbValue()293 setSoftKeyboardMode_withIgnoreHardKb_whenShowImeWithHardKb_setOriginalHardKbValue() { 294 putSecureIntForUser(Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, STATE_SHOW_IME, USER_ID); 295 296 assertTrue(mUserState.setSoftKeyboardModeLocked(SHOW_MODE_IGNORE_HARD_KEYBOARD, null)); 297 298 assertEquals(SHOW_MODE_IGNORE_HARD_KEYBOARD | SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE, 299 getSecureIntForUser(Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, USER_ID)); 300 } 301 302 @Test setSoftKeyboardMode_whenCurrentIgnoreHardKb_shouldSetShowImeWithHardKbValue()303 public void setSoftKeyboardMode_whenCurrentIgnoreHardKb_shouldSetShowImeWithHardKbValue() { 304 mUserState.setSoftKeyboardModeLocked(SHOW_MODE_IGNORE_HARD_KEYBOARD, COMPONENT_NAME); 305 putSecureIntForUser(Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, STATE_HIDE_IME, USER_ID); 306 putSecureIntForUser(Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, 307 SHOW_MODE_IGNORE_HARD_KEYBOARD | SHOW_MODE_HARD_KEYBOARD_ORIGINAL_VALUE, USER_ID); 308 309 assertTrue(mUserState.setSoftKeyboardModeLocked(SHOW_MODE_AUTO, null)); 310 311 assertEquals(STATE_SHOW_IME, getSecureIntForUser( 312 Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, USER_ID)); 313 } 314 315 @Test setSoftKeyboardMode_withRequester_shouldUpdateInternalStateAndSettingsAsIs()316 public void setSoftKeyboardMode_withRequester_shouldUpdateInternalStateAndSettingsAsIs() { 317 assertTrue(mUserState.setSoftKeyboardModeLocked(SHOW_MODE_HIDDEN, COMPONENT_NAME)); 318 319 assertEquals(SHOW_MODE_HIDDEN, mUserState.getSoftKeyboardShowModeLocked()); 320 assertEquals(SHOW_MODE_HIDDEN, getSecureIntForUser( 321 Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE, USER_ID)); 322 assertEquals(COMPONENT_NAME, mUserState.getServiceChangingSoftKeyboardModeLocked()); 323 } 324 325 @Test setSoftKeyboardMode_shouldNotifyBoundService()326 public void setSoftKeyboardMode_shouldNotifyBoundService() { 327 mUserState.addServiceLocked(mMockConnection); 328 329 assertTrue(mUserState.setSoftKeyboardModeLocked(SHOW_MODE_HIDDEN, COMPONENT_NAME)); 330 331 verify(mMockConnection).notifySoftKeyboardShowModeChangedLocked(eq(SHOW_MODE_HIDDEN)); 332 } 333 334 @Test doesShortcutTargetsStringContain_returnFalse()335 public void doesShortcutTargetsStringContain_returnFalse() { 336 assertFalse(doesShortcutTargetsStringContain(null, null)); 337 assertFalse(doesShortcutTargetsStringContain(null, 338 COMPONENT_NAME.flattenToShortString())); 339 assertFalse(doesShortcutTargetsStringContain(new ArraySet<>(), null)); 340 341 final ArraySet<String> shortcutTargets = new ArraySet<>(); 342 shortcutTargets.add(COMPONENT_NAME.flattenToString()); 343 assertFalse(doesShortcutTargetsStringContain(shortcutTargets, 344 COMPONENT_NAME1.flattenToString())); 345 } 346 347 @Test isAssignedToShortcutLocked_withDifferentTypeComponentString_returnTrue()348 public void isAssignedToShortcutLocked_withDifferentTypeComponentString_returnTrue() { 349 final ArraySet<String> shortcutTargets = new ArraySet<>(); 350 shortcutTargets.add(COMPONENT_NAME1.flattenToShortString()); 351 shortcutTargets.add(COMPONENT_NAME2.flattenToString()); 352 353 assertTrue(doesShortcutTargetsStringContain(shortcutTargets, 354 COMPONENT_NAME1.flattenToString())); 355 assertTrue(doesShortcutTargetsStringContain(shortcutTargets, 356 COMPONENT_NAME2.flattenToShortString())); 357 } 358 359 @Test isShortcutTargetInstalledLocked_returnTrue()360 public void isShortcutTargetInstalledLocked_returnTrue() { 361 mUserState.mInstalledServices.add(mMockServiceInfo); 362 assertTrue(mUserState.isShortcutTargetInstalledLocked(COMPONENT_NAME.flattenToString())); 363 } 364 365 @Test isShortcutTargetInstalledLocked_invalidTarget_returnFalse()366 public void isShortcutTargetInstalledLocked_invalidTarget_returnFalse() { 367 final ComponentName invalidTarget = 368 new ComponentName("com.android.server.accessibility", "InvalidTarget"); 369 assertFalse(mUserState.isShortcutTargetInstalledLocked(invalidTarget.flattenToString())); 370 } 371 372 @Test setWindowMagnificationMode_returnExpectedMagnificationMode()373 public void setWindowMagnificationMode_returnExpectedMagnificationMode() { 374 assertEquals(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, 375 mUserState.getMagnificationModeLocked(TEST_DISPLAY)); 376 377 mUserState.setMagnificationModeLocked(TEST_DISPLAY, 378 ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); 379 380 assertEquals(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, 381 mUserState.getMagnificationModeLocked(TEST_DISPLAY)); 382 } 383 384 @Test setMagnificationFollowTypingEnabled_defaultTrueAndThenDisable_returnFalse()385 public void setMagnificationFollowTypingEnabled_defaultTrueAndThenDisable_returnFalse() { 386 assertTrue(mUserState.isMagnificationFollowTypingEnabled()); 387 388 mUserState.setMagnificationFollowTypingEnabled(false); 389 390 assertFalse(mUserState.isMagnificationFollowTypingEnabled()); 391 } 392 393 @Test setAlwaysOnMagnificationEnabled_defaultFalseAndSetTrue_returnTrue()394 public void setAlwaysOnMagnificationEnabled_defaultFalseAndSetTrue_returnTrue() { 395 assertFalse(mUserState.isAlwaysOnMagnificationEnabled()); 396 397 mUserState.setAlwaysOnMagnificationEnabled(true); 398 399 assertTrue(mUserState.isAlwaysOnMagnificationEnabled()); 400 } 401 402 @Test setFocusAppearanceData_returnExpectedFocusAppearanceData()403 public void setFocusAppearanceData_returnExpectedFocusAppearanceData() { 404 final int focusStrokeWidthValue = 100; 405 final int focusColorValue = Color.BLUE; 406 407 assertEquals(mFocusStrokeWidthDefaultValue, mUserState.getFocusStrokeWidthLocked()); 408 assertEquals(mFocusColorDefaultValue, mUserState.getFocusColorLocked()); 409 410 mUserState.setFocusAppearanceLocked(focusStrokeWidthValue, focusColorValue); 411 412 assertEquals(focusStrokeWidthValue, mUserState.getFocusStrokeWidthLocked()); 413 assertEquals(focusColorValue, mUserState.getFocusColorLocked()); 414 415 } 416 getSecureIntForUser(String key, int userId)417 private int getSecureIntForUser(String key, int userId) { 418 return Settings.Secure.getIntForUser(mMockResolver, key, -1, userId); 419 } 420 putSecureIntForUser(String key, int value, int userId)421 private void putSecureIntForUser(String key, int value, int userId) { 422 Settings.Secure.putIntForUser(mMockResolver, key, value, userId); 423 } 424 } 425