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