diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index 2c1e951b61287..30ea5c4761912 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -30,7 +30,7 @@ import java.util.Map; interface IUsageStatsManager { @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) ParceledListSlice queryUsageStats(int bucketType, long beginTime, long endTime, - String callingPackage); + String callingPackage, int userId); @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) ParceledListSlice queryConfigurationStats(int bucketType, long beginTime, long endTime, String callingPackage); diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index f74d16ee9238c..31781ec79203a 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -23,6 +23,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; +import android.annotation.UserHandleAware; import android.app.Activity; import android.app.PendingIntent; import android.compat.annotation.UnsupportedAppUsage; @@ -437,11 +438,12 @@ public final class UsageStatsManager { * @see #INTERVAL_YEARLY * @see #INTERVAL_BEST */ + @UserHandleAware public List queryUsageStats(int intervalType, long beginTime, long endTime) { try { @SuppressWarnings("unchecked") ParceledListSlice slice = mService.queryUsageStats(intervalType, beginTime, - endTime, mContext.getOpPackageName()); + endTime, mContext.getOpPackageName(), mContext.getUserId()); if (slice != null) { return slice.getList(); } diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java index 64906bb27ff07..e16d44854516f 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverListControllerTest.java @@ -100,7 +100,7 @@ public class ResolverListControllerTest { final List slices = new ArrayList<>(); slices.add(packageStats); ParceledListSlice stats = new ParceledListSlice<>(slices); - when(mMockService.queryUsageStats(anyInt(), anyLong(), anyLong(), anyString())) + when(mMockService.queryUsageStats(anyInt(), anyLong(), anyLong(), anyString(), anyInt())) .thenReturn(stats); Answer answer = new Answer() { @Override diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 0cb1255c68302..9e419d4c3f3b3 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -1526,15 +1526,19 @@ public class UsageStatsService extends SystemService implements @Override public ParceledListSlice queryUsageStats(int bucketType, long beginTime, - long endTime, String callingPackage) { + long endTime, String callingPackage, int userId) { if (!hasPermission(callingPackage)) { return null; } - final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller( - Binder.getCallingUid(), UserHandle.getCallingUserId()); + final int callingUid = Binder.getCallingUid(); + userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), callingUid, + userId, false, true, "queryUsageStats", callingPackage); + + // Check the caller's userId for obfuscation decision, not the user being queried + final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller( + callingUid, UserHandle.getCallingUserId()); - final int userId = UserHandle.getCallingUserId(); final long token = Binder.clearCallingIdentity(); try { final List results = UsageStatsService.this.queryUsageStats(