• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.ActivityManagerInternal;
19 import android.app.AlarmManager;
20 import android.app.IActivityManager;
21 import android.app.IActivityTaskManager;
22 import android.app.NotificationManager;
23 import android.app.PendingIntent;
24 import android.app.admin.DevicePolicyManagerInternal;
25 import android.app.admin.DevicePolicyManagerLiteInternal;
26 import android.app.backup.IBackupManager;
27 import android.app.usage.UsageStatsManagerInternal;
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.pm.IPackageManager;
31 import android.content.pm.PackageManagerInternal;
32 import android.database.ContentObserver;
33 import android.hardware.usb.UsbManager;
34 import android.media.IAudioService;
35 import android.net.IIpConnectivityMetrics;
36 import android.net.Uri;
37 import android.os.Bundle;
38 import android.os.Environment;
39 import android.os.Looper;
40 import android.os.PowerManagerInternal;
41 import android.os.UserHandle;
42 import android.os.UserManager;
43 import android.permission.IPermissionManager;
44 import android.security.KeyChain;
45 import android.telephony.TelephonyManager;
46 import android.util.ArrayMap;
47 import android.util.Pair;
48 import android.view.IWindowManager;
49 
50 import androidx.annotation.NonNull;
51 
52 import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
53 import com.android.internal.widget.LockPatternUtils;
54 import com.android.internal.widget.LockSettingsInternal;
55 import com.android.server.LocalServices;
56 import com.android.server.PersistentDataBlockManagerInternal;
57 import com.android.server.net.NetworkPolicyManagerInternal;
58 import com.android.server.pm.UserManagerInternal;
59 import com.android.server.wm.ActivityTaskManagerInternal;
60 
61 import java.io.File;
62 import java.io.IOException;
63 import java.util.Map;
64 
65 /**
66  * Overrides {@link #DevicePolicyManagerService} for dependency injection.
67  */
68 public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerService {
69     public final DpmMockContext context;
70     public final MockInjector mMockInjector;
71 
DevicePolicyManagerServiceTestable(MockSystemServices services, DpmMockContext context)72     public DevicePolicyManagerServiceTestable(MockSystemServices services, DpmMockContext context) {
73         this(new MockInjector(services, context), services.pathProvider);
74     }
75 
DevicePolicyManagerServiceTestable( MockInjector injector, PolicyPathProvider pathProvider)76     private DevicePolicyManagerServiceTestable(
77             MockInjector injector, PolicyPathProvider pathProvider) {
78         super(unregisterLocalServices(injector), pathProvider);
79         mMockInjector = injector;
80         this.context = injector.context;
81     }
82 
83     /**
84      * Unregisters local services to avoid IllegalStateException when DPMS ctor re-registers them.
85      * This is made into a static method to circumvent the requirement to call super() first.
86      * Returns its parameter as is.
87      */
unregisterLocalServices(MockInjector injector)88     private static MockInjector unregisterLocalServices(MockInjector injector) {
89         LocalServices.removeServiceForTest(DevicePolicyManagerLiteInternal.class);
90         LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
91         return injector;
92     }
93 
notifyChangeToContentObserver(Uri uri, int userHandle)94     public void notifyChangeToContentObserver(Uri uri, int userHandle) {
95         ContentObserver co = mMockInjector.mContentObservers.get(new Pair<>(uri, userHandle));
96         if (co != null) {
97             co.onChange(false, uri, userHandle); // notify synchronously
98         }
99 
100         // Notify USER_ALL observer too.
101         co = mMockInjector.mContentObservers.get(new Pair<>(uri, UserHandle.USER_ALL));
102         if (co != null) {
103             co.onChange(false, uri, userHandle); // notify synchronously
104         }
105     }
106 
107     static class MockInjector extends Injector {
108 
109         public final DpmMockContext context;
110         private final MockSystemServices services;
111 
112         // Key is a pair of uri and userId
113         private final Map<Pair<Uri, Integer>, ContentObserver> mContentObservers = new ArrayMap<>();
114 
115         // Used as an override when set to nonzero.
116         private long mCurrentTimeMillis = 0;
117 
118         private final Map<Long, Pair<String, Integer>> mEnabledChanges = new ArrayMap<>();
119 
MockInjector(MockSystemServices services, DpmMockContext context)120         public MockInjector(MockSystemServices services, DpmMockContext context) {
121             super(context);
122             this.services = services;
123             this.context = context;
124         }
125 
126         @Override
getUserManager()127         UserManager getUserManager() {
128             return services.userManager;
129         }
130 
131         @Override
getUserManagerInternal()132         UserManagerInternal getUserManagerInternal() {
133             return services.userManagerInternal;
134         }
135 
136         @Override
getUsageStatsManagerInternal()137         UsageStatsManagerInternal getUsageStatsManagerInternal() {
138             return services.usageStatsManagerInternal;
139         }
140 
141         @Override
getNetworkPolicyManagerInternal()142         NetworkPolicyManagerInternal getNetworkPolicyManagerInternal() {
143             return services.networkPolicyManagerInternal;
144         }
145 
146         @Override
getPackageManagerInternal()147         PackageManagerInternal getPackageManagerInternal() {
148             return services.packageManagerInternal;
149         }
150 
151         @Override
getPowerManagerInternal()152         PowerManagerInternal getPowerManagerInternal() {
153             return services.powerManagerInternal;
154         }
155 
156         @Override
getNotificationManager()157         NotificationManager getNotificationManager() {
158             return services.notificationManager;
159         }
160 
161         @Override
getIIpConnectivityMetrics()162         IIpConnectivityMetrics getIIpConnectivityMetrics() {
163             return services.iipConnectivityMetrics;
164         }
165 
166         @Override
getIWindowManager()167         IWindowManager getIWindowManager() {
168             return services.iwindowManager;
169         }
170 
171         @Override
getIActivityManager()172         IActivityManager getIActivityManager() {
173             return services.iactivityManager;
174         }
175 
176         @Override
getIActivityTaskManager()177         IActivityTaskManager getIActivityTaskManager() {
178             return services.iactivityTaskManager;
179         }
180 
181         @Override
getActivityManagerInternal()182         ActivityManagerInternal getActivityManagerInternal() {
183             return services.activityManagerInternal;
184         }
185 
186         @Override
getActivityTaskManagerInternal()187         ActivityTaskManagerInternal getActivityTaskManagerInternal() {
188             return services.activityTaskManagerInternal;
189         }
190 
191         @Override
getIPackageManager()192         IPackageManager getIPackageManager() {
193             return services.ipackageManager;
194         }
195 
196         @Override
getIPermissionManager()197         IPermissionManager getIPermissionManager() {
198             return services.ipermissionManager;
199         }
200 
201         @Override
getIBackupManager()202         IBackupManager getIBackupManager() {
203             return services.ibackupManager;
204         }
205 
206         @Override
getLockSettingsInternal()207         LockSettingsInternal getLockSettingsInternal() {
208             return services.lockSettingsInternal;
209         }
210 
211         @Override
getIAudioService()212         IAudioService getIAudioService() {
213             return services.iaudioService;
214         }
215 
216         @Override
getPersistentDataBlockManagerInternal()217         PersistentDataBlockManagerInternal getPersistentDataBlockManagerInternal() {
218             return services.persistentDataBlockManagerInternal;
219         }
220 
221         @Override
getMyLooper()222         Looper getMyLooper() {
223             return Looper.getMainLooper();
224         }
225 
226         @Override
getAlarmManager()227         AlarmManager getAlarmManager() {return services.alarmManager;}
228 
229         @Override
newLockPatternUtils()230         LockPatternUtils newLockPatternUtils() {
231             return services.lockPatternUtils;
232         }
233 
234         @Override
getUsbManager()235         UsbManager getUsbManager() {
236             return services.usbManager;
237         }
238 
239         @Override
storageManagerIsFileBasedEncryptionEnabled()240         boolean storageManagerIsFileBasedEncryptionEnabled() {
241             return services.storageManager.isFileBasedEncryptionEnabled();
242         }
243 
244         @Override
binderClearCallingIdentity()245         long binderClearCallingIdentity() {
246             return context.binder.clearCallingIdentity();
247         }
248 
249         @Override
binderRestoreCallingIdentity(long token)250         void binderRestoreCallingIdentity(long token) {
251             context.binder.restoreCallingIdentity(token);
252         }
253 
254         @Override
binderWithCleanCallingIdentity(@onNull ThrowingRunnable action)255         void binderWithCleanCallingIdentity(@NonNull ThrowingRunnable action) {
256             context.binder.withCleanCallingIdentity(action);
257         }
258 
259         @Override
binderGetCallingUid()260         int binderGetCallingUid() {
261             return context.binder.getCallingUid();
262         }
263 
264         @Override
binderGetCallingPid()265         int binderGetCallingPid() {
266             return context.binder.getCallingPid();
267         }
268 
269         @Override
binderGetCallingUserHandle()270         UserHandle binderGetCallingUserHandle() {
271             return context.binder.getCallingUserHandle();
272         }
273 
274         @Override
binderIsCallingUidMyUid()275         boolean binderIsCallingUidMyUid() {
276             return context.binder.isCallerUidMyUid();
277         }
278 
279         @Override
powerManagerGoToSleep(long time, int reason, int flags)280         void powerManagerGoToSleep(long time, int reason, int flags) {
281             services.powerManager.goToSleep(time, reason, flags);
282         }
283 
284         @Override
powerManagerReboot(String reason)285         void powerManagerReboot(String reason) {
286             services.powerManager.reboot(reason);
287         }
288 
289         @Override
recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force, boolean wipeEuicc, boolean wipeExtRequested, boolean wipeResetProtectionData)290         boolean recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force,
291                 boolean wipeEuicc, boolean wipeExtRequested, boolean wipeResetProtectionData)
292                         throws IOException {
293             return services.recoverySystem.rebootWipeUserData(shutdown, reason, force, wipeEuicc,
294                     wipeExtRequested, wipeResetProtectionData);
295         }
296 
297         @Override
systemPropertiesGetBoolean(String key, boolean def)298         boolean systemPropertiesGetBoolean(String key, boolean def) {
299             return services.systemProperties.getBoolean(key, def);
300         }
301 
302         @Override
systemPropertiesGetLong(String key, long def)303         long systemPropertiesGetLong(String key, long def) {
304             return services.systemProperties.getLong(key, def);
305         }
306 
307         @Override
systemPropertiesGet(String key, String def)308         String systemPropertiesGet(String key, String def) {
309             return services.systemProperties.get(key, def);
310         }
311 
312         @Override
systemPropertiesGet(String key)313         String systemPropertiesGet(String key) {
314             return services.systemProperties.get(key);
315         }
316 
317         @Override
systemPropertiesSet(String key, String value)318         void systemPropertiesSet(String key, String value) {
319             services.systemProperties.set(key, value);
320         }
321 
322         @Override
userManagerIsHeadlessSystemUserMode()323         boolean userManagerIsHeadlessSystemUserMode() {
324             return services.userManagerForMock.isHeadlessSystemUserMode();
325         }
326 
327         @Override
pendingIntentGetActivityAsUser(Context context, int requestCode, Intent intent, int flags, Bundle options, UserHandle user)328         PendingIntent pendingIntentGetActivityAsUser(Context context, int requestCode,
329                 Intent intent, int flags, Bundle options, UserHandle user) {
330             return null;
331         }
332 
333         @Override
pendingIntentGetBroadcast(Context context, int requestCode, Intent intent, int flags)334         PendingIntent pendingIntentGetBroadcast(Context context, int requestCode,
335                 Intent intent, int flags) {
336             return null;
337         }
338 
339         @Override
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer, int userHandle)340         void registerContentObserver(Uri uri, boolean notifyForDescendents,
341                 ContentObserver observer, int userHandle) {
342             mContentObservers.put(new Pair<Uri, Integer>(uri, userHandle), observer);
343         }
344 
345         @Override
settingsSecureGetIntForUser(String name, int def, int userHandle)346         int settingsSecureGetIntForUser(String name, int def, int userHandle) {
347             return services.settings.settingsSecureGetIntForUser(name, def, userHandle);
348         }
349 
350         @Override
settingsSecureGetStringForUser(String name, int userHandle)351         String settingsSecureGetStringForUser(String name, int userHandle) {
352             return services.settings.settingsSecureGetStringForUser(name, userHandle);
353         }
354 
355         @Override
settingsSecurePutIntForUser(String name, int value, int userHandle)356         void settingsSecurePutIntForUser(String name, int value, int userHandle) {
357             services.settings.settingsSecurePutIntForUser(name, value, userHandle);
358         }
359 
360         @Override
settingsSecurePutStringForUser(String name, String value, int userHandle)361         void settingsSecurePutStringForUser(String name, String value, int userHandle) {
362             services.settings.settingsSecurePutStringForUser(name, value, userHandle);
363         }
364 
365         @Override
settingsGlobalPutStringForUser(String name, String value, int userHandle)366         void settingsGlobalPutStringForUser(String name, String value, int userHandle) {
367             services.settings.settingsGlobalPutStringForUser(name, value, userHandle);
368         }
369 
370         @Override
settingsSecurePutInt(String name, int value)371         void settingsSecurePutInt(String name, int value) {
372             services.settings.settingsSecurePutInt(name, value);
373         }
374 
375         @Override
settingsGlobalPutInt(String name, int value)376         void settingsGlobalPutInt(String name, int value) {
377             services.settings.settingsGlobalPutInt(name, value);
378         }
379 
380         @Override
settingsSecurePutString(String name, String value)381         void settingsSecurePutString(String name, String value) {
382             services.settings.settingsSecurePutString(name, value);
383         }
384 
385         @Override
settingsGlobalPutString(String name, String value)386         void settingsGlobalPutString(String name, String value) {
387             services.settings.settingsGlobalPutString(name, value);
388         }
389 
390         @Override
settingsSystemPutStringForUser(String name, String value, int userId)391         void settingsSystemPutStringForUser(String name, String value, int userId) {
392             services.settings.settingsSystemPutStringForUser(name, value, userId);
393         }
394 
395         @Override
settingsGlobalGetInt(String name, int def)396         int settingsGlobalGetInt(String name, int def) {
397             return services.settings.settingsGlobalGetInt(name, def);
398         }
399 
400         @Override
settingsGlobalGetString(String name)401         String settingsGlobalGetString(String name) {
402             return services.settings.settingsGlobalGetString(name);
403         }
404 
405         @Override
securityLogSetLoggingEnabledProperty(boolean enabled)406         void securityLogSetLoggingEnabledProperty(boolean enabled) {
407             services.settings.securityLogSetLoggingEnabledProperty(enabled);
408         }
409 
410         @Override
securityLogGetLoggingEnabledProperty()411         boolean securityLogGetLoggingEnabledProperty() {
412             return services.settings.securityLogGetLoggingEnabledProperty();
413         }
414 
415         @Override
securityLogIsLoggingEnabled()416         boolean securityLogIsLoggingEnabled() {
417             return services.settings.securityLogIsLoggingEnabled();
418         }
419 
420         @Override
getTelephonyManager()421         TelephonyManager getTelephonyManager() {
422             return services.telephonyManager;
423         }
424 
425         @Override
isBuildDebuggable()426         boolean isBuildDebuggable() {
427             return services.buildMock.isDebuggable;
428         }
429 
430         @Override
keyChainBind()431         KeyChain.KeyChainConnection keyChainBind() {
432             return services.keyChainConnection;
433         }
434 
435         @Override
keyChainBindAsUser(UserHandle user)436         KeyChain.KeyChainConnection keyChainBindAsUser(UserHandle user) {
437             return services.keyChainConnection;
438         }
439 
440         @Override
postOnSystemServerInitThreadPool(Runnable runnable)441         void postOnSystemServerInitThreadPool(Runnable runnable) {
442             runnable.run();
443         }
444 
445         @Override
newTransferOwnershipMetadataManager()446         public TransferOwnershipMetadataManager newTransferOwnershipMetadataManager() {
447             return new TransferOwnershipMetadataManager(
448                     new TransferOwnershipMetadataManagerMockInjector());
449         }
450 
451         @Override
runCryptoSelfTest()452         public void runCryptoSelfTest() {}
453 
454         @Override
getPersonalAppsForSuspension(int userId)455         public String[] getPersonalAppsForSuspension(int userId) {
456             return new String[]{};
457         }
458 
setSystemCurrentTimeMillis(long value)459         public void setSystemCurrentTimeMillis(long value) {
460             mCurrentTimeMillis = value;
461         }
462 
463         @Override
systemCurrentTimeMillis()464         public long systemCurrentTimeMillis() {
465             return mCurrentTimeMillis != 0 ? mCurrentTimeMillis : System.currentTimeMillis();
466         }
467 
setChangeEnabledForPackage( long changeId, boolean enabled, String packageName, int userId)468         public void setChangeEnabledForPackage(
469                 long changeId, boolean enabled, String packageName, int userId) {
470             if (enabled) {
471                 mEnabledChanges.put(changeId, Pair.create(packageName, userId));
472             } else {
473                 mEnabledChanges.remove(changeId);
474             }
475         }
476 
clearEnabledChanges()477         public void clearEnabledChanges() {
478             mEnabledChanges.clear();
479         }
480 
481         @Override
isChangeEnabled(long changeId, String packageName, int userId)482         public boolean isChangeEnabled(long changeId, String packageName, int userId) {
483             Pair<String, Integer> packageAndUser = mEnabledChanges.get(changeId);
484             if (packageAndUser == null) {
485                 return false;
486             }
487 
488             if (!packageAndUser.first.equals(packageName)
489                     || !packageAndUser.second.equals(userId)) {
490                 return false;
491             }
492 
493             return true;
494         }
495 
496         @Override
createContextAsUser(UserHandle user)497         public Context createContextAsUser(UserHandle user) {
498             return context;
499         }
500     }
501 
502     static class TransferOwnershipMetadataManagerMockInjector extends
503             TransferOwnershipMetadataManager.Injector {
504         @Override
getOwnerTransferMetadataDir()505         public File getOwnerTransferMetadataDir() {
506             return Environment.getExternalStorageDirectory();
507         }
508     }
509 }
510