Loading services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +67 −40 Original line number Diff line number Diff line Loading @@ -271,7 +271,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final Context mContext; final PackageManager mPackageManager; final UserManager mUserManager; final PowerManager.WakeLock mWakeLock; final LocalService mLocalService; Loading Loading @@ -995,7 +994,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean removed = false; if (DBG) Slog.d(LOG_TAG, "Handling package changes for user " + userHandle); DevicePolicyData policy = getUserData(userHandle); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); synchronized (this) { for (int i = policy.mAdminList.size() - 1; i >= 0; i--) { ActiveAdmin aa = policy.mAdminList.get(i); Loading Loading @@ -1071,7 +1070,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { /** Unit test will override it to inject a mock. */ @VisibleForTesting IWindowManager newIWindowManager() { IWindowManager getIWindowManager() { return IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); } Loading @@ -1081,6 +1080,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return ActivityManagerNative.getDefault(); } /** Unit test will override it to inject a mock. */ @VisibleForTesting IPackageManager getIPackageManager() { return AppGlobals.getPackageManager(); } /** Unit test will override it to inject a mock. */ @VisibleForTesting LockPatternUtils newLockPatternUtils(Context context) { Loading Loading @@ -1129,13 +1134,33 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @VisibleForTesting WakeLock powerManagerNewWakeLock(int levelAndFlags, String tag) { return mContext.getSystemService(PowerManager.class).newWakeLock(levelAndFlags, tag); void powerManagerGoToSleep(long time, int reason, int flags) { mContext.getSystemService(PowerManager.class).goToSleep(time, reason, flags); } @VisibleForTesting void powerManagerGoToSleep(long time, int reason, int flags) { mContext.getSystemService(PowerManager.class).goToSleep(time, reason, flags); boolean systemPropertiesGetBoolean(String key, boolean def) { return SystemProperties.getBoolean(key, def); } @VisibleForTesting long systemPropertiesGetLong(String key, long def) { return SystemProperties.getLong(key, def); } @VisibleForTesting String systemPropertiesGet(String key, String def) { return SystemProperties.get(key, def); } @VisibleForTesting String systemPropertiesGet(String key) { return SystemProperties.get(key); } @VisibleForTesting void systemPropertiesSet(String key, String value) { SystemProperties.set(key, value); } /** Loading @@ -1145,14 +1170,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mContext = context; mHandler = new Handler(getMyLooper()); mOwners = newOwners(); mUserManager = getUserManager(); mPackageManager = getPackageManager(); mHasFeature = mPackageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); mPowerManagerInternal = getPowerManagerInternal(); mWakeLock = powerManagerNewWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DPM"); mIWindowManager = newIWindowManager(); mNotificationManager = getNotificationManager(); mUserManager = Preconditions.checkNotNull(getUserManager()); mPackageManager = Preconditions.checkNotNull(getPackageManager()); mPowerManagerInternal = Preconditions.checkNotNull(getPowerManagerInternal()); mIWindowManager = Preconditions.checkNotNull(getIWindowManager()); mNotificationManager = Preconditions.checkNotNull(getNotificationManager()); mLocalService = new LocalService(); mHasFeature = mPackageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); if (!mHasFeature) { // Skip the rest of the initialization return; Loading Loading @@ -1862,7 +1889,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Ensure the status of the camera is synced down to the system. Interested native services // should monitor this value and act accordingly. String cameraPropertyForUser = SYSTEM_PROP_DISABLE_CAMERA_PREFIX + policy.mUserHandle; boolean systemState = SystemProperties.getBoolean(cameraPropertyForUser, false); boolean systemState = systemPropertiesGetBoolean(cameraPropertyForUser, false); boolean cameraDisabled = getCameraDisabled(null, policy.mUserHandle); if (cameraDisabled != systemState) { long token = binderClearCallingIdentity(); Loading @@ -1870,7 +1897,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { String value = cameraDisabled ? "1" : "0"; if (DBG) Slog.v(LOG_TAG, "Change in camera state [" + cameraPropertyForUser + "] = " + value); SystemProperties.set(cameraPropertyForUser, value); systemPropertiesSet(cameraPropertyForUser, value); } finally { binderRestoreCallingIdentity(token); } Loading Loading @@ -3231,7 +3258,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } private boolean isExtStorageEncrypted() { String state = SystemProperties.get("vold.decrypt"); String state = systemPropertiesGet("vold.decrypt"); return !"".equals(state); } Loading Loading @@ -3969,7 +3996,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE}. */ private int getEncryptionStatus() { String status = SystemProperties.get("ro.crypto.state", "unsupported"); String status = systemPropertiesGet("ro.crypto.state", "unsupported"); if ("encrypted".equalsIgnoreCase(status)) { final long token = binderClearCallingIdentity(); try { Loading Loading @@ -4377,7 +4404,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } boolean isInitializerSystemApp; try { isInitializerSystemApp = isSystemApp(AppGlobals.getPackageManager(), isInitializerSystemApp = isSystemApp(getIPackageManager(), initializer.getPackageName(), binderGetCallingUserHandle().getIdentifier()); } catch (RemoteException | IllegalArgumentException e) { isInitializerSystemApp = false; Loading Loading @@ -4528,7 +4555,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final long ident = binderClearCallingIdentity(); try { clearUserRestrictions(userHandle); AppGlobals.getPackageManager().updatePermissionFlagsForAllApps( getIPackageManager().updatePermissionFlagsForAllApps( PackageManager.FLAG_PERMISSION_POLICY_FIXED, 0 /* flagValues */, userHandle.getIdentifier()); } catch (RemoteException re) { Loading Loading @@ -4596,7 +4623,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { if (!isDeviceOwner(activeAdmin.info.getPackageName())) { IPackageManager ipm = AppGlobals.getPackageManager(); IPackageManager ipm = getIPackageManager(); ipm.setComponentEnabledSetting(who, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP, userId); Loading Loading @@ -4857,7 +4884,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private void enableIfNecessary(String packageName, int userId) { try { IPackageManager ipm = AppGlobals.getPackageManager(); IPackageManager ipm = getIPackageManager(); ApplicationInfo ai = ipm.getApplicationInfo(packageName, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, userId); Loading Loading @@ -4919,7 +4946,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { pm.addPersistentPreferredActivity(filter, activity, userHandle); Loading @@ -4938,7 +4965,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { pm.clearPackagePersistentPreferredActivities(packageName, userHandle); Loading Loading @@ -5074,7 +5101,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { UserInfo parent = mUserManager.getProfileParent(callingUserId); Loading Loading @@ -5105,7 +5132,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int callingUserId = UserHandle.getCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { UserInfo parent = mUserManager.getProfileParent(callingUserId); Loading Loading @@ -5144,7 +5171,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { userIdToCheck = user.profileGroupId; } IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); for (String enabledPackage : enabledPackages) { boolean systemService = false; try { Loading Loading @@ -5276,7 +5303,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { List<AccessibilityServiceInfo> installedServices = accessibilityManager.getInstalledAccessibilityServiceList(); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); if (installedServices != null) { for (AccessibilityServiceInfo service : installedServices) { ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo; Loading Loading @@ -5425,7 +5452,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { List<InputMethodInfo> imes = inputMethodManager.getInputMethodList(); long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); if (imes != null) { for (InputMethodInfo ime : imes) { ServiceInfo serviceInfo = ime.getServiceInfo(); Loading Loading @@ -5472,7 +5499,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { String profileOwnerPkg = profileOwnerComponent.getPackageName(); final IPackageManager ipm = AppGlobals.getPackageManager(); final IPackageManager ipm = getIPackageManager(); IActivityManager activityManager = getIActivityManager(); final int userHandle = user.getIdentifier(); Loading Loading @@ -5624,8 +5651,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Send out notifications however as some clients may want to reread the // value which actually changed due to a restriction having been applied. final String property = Settings.Secure.SYS_PROP_SETTING_VERSION; long version = SystemProperties.getLong(property, 0) + 1; SystemProperties.set(property, Long.toString(version)); long version = systemPropertiesGetLong(property, 0) + 1; systemPropertiesSet(property, Long.toString(version)); final String name = Settings.Secure.LOCATION_PROVIDERS_ALLOWED; Uri url = Uri.withAppendedPath(Settings.Secure.CONTENT_URI, name); Loading Loading @@ -5660,7 +5687,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); return pm.setApplicationHiddenSettingAsUser(packageName, hidden, callingUserId); } catch (RemoteException re) { // shouldn't happen Loading @@ -5681,7 +5708,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); return pm.getApplicationHiddenSettingAsUser(packageName, callingUserId); } catch (RemoteException re) { // shouldn't happen Loading Loading @@ -5718,7 +5745,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { primaryUser = um.getUserInfo(userId); } IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); if (!isSystemApp(pm, packageName, primaryUser.id)) { throw new IllegalArgumentException("Only system apps can be enabled this way."); } Loading Loading @@ -5755,7 +5782,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { primaryUser = um.getUserInfo(userId); } IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); List<ResolveInfo> activitiesToEnable = pm.queryIntentActivities(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), 0, // no flags Loading Loading @@ -5851,7 +5878,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); pm.setBlockUninstallForUser(packageName, uninstallBlocked, userId); } catch (RemoteException re) { // Shouldn't happen. Loading @@ -5876,7 +5903,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); return pm.getBlockUninstallForUser(packageName, userId); } catch (RemoteException re) { // Shouldn't happen. Loading Loading @@ -6560,7 +6587,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); long ident = binderClearCallingIdentity(); try { final ApplicationInfo ai = AppGlobals.getPackageManager() final ApplicationInfo ai = getIPackageManager() .getApplicationInfo(packageName, 0, user.getIdentifier()); final int targetSdkVersion = ai == null ? 0 : ai.targetSdkVersion; if (targetSdkVersion < android.os.Build.VERSION_CODES.M) { Loading Loading @@ -6607,7 +6634,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); long ident = binderClearCallingIdentity(); try { int granted = AppGlobals.getPackageManager().checkPermission(permission, int granted = getIPackageManager().checkPermission(permission, packageName, user.getIdentifier()); int permFlags = packageManager.getPermissionFlags(permission, packageName, user); if ((permFlags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) Loading services/tests/servicestests/AndroidManifest.xml +20 −2 Original line number Diff line number Diff line Loading @@ -67,7 +67,25 @@ </intent-filter> </receiver> <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmin" <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmins$Admin1" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmins$Admin2" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmins$Admin3" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> Loading services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java +42 −16 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.internal.widget.LockPatternUtils; import android.app.IActivityManager; import android.app.NotificationManager; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.os.Looper; import android.os.PowerManager.WakeLock; Loading @@ -45,9 +46,9 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi public static final String DEVICE_OWNER_FILE = "device_owner2.xml"; public static final String PROFILE_OWNER_FILE_BASE = "profile_owner.xml"; final private File mLegacyFile; final private File mDeviceOwnerFile; final private File mProfileOwnerBase; private final File mLegacyFile; private final File mDeviceOwnerFile; private final File mProfileOwnerBase; public OwnersTestable(Context context, File dataDir) { super(context); Loading Loading @@ -96,47 +97,52 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi } @Override protected Owners newOwners() { Owners newOwners() { return new OwnersTestable(getContext(), dataDir); } @Override protected UserManager getUserManager() { UserManager getUserManager() { return getContext().userManager; } @Override protected PackageManager getPackageManager() { PackageManager getPackageManager() { return getContext().packageManager; } @Override protected PowerManagerInternal getPowerManagerInternal() { PowerManagerInternal getPowerManagerInternal() { return getContext().powerManagerInternal; } @Override protected NotificationManager getNotificationManager() { NotificationManager getNotificationManager() { return getContext().notificationManager; } @Override protected IWindowManager newIWindowManager() { IWindowManager getIWindowManager() { return getContext().iwindowManager; } @Override protected IActivityManager getIActivityManager() { IActivityManager getIActivityManager() { return getContext().iactivityManager; } @Override protected LockPatternUtils newLockPatternUtils(Context context) { IPackageManager getIPackageManager() { return getContext().ipackageManager; } @Override LockPatternUtils newLockPatternUtils(Context context) { return getContext().lockPatternUtils; } @Override protected Looper getMyLooper() { Looper getMyLooper() { return Looper.getMainLooper(); } Loading Loading @@ -181,12 +187,32 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi } @Override WakeLock powerManagerNewWakeLock(int levelAndFlags, String tag) { return getContext().powerManager.newWakeLock(levelAndFlags, tag); void powerManagerGoToSleep(long time, int reason, int flags) { getContext().powerManager.goToSleep(time, reason, flags); } @Override boolean systemPropertiesGetBoolean(String key, boolean def) { return getContext().systemProperties.getBoolean(key, def); } @Override void powerManagerGoToSleep(long time, int reason, int flags) { getContext().powerManager.goToSleep(time, reason, flags); long systemPropertiesGetLong(String key, long def) { return getContext().systemProperties.getLong(key, def); } @Override String systemPropertiesGet(String key, String def) { return getContext().systemProperties.get(key, def); } @Override String systemPropertiesGet(String key) { return getContext().systemProperties.get(key); } @Override void systemPropertiesSet(String key, String value) { getContext().systemProperties.set(key, value); } } services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +288 −43 File changed.Preview size limit exceeded, changes collapsed. Show changes services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +38 −10 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.devicepolicy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.LockPatternUtils; import android.app.IActivityManager; Loading @@ -24,11 +25,13 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.PowerManager.WakeLock; import android.os.PowerManagerInternal; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.test.mock.MockContext; Loading Loading @@ -71,27 +74,27 @@ public class DpmMockContext extends MockContext { public static final int SYSTEM_PID = 11111; public static class MockBinder { int mCallingUid = CALLER_UID; int mCallingPid = CALLER_PID; public int callingUid = CALLER_UID; public int callingPid = CALLER_PID; public long clearCallingIdentity() { final long token = (((long) mCallingUid) << 32) | (mCallingPid); mCallingUid = SYSTEM_UID; mCallingPid = SYSTEM_PID; final long token = (((long) callingUid) << 32) | (callingPid); callingUid = SYSTEM_UID; callingPid = SYSTEM_PID; return token; } public void restoreCallingIdentity(long token) { mCallingUid = (int) (token >> 32); mCallingPid = (int) token; callingUid = (int) (token >> 32); callingPid = (int) token; } public int getCallingUid() { return mCallingUid; return callingUid; } public int getCallingPid() { return mCallingPid; return callingPid; } public UserHandle getCallingUserHandle() { Loading @@ -99,7 +102,7 @@ public class DpmMockContext extends MockContext { } public boolean isCallerUidMyUid() { return mCallingUid == SYSTEM_UID; return callingUid == SYSTEM_UID; } } Loading @@ -118,6 +121,27 @@ public class DpmMockContext extends MockContext { } } public static class SystemPropertiesForMock { public boolean getBoolean(String key, boolean def) { return false; } public long getLong(String key, long def) { return 0; } public String get(String key, String def) { return null; } public String get(String key) { return null; } public void set(String key, String value) { } } public final Context realTestContext; /** Loading @@ -129,12 +153,14 @@ public class DpmMockContext extends MockContext { public final MockBinder binder; public final EnvironmentForMock environment; public final SystemPropertiesForMock systemProperties; public final UserManager userManager; public final PowerManagerForMock powerManager; public final PowerManagerInternal powerManagerInternal; public final NotificationManager notificationManager; public final IWindowManager iwindowManager; public final IActivityManager iactivityManager; public final IPackageManager ipackageManager; public final LockPatternUtils lockPatternUtils; /** Note this is a partial mock, not a real mock. */ Loading @@ -146,12 +172,14 @@ public class DpmMockContext extends MockContext { realTestContext = context; binder = new MockBinder(); environment = mock(EnvironmentForMock.class); systemProperties= mock(SystemPropertiesForMock.class); userManager = mock(UserManager.class); powerManager = mock(PowerManagerForMock.class); powerManagerInternal = mock(PowerManagerInternal.class); notificationManager = mock(NotificationManager.class); iwindowManager = mock(IWindowManager.class); iactivityManager = mock(IActivityManager.class); ipackageManager = mock(IPackageManager.class); lockPatternUtils = mock(LockPatternUtils.class); // Package manager is huge, so we use a partial mock instead. Loading Loading
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +67 −40 Original line number Diff line number Diff line Loading @@ -271,7 +271,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final Context mContext; final PackageManager mPackageManager; final UserManager mUserManager; final PowerManager.WakeLock mWakeLock; final LocalService mLocalService; Loading Loading @@ -995,7 +994,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean removed = false; if (DBG) Slog.d(LOG_TAG, "Handling package changes for user " + userHandle); DevicePolicyData policy = getUserData(userHandle); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); synchronized (this) { for (int i = policy.mAdminList.size() - 1; i >= 0; i--) { ActiveAdmin aa = policy.mAdminList.get(i); Loading Loading @@ -1071,7 +1070,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { /** Unit test will override it to inject a mock. */ @VisibleForTesting IWindowManager newIWindowManager() { IWindowManager getIWindowManager() { return IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); } Loading @@ -1081,6 +1080,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return ActivityManagerNative.getDefault(); } /** Unit test will override it to inject a mock. */ @VisibleForTesting IPackageManager getIPackageManager() { return AppGlobals.getPackageManager(); } /** Unit test will override it to inject a mock. */ @VisibleForTesting LockPatternUtils newLockPatternUtils(Context context) { Loading Loading @@ -1129,13 +1134,33 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @VisibleForTesting WakeLock powerManagerNewWakeLock(int levelAndFlags, String tag) { return mContext.getSystemService(PowerManager.class).newWakeLock(levelAndFlags, tag); void powerManagerGoToSleep(long time, int reason, int flags) { mContext.getSystemService(PowerManager.class).goToSleep(time, reason, flags); } @VisibleForTesting void powerManagerGoToSleep(long time, int reason, int flags) { mContext.getSystemService(PowerManager.class).goToSleep(time, reason, flags); boolean systemPropertiesGetBoolean(String key, boolean def) { return SystemProperties.getBoolean(key, def); } @VisibleForTesting long systemPropertiesGetLong(String key, long def) { return SystemProperties.getLong(key, def); } @VisibleForTesting String systemPropertiesGet(String key, String def) { return SystemProperties.get(key, def); } @VisibleForTesting String systemPropertiesGet(String key) { return SystemProperties.get(key); } @VisibleForTesting void systemPropertiesSet(String key, String value) { SystemProperties.set(key, value); } /** Loading @@ -1145,14 +1170,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mContext = context; mHandler = new Handler(getMyLooper()); mOwners = newOwners(); mUserManager = getUserManager(); mPackageManager = getPackageManager(); mHasFeature = mPackageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); mPowerManagerInternal = getPowerManagerInternal(); mWakeLock = powerManagerNewWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DPM"); mIWindowManager = newIWindowManager(); mNotificationManager = getNotificationManager(); mUserManager = Preconditions.checkNotNull(getUserManager()); mPackageManager = Preconditions.checkNotNull(getPackageManager()); mPowerManagerInternal = Preconditions.checkNotNull(getPowerManagerInternal()); mIWindowManager = Preconditions.checkNotNull(getIWindowManager()); mNotificationManager = Preconditions.checkNotNull(getNotificationManager()); mLocalService = new LocalService(); mHasFeature = mPackageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); if (!mHasFeature) { // Skip the rest of the initialization return; Loading Loading @@ -1862,7 +1889,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Ensure the status of the camera is synced down to the system. Interested native services // should monitor this value and act accordingly. String cameraPropertyForUser = SYSTEM_PROP_DISABLE_CAMERA_PREFIX + policy.mUserHandle; boolean systemState = SystemProperties.getBoolean(cameraPropertyForUser, false); boolean systemState = systemPropertiesGetBoolean(cameraPropertyForUser, false); boolean cameraDisabled = getCameraDisabled(null, policy.mUserHandle); if (cameraDisabled != systemState) { long token = binderClearCallingIdentity(); Loading @@ -1870,7 +1897,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { String value = cameraDisabled ? "1" : "0"; if (DBG) Slog.v(LOG_TAG, "Change in camera state [" + cameraPropertyForUser + "] = " + value); SystemProperties.set(cameraPropertyForUser, value); systemPropertiesSet(cameraPropertyForUser, value); } finally { binderRestoreCallingIdentity(token); } Loading Loading @@ -3231,7 +3258,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } private boolean isExtStorageEncrypted() { String state = SystemProperties.get("vold.decrypt"); String state = systemPropertiesGet("vold.decrypt"); return !"".equals(state); } Loading Loading @@ -3969,7 +3996,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE}. */ private int getEncryptionStatus() { String status = SystemProperties.get("ro.crypto.state", "unsupported"); String status = systemPropertiesGet("ro.crypto.state", "unsupported"); if ("encrypted".equalsIgnoreCase(status)) { final long token = binderClearCallingIdentity(); try { Loading Loading @@ -4377,7 +4404,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } boolean isInitializerSystemApp; try { isInitializerSystemApp = isSystemApp(AppGlobals.getPackageManager(), isInitializerSystemApp = isSystemApp(getIPackageManager(), initializer.getPackageName(), binderGetCallingUserHandle().getIdentifier()); } catch (RemoteException | IllegalArgumentException e) { isInitializerSystemApp = false; Loading Loading @@ -4528,7 +4555,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final long ident = binderClearCallingIdentity(); try { clearUserRestrictions(userHandle); AppGlobals.getPackageManager().updatePermissionFlagsForAllApps( getIPackageManager().updatePermissionFlagsForAllApps( PackageManager.FLAG_PERMISSION_POLICY_FIXED, 0 /* flagValues */, userHandle.getIdentifier()); } catch (RemoteException re) { Loading Loading @@ -4596,7 +4623,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { if (!isDeviceOwner(activeAdmin.info.getPackageName())) { IPackageManager ipm = AppGlobals.getPackageManager(); IPackageManager ipm = getIPackageManager(); ipm.setComponentEnabledSetting(who, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP, userId); Loading Loading @@ -4857,7 +4884,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private void enableIfNecessary(String packageName, int userId) { try { IPackageManager ipm = AppGlobals.getPackageManager(); IPackageManager ipm = getIPackageManager(); ApplicationInfo ai = ipm.getApplicationInfo(packageName, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, userId); Loading Loading @@ -4919,7 +4946,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { pm.addPersistentPreferredActivity(filter, activity, userHandle); Loading @@ -4938,7 +4965,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { pm.clearPackagePersistentPreferredActivities(packageName, userHandle); Loading Loading @@ -5074,7 +5101,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { UserInfo parent = mUserManager.getProfileParent(callingUserId); Loading Loading @@ -5105,7 +5132,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int callingUserId = UserHandle.getCallingUserId(); synchronized (this) { getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); long id = binderClearCallingIdentity(); try { UserInfo parent = mUserManager.getProfileParent(callingUserId); Loading Loading @@ -5144,7 +5171,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { userIdToCheck = user.profileGroupId; } IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); for (String enabledPackage : enabledPackages) { boolean systemService = false; try { Loading Loading @@ -5276,7 +5303,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { List<AccessibilityServiceInfo> installedServices = accessibilityManager.getInstalledAccessibilityServiceList(); IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); if (installedServices != null) { for (AccessibilityServiceInfo service : installedServices) { ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo; Loading Loading @@ -5425,7 +5452,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { List<InputMethodInfo> imes = inputMethodManager.getInputMethodList(); long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); if (imes != null) { for (InputMethodInfo ime : imes) { ServiceInfo serviceInfo = ime.getServiceInfo(); Loading Loading @@ -5472,7 +5499,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { String profileOwnerPkg = profileOwnerComponent.getPackageName(); final IPackageManager ipm = AppGlobals.getPackageManager(); final IPackageManager ipm = getIPackageManager(); IActivityManager activityManager = getIActivityManager(); final int userHandle = user.getIdentifier(); Loading Loading @@ -5624,8 +5651,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Send out notifications however as some clients may want to reread the // value which actually changed due to a restriction having been applied. final String property = Settings.Secure.SYS_PROP_SETTING_VERSION; long version = SystemProperties.getLong(property, 0) + 1; SystemProperties.set(property, Long.toString(version)); long version = systemPropertiesGetLong(property, 0) + 1; systemPropertiesSet(property, Long.toString(version)); final String name = Settings.Secure.LOCATION_PROVIDERS_ALLOWED; Uri url = Uri.withAppendedPath(Settings.Secure.CONTENT_URI, name); Loading Loading @@ -5660,7 +5687,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); return pm.setApplicationHiddenSettingAsUser(packageName, hidden, callingUserId); } catch (RemoteException re) { // shouldn't happen Loading @@ -5681,7 +5708,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); return pm.getApplicationHiddenSettingAsUser(packageName, callingUserId); } catch (RemoteException re) { // shouldn't happen Loading Loading @@ -5718,7 +5745,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { primaryUser = um.getUserInfo(userId); } IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); if (!isSystemApp(pm, packageName, primaryUser.id)) { throw new IllegalArgumentException("Only system apps can be enabled this way."); } Loading Loading @@ -5755,7 +5782,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { primaryUser = um.getUserInfo(userId); } IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); List<ResolveInfo> activitiesToEnable = pm.queryIntentActivities(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), 0, // no flags Loading Loading @@ -5851,7 +5878,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); pm.setBlockUninstallForUser(packageName, uninstallBlocked, userId); } catch (RemoteException re) { // Shouldn't happen. Loading @@ -5876,7 +5903,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long id = binderClearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); IPackageManager pm = getIPackageManager(); return pm.getBlockUninstallForUser(packageName, userId); } catch (RemoteException re) { // Shouldn't happen. Loading Loading @@ -6560,7 +6587,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); long ident = binderClearCallingIdentity(); try { final ApplicationInfo ai = AppGlobals.getPackageManager() final ApplicationInfo ai = getIPackageManager() .getApplicationInfo(packageName, 0, user.getIdentifier()); final int targetSdkVersion = ai == null ? 0 : ai.targetSdkVersion; if (targetSdkVersion < android.os.Build.VERSION_CODES.M) { Loading Loading @@ -6607,7 +6634,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); long ident = binderClearCallingIdentity(); try { int granted = AppGlobals.getPackageManager().checkPermission(permission, int granted = getIPackageManager().checkPermission(permission, packageName, user.getIdentifier()); int permFlags = packageManager.getPermissionFlags(permission, packageName, user); if ((permFlags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) Loading
services/tests/servicestests/AndroidManifest.xml +20 −2 Original line number Diff line number Diff line Loading @@ -67,7 +67,25 @@ </intent-filter> </receiver> <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmin" <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmins$Admin1" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmins$Admin2" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> <receiver android:name="com.android.server.devicepolicy.DummyDeviceAdmins$Admin3" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> Loading
services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java +42 −16 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.internal.widget.LockPatternUtils; import android.app.IActivityManager; import android.app.NotificationManager; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.os.Looper; import android.os.PowerManager.WakeLock; Loading @@ -45,9 +46,9 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi public static final String DEVICE_OWNER_FILE = "device_owner2.xml"; public static final String PROFILE_OWNER_FILE_BASE = "profile_owner.xml"; final private File mLegacyFile; final private File mDeviceOwnerFile; final private File mProfileOwnerBase; private final File mLegacyFile; private final File mDeviceOwnerFile; private final File mProfileOwnerBase; public OwnersTestable(Context context, File dataDir) { super(context); Loading Loading @@ -96,47 +97,52 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi } @Override protected Owners newOwners() { Owners newOwners() { return new OwnersTestable(getContext(), dataDir); } @Override protected UserManager getUserManager() { UserManager getUserManager() { return getContext().userManager; } @Override protected PackageManager getPackageManager() { PackageManager getPackageManager() { return getContext().packageManager; } @Override protected PowerManagerInternal getPowerManagerInternal() { PowerManagerInternal getPowerManagerInternal() { return getContext().powerManagerInternal; } @Override protected NotificationManager getNotificationManager() { NotificationManager getNotificationManager() { return getContext().notificationManager; } @Override protected IWindowManager newIWindowManager() { IWindowManager getIWindowManager() { return getContext().iwindowManager; } @Override protected IActivityManager getIActivityManager() { IActivityManager getIActivityManager() { return getContext().iactivityManager; } @Override protected LockPatternUtils newLockPatternUtils(Context context) { IPackageManager getIPackageManager() { return getContext().ipackageManager; } @Override LockPatternUtils newLockPatternUtils(Context context) { return getContext().lockPatternUtils; } @Override protected Looper getMyLooper() { Looper getMyLooper() { return Looper.getMainLooper(); } Loading Loading @@ -181,12 +187,32 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi } @Override WakeLock powerManagerNewWakeLock(int levelAndFlags, String tag) { return getContext().powerManager.newWakeLock(levelAndFlags, tag); void powerManagerGoToSleep(long time, int reason, int flags) { getContext().powerManager.goToSleep(time, reason, flags); } @Override boolean systemPropertiesGetBoolean(String key, boolean def) { return getContext().systemProperties.getBoolean(key, def); } @Override void powerManagerGoToSleep(long time, int reason, int flags) { getContext().powerManager.goToSleep(time, reason, flags); long systemPropertiesGetLong(String key, long def) { return getContext().systemProperties.getLong(key, def); } @Override String systemPropertiesGet(String key, String def) { return getContext().systemProperties.get(key, def); } @Override String systemPropertiesGet(String key) { return getContext().systemProperties.get(key); } @Override void systemPropertiesSet(String key, String value) { getContext().systemProperties.set(key, value); } }
services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +288 −43 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +38 −10 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.devicepolicy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.LockPatternUtils; import android.app.IActivityManager; Loading @@ -24,11 +25,13 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.PowerManager.WakeLock; import android.os.PowerManagerInternal; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.test.mock.MockContext; Loading Loading @@ -71,27 +74,27 @@ public class DpmMockContext extends MockContext { public static final int SYSTEM_PID = 11111; public static class MockBinder { int mCallingUid = CALLER_UID; int mCallingPid = CALLER_PID; public int callingUid = CALLER_UID; public int callingPid = CALLER_PID; public long clearCallingIdentity() { final long token = (((long) mCallingUid) << 32) | (mCallingPid); mCallingUid = SYSTEM_UID; mCallingPid = SYSTEM_PID; final long token = (((long) callingUid) << 32) | (callingPid); callingUid = SYSTEM_UID; callingPid = SYSTEM_PID; return token; } public void restoreCallingIdentity(long token) { mCallingUid = (int) (token >> 32); mCallingPid = (int) token; callingUid = (int) (token >> 32); callingPid = (int) token; } public int getCallingUid() { return mCallingUid; return callingUid; } public int getCallingPid() { return mCallingPid; return callingPid; } public UserHandle getCallingUserHandle() { Loading @@ -99,7 +102,7 @@ public class DpmMockContext extends MockContext { } public boolean isCallerUidMyUid() { return mCallingUid == SYSTEM_UID; return callingUid == SYSTEM_UID; } } Loading @@ -118,6 +121,27 @@ public class DpmMockContext extends MockContext { } } public static class SystemPropertiesForMock { public boolean getBoolean(String key, boolean def) { return false; } public long getLong(String key, long def) { return 0; } public String get(String key, String def) { return null; } public String get(String key) { return null; } public void set(String key, String value) { } } public final Context realTestContext; /** Loading @@ -129,12 +153,14 @@ public class DpmMockContext extends MockContext { public final MockBinder binder; public final EnvironmentForMock environment; public final SystemPropertiesForMock systemProperties; public final UserManager userManager; public final PowerManagerForMock powerManager; public final PowerManagerInternal powerManagerInternal; public final NotificationManager notificationManager; public final IWindowManager iwindowManager; public final IActivityManager iactivityManager; public final IPackageManager ipackageManager; public final LockPatternUtils lockPatternUtils; /** Note this is a partial mock, not a real mock. */ Loading @@ -146,12 +172,14 @@ public class DpmMockContext extends MockContext { realTestContext = context; binder = new MockBinder(); environment = mock(EnvironmentForMock.class); systemProperties= mock(SystemPropertiesForMock.class); userManager = mock(UserManager.class); powerManager = mock(PowerManagerForMock.class); powerManagerInternal = mock(PowerManagerInternal.class); notificationManager = mock(NotificationManager.class); iwindowManager = mock(IWindowManager.class); iactivityManager = mock(IActivityManager.class); ipackageManager = mock(IPackageManager.class); lockPatternUtils = mock(LockPatternUtils.class); // Package manager is huge, so we use a partial mock instead. Loading