1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.server.devicepolicy;
17 
18 import android.app.IActivityManager;
19 import android.app.NotificationManager;
20 import android.app.backup.IBackupManager;
21 import android.content.pm.IPackageManager;
22 import android.content.pm.PackageManagerInternal;
23 import android.database.ContentObserver;
24 import android.media.IAudioService;
25 import android.net.Uri;
26 import android.os.Looper;
27 import android.os.PowerManagerInternal;
28 import android.os.UserHandle;
29 import android.os.UserManager;
30 import android.os.UserManagerInternal;
31 import android.telephony.TelephonyManager;
32 import android.util.ArrayMap;
33 import android.util.Pair;
34 import android.view.IWindowManager;
35 
36 import com.android.internal.widget.LockPatternUtils;
37 
38 import java.io.File;
39 import java.util.Map;
40 
41 /**
42  * Overrides {@link #DevicePolicyManagerService} for dependency injection.
43  */
44 public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerService {
45     /**
46      * Overrides {@link #Owners} for dependency injection.
47      */
48     public static class OwnersTestable extends Owners {
49         public static final String LEGACY_FILE = "legacy.xml";
50         public static final String DEVICE_OWNER_FILE = "device_owner2.xml";
51         public static final String PROFILE_OWNER_FILE_BASE = "profile_owner.xml";
52 
53         private final File mLegacyFile;
54         private final File mDeviceOwnerFile;
55         private final File mProfileOwnerBase;
56 
OwnersTestable(DpmMockContext context)57         public OwnersTestable(DpmMockContext context) {
58             super(context.userManager, context.userManagerInternal, context.packageManagerInternal);
59             mLegacyFile = new File(context.dataDir, LEGACY_FILE);
60             mDeviceOwnerFile = new File(context.dataDir, DEVICE_OWNER_FILE);
61             mProfileOwnerBase = new File(context.dataDir, PROFILE_OWNER_FILE_BASE);
62         }
63 
64         @Override
getLegacyConfigFileWithTestOverride()65         File getLegacyConfigFileWithTestOverride() {
66             return mLegacyFile;
67         }
68 
69         @Override
getDeviceOwnerFileWithTestOverride()70         File getDeviceOwnerFileWithTestOverride() {
71             return mDeviceOwnerFile;
72         }
73 
74         @Override
getProfileOwnerFileWithTestOverride(int userId)75         File getProfileOwnerFileWithTestOverride(int userId) {
76             return new File(mDeviceOwnerFile.getAbsoluteFile() + "-" + userId);
77         }
78     }
79 
80     public final DpmMockContext context;
81     private final MockInjector mMockInjector;
82 
DevicePolicyManagerServiceTestable(DpmMockContext context, File dataDir)83     public DevicePolicyManagerServiceTestable(DpmMockContext context, File dataDir) {
84         this(new MockInjector(context, dataDir));
85     }
86 
DevicePolicyManagerServiceTestable(MockInjector injector)87     private DevicePolicyManagerServiceTestable(MockInjector injector) {
88         super(injector);
89         mMockInjector = injector;
90         this.context = injector.context;
91     }
92 
93 
notifyChangeToContentObserver(Uri uri, int userHandle)94     public void notifyChangeToContentObserver(Uri uri, int userHandle) {
95         ContentObserver co = mMockInjector.mContentObservers
96                 .get(new Pair<Uri, Integer>(uri, userHandle));
97         if (co != null) {
98             co.onChange(false, uri, userHandle); // notify synchronously
99         }
100 
101         // Notify USER_ALL observer too.
102         co = mMockInjector.mContentObservers
103                 .get(new Pair<Uri, Integer>(uri, UserHandle.USER_ALL));
104         if (co != null) {
105             co.onChange(false, uri, userHandle); // notify synchronously
106         }
107     }
108 
109 
110     private static class MockInjector extends Injector {
111 
112         public final DpmMockContext context;
113 
114         public final File dataDir;
115 
116         // Key is a pair of uri and userId
117         private final Map<Pair<Uri, Integer>, ContentObserver> mContentObservers = new ArrayMap<>();
118 
MockInjector(DpmMockContext context, File dataDir)119         private MockInjector(DpmMockContext context, File dataDir) {
120             super(context);
121             this.context = context;
122             this.dataDir = dataDir;
123         }
124 
125         @Override
newOwners()126         Owners newOwners() {
127             return new OwnersTestable(context);
128         }
129 
130         @Override
getUserManager()131         UserManager getUserManager() {
132             return context.userManager;
133         }
134 
135         @Override
getUserManagerInternal()136         UserManagerInternal getUserManagerInternal() {
137             return context.userManagerInternal;
138         }
139 
140         @Override
getPackageManagerInternal()141         PackageManagerInternal getPackageManagerInternal() {
142             return context.packageManagerInternal;
143         }
144 
145         @Override
getPowerManagerInternal()146         PowerManagerInternal getPowerManagerInternal() {
147             return context.powerManagerInternal;
148         }
149 
150         @Override
getNotificationManager()151         NotificationManager getNotificationManager() {
152             return context.notificationManager;
153         }
154 
155         @Override
getIWindowManager()156         IWindowManager getIWindowManager() {
157             return context.iwindowManager;
158         }
159 
160         @Override
getIActivityManager()161         IActivityManager getIActivityManager() {
162             return context.iactivityManager;
163         }
164 
165         @Override
getIPackageManager()166         IPackageManager getIPackageManager() {
167             return context.ipackageManager;
168         }
169 
170         @Override
getIBackupManager()171         IBackupManager getIBackupManager() {
172             return context.ibackupManager;
173         }
174 
175         @Override
getIAudioService()176         IAudioService getIAudioService() {
177             return context.iaudioService;
178         }
179 
180         @Override
getMyLooper()181         Looper getMyLooper() {
182             return Looper.getMainLooper();
183         }
184 
185         @Override
newLockPatternUtils()186         LockPatternUtils newLockPatternUtils() {
187             return context.lockPatternUtils;
188         }
189 
190         @Override
storageManagerIsFileBasedEncryptionEnabled()191         boolean storageManagerIsFileBasedEncryptionEnabled() {
192             return context.storageManager.isFileBasedEncryptionEnabled();
193         }
194 
195         @Override
storageManagerIsNonDefaultBlockEncrypted()196         boolean storageManagerIsNonDefaultBlockEncrypted() {
197             return context.storageManager.isNonDefaultBlockEncrypted();
198         }
199 
200         @Override
storageManagerIsEncrypted()201         boolean storageManagerIsEncrypted() {
202             return context.storageManager.isEncrypted();
203         }
204 
205         @Override
storageManagerIsEncryptable()206         boolean storageManagerIsEncryptable() {
207             return context.storageManager.isEncryptable();
208         }
209 
210         @Override
getDevicePolicyFilePathForSystemUser()211         String getDevicePolicyFilePathForSystemUser() {
212             return context.systemUserDataDir.getAbsolutePath() + "/";
213         }
214 
215         @Override
binderClearCallingIdentity()216         long binderClearCallingIdentity() {
217             return context.binder.clearCallingIdentity();
218         }
219 
220         @Override
binderRestoreCallingIdentity(long token)221         void binderRestoreCallingIdentity(long token) {
222             context.binder.restoreCallingIdentity(token);
223         }
224 
225         @Override
binderGetCallingUid()226         int binderGetCallingUid() {
227             return context.binder.getCallingUid();
228         }
229 
230         @Override
binderGetCallingPid()231         int binderGetCallingPid() {
232             return context.binder.getCallingPid();
233         }
234 
235         @Override
binderGetCallingUserHandle()236         UserHandle binderGetCallingUserHandle() {
237             return context.binder.getCallingUserHandle();
238         }
239 
240         @Override
binderIsCallingUidMyUid()241         boolean binderIsCallingUidMyUid() {
242             return context.binder.isCallerUidMyUid();
243         }
244 
245         @Override
environmentGetUserSystemDirectory(int userId)246         File environmentGetUserSystemDirectory(int userId) {
247             return context.environment.getUserSystemDirectory(userId);
248         }
249 
250         @Override
powerManagerGoToSleep(long time, int reason, int flags)251         void powerManagerGoToSleep(long time, int reason, int flags) {
252             context.powerManager.goToSleep(time, reason, flags);
253         }
254 
255         @Override
powerManagerReboot(String reason)256         void powerManagerReboot(String reason) {
257             context.powerManager.reboot(reason);
258         }
259 
260         @Override
systemPropertiesGetBoolean(String key, boolean def)261         boolean systemPropertiesGetBoolean(String key, boolean def) {
262             return context.systemProperties.getBoolean(key, def);
263         }
264 
265         @Override
systemPropertiesGetLong(String key, long def)266         long systemPropertiesGetLong(String key, long def) {
267             return context.systemProperties.getLong(key, def);
268         }
269 
270         @Override
systemPropertiesGet(String key, String def)271         String systemPropertiesGet(String key, String def) {
272             return context.systemProperties.get(key, def);
273         }
274 
275         @Override
systemPropertiesGet(String key)276         String systemPropertiesGet(String key) {
277             return context.systemProperties.get(key);
278         }
279 
280         @Override
systemPropertiesSet(String key, String value)281         void systemPropertiesSet(String key, String value) {
282             context.systemProperties.set(key, value);
283         }
284 
285         @Override
userManagerIsSplitSystemUser()286         boolean userManagerIsSplitSystemUser() {
287             return context.userManagerForMock.isSplitSystemUser();
288         }
289 
290         @Override
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer, int userHandle)291         void registerContentObserver(Uri uri, boolean notifyForDescendents,
292                 ContentObserver observer, int userHandle) {
293             mContentObservers.put(new Pair<Uri, Integer>(uri, userHandle), observer);
294         }
295 
296         @Override
settingsSecureGetIntForUser(String name, int def, int userHandle)297         int settingsSecureGetIntForUser(String name, int def, int userHandle) {
298             return context.settings.settingsSecureGetIntForUser(name, def, userHandle);
299         }
300 
301         @Override
settingsSecurePutIntForUser(String name, int value, int userHandle)302         void settingsSecurePutIntForUser(String name, int value, int userHandle) {
303             context.settings.settingsSecurePutIntForUser(name, value, userHandle);
304         }
305 
306         @Override
settingsSecurePutStringForUser(String name, String value, int userHandle)307         void settingsSecurePutStringForUser(String name, String value, int userHandle) {
308             context.settings.settingsSecurePutStringForUser(name, value, userHandle);
309         }
310 
311         @Override
settingsGlobalPutStringForUser(String name, String value, int userHandle)312         void settingsGlobalPutStringForUser(String name, String value, int userHandle) {
313             context.settings.settingsGlobalPutStringForUser(name, value, userHandle);
314         }
315 
316         @Override
settingsSecurePutInt(String name, int value)317         void settingsSecurePutInt(String name, int value) {
318             context.settings.settingsSecurePutInt(name, value);
319         }
320 
321         @Override
settingsGlobalPutInt(String name, int value)322         void settingsGlobalPutInt(String name, int value) {
323             context.settings.settingsGlobalPutInt(name, value);
324         }
325 
326         @Override
settingsSecurePutString(String name, String value)327         void settingsSecurePutString(String name, String value) {
328             context.settings.settingsSecurePutString(name, value);
329         }
330 
331         @Override
settingsGlobalPutString(String name, String value)332         void settingsGlobalPutString(String name, String value) {
333             context.settings.settingsGlobalPutString(name, value);
334         }
335 
336         @Override
settingsGlobalGetInt(String name, int def)337         int settingsGlobalGetInt(String name, int def) {
338             return context.settings.settingsGlobalGetInt(name, def);
339         }
340 
341         @Override
securityLogSetLoggingEnabledProperty(boolean enabled)342         void securityLogSetLoggingEnabledProperty(boolean enabled) {
343             context.settings.securityLogSetLoggingEnabledProperty(enabled);
344         }
345 
346         @Override
securityLogGetLoggingEnabledProperty()347         boolean securityLogGetLoggingEnabledProperty() {
348             return context.settings.securityLogGetLoggingEnabledProperty();
349         }
350 
351         @Override
securityLogIsLoggingEnabled()352         boolean securityLogIsLoggingEnabled() {
353             return context.settings.securityLogIsLoggingEnabled();
354         }
355 
356         @Override
getTelephonyManager()357         TelephonyManager getTelephonyManager() {
358             return context.telephonyManager;
359         }
360     }
361 }
362