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; 36d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolovimport android.app.job.JobInfo; 37d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolovimport android.app.job.JobScheduler; 38d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.BroadcastReceiver; 39d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.ContentResolver; 40d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.Context; 41e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franksimport android.content.ContextWrapper; 42d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.Intent; 43d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.IntentFilter; 44d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.ActivityInfo; 45d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.IPackageManager; 46d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.PackageManager; 47d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.ResolveInfo; 48d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.pm.UserInfo; 49d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.content.res.Configuration; 50d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.media.AudioManager; 51d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.net.Uri; 52cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shuklaimport android.net.wifi.WifiManager; 53d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.FileUtils; 54d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.Handler; 55d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.Looper; 56d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.UserHandle; 57d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.os.UserManager; 58d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.provider.CallLog; 59d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.provider.MediaStore; 60d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.provider.Settings; 61d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.support.test.InstrumentationRegistry; 62d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.support.test.filters.SmallTest; 63e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franksimport android.support.test.runner.AndroidJUnit4; 64d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.test.mock.MockContentProvider; 65d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.test.mock.MockContentResolver; 66d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport android.util.ArrayMap; 67d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 687df1a82802cdf842d07a86a80383c7d5ea7ae53aLorenzo Colittiimport com.android.internal.util.test.FakeSettingsProvider; 69d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport com.android.internal.widget.LockPatternUtils; 70d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport com.android.server.SystemService; 71d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport com.android.server.retaildemo.RetailDemoModeService.Injector; 72d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 73d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.After; 74d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.Before; 75d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.Test; 76d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.junit.runner.RunWith; 77d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.mockito.ArgumentCaptor; 78d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.mockito.Mock; 79e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franksimport org.mockito.Mockito; 80d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport org.mockito.MockitoAnnotations; 81192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffinimport org.mockito.compat.ArgumentMatcher; 82d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 83d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport java.io.File; 84d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport java.util.concurrent.CountDownLatch; 85d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankaimport java.util.concurrent.TimeUnit; 86d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 87e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks@RunWith(AndroidJUnit4.class) 88d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka@SmallTest 89d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shankapublic class RetailDemoModeServiceTest { 90d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private static final int TEST_DEMO_USER = 111; 91d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private static final long SETUP_COMPLETE_TIMEOUT_MS = 2000; // 2 sec 92d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private static final String TEST_CAMERA_PKG = "test.cameraapp"; 93d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private static final String TEST_PRELOADS_DIR_NAME = "test_preloads"; 94d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 95e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks private Context mContext; 96d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock UserManager mUm; 97d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock PackageManager mPm; 98d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock IPackageManager mIpm; 99d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock NotificationManager mNm; 100d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock ActivityManagerInternal mAmi; 101d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock AudioManager mAudioManager; 102cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla private @Mock WifiManager mWifiManager; 103d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private @Mock LockPatternUtils mLockPatternUtils; 104d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolov private @Mock JobScheduler mJobScheduler; 105233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka private MockPreloadAppsInstaller mPreloadAppsInstaller; 106d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private MockContentResolver mContentResolver; 107d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private MockContactsProvider mContactsProvider; 108d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private Configuration mConfiguration; 109d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private File mTestPreloadsDir; 110d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private CountDownLatch mLatch; 111d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 112d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private RetailDemoModeService mService; 113d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private TestInjector mInjector; 114d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 115d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Before 116d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka public void setUp() throws Exception { 117d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka MockitoAnnotations.initMocks(this); 118e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); 119d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolov when(mContext.getSystemServiceName(eq(JobScheduler.class))).thenReturn( 120d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolov Context.JOB_SCHEDULER_SERVICE); 121d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolov when(mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE)).thenReturn(mJobScheduler); 122e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUm); 123d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mContentResolver = new MockContentResolver(mContext); 124d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); 125d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mContactsProvider = new MockContactsProvider(mContext); 126d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mContentResolver.addProvider(CallLog.AUTHORITY, mContactsProvider); 127d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka when(mContext.getContentResolver()).thenReturn(mContentResolver); 128233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka mPreloadAppsInstaller = new MockPreloadAppsInstaller(mContext); 129d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mConfiguration = new Configuration(); 130d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mTestPreloadsDir = new File(InstrumentationRegistry.getContext().getFilesDir(), 131d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka TEST_PRELOADS_DIR_NAME); 132d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 133e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks Settings.Global.putString(mContentResolver, Settings.Global.RETAIL_DEMO_MODE_CONSTANTS, ""); 134e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks Settings.Global.putInt(mContentResolver, Settings.Global.DEVICE_PROVISIONED, 1); 135e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks Settings.Global.putInt(mContentResolver, Settings.Global.DEVICE_DEMO_MODE, 1); 136e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks 137d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Initialize RetailDemoModeService 138d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mInjector = new TestInjector(); 139d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService = new RetailDemoModeService(mInjector); 140d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.onStart(); 141d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 142d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 143d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @After 144d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka public void tearDown() { 145e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks if (mTestPreloadsDir != null) { 146e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks FileUtils.deleteContentsAndDir(mTestPreloadsDir); 147e25dbaa619bab4291e1013582a0b59e7b82d4db8Christine Franks } 148d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 149d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 150d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Test 151d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka public void testDemoUserSetup() throws Exception { 152d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); 153d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 154d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mLatch = new CountDownLatch(1); 15528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka final UserInfo userInfo = new UserInfo(); 15628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka userInfo.id = TEST_DEMO_USER; 15728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka when(mUm.createUser(anyString(), anyInt())).thenReturn(userInfo); 158d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 159501247bab13b558b29c1fde65dc9d2ed3e4653acSudheer Shanka setCameraPackage(TEST_CAMERA_PKG); 160d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); 161d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertEquals(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED + " property not set", 162d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka "1", mInjector.systemPropertiesGet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED)); 163d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 16428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka final ArgumentCaptor<IntentFilter> intentFilter = 16528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka ArgumentCaptor.forClass(IntentFilter.class); 16628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka verify(mContext).registerReceiver(any(BroadcastReceiver.class), intentFilter.capture()); 16728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka assertTrue("Not registered for " + Intent.ACTION_SCREEN_OFF, 16828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka intentFilter.getValue().hasAction(Intent.ACTION_SCREEN_OFF)); 16928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka 170d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Wait for the setup to complete. 171d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mLatch.await(SETUP_COMPLETE_TIMEOUT_MS, TimeUnit.MILLISECONDS); 172d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka ArgumentCaptor<Integer> flags = ArgumentCaptor.forClass(Integer.class); 173d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).createUser(anyString(), flags.capture()); 174d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertTrue("FLAG_DEMO not set during user creation", 175d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka (flags.getValue() & UserInfo.FLAG_DEMO) != 0); 176d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertTrue("FLAG_EPHEMERAL not set during user creation", 177d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka (flags.getValue() & UserInfo.FLAG_EPHEMERAL) != 0); 178d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Verify if necessary restrictions are being set. 179d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final UserHandle user = UserHandle.of(TEST_DEMO_USER); 180d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); 181d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); 182d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); 183d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER, true, user); 184d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user); 185d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_CONFIG_BLUETOOTH, true, user); 186d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user); 187d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM); 188d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Verify if necessary settings are updated. 189d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertEquals("SKIP_FIRST_USE_HINTS setting is not set for demo user", 190d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Settings.Secure.getIntForUser(mContentResolver, 191d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Settings.Secure.SKIP_FIRST_USE_HINTS, TEST_DEMO_USER), 192d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 1); 193d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertEquals("PACKAGE_VERIFIER_ENABLE settings should be set to 0 for demo user", 194d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Settings.Global.getInt(mContentResolver, 195d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Settings.Global.PACKAGE_VERIFIER_ENABLE), 196d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 0); 197d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Verify if camera is granted location permission. 198d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mPm).grantRuntimePermission(TEST_CAMERA_PKG, 199d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Manifest.permission.ACCESS_FINE_LOCATION, user); 200d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Verify call logs are cleared. 201d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertTrue("Call logs should be deleted", mContactsProvider.isCallLogDeleted()); 202d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 203d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 204d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Test 20528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka public void testSettingsObserver_disableDemoMode() throws Exception { 206d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final RetailDemoModeService.SettingsObserver observer = 207d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.new SettingsObserver(new Handler(Looper.getMainLooper())); 208d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final Uri deviceDemoModeUri = Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE); 20928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka when(mUm.hasUserRestriction(UserManager.DISALLOW_SAFE_BOOT, UserHandle.SYSTEM)) 21028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka .thenReturn(false); 21128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka Settings.Global.putInt(mContentResolver, Settings.Global.PACKAGE_VERIFIER_ENABLE, 1); 212d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // Settings.Global.DEVICE_DEMO_MODE has been set to 1 initially. 213d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka observer.onChange(false, deviceDemoModeUri); 21428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka final ArgumentCaptor<BroadcastReceiver> receiver = 21528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka ArgumentCaptor.forClass(BroadcastReceiver.class); 21628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class)); 217d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 21828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka Settings.Global.putInt(mContentResolver, Settings.Global.PACKAGE_VERIFIER_ENABLE, 0); 219d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka new File(mTestPreloadsDir, "dir1").mkdirs(); 220d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka new File(mTestPreloadsDir, "file1").createNewFile(); 221d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Settings.Global.putInt(mContentResolver, Settings.Global.DEVICE_DEMO_MODE, 0); 222d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka observer.onChange(false, deviceDemoModeUri); 22328537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka verify(mContext).unregisterReceiver(receiver.getValue()); 22428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka verify(mUm).setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, false, UserHandle.SYSTEM); 22528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka assertEquals("Package verifier enable value has not been reset", 1, 22628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka Settings.Global.getInt(mContentResolver, Settings.Global.PACKAGE_VERIFIER_ENABLE)); 227d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Thread.sleep(20); // Wait for the deletion to complete. 228d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // verify that the preloaded directory is emptied. 229d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka assertEquals("Preloads directory is not emptied", 230d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 0, mTestPreloadsDir.list().length); 231d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolov // Verify that the expiration job was scheduled 232d225f0bfd5bc8e7767dc000ea5174bddd95bdea8Fyodor Kupolov verify(mJobScheduler).schedule(any(JobInfo.class)); 233d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 234d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 235d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Test 23628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka public void testSettingsObserver_enableDemoMode() throws Exception { 23728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka final RetailDemoModeService.SettingsObserver observer = 23828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka mService.new SettingsObserver(new Handler(Looper.getMainLooper())); 23928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka final Uri deviceDemoModeUri = Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE); 24028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka // Settings.Global.DEVICE_DEMO_MODE has been set to 1 initially. 24128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka observer.onChange(false, deviceDemoModeUri); 24228537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka assertEquals(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED + " property not set", 24328537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka "1", mInjector.systemPropertiesGet(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED)); 24428537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka 24528537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka final ArgumentCaptor<IntentFilter> intentFilter = 24628537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka ArgumentCaptor.forClass(IntentFilter.class); 24728537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka verify(mContext).registerReceiver(any(BroadcastReceiver.class), intentFilter.capture()); 24828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka assertTrue("Not registered for " + Intent.ACTION_SCREEN_OFF, 24928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka intentFilter.getValue().hasAction(Intent.ACTION_SCREEN_OFF)); 25028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka } 25128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka 25228537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka @Test 253d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka public void testSwitchToDemoUser() { 254d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka // To make the RetailDemoModeService update it's internal state. 255d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); 256d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final RetailDemoModeService.SettingsObserver observer = 257d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.new SettingsObserver(new Handler(Looper.getMainLooper())); 258d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka observer.onChange(false, Settings.Global.getUriFor(Settings.Global.DEVICE_DEMO_MODE)); 259d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 260d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final UserInfo userInfo = new UserInfo(TEST_DEMO_USER, "demo_user", 261d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL); 262d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka when(mUm.getUserInfo(TEST_DEMO_USER)).thenReturn(userInfo); 263cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla when(mWifiManager.isWifiEnabled()).thenReturn(false); 264d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final int minVolume = -111; 265d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka for (int stream : RetailDemoModeService.VOLUME_STREAMS_TO_MUTE) { 266d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka when(mAudioManager.getStreamMinVolume(stream)).thenReturn(minVolume); 267d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 268d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 269d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mService.onSwitchUser(TEST_DEMO_USER); 270d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mAmi).updatePersistentConfigurationForUser(mConfiguration, TEST_DEMO_USER); 271d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka for (int stream : RetailDemoModeService.VOLUME_STREAMS_TO_MUTE) { 272d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mAudioManager).setStreamVolume(stream, minVolume, 0); 273d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 274d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka verify(mLockPatternUtils).setLockScreenDisabled(true, TEST_DEMO_USER); 275cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla verify(mWifiManager).setWifiEnabled(true); 276d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 277d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 278d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private void setCameraPackage(String pkgName) { 279d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final ResolveInfo ri = new ResolveInfo(); 280d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka final ActivityInfo ai = new ActivityInfo(); 281d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka ai.packageName = pkgName; 282d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka ri.activityInfo = ai; 283d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka when(mPm.resolveActivityAsUser( 284d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka argThat(new IntentMatcher(MediaStore.ACTION_IMAGE_CAPTURE)), 285d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka anyInt(), 286d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka eq(TEST_DEMO_USER))).thenReturn(ri); 287d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 288d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 289d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private class IntentMatcher extends ArgumentMatcher<Intent> { 290d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private final Intent mIntent; 291d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 292d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka IntentMatcher(String action) { 293d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mIntent = new Intent(action); 294d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 295d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 296d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 297192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffin public boolean matchesObject(Object argument) { 298d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka if (argument instanceof Intent) { 299d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return ((Intent) argument).filterEquals(mIntent); 300d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 301d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return false; 302d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 303d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 304d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 305192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffin public String toString() { 306192bb0bc54f6bb418f5778fe26eb2e68514290fbPaul Duffin return "Expected: " + mIntent; 307d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 308d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 309d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 310d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private class MockContactsProvider extends MockContentProvider { 311d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private boolean mCallLogDeleted; 312d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 313d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka MockContactsProvider(Context context) { 314d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka super(context); 315d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 316d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 317d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 318d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka public int delete(Uri uri, String selection, String[] selectionArgs) { 319d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka if (CallLog.Calls.CONTENT_URI.equals(uri)) { 320d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mCallLogDeleted = true; 321d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 322d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return 0; 323d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 324d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 325d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka public boolean isCallLogDeleted() { 326d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mCallLogDeleted; 327d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 328d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 329d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 330233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka private class MockPreloadAppsInstaller extends PreloadAppsInstaller { 331233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka MockPreloadAppsInstaller(Context context) { 332233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka super(context); 333233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka } 334233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka 335233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka @Override 336233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka public void installApps(int userId) { 337233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka } 338233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka } 339233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka 340d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private class TestInjector extends Injector { 341d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka private ArrayMap<String, String> mSystemProperties = new ArrayMap<>(); 342d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 343d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka TestInjector() { 344d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka super(mContext); 345d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 346d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 347d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 348d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Context getContext() { 349d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mContext; 350d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 351d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 352d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 353d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka UserManager getUserManager() { 354d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mUm; 355d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 356d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 357d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 358cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla WifiManager getWifiManager() { 359cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla return mWifiManager; 360cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla } 361cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla 362cd47cec57d082aab910fd7a2094cd01baa4c65f3Suprabh Shukla @Override 363d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void switchUser(int userId) { 364d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka if (mLatch != null) { 365d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mLatch.countDown(); 366d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 367d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 368d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 369d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 370d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka AudioManager getAudioManager() { 371d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mAudioManager; 372d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 373d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 374d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 375d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka NotificationManager getNotificationManager() { 376d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mNm; 377d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 378d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 379d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 380d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka ActivityManagerInternal getActivityManagerInternal() { 381d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mAmi; 382d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 383d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 384d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 385d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka PackageManager getPackageManager() { 386d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mPm; 387d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 388d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 389d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 390d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka IPackageManager getIPackageManager() { 391d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mIpm; 392d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 393d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 394d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 395d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka ContentResolver getContentResolver() { 396d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mContentResolver; 397d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 398d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 399d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 400d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka PreloadAppsInstaller getPreloadAppsInstaller() { 401d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mPreloadAppsInstaller; 402d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 403d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 404d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 405d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void systemPropertiesSet(String key, String value) { 406d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka mSystemProperties.put(key, value); 407d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 408d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 409d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 410d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void turnOffAllFlashLights(String[] cameraIdsWithFlash) { 411d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 412d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 413d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 414d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void initializeWakeLock() { 415d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 416d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 417d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 41828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka void destroyWakeLock() { 41928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka } 42028537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka 42128537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka @Override 422d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka boolean isWakeLockHeld() { 423d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return false; 424d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 425d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 426d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 427d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void acquireWakeLock() { 428d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 429d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 430d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 431d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void releaseWakeLock() { 432d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 433d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 434d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 435d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void logSessionDuration(int duration) { 436d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 437d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 438d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 439d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka void logSessionCount(int count) { 440d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 441d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 442d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 443d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Configuration getSystemUsersConfiguration() { 444d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mConfiguration; 445d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 446d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 447d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 448d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka LockPatternUtils getLockPatternUtils() { 449d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mLockPatternUtils; 450d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 451d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 452d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 453d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka Notification createResetNotification() { 454d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return null; 455d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 456d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 457d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka @Override 458d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka File getDataPreloadsDirectory() { 459d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka return mTestPreloadsDir; 460d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 461d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 46228537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka @Override 4636e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov File getDataPreloadsFileCacheDirectory() { 4646e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov return new File(mTestPreloadsDir, "file_cache"); 4656e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov } 4666e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov 4676e68706f67c84a714bc9d765cf3f30d1e43ae9ceFyodor Kupolov @Override 46828537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka void publishLocalService(RetailDemoModeService service, 46928537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka RetailDemoModeServiceInternal localService) { 470d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 471d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka 47228537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka String systemPropertiesGet(String key) { 47328537b6ae92a3211b5993ac00482ef905a911244Sudheer Shanka return mSystemProperties.get(key); 474d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 475d9fcb69b81e49cc106d6c53884fdc3aee4822e81Sudheer Shanka } 476233cc3ef10d025276ffa280e8d4b58969860ac24Sudheer Shanka} 477