RetailDemoModeServiceTest.java revision 192bb0bc54f6bb418f5778fe26eb2e68514290fb
1d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka/*
2d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * Copyright (C) 2016 The Android Open Source Project
3d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka *
4d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
5d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * you may not use this file except in compliance with the License.
6d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * You may obtain a copy of the License at
7d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka *
8d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
9d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka *
10d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * Unless required by applicable law or agreed to in writing, software
11d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
12d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * See the License for the specific language governing permissions and
14d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka * limitations under the License.
15d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka */
16d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
17d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankapackage com.android.server.retaildemo;
18d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
19d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static com.android.server.retaildemo.RetailDemoModeService.SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED;
20d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
21d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.junit.Assert.assertEquals;
22d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.junit.Assert.assertTrue;
23d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Matchers.any;
24d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Matchers.anyInt;
25d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Matchers.anyString;
26d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Matchers.argThat;
27d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Matchers.eq;
28d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Mockito.verify;
29d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport static org.mockito.Mockito.when;
30d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
31d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.Manifest;
32d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.app.ActivityManagerInternal;
33d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.app.Notification;
34d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.app.NotificationManager;
35d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.app.RetailDemoModeServiceInternal;
36d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.BroadcastReceiver;
37d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.ContentResolver;
38d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.Context;
39d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.Intent;
40d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.IntentFilter;
41d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.ActivityInfo;
42d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.IPackageManager;
43d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.PackageManager;
44d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.ResolveInfo;
45d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.UserInfo;
46d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.res.Configuration;
47d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.media.AudioManager;
48d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.net.Uri;
49cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shuklaimport android.net.wifi.WifiManager;
50d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.FileUtils;
51d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.Handler;
52d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.Looper;
53d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.UserHandle;
54d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.UserManager;
55d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.provider.CallLog;
56d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.provider.MediaStore;
57d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.provider.Settings;
58d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.support.test.InstrumentationRegistry;
59d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.support.test.filters.SmallTest;
60d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.test.mock.MockContentProvider;
61d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.test.mock.MockContentResolver;
62d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.util.ArrayMap;
63d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
647df1a82802cdf842d07a86a80383c7d5ea7ae53aLorenzo Colittiimport com.android.internal.util.test.FakeSettingsProvider;
65d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport com.android.internal.widget.LockPatternUtils;
66d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport com.android.server.SystemService;
67d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport com.android.server.retaildemo.RetailDemoModeService.Injector;
68d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
69d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.After;
70d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.Before;
71d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.Test;
72d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.runner.RunWith;
73d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.runners.JUnit4;
74d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.mockito.ArgumentCaptor;
75d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.mockito.Mock;
76d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.mockito.MockitoAnnotations;
77192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffinimport org.mockito.compat.ArgumentMatcher;
78d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
79d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport java.io.File;
80d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport java.util.concurrent.CountDownLatch;
81d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport java.util.concurrent.TimeUnit;
82d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
83d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka@RunWith(JUnit4.class)
84d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka@SmallTest
85d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankapublic class RetailDemoModeServiceTest {
86d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private static final int TEST_DEMO_USER = 111;
87d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private static final long SETUP_COMPLETE_TIMEOUT_MS = 2000; // 2 sec
88d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private static final String TEST_CAMERA_PKG = "test.cameraapp";
89d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private static final String TEST_PRELOADS_DIR_NAME = "test_preloads";
90d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
91d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock Context mContext;
92d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock UserManager mUm;
93d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock PackageManager mPm;
94d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock IPackageManager mIpm;
95d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock NotificationManager mNm;
96d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock ActivityManagerInternal mAmi;
97d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock AudioManager mAudioManager;
98cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla    private @Mock WifiManager mWifiManager;
99d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private @Mock LockPatternUtils mLockPatternUtils;
100233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka    private MockPreloadAppsInstaller mPreloadAppsInstaller;
101d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private MockContentResolver mContentResolver;
102d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private MockContactsProvider mContactsProvider;
103d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private Configuration mConfiguration;
104d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private File mTestPreloadsDir;
105d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private CountDownLatch mLatch;
106d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
107d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private RetailDemoModeService mService;
108d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private TestInjector mInjector;
109d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
110d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    @Before
111d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    public void setUp() throws Exception {
112d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        MockitoAnnotations.initMocks(this);
113d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mContentResolver = new MockContentResolver(mContext);
114d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
115d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mContactsProvider = new MockContactsProvider(mContext);
116d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mContentResolver.addProvider(CallLog.AUTHORITY, mContactsProvider);
117d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        when(mContext.getContentResolver()).thenReturn(mContentResolver);
118233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka        mPreloadAppsInstaller = new MockPreloadAppsInstaller(mContext);
119d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mConfiguration = new Configuration();
120d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mTestPreloadsDir = new File(InstrumentationRegistry.getContext().getFilesDir(),
121d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                TEST_PRELOADS_DIR_NAME);
122d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
123d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Settings.Global.putString(mContentResolver,
124d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                Settings.Global.RETAIL_DEMO_MODE_CONSTANTS, "");
125d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Settings.Global.putInt(mContentResolver,
126d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                Settings.Global.DEVICE_PROVISIONED, 1);
127d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Settings.Global.putInt(mContentResolver,
128d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                Settings.Global.DEVICE_DEMO_MODE, 1);
129d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Initialize RetailDemoModeService
130d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mInjector = new TestInjector();
131d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mService = new RetailDemoModeService(mInjector);
132d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mService.onStart();
133d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
134d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
135d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    @After
136d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    public void tearDown() {
137d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        FileUtils.deleteContentsAndDir(mTestPreloadsDir);
138d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
139d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
140d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    @Test
141d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    public void testDemoUserSetup() throws Exception {
142d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
143d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
144d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mLatch = new CountDownLatch(1);
14528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        final UserInfo userInfo = new UserInfo();
14628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        userInfo.id = TEST_DEMO_USER;
14728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        when(mUm.createUser(anyString(), anyInt())).thenReturn(userInfo);
148d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
149501247bab13b558b29c1fde65dc9d2ed3e4653acSudheer Shanka        setCameraPackage(TEST_CAMERA_PKG);
150d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
151d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertEquals(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED + " property not set",
152d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                "1", mInjector.systemPropertiesGet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED));
153d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
15428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        final ArgumentCaptor<IntentFilter> intentFilter =
15528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                ArgumentCaptor.forClass(IntentFilter.class);
15628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        verify(mContext).registerReceiver(any(BroadcastReceiver.class), intentFilter.capture());
15728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        assertTrue("Not registered for " + Intent.ACTION_SCREEN_OFF,
15828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                intentFilter.getValue().hasAction(Intent.ACTION_SCREEN_OFF));
15928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka
160d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Wait for the setup to complete.
161d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mLatch.await(SETUP_COMPLETE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
162d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        ArgumentCaptor<Integer> flags = ArgumentCaptor.forClass(Integer.class);
163d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).createUser(anyString(), flags.capture());
164d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertTrue("FLAG_DEMO not set during user creation",
165d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                (flags.getValue() & UserInfo.FLAG_DEMO) != 0);
166d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertTrue("FLAG_EPHEMERAL not set during user creation",
167d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                (flags.getValue() & UserInfo.FLAG_EPHEMERAL) != 0);
168d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Verify if necessary restrictions are being set.
169d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final UserHandle user = UserHandle.of(TEST_DEMO_USER);
170d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user);
171d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user);
172d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user);
173d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER, true, user);
174d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user);
175d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_CONFIG_BLUETOOTH, true, user);
176d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user);
177d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM);
178d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Verify if necessary settings are updated.
179d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertEquals("SKIP_FIRST_USE_HINTS setting is not set for demo user",
180d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                Settings.Secure.getIntForUser(mContentResolver,
181d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                        Settings.Secure.SKIP_FIRST_USE_HINTS, TEST_DEMO_USER),
182d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                1);
183d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertEquals("PACKAGE_VERIFIER_ENABLE settings should be set to 0 for demo user",
184d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                Settings.Global.getInt(mContentResolver,
185d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                        Settings.Global.PACKAGE_VERIFIER_ENABLE),
186d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                0);
187d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Verify if camera is granted location permission.
188d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mPm).grantRuntimePermission(TEST_CAMERA_PKG,
189d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                Manifest.permission.ACCESS_FINE_LOCATION, user);
190d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Verify call logs are cleared.
191d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertTrue("Call logs should be deleted", mContactsProvider.isCallLogDeleted());
192d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
193d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
194d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    @Test
19528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka    public void testSettingsObserver_disableDemoMode() throws Exception {
196d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final RetailDemoModeService.SettingsObserver observer =
197d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                mService.new SettingsObserver(new Handler(Looper.getMainLooper()));
198d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final Uri deviceDemoModeUri = Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE);
19928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        when(mUm.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT, UserHandle.SYSTEM))
20028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                .thenReturn(false);
20128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        Settings.Global.putInt(mContentResolver, Settings.Global.PACKAGE_VERIFIER_ENABLE, 1);
202d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // Settings.Global.DEVICE_DEMO_MODE has been set to 1 initially.
203d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        observer.onChange(false, deviceDemoModeUri);
20428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        final ArgumentCaptor<BroadcastReceiver> receiver =
20528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                ArgumentCaptor.forClass(BroadcastReceiver.class);
20628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
207d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
20828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        Settings.Global.putInt(mContentResolver, Settings.Global.PACKAGE_VERIFIER_ENABLE, 0);
209d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        new File(mTestPreloadsDir, "dir1").mkdirs();
210d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        new File(mTestPreloadsDir, "file1").createNewFile();
211d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Settings.Global.putInt(mContentResolver, Settings.Global.DEVICE_DEMO_MODE, 0);
212d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        observer.onChange(false, deviceDemoModeUri);
21328537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        verify(mContext).unregisterReceiver(receiver.getValue());
21428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        verify(mUm).setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, false, UserHandle.SYSTEM);
21528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        assertEquals("Package verifier enable value has not been reset", 1,
21628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                Settings.Global.getInt(mContentResolver, Settings.Global.PACKAGE_VERIFIER_ENABLE));
217d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Thread.sleep(20); // Wait for the deletion to complete.
218d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // verify that the preloaded directory is emptied.
219d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        assertEquals("Preloads directory is not emptied",
220d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                0, mTestPreloadsDir.list().length);
221d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
222d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
223d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    @Test
22428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka    public void testSettingsObserver_enableDemoMode() throws Exception {
22528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        final RetailDemoModeService.SettingsObserver observer =
22628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                mService.new SettingsObserver(new Handler(Looper.getMainLooper()));
22728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        final Uri deviceDemoModeUri = Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE);
22828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        // Settings.Global.DEVICE_DEMO_MODE has been set to 1 initially.
22928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        observer.onChange(false, deviceDemoModeUri);
23028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        assertEquals(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED + " property not set",
23128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                "1", mInjector.systemPropertiesGet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED));
23228537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka
23328537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        final ArgumentCaptor<IntentFilter> intentFilter =
23428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                ArgumentCaptor.forClass(IntentFilter.class);
23528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        verify(mContext).registerReceiver(any(BroadcastReceiver.class), intentFilter.capture());
23628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        assertTrue("Not registered for " + Intent.ACTION_SCREEN_OFF,
23728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                intentFilter.getValue().hasAction(Intent.ACTION_SCREEN_OFF));
23828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka    }
23928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka
24028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka    @Test
241d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    public void testSwitchToDemoUser() {
242d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        // To make the RetailDemoModeService update it's internal state.
243d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
244d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final RetailDemoModeService.SettingsObserver observer =
245d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                mService.new SettingsObserver(new Handler(Looper.getMainLooper()));
246d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        observer.onChange(false, Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE));
247d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
248d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final UserInfo userInfo = new UserInfo(TEST_DEMO_USER, "demo_user",
249d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL);
250d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        when(mUm.getUserInfo(TEST_DEMO_USER)).thenReturn(userInfo);
251cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla        when(mWifiManager.isWifiEnabled()).thenReturn(false);
252d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final int minVolume = -111;
253d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        for (int stream : RetailDemoModeService.VOLUME_STREAMS_TO_MUTE) {
254d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            when(mAudioManager.getStreamMinVolume(stream)).thenReturn(minVolume);
255d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
256d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
257d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        mService.onSwitchUser(TEST_DEMO_USER);
258d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mAmi).updatePersistentConfigurationForUser(mConfiguration, TEST_DEMO_USER);
259d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        for (int stream : RetailDemoModeService.VOLUME_STREAMS_TO_MUTE) {
260d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            verify(mAudioManager).setStreamVolume(stream, minVolume, 0);
261d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
262d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        verify(mLockPatternUtils).setLockScreenDisabled(true, TEST_DEMO_USER);
263cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla        verify(mWifiManager).setWifiEnabled(true);
264d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
265d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
266d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private void setCameraPackage(String pkgName) {
267d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final ResolveInfo ri = new ResolveInfo();
268d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        final ActivityInfo ai = new ActivityInfo();
269d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        ai.packageName = pkgName;
270d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        ri.activityInfo = ai;
271d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        when(mPm.resolveActivityAsUser(
272d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                argThat(new IntentMatcher(MediaStore.ACTION_IMAGE_CAPTURE)),
273d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                anyInt(),
274d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                eq(TEST_DEMO_USER))).thenReturn(ri);
275d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
276d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
277d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private class IntentMatcher extends ArgumentMatcher<Intent> {
278d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        private final Intent mIntent;
279d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
280d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        IntentMatcher(String action) {
281d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            mIntent = new Intent(action);
282d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
283d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
284d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
285192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffin        public boolean matchesObject(Object argument) {
286d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            if (argument instanceof Intent) {
287d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                return ((Intent) argument).filterEquals(mIntent);
288d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            }
289d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return false;
290d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
291d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
292d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
293192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffin        public String toString() {
294192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffin            return "Expected: " + mIntent;
295d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
296d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
297d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
298d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private class MockContactsProvider extends MockContentProvider {
299d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        private boolean mCallLogDeleted;
300d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
301d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        MockContactsProvider(Context context) {
302d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            super(context);
303d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
304d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
305d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
306d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        public int delete(Uri uri, String selection, String[] selectionArgs) {
307d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            if (CallLog.Calls.CONTENT_URI.equals(uri)) {
308d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                mCallLogDeleted = true;
309d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            }
310d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return 0;
311d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
312d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
313d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        public boolean isCallLogDeleted() {
314d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mCallLogDeleted;
315d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
316d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
317d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
318233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka    private class MockPreloadAppsInstaller extends PreloadAppsInstaller {
319233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka        MockPreloadAppsInstaller(Context context) {
320233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka            super(context);
321233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka        }
322233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka
323233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka        @Override
324233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka        public void installApps(int userId) {
325233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka        }
326233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka    }
327233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka
328d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    private class TestInjector extends Injector {
329d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        private ArrayMap<String, String> mSystemProperties = new ArrayMap<>();
330d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
331d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        TestInjector() {
332d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            super(mContext);
333d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
334d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
335d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
336d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Context getContext() {
337d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mContext;
338d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
339d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
340d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
341d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        UserManager getUserManager() {
342d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mUm;
343d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
344d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
345d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
346cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla        WifiManager getWifiManager() {
347cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla            return mWifiManager;
348cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla        }
349cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla
350cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla        @Override
351d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void switchUser(int userId) {
352d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            if (mLatch != null) {
353d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka                mLatch.countDown();
354d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            }
355d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
356d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
357d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
358d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        AudioManager getAudioManager() {
359d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mAudioManager;
360d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
361d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
362d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
363d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        NotificationManager getNotificationManager() {
364d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mNm;
365d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
366d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
367d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
368d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        ActivityManagerInternal getActivityManagerInternal() {
369d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mAmi;
370d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
371d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
372d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
373d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        PackageManager getPackageManager() {
374d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mPm;
375d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
376d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
377d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
378d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        IPackageManager getIPackageManager() {
379d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mIpm;
380d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
381d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
382d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
383d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        ContentResolver getContentResolver() {
384d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mContentResolver;
385d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
386d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
387d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
388d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        PreloadAppsInstaller getPreloadAppsInstaller() {
389d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mPreloadAppsInstaller;
390d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
391d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
392d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
393d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void systemPropertiesSet(String key, String value) {
394d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            mSystemProperties.put(key, value);
395d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
396d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
397d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
398d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void turnOffAllFlashLights(String[] cameraIdsWithFlash) {
399d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
400d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
401d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
402d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void initializeWakeLock() {
403d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
404d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
405d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
40628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        void destroyWakeLock() {
40728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        }
40828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka
40928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        @Override
410d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        boolean isWakeLockHeld() {
411d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return false;
412d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
413d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
414d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
415d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void acquireWakeLock() {
416d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
417d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
418d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
419d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void releaseWakeLock() {
420d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
421d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
422d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
423d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void logSessionDuration(int duration) {
424d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
425d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
426d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
427d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        void logSessionCount(int count) {
428d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
429d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
430d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
431d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Configuration getSystemUsersConfiguration() {
432d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mConfiguration;
433d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
434d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
435d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
436d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        LockPatternUtils getLockPatternUtils() {
437d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mLockPatternUtils;
438d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
439d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
440d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
441d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        Notification createResetNotification() {
442d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return null;
443d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
444d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
445d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        @Override
446d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        File getDataPreloadsDirectory() {
447d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka            return mTestPreloadsDir;
448d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
449d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
45028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        @Override
4516e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov        File getDataPreloadsFileCacheDirectory() {
4526e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov            return new File(mTestPreloadsDir, "file_cache");
4536e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov        }
4546e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov
4556e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov        @Override
45628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        void publishLocalService(RetailDemoModeService service,
45728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka                RetailDemoModeServiceInternal localService) {
458d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
459d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka
46028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka        String systemPropertiesGet(String key) {
46128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka            return mSystemProperties.get(key);
462d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka        }
463d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka    }
464233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka}
465