diff options
-rw-r--r-- | services/usage/java/com/android/server/usage/UsageStatsService.java | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 010a32274dcd..e7c9e927b311 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -48,6 +48,7 @@ import android.app.IUidObserver; import android.app.PendingIntent; import android.app.UidObserver; import android.app.admin.DevicePolicyManagerInternal; +import android.app.supervision.SupervisionManagerInternal; import android.app.usage.AppLaunchEstimateInfo; import android.app.usage.AppStandbyInfo; import android.app.usage.BroadcastResponseStatsList; @@ -230,6 +231,7 @@ public class UsageStatsService extends SystemService implements // Do not use directly. Call getDpmInternal() instead DevicePolicyManagerInternal mDpmInternal; // Do not use directly. Call getShortcutServiceInternal() instead + SupervisionManagerInternal mSupervisionManagerInternal; ShortcutServiceInternal mShortcutServiceInternal; private final SparseArray<UserUsageStatsService> mUserState = new SparseArray<>(); @@ -439,6 +441,9 @@ public class UsageStatsService extends SystemService implements // initialize mDpmInternal getDpmInternal(); // initialize mShortcutServiceInternal + if (android.app.supervision.flags.Flags.deprecateDpmSupervisionApis()) { + getSupervisionManagerInternal(); + } getShortcutServiceInternal(); mResponseStatsTracker.onSystemServicesReady(getContext()); @@ -604,6 +609,15 @@ public class UsageStatsService extends SystemService implements return mDpmInternal; } + @Nullable + private SupervisionManagerInternal getSupervisionManagerInternal() { + if (mSupervisionManagerInternal == null) { + mSupervisionManagerInternal = + LocalServices.getService(SupervisionManagerInternal.class); + } + return mSupervisionManagerInternal; + } + private ShortcutServiceInternal getShortcutServiceInternal() { if (mShortcutServiceInternal == null) { mShortcutServiceInternal = LocalServices.getService(ShortcutServiceInternal.class); @@ -753,6 +767,16 @@ public class UsageStatsService extends SystemService implements callingPid, callingUid) == PackageManager.PERMISSION_GRANTED); } + private boolean isSupervisionEnabled(int callingUid) { + if (android.app.supervision.flags.Flags.deprecateDpmSupervisionApis()) { + SupervisionManagerInternal smInternal = getSupervisionManagerInternal(); + return smInternal != null && smInternal.isActiveSupervisionApp(callingUid); + } else { + DevicePolicyManagerInternal dpmInternal = getDpmInternal(); + return dpmInternal != null && dpmInternal.isActiveSupervisionApp(callingUid); + } + } + private static void deleteRecursively(final File path) { if (path.isDirectory()) { final File[] files = path.listFiles(); @@ -2929,10 +2953,9 @@ public class UsageStatsService extends SystemService implements long timeLimitMs, long timeUsedMs, PendingIntent callbackIntent, String callingPackage) { final int callingUid = Binder.getCallingUid(); - final DevicePolicyManagerInternal dpmInternal = getDpmInternal(); if (!hasPermissions( Manifest.permission.SUSPEND_APPS, Manifest.permission.OBSERVE_APP_USAGE) - && (dpmInternal == null || !dpmInternal.isActiveSupervisionApp(callingUid))) { + && !isSupervisionEnabled(callingUid)) { throw new SecurityException("Caller must be the active supervision app or " + "it must have both SUSPEND_APPS and OBSERVE_APP_USAGE permissions"); } @@ -2956,10 +2979,9 @@ public class UsageStatsService extends SystemService implements @Override public void unregisterAppUsageLimitObserver(int observerId, String callingPackage) { final int callingUid = Binder.getCallingUid(); - final DevicePolicyManagerInternal dpmInternal = getDpmInternal(); if (!hasPermissions( Manifest.permission.SUSPEND_APPS, Manifest.permission.OBSERVE_APP_USAGE) - && (dpmInternal == null || !dpmInternal.isActiveSupervisionApp(callingUid))) { + && !isSupervisionEnabled(callingUid)) { throw new SecurityException("Caller must be the active supervision app or " + "it must have both SUSPEND_APPS and OBSERVE_APP_USAGE permissions"); } |