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