Home | History | Annotate | Download | only in devicepolicy
      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.PendingIntent;
     21 import android.app.backup.IBackupManager;
     22 import android.content.Context;
     23 import android.content.Intent;
     24 import android.content.pm.IPackageManager;
     25 import android.content.pm.PackageManagerInternal;
     26 import android.database.ContentObserver;
     27 import android.media.IAudioService;
     28 import android.net.IIpConnectivityMetrics;
     29 import android.net.Uri;
     30 import android.os.Bundle;
     31 import android.os.Looper;
     32 import android.os.PowerManagerInternal;
     33 import android.os.UserHandle;
     34 import android.os.UserManager;
     35 import android.os.UserManagerInternal;
     36 import android.security.KeyChain;
     37 import android.telephony.TelephonyManager;
     38 import android.util.ArrayMap;
     39 import android.util.Pair;
     40 import android.view.IWindowManager;
     41 
     42 import com.android.internal.widget.LockPatternUtils;
     43 
     44 import java.io.File;
     45 import java.io.IOException;
     46 import java.util.Map;
     47 
     48 /**
     49  * Overrides {@link #DevicePolicyManagerService} for dependency injection.
     50  */
     51 public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerService {
     52     /**
     53      * Overrides {@link #Owners} for dependency injection.
     54      */
     55     public static class OwnersTestable extends Owners {
     56         public static final String LEGACY_FILE = "legacy.xml";
     57         public static final String DEVICE_OWNER_FILE = "device_owner2.xml";
     58         public static final String PROFILE_OWNER_FILE = "profile_owner.xml";
     59 
     60         private final File mLegacyFile;
     61         private final File mDeviceOwnerFile;
     62         private final File mUsersDataDir;
     63 
     64         public OwnersTestable(MockSystemServices services) {
     65             super(services.userManager, services.userManagerInternal,
     66                     services.packageManagerInternal);
     67             mLegacyFile = new File(services.dataDir, LEGACY_FILE);
     68             mDeviceOwnerFile = new File(services.dataDir, DEVICE_OWNER_FILE);
     69             mUsersDataDir = new File(services.dataDir, "users");
     70         }
     71 
     72         @Override
     73         File getLegacyConfigFileWithTestOverride() {
     74             return mLegacyFile;
     75         }
     76 
     77         @Override
     78         File getDeviceOwnerFileWithTestOverride() {
     79             return mDeviceOwnerFile;
     80         }
     81 
     82         @Override
     83         File getProfileOwnerFileWithTestOverride(int userId) {
     84             final File userDir = new File(mUsersDataDir, String.valueOf(userId));
     85             return new File(userDir, PROFILE_OWNER_FILE);
     86         }
     87     }
     88 
     89     public final DpmMockContext context;
     90     private final MockInjector mMockInjector;
     91 
     92     public DevicePolicyManagerServiceTestable(MockSystemServices services, DpmMockContext context) {
     93         this(new MockInjector(services, context));
     94     }
     95 
     96     private DevicePolicyManagerServiceTestable(MockInjector injector) {
     97         super(injector);
     98         mMockInjector = injector;
     99         this.context = injector.context;
    100     }
    101 
    102 
    103     public void notifyChangeToContentObserver(Uri uri, int userHandle) {
    104         ContentObserver co = mMockInjector.mContentObservers.get(new Pair<>(uri, userHandle));
    105         if (co != null) {
    106             co.onChange(false, uri, userHandle); // notify synchronously
    107         }
    108 
    109         // Notify USER_ALL observer too.
    110         co = mMockInjector.mContentObservers.get(new Pair<>(uri, UserHandle.USER_ALL));
    111         if (co != null) {
    112             co.onChange(false, uri, userHandle); // notify synchronously
    113         }
    114     }
    115 
    116 
    117     private static class MockInjector extends Injector {
    118 
    119         public final DpmMockContext context;
    120         private final MockSystemServices services;
    121 
    122         // Key is a pair of uri and userId
    123         private final Map<Pair<Uri, Integer>, ContentObserver> mContentObservers = new ArrayMap<>();
    124 
    125         private MockInjector(MockSystemServices services, DpmMockContext context) {
    126             super(context);
    127             this.services = services;
    128             this.context = context;
    129         }
    130 
    131         @Override
    132         Owners newOwners() {
    133             return new OwnersTestable(services);
    134         }
    135 
    136         @Override
    137         UserManager getUserManager() {
    138             return services.userManager;
    139         }
    140 
    141         @Override
    142         UserManagerInternal getUserManagerInternal() {
    143             return services.userManagerInternal;
    144         }
    145 
    146         @Override
    147         PackageManagerInternal getPackageManagerInternal() {
    148             return services.packageManagerInternal;
    149         }
    150 
    151         @Override
    152         PowerManagerInternal getPowerManagerInternal() {
    153             return services.powerManagerInternal;
    154         }
    155 
    156         @Override
    157         NotificationManager getNotificationManager() {
    158             return services.notificationManager;
    159         }
    160 
    161         @Override
    162         IIpConnectivityMetrics getIIpConnectivityMetrics() {
    163             return services.iipConnectivityMetrics;
    164         }
    165 
    166         @Override
    167         IWindowManager getIWindowManager() {
    168             return services.iwindowManager;
    169         }
    170 
    171         @Override
    172         IActivityManager getIActivityManager() {
    173             return services.iactivityManager;
    174         }
    175 
    176         @Override
    177         IPackageManager getIPackageManager() {
    178             return services.ipackageManager;
    179         }
    180 
    181         @Override
    182         IBackupManager getIBackupManager() {
    183             return services.ibackupManager;
    184         }
    185 
    186         @Override
    187         IAudioService getIAudioService() {
    188             return services.iaudioService;
    189         }
    190 
    191         @Override
    192         Looper getMyLooper() {
    193             return Looper.getMainLooper();
    194         }
    195 
    196         @Override
    197         LockPatternUtils newLockPatternUtils() {
    198             return services.lockPatternUtils;
    199         }
    200 
    201         @Override
    202         boolean storageManagerIsFileBasedEncryptionEnabled() {
    203             return services.storageManager.isFileBasedEncryptionEnabled();
    204         }
    205 
    206         @Override
    207         boolean storageManagerIsNonDefaultBlockEncrypted() {
    208             return services.storageManager.isNonDefaultBlockEncrypted();
    209         }
    210 
    211         @Override
    212         boolean storageManagerIsEncrypted() {
    213             return services.storageManager.isEncrypted();
    214         }
    215 
    216         @Override
    217         boolean storageManagerIsEncryptable() {
    218             return services.storageManager.isEncryptable();
    219         }
    220 
    221         @Override
    222         String getDevicePolicyFilePathForSystemUser() {
    223             return services.systemUserDataDir.getAbsolutePath() + "/";
    224         }
    225 
    226         @Override
    227         long binderClearCallingIdentity() {
    228             return context.binder.clearCallingIdentity();
    229         }
    230 
    231         @Override
    232         void binderRestoreCallingIdentity(long token) {
    233             context.binder.restoreCallingIdentity(token);
    234         }
    235 
    236         @Override
    237         int binderGetCallingUid() {
    238             return context.binder.getCallingUid();
    239         }
    240 
    241         @Override
    242         int binderGetCallingPid() {
    243             return context.binder.getCallingPid();
    244         }
    245 
    246         @Override
    247         UserHandle binderGetCallingUserHandle() {
    248             return context.binder.getCallingUserHandle();
    249         }
    250 
    251         @Override
    252         boolean binderIsCallingUidMyUid() {
    253             return context.binder.isCallerUidMyUid();
    254         }
    255 
    256         @Override
    257         File environmentGetUserSystemDirectory(int userId) {
    258             return services.environment.getUserSystemDirectory(userId);
    259         }
    260 
    261         @Override
    262         void powerManagerGoToSleep(long time, int reason, int flags) {
    263             services.powerManager.goToSleep(time, reason, flags);
    264         }
    265 
    266         @Override
    267         void powerManagerReboot(String reason) {
    268             services.powerManager.reboot(reason);
    269         }
    270 
    271         @Override
    272         void recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force,
    273                 boolean wipeEuicc) throws IOException {
    274             services.recoverySystem.rebootWipeUserData(shutdown, reason, force, wipeEuicc);
    275         }
    276 
    277         @Override
    278         boolean systemPropertiesGetBoolean(String key, boolean def) {
    279             return services.systemProperties.getBoolean(key, def);
    280         }
    281 
    282         @Override
    283         long systemPropertiesGetLong(String key, long def) {
    284             return services.systemProperties.getLong(key, def);
    285         }
    286 
    287         @Override
    288         String systemPropertiesGet(String key, String def) {
    289             return services.systemProperties.get(key, def);
    290         }
    291 
    292         @Override
    293         String systemPropertiesGet(String key) {
    294             return services.systemProperties.get(key);
    295         }
    296 
    297         @Override
    298         void systemPropertiesSet(String key, String value) {
    299             services.systemProperties.set(key, value);
    300         }
    301 
    302         @Override
    303         boolean userManagerIsSplitSystemUser() {
    304             return services.userManagerForMock.isSplitSystemUser();
    305         }
    306 
    307         @Override
    308         PendingIntent pendingIntentGetActivityAsUser(Context context, int requestCode,
    309                 Intent intent, int flags, Bundle options, UserHandle user) {
    310             return null;
    311         }
    312 
    313         @Override
    314         void registerContentObserver(Uri uri, boolean notifyForDescendents,
    315                 ContentObserver observer, int userHandle) {
    316             mContentObservers.put(new Pair<Uri, Integer>(uri, userHandle), observer);
    317         }
    318 
    319         @Override
    320         int settingsSecureGetIntForUser(String name, int def, int userHandle) {
    321             return services.settings.settingsSecureGetIntForUser(name, def, userHandle);
    322         }
    323 
    324         @Override
    325         String settingsSecureGetStringForUser(String name, int userHandle) {
    326             return services.settings.settingsSecureGetStringForUser(name, userHandle);
    327         }
    328 
    329         @Override
    330         void settingsSecurePutIntForUser(String name, int value, int userHandle) {
    331             services.settings.settingsSecurePutIntForUser(name, value, userHandle);
    332         }
    333 
    334         @Override
    335         void settingsSecurePutStringForUser(String name, String value, int userHandle) {
    336             services.settings.settingsSecurePutStringForUser(name, value, userHandle);
    337         }
    338 
    339         @Override
    340         void settingsGlobalPutStringForUser(String name, String value, int userHandle) {
    341             services.settings.settingsGlobalPutStringForUser(name, value, userHandle);
    342         }
    343 
    344         @Override
    345         void settingsSecurePutInt(String name, int value) {
    346             services.settings.settingsSecurePutInt(name, value);
    347         }
    348 
    349         @Override
    350         void settingsGlobalPutInt(String name, int value) {
    351             services.settings.settingsGlobalPutInt(name, value);
    352         }
    353 
    354         @Override
    355         void settingsSecurePutString(String name, String value) {
    356             services.settings.settingsSecurePutString(name, value);
    357         }
    358 
    359         @Override
    360         void settingsGlobalPutString(String name, String value) {
    361             services.settings.settingsGlobalPutString(name, value);
    362         }
    363 
    364         @Override
    365         int settingsGlobalGetInt(String name, int def) {
    366             return services.settings.settingsGlobalGetInt(name, def);
    367         }
    368 
    369         @Override
    370         String settingsGlobalGetString(String name) {
    371             return services.settings.settingsGlobalGetString(name);
    372         }
    373 
    374         @Override
    375         void securityLogSetLoggingEnabledProperty(boolean enabled) {
    376             services.settings.securityLogSetLoggingEnabledProperty(enabled);
    377         }
    378 
    379         @Override
    380         boolean securityLogGetLoggingEnabledProperty() {
    381             return services.settings.securityLogGetLoggingEnabledProperty();
    382         }
    383 
    384         @Override
    385         boolean securityLogIsLoggingEnabled() {
    386             return services.settings.securityLogIsLoggingEnabled();
    387         }
    388 
    389         @Override
    390         TelephonyManager getTelephonyManager() {
    391             return services.telephonyManager;
    392         }
    393 
    394         @Override
    395         boolean isBuildDebuggable() {
    396             return services.buildMock.isDebuggable;
    397         }
    398 
    399         @Override
    400         KeyChain.KeyChainConnection keyChainBindAsUser(UserHandle user) {
    401             return services.keyChainConnection;
    402         }
    403     }
    404 }
    405