1c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki/*
2c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * Copyright (C) 2015 The Android Open Source Project
3c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki *
4c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * you may not use this file except in compliance with the License.
6c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * You may obtain a copy of the License at
7c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki *
8c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki *
10c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * Unless required by applicable law or agreed to in writing, software
11c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * See the License for the specific language governing permissions and
14c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki * limitations under the License.
15c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki */
16c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
17c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukipackage com.android.server.devicepolicy;
18c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
19cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport com.android.internal.widget.LockPatternUtils;
20cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
21cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.app.IActivityManager;
22cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.app.NotificationManager;
23b643fb0e67460344ade2e3db92738999f8168496Makoto Onukiimport android.app.backup.IBackupManager;
24cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.content.BroadcastReceiver;
25a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onukiimport android.content.ContentResolver;
26c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukiimport android.content.Context;
27cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.content.Intent;
28cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.content.IntentFilter;
29f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onukiimport android.content.pm.IPackageManager;
30cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.content.pm.PackageManager;
31cb6fd80721253ffa9dcab5cf8c2f4e9b9cd17cccFyodor Kupolovimport android.content.pm.PackageManagerInternal;
32d932f7689d799b07a6776bc7c59749f672528239Makoto Onukiimport android.content.pm.UserInfo;
33b643fb0e67460344ade2e3db92738999f8168496Makoto Onukiimport android.media.IAudioService;
34a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onukiimport android.net.wifi.WifiManager;
35cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.os.Bundle;
36cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.os.Handler;
37cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.os.PowerManager.WakeLock;
38cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.os.PowerManagerInternal;
39cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.os.UserHandle;
40c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukiimport android.os.UserManager;
41068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.os.UserManagerInternal;
421216ae5d023e8f6e4f158a447a5764288e4ccc3eMahaver Chopraimport android.telephony.TelephonyManager;
43a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onukiimport android.test.mock.MockContentResolver;
44cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.test.mock.MockContext;
45cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.view.IWindowManager;
46cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
47b643fb0e67460344ade2e3db92738999f8168496Makoto Onukiimport org.junit.Assert;
482a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onukiimport org.mockito.invocation.InvocationOnMock;
492a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onukiimport org.mockito.stubbing.Answer;
50b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki
51cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.io.File;
52cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.util.ArrayList;
53cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.util.List;
54c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
553e794afb82228199c0a83bed5463dbeb3c48dd62Victor Changimport static org.mockito.Matchers.anyBoolean;
562a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onukiimport static org.mockito.Matchers.anyInt;
57d932f7689d799b07a6776bc7c59749f672528239Makoto Onukiimport static org.mockito.Matchers.eq;
58c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onukiimport static org.mockito.Mockito.mock;
59cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport static org.mockito.Mockito.spy;
60d932f7689d799b07a6776bc7c59749f672528239Makoto Onukiimport static org.mockito.Mockito.when;
61c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
62cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki/**
63cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * Context used throughout DPMS tests.
64cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki */
65cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukipublic class DpmMockContext extends MockContext {
66cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
67cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * User-id of a non-system user we use throughout unit tests.
68cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
69cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static final int CALLER_USER_HANDLE = 20;
70c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
71cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
72b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki     * UID corresponding to {@link #CALLER_USER_HANDLE}.
73cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
74d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public static final int CALLER_UID = UserHandle.getUid(CALLER_USER_HANDLE, 20123);
75c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
76cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
77b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki     * UID used when a caller is on the system user.
78b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki     */
79d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public static final int CALLER_SYSTEM_USER_UID = 20321;
80b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki
81b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki    /**
82cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * PID of the caller.
83cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
84cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static final int CALLER_PID = 22222;
85cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
86cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
87cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * UID of the system server.
88cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
89cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static final int SYSTEM_UID = android.os.Process.SYSTEM_UID;
90cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
91cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
92cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * PID of the system server.
93cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
94cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static final int SYSTEM_PID = 11111;
95cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
96cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static class MockBinder {
97f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public int callingUid = CALLER_UID;
98f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public int callingPid = CALLER_PID;
99cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
100cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public long clearCallingIdentity() {
101f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            final long token = (((long) callingUid) << 32) | (callingPid);
102f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            callingUid = SYSTEM_UID;
103f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            callingPid = SYSTEM_PID;
104cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            return token;
105cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
106cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
107cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public void restoreCallingIdentity(long token) {
108f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            callingUid = (int) (token >> 32);
109f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            callingPid = (int) token;
110cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
111cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
112cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public int getCallingUid() {
113f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return callingUid;
114cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
115cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
116cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public int getCallingPid() {
117f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return callingPid;
118cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
119cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
120cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public UserHandle getCallingUserHandle() {
121cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            return new UserHandle(UserHandle.getUserId(getCallingUid()));
122cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
123cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
124cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public boolean isCallerUidMyUid() {
125f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return callingUid == SYSTEM_UID;
126cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
127c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    }
128c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
129cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static class EnvironmentForMock {
130cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public File getUserSystemDirectory(int userId) {
131cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            return null;
132cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
133cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
134cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
135cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public static class PowerManagerForMock {
136cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public WakeLock newWakeLock(int levelAndFlags, String tag) {
137cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            return null;
138cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
139cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
140cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        public void goToSleep(long time, int reason, int flags) {
141cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
142f8373b5afc6dd25350bbca7093178807f1cc9ed6Mahaver Chopra
143f8373b5afc6dd25350bbca7093178807f1cc9ed6Mahaver Chopra        public void reboot(String reason) {
144f8373b5afc6dd25350bbca7093178807f1cc9ed6Mahaver Chopra        }
145cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
146cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
147f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki    public static class SystemPropertiesForMock {
148f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public boolean getBoolean(String key, boolean def) {
149f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return false;
150f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        }
151f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki
152f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public long getLong(String key, long def) {
153f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return 0;
154f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        }
155f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki
156f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public String get(String key, String def) {
157f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return null;
158f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        }
159f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki
160f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public String get(String key) {
161f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki            return null;
162f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        }
163f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki
164f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        public void set(String key, String value) {
165f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        }
166f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki    }
167f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki
168b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki    public static class UserManagerForMock {
169b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        public boolean isSplitSystemUser() {
170b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            return false;
171b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        }
172b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki    }
173b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki
174a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki    public static class SettingsForMock {
1753e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public int settingsSecureGetIntForUser(String name, int def, int userHandle) {
176a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki            return 0;
177a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
178a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1793e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsSecurePutIntForUser(String name, int value, int userHandle) {
180a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
181a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1823e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsSecurePutStringForUser(String name, String value, int userHandle) {
183a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
184a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1853e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsGlobalPutStringForUser(String name, String value, int userHandle) {
186a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
187a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1883e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsSecurePutInt(String name, int value) {
189a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
190a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1913e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsGlobalPutInt(String name, int value) {
192a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
193a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1943e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsSecurePutString(String name, String value) {
195a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
196a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
1973e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void settingsGlobalPutString(String name, String value) {
198a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
1993f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki
2003e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public int settingsGlobalGetInt(String name, int value) {
2013f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki            return 0;
2023f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki        }
2033f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki
2043e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        public void securityLogSetLoggingEnabledProperty(boolean enabled) {
2053f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki        }
20649caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu
20749caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu        public boolean securityLogGetLoggingEnabledProperty() {
20849caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu            return false;
20949caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu        }
21049caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu
21149caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu        public boolean securityLogIsLoggingEnabled() {
21249caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu            return false;
21349caead1c2608f57ac6c260396c6bfd058b921aeRubin Xu        }
214a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki    }
215a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
216d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki    public static class StorageManagerForMock {
217d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        public boolean isFileBasedEncryptionEnabled() {
218d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki            return false;
219d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        }
220d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki
221d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        public boolean isNonDefaultBlockEncrypted() {
222d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki            return false;
223d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        }
224d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki
225d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        public boolean isEncrypted() {
226d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki            return false;
227d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        }
228d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki
229d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        public boolean isEncryptable() {
230d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki            return false;
231d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        }
232d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki    }
233d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki
234cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final Context realTestContext;
235cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
236cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /**
237cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * Use this instance to verify unimplemented methods such as {@link #sendBroadcast}.
238cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * (Spying on {@code this} instance will confuse mockito somehow and I got weired "wrong number
239cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     * of arguments" exceptions.)
240cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki     */
241cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final Context spiedContext;
242cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
243d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public final File dataDir;
244d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public final File systemUserDataDir;
245d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
246cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final MockBinder binder;
247cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final EnvironmentForMock environment;
248f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki    public final SystemPropertiesForMock systemProperties;
249cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final UserManager userManager;
250068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki    public final UserManagerInternal userManagerInternal;
251cb6fd80721253ffa9dcab5cf8c2f4e9b9cd17cccFyodor Kupolov    public final PackageManagerInternal packageManagerInternal;
252b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki    public final UserManagerForMock userManagerForMock;
253cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final PowerManagerForMock powerManager;
254cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final PowerManagerInternal powerManagerInternal;
255cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final NotificationManager notificationManager;
256cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final IWindowManager iwindowManager;
257cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final IActivityManager iactivityManager;
258f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki    public final IPackageManager ipackageManager;
259b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki    public final IBackupManager ibackupManager;
260b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki    public final IAudioService iaudioService;
261cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final LockPatternUtils lockPatternUtils;
262d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki    public final StorageManagerForMock storageManager;
263a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki    public final WifiManager wifiManager;
264a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki    public final SettingsForMock settings;
265a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    public final MockContentResolver contentResolver;
2661216ae5d023e8f6e4f158a447a5764288e4ccc3eMahaver Chopra    public final TelephonyManager telephonyManager;
267cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
268cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    /** Note this is a partial mock, not a real mock. */
269cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final PackageManager packageManager;
270cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
271cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public final List<String> callerPermissions = new ArrayList<>();
272cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
273d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    private final ArrayList<UserInfo> mUserInfos = new ArrayList<>();
274d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
275d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public DpmMockContext(Context context, File dataDir) {
276cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        realTestContext = context;
277d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
278d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        this.dataDir = dataDir;
279d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        DpmTestUtils.clearDir(dataDir);
280d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
281cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        binder = new MockBinder();
282cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        environment = mock(EnvironmentForMock.class);
283f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        systemProperties= mock(SystemPropertiesForMock.class);
284cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        userManager = mock(UserManager.class);
285068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki        userManagerInternal = mock(UserManagerInternal.class);
286b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        userManagerForMock = mock(UserManagerForMock.class);
287cb6fd80721253ffa9dcab5cf8c2f4e9b9cd17cccFyodor Kupolov        packageManagerInternal = mock(PackageManagerInternal.class);
288cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        powerManager = mock(PowerManagerForMock.class);
289cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        powerManagerInternal = mock(PowerManagerInternal.class);
290cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        notificationManager = mock(NotificationManager.class);
291cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        iwindowManager = mock(IWindowManager.class);
292cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        iactivityManager = mock(IActivityManager.class);
293f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki        ipackageManager = mock(IPackageManager.class);
294b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        ibackupManager = mock(IBackupManager.class);
295b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        iaudioService = mock(IAudioService.class);
296cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        lockPatternUtils = mock(LockPatternUtils.class);
297d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onuki        storageManager = mock(StorageManagerForMock.class);
298a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki        wifiManager = mock(WifiManager.class);
299a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        settings = mock(SettingsForMock.class);
3001216ae5d023e8f6e4f158a447a5764288e4ccc3eMahaver Chopra        telephonyManager = mock(TelephonyManager.class);
301cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
302cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        // Package manager is huge, so we use a partial mock instead.
303cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        packageManager = spy(context.getPackageManager());
304cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
305cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext = mock(Context.class);
306d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
307a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki        contentResolver = new MockContentResolver();
308a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki
309d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        // Add the system user
310d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        systemUserDataDir = addUser(UserHandle.USER_SYSTEM, UserInfo.FLAG_PRIMARY);
311d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
312d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        // System user is always running.
313a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki        setUserRunning(UserHandle.USER_SYSTEM, true);
314d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    }
315d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
316d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public File addUser(int userId, int flags) {
317d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
318d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        // Set up (default) UserInfo for CALLER_USER_HANDLE.
319d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        final UserInfo uh = new UserInfo(userId, "user" + userId, flags);
320d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        when(userManager.getUserInfo(eq(userId))).thenReturn(uh);
321d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
322d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        mUserInfos.add(uh);
323d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        when(userManager.getUsers()).thenReturn(mUserInfos);
3243e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        when(userManager.getUsers(anyBoolean())).thenReturn(mUserInfos);
3253e794afb82228199c0a83bed5463dbeb3c48dd62Victor Chang        when(userManager.isUserRunning(eq(new UserHandle(userId)))).thenReturn(true);
3262a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        when(userManager.getUserInfo(anyInt())).thenAnswer(
3272a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                new Answer<UserInfo>() {
3282a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    @Override
3292a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    public UserInfo answer(InvocationOnMock invocation) throws Throwable {
3302a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        final int userId = (int) invocation.getArguments()[0];
3312a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        for (UserInfo ui : mUserInfos) {
3322a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            if (ui.id == userId) {
3332a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                return ui;
3342a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            }
3352a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        }
3362a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        return null;
3372a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    }
3382a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                }
3392a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        );
3402a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        when(userManager.getProfiles(anyInt())).thenAnswer(
3412a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                new Answer<List<UserInfo>>() {
3422a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    @Override
3432a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    public List<UserInfo> answer(InvocationOnMock invocation) throws Throwable {
3442a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        final int userId = (int) invocation.getArguments()[0];
3457f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                        return getProfiles(userId);
3467f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                    }
3477f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                }
3487f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        );
3497f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        when(userManager.getProfileIdsWithDisabled(anyInt())).thenAnswer(
3507f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                new Answer<int[]>() {
3517f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                    @Override
3527f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                    public int[] answer(InvocationOnMock invocation) throws Throwable {
3537f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                        final int userId = (int) invocation.getArguments()[0];
3547f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                        List<UserInfo> profiles = getProfiles(userId);
3557f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                        int[] results = new int[profiles.size()];
3567f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                        for (int i = 0; i < results.length; i++) {
3577f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                            results[i] = profiles.get(i).id;
3582a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        }
3597f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                        return results;
3602a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    }
3612a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                }
3622a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        );
363d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
3647f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov
365d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        // Create a data directory.
366d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        final File dir = new File(dataDir, "user" + userId);
367d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        DpmTestUtils.clearDir(dir);
368d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
369d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        when(environment.getUserSystemDirectory(eq(userId))).thenReturn(dir);
370d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        return dir;
371d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    }
372d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
3737f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov    private List<UserInfo> getProfiles(int userId) {
3747f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        final ArrayList<UserInfo> ret = new ArrayList<UserInfo>();
3757f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        UserInfo parent = null;
3767f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        for (UserInfo ui : mUserInfos) {
3777f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            if (ui.id == userId) {
3787f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                parent = ui;
3797f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                break;
3807f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            }
3817f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        }
3827f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        if (parent == null) {
3837f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            return ret;
3847f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        }
3857f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        ret.add(parent);
3867f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        for (UserInfo ui : mUserInfos) {
3877f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            if (ui.id == userId) {
3887f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                continue;
3897f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            }
3907f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            if (ui.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
3917f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                    && ui.profileGroupId == parent.profileGroupId) {
3927f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov                ret.add(ui);
3937f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov            }
3947f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        }
3957f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov        return ret;
3967f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov    }
3977f98aa4aa93497692f200c553d2d6fff402e3de2Fyodor Kupolov
398d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    /**
399d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki     * Add multiple users at once.  They'll all have flag 0.
400d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki     */
401d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public void addUsers(int... userIds) {
402d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        for (int userId : userIds) {
403d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki            addUser(userId, 0);
404d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        }
405c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    }
406c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
407a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    public void setUserRunning(int userId, boolean isRunning) {
408a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki        when(userManager.isUserRunning(MockUtils.checkUserHandle(userId)))
409a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki                .thenReturn(isRunning);
410a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    }
411a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki
412c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    @Override
413c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    public Object getSystemService(String name) {
414c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki        switch (name) {
415c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki            case Context.USER_SERVICE:
416cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                return userManager;
417cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            case Context.POWER_SERVICE:
418cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                return powerManager;
419a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki            case Context.WIFI_SERVICE:
420a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki                return wifiManager;
421c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki        }
422cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        throw new UnsupportedOperationException();
423cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
424cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
425cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
42672a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki    public String getSystemServiceName(Class<?> serviceClass) {
42772a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki        return realTestContext.getSystemServiceName(serviceClass);
42872a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki    }
42972a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki
43072a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki    @Override
431cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public PackageManager getPackageManager() {
432cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return packageManager;
433cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
434cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
435cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
436cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void enforceCallingOrSelfPermission(String permission, String message) {
437cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        if (binder.getCallingUid() == SYSTEM_UID) {
438cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            return; // Assume system has all permissions.
439cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
440cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        if (!callerPermissions.contains(permission)) {
441cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            throw new SecurityException("Caller doesn't have " + permission + " : " + message);
442cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
443cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
444cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
445cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
446cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent) {
447cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent);
448cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
449cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
450cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
451cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent, String receiverPermission) {
452cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent, receiverPermission);
453cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
454cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
455cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
456cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
457cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions);
458cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
459cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
460cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
461cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) {
462cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent, receiverPermission, options);
463cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
464cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
465cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
466cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
467cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent, receiverPermission, appOp);
468cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
469cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
470cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
471cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
472cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission);
473cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
474cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
475cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
476cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission,
477cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
478cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
479cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
480cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialCode, initialData, initialExtras);
481cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
482cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
483cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
484cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
485cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
486cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
487cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission, options, resultReceiver,
488cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler,
489cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialCode, initialData, initialExtras);
490cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
491cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
492cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
493cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
494cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
495cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
496cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission, appOp, resultReceiver,
497cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler,
498cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialCode, initialData, initialExtras);
499cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
500cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
501cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
502cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
503b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        if (binder.callingPid != SYSTEM_PID) {
504b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            // Unless called as the system process, can only call if the target user is the
505b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            // calling user.
506b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            // (The actual check is more complex; we may need to change it later.)
507b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            Assert.assertEquals(UserHandle.getUserId(binder.getCallingUid()), user.getIdentifier());
508b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        }
509b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki
510cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastAsUser(intent, user);
511cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
512cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
513cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
514cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) {
515cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastAsUser(intent, user, receiverPermission);
516cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
517cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
518cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
519cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
520cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            int appOp) {
521cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, appOp);
522cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
523cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
524cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
525cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
526cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
527cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            int initialCode, String initialData, Bundle initialExtras) {
528cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, resultReceiver,
529cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler, initialCode, initialData, initialExtras);
5303cb2b49f443a31b1bb043d0450e350b95acecc8bSuprabh Shukla        resultReceiver.onReceive(spiedContext, intent);
531cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
532cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
533cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
534cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
535cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
536cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
537cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp,
538cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                resultReceiver,
539cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler, initialCode, initialData, initialExtras);
540cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
541cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
542cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
543cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
544cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
545cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
546cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, options,
547cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                resultReceiver, scheduler, initialCode, initialData, initialExtras);
548cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
549cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
550cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
551cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyBroadcast(Intent intent) {
552cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyBroadcast(intent);
553cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
554cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
555cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
556cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,
557cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
558cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode,
559cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialData, initialExtras);
560cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
561cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
562cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
563cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void removeStickyBroadcast(Intent intent) {
564cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.removeStickyBroadcast(intent);
565cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
566cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
567cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
568cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
569cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyBroadcastAsUser(intent, user);
570cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
571cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
572cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
573cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user,
574cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
575cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
576cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode,
577cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialData, initialExtras);
578cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
579cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
580cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
581cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
582cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.removeStickyBroadcastAsUser(intent, user);
583cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
584cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
585cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
586cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
587cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return spiedContext.registerReceiver(receiver, filter);
588cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
589cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
590cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
591cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
592cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String broadcastPermission, Handler scheduler) {
593cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return spiedContext.registerReceiver(receiver, filter, broadcastPermission, scheduler);
594cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
595cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
596cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
597cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
598cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            IntentFilter filter, String broadcastPermission, Handler scheduler) {
599cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
600cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler);
601cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
602cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
603cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
604cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void unregisterReceiver(BroadcastReceiver receiver) {
605cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.unregisterReceiver(receiver);
606c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    }
607a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki
608a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    @Override
609a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    public ContentResolver getContentResolver() {
610a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki        return contentResolver;
611a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    }
612c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki}
613