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