DpmMockContext.java revision 1216ae5d023e8f6e4f158a447a5764288e4ccc3e
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;
42d4c9e541ec7110d3c842d6f92c3ec6beb0b6d997Makoto Onukiimport android.os.storage.StorageManager;
431216ae5d023e8f6e4f158a447a5764288e4ccc3eMahaver Chopraimport android.telephony.TelephonyManager;
44a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onukiimport android.test.mock.MockContentResolver;
45cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.test.mock.MockContext;
46cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.view.IWindowManager;
47cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
48b643fb0e67460344ade2e3db92738999f8168496Makoto Onukiimport org.junit.Assert;
492a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onukiimport org.mockito.invocation.InvocationOnMock;
502a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onukiimport org.mockito.stubbing.Answer;
51b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki
52cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.io.File;
53cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.util.ArrayList;
54cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.util.List;
55c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
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 {
175a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        int settingsSecureGetIntForUser(String name, int def, int userHandle) {
176a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki            return 0;
177a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
178a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
179a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsSecurePutIntForUser(String name, int value, int userHandle) {
180a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
181a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
182a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsSecurePutStringForUser(String name, String value, int userHandle) {
183a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
184a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
185a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsGlobalPutStringForUser(String name, String value, int userHandle) {
186a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
187a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
188a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsSecurePutInt(String name, int value) {
189a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
190a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
191a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsGlobalPutInt(String name, int value) {
192a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
193a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
194a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsSecurePutString(String name, String value) {
195a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
196a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki
197a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        void settingsGlobalPutString(String name, String value) {
198a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki        }
1993f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki
2003f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki        int settingsGlobalGetInt(String name, int def) {
2013f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki            return 0;
2023f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki        }
2033f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki
2043f3657a61b54d495bf2e692289eb92a48fe5a0b2Makoto Onuki        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);
3242a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        when(userManager.getUserInfo(anyInt())).thenAnswer(
3252a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                new Answer<UserInfo>() {
3262a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    @Override
3272a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    public UserInfo answer(InvocationOnMock invocation) throws Throwable {
3282a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        final int userId = (int) invocation.getArguments()[0];
3292a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        for (UserInfo ui : mUserInfos) {
3302a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            if (ui.id == userId) {
3312a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                return ui;
3322a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            }
3332a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        }
3342a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        return null;
3352a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    }
3362a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                }
3372a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        );
3382a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        when(userManager.getProfiles(anyInt())).thenAnswer(
3392a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                new Answer<List<UserInfo>>() {
3402a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    @Override
3412a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    public List<UserInfo> answer(InvocationOnMock invocation) throws Throwable {
3422a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        final int userId = (int) invocation.getArguments()[0];
3432a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        final ArrayList<UserInfo> ret = new ArrayList<UserInfo>();
3442a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        UserInfo parent = null;
3452a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        for (UserInfo ui : mUserInfos) {
3462a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            if (ui.id == userId) {
3472a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                parent = ui;
3482a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                break;
3492a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            }
3502a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        }
3512a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        if (parent == null) {
3522a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            return ret;
3532a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        }
3542a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        ret.add(parent);
3552a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        for (UserInfo ui : mUserInfos) {
3562a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            if (ui.id == userId) {
3572a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                continue;
3582a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            }
3592a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            if (ui.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
3602a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                    && ui.profileGroupId == parent.profileGroupId) {
3612a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                                ret.add(ui);
3622a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                            }
3632a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        }
3642a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                        return ret;
3652a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                    }
3662a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki                }
3672a3c3da0fc07ef37abc45cfb0166bdf5f7f202b6Makoto Onuki        );
368d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
369d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        // Create a data directory.
370d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        final File dir = new File(dataDir, "user" + userId);
371d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        DpmTestUtils.clearDir(dir);
372d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
373d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        when(environment.getUserSystemDirectory(eq(userId))).thenReturn(dir);
374d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        return dir;
375d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    }
376d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki
377d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    /**
378d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki     * Add multiple users at once.  They'll all have flag 0.
379d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki     */
380d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki    public void addUsers(int... userIds) {
381d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        for (int userId : userIds) {
382d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki            addUser(userId, 0);
383d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki        }
384c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    }
385c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki
386a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    public void setUserRunning(int userId, boolean isRunning) {
387a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki        when(userManager.isUserRunning(MockUtils.checkUserHandle(userId)))
388a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki                .thenReturn(isRunning);
389a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    }
390a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki
391c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    @Override
392c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    public Object getSystemService(String name) {
393c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki        switch (name) {
394c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki            case Context.USER_SERVICE:
395cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                return userManager;
396cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            case Context.POWER_SERVICE:
397cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                return powerManager;
398a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki            case Context.WIFI_SERVICE:
399a31ebbc439364a4993e79fd385cf6373408a42feMakoto Onuki                return wifiManager;
400c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki        }
401cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        throw new UnsupportedOperationException();
402cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
403cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
404cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
40572a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki    public String getSystemServiceName(Class<?> serviceClass) {
40672a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki        return realTestContext.getSystemServiceName(serviceClass);
40772a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki    }
40872a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki
40972a3a0c7d24f629bca38ee2652491307e4e706daMakoto Onuki    @Override
410cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public PackageManager getPackageManager() {
411cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return packageManager;
412cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
413cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
414cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
415cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void enforceCallingOrSelfPermission(String permission, String message) {
416cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        if (binder.getCallingUid() == SYSTEM_UID) {
417cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            return; // Assume system has all permissions.
418cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
419cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        if (!callerPermissions.contains(permission)) {
420cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            throw new SecurityException("Caller doesn't have " + permission + " : " + message);
421cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        }
422cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
423cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
424cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
425cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent) {
426cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent);
427cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
428cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
429cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
430cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent, String receiverPermission) {
431cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent, receiverPermission);
432cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
433cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
434cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
435cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
436cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions);
437cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
438cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
439cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
440cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) {
441cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent, receiverPermission, options);
442cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
443cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
444cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
445cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
446cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcast(intent, receiverPermission, appOp);
447cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
448cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
449cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
450cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
451cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission);
452cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
453cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
454cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
455cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission,
456cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
457cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
458cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
459cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialCode, initialData, initialExtras);
460cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
461cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
462cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
463cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
464cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
465cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
466cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission, options, resultReceiver,
467cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler,
468cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialCode, initialData, initialExtras);
469cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
470cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
471cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
472cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
473cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
474cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
475cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcast(intent, receiverPermission, appOp, resultReceiver,
476cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler,
477cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialCode, initialData, initialExtras);
478cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
479cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
480cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
481cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastAsUser(Intent intent, UserHandle user) {
482b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        if (binder.callingPid != SYSTEM_PID) {
483b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            // Unless called as the system process, can only call if the target user is the
484b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            // calling user.
485b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            // (The actual check is more complex; we may need to change it later.)
486b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki            Assert.assertEquals(UserHandle.getUserId(binder.getCallingUid()), user.getIdentifier());
487b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki        }
488b643fb0e67460344ade2e3db92738999f8168496Makoto Onuki
489cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastAsUser(intent, user);
490cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
491cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
492cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
493cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) {
494cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastAsUser(intent, user, receiverPermission);
495cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
496cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
497cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
498cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
499cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            int appOp) {
500cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, appOp);
501cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
502cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
503cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
504cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
505cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
506cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            int initialCode, String initialData, Bundle initialExtras) {
507cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, resultReceiver,
508cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler, initialCode, initialData, initialExtras);
509cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
510cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
511cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
512cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
513cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
514cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
515cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp,
516cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                resultReceiver,
517cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler, initialCode, initialData, initialExtras);
518cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
519cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
520cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
521cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
522cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
523cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
524cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, options,
525cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                resultReceiver, scheduler, initialCode, initialData, initialExtras);
526cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
527cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
528cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
529cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyBroadcast(Intent intent) {
530cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyBroadcast(intent);
531cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
532cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
533cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
534cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,
535cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
536cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode,
537cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialData, initialExtras);
538cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
539cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
540cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
541cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void removeStickyBroadcast(Intent intent) {
542cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.removeStickyBroadcast(intent);
543cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
544cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
545cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
546cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
547cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyBroadcastAsUser(intent, user);
548cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
549cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
550cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
551cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user,
552cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
553cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String initialData, Bundle initialExtras) {
554cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode,
555cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                initialData, initialExtras);
556cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
557cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
558cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
559cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
560cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.removeStickyBroadcastAsUser(intent, user);
561cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
562cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
563cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
564cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
565cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return spiedContext.registerReceiver(receiver, filter);
566cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
567cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
568cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
569cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
570cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            String broadcastPermission, Handler scheduler) {
571cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return spiedContext.registerReceiver(receiver, filter, broadcastPermission, scheduler);
572cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
573cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
574cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
575cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
576cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki            IntentFilter filter, String broadcastPermission, Handler scheduler) {
577cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
578cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                scheduler);
579cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    }
580cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki
581cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    @Override
582cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki    public void unregisterReceiver(BroadcastReceiver receiver) {
583cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki        spiedContext.unregisterReceiver(receiver);
584c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki    }
585a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki
586a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    @Override
587a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    public ContentResolver getContentResolver() {
588a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki        return contentResolver;
589a52562ca9a4144cf30e6d5c6ffe856cc8e284464Makoto Onuki    }
590c9754cf0dfa66d39ce9ea0d2eeab5f7c442a9686Makoto Onuki}
591