diff options
8 files changed, 43 insertions, 11 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 24f0bcf4fbba..e0318ac974e9 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -9,6 +9,7 @@ package android { field public static final String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES"; field @Deprecated public static final String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO"; field public static final String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS"; + field public static final String ACCESS_LOCUS_ID_USAGE_STATS = "android.permission.ACCESS_LOCUS_ID_USAGE_STATS"; field public static final String ACCESS_MESSAGES_ON_ICC = "android.permission.ACCESS_MESSAGES_ON_ICC"; field public static final String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION"; field public static final String ACCESS_MTP = "android.permission.ACCESS_MTP"; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 413435f027c7..28f5b03b3832 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4918,6 +4918,10 @@ <permission android:name="android.permission.ACCESS_TV_TUNER" android:protectionLevel="signature|privileged" /> + <!-- @hide @SystemApi Allows an application to access locusId events in the usage stats. --> + <permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS" + android:protectionLevel="signature|appPredictor" /> + <application android:process="system" android:persistent="true" android:hasCode="false" diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 5946f2158ac8..b2d6c96b57dc 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -252,6 +252,9 @@ <!-- Permission required for CTS test - ShortcutManagerUsageTest --> <uses-permission android:name="android.permission.ACCESS_SHORTCUTS"/> + <!-- Permission required for CTS test - UsageStatsTest --> + <uses-permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS"/> + <!-- Permissions required to test ambient display. --> <uses-permission android:name="android.permission.READ_DREAM_STATE"/> <uses-permission android:name="android.permission.WRITE_DREAM_STATE"/> diff --git a/services/core/java/android/app/usage/UsageStatsManagerInternal.java b/services/core/java/android/app/usage/UsageStatsManagerInternal.java index 5c2cbfa63a2b..442c9e543b01 100644 --- a/services/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/services/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -220,9 +220,13 @@ public abstract class UsageStatsManagerInternal { * result. * @param hideShortcutInvocationEvents whether the {@link UsageEvents.Event#SHORTCUT_INVOCATION} * events need to be excluded from the result. + * @param hideLocusIdEvents whether the {@link UsageEvents.Event#LOCUS_ID_SET} + * events need to be excluded from the result. + * */ public abstract UsageEvents queryEventsForUser(@UserIdInt int userId, long beginTime, - long endTime, boolean obfuscateInstantApps, boolean hideShortcutInvocationEvents); + long endTime, boolean obfuscateInstantApps, boolean hideShortcutInvocationEvents, + boolean hideLocusIdEvents); /** * Used to persist the last time a job was run for this app, in order to make decisions later diff --git a/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java b/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java index 4e37f47149b4..644c155b4158 100644 --- a/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java +++ b/services/people/java/com/android/server/people/data/UsageStatsQueryHelper.java @@ -59,7 +59,7 @@ class UsageStatsQueryHelper { */ boolean querySince(long sinceTime) { UsageEvents usageEvents = mUsageStatsManagerInternal.queryEventsForUser( - mUserId, sinceTime, System.currentTimeMillis(), false, false); + mUserId, sinceTime, System.currentTimeMillis(), false, false, false); if (usageEvents == null) { return false; } diff --git a/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java b/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java index b273578ada3a..01d9dc00cf47 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/UsageStatsQueryHelperTest.java @@ -189,7 +189,7 @@ public final class UsageStatsQueryHelperTest { private void addUsageEvents(UsageEvents.Event... events) { UsageEvents usageEvents = new UsageEvents(Arrays.asList(events), new String[]{}); when(mUsageStatsManagerInternal.queryEventsForUser(anyInt(), anyLong(), anyLong(), - anyBoolean(), anyBoolean())).thenReturn(usageEvents); + anyBoolean(), anyBoolean(), anyBoolean())).thenReturn(usageEvents); } private static <T> void addLocalServiceMock(Class<T> clazz, T mock) { diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 48b6e2aaad5c..3b3a58b21339 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -491,6 +491,15 @@ public class UsageStatsService extends SystemService implements return true; // hide by default if we can't verify visibility } + private boolean shouldHideLocusIdEvents(int callingPid, int callingUid) { + if (callingUid == Process.SYSTEM_UID) { + return false; + } + return !(getContext().checkPermission( + android.Manifest.permission.ACCESS_LOCUS_ID_USAGE_STATS, callingPid, callingUid) + == PackageManager.PERMISSION_GRANTED); + } + private static void deleteRecursively(File f) { File[] files = f.listFiles(); if (files != null) { @@ -1030,7 +1039,8 @@ public class UsageStatsService extends SystemService implements * Called by the Binder stub. */ UsageEvents queryEvents(int userId, long beginTime, long endTime, - boolean shouldObfuscateInstantApps, boolean shouldHideShortcutInvocationEvents) { + boolean shouldObfuscateInstantApps, boolean shouldHideShortcutInvocationEvents, + boolean shouldHideLocusIdEvents) { synchronized (mLock) { if (!mUserUnlockedStates.get(userId)) { Slog.w(TAG, "Failed to query events for locked user " + userId); @@ -1042,7 +1052,7 @@ public class UsageStatsService extends SystemService implements return null; // user was stopped or removed } return service.queryEvents(beginTime, endTime, shouldObfuscateInstantApps, - shouldHideShortcutInvocationEvents); + shouldHideShortcutInvocationEvents, shouldHideLocusIdEvents); } } @@ -1451,8 +1461,10 @@ public class UsageStatsService extends SystemService implements try { final boolean hideShortcutInvocationEvents = shouldHideShortcutInvocationEvents( userId, callingPackage, callingPid, callingUid); + boolean shouldHideLocusIdEvents = shouldHideLocusIdEvents(callingPid, callingUid); return UsageStatsService.this.queryEvents(userId, beginTime, endTime, - obfuscateInstantApps, hideShortcutInvocationEvents); + obfuscateInstantApps, hideShortcutInvocationEvents, + shouldHideLocusIdEvents); } finally { Binder.restoreCallingIdentity(token); } @@ -1499,8 +1511,10 @@ public class UsageStatsService extends SystemService implements try { final boolean hideShortcutInvocationEvents = shouldHideShortcutInvocationEvents( userId, callingPackage, callingPid, callingUid); + boolean shouldHideLocusIdEvents = shouldHideLocusIdEvents(callingPid, callingUid); return UsageStatsService.this.queryEvents(userId, beginTime, endTime, - obfuscateInstantApps, hideShortcutInvocationEvents); + obfuscateInstantApps, hideShortcutInvocationEvents, + shouldHideLocusIdEvents); } finally { Binder.restoreCallingIdentity(token); } @@ -2117,9 +2131,11 @@ public class UsageStatsService extends SystemService implements @Override public UsageEvents queryEventsForUser(int userId, long beginTime, long endTime, - boolean obfuscateInstantApps, boolean hideShortcutInvocationEvents) { + boolean obfuscateInstantApps, boolean shouldHideShortcutInvocationEvents, + boolean shouldHideLocusIdEvents) { return UsageStatsService.this.queryEvents( - userId, beginTime, endTime, obfuscateInstantApps, hideShortcutInvocationEvents); + userId, beginTime, endTime, obfuscateInstantApps, + shouldHideShortcutInvocationEvents, shouldHideLocusIdEvents); } @Override diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index 4d711128da76..d9317ace6e24 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -481,8 +481,8 @@ class UserUsageStatsService { return queryStats(bucketType, beginTime, endTime, sEventStatsCombiner); } - UsageEvents queryEvents(final long beginTime, final long endTime, - boolean obfuscateInstantApps, boolean hideShortcutInvocationEvents) { + UsageEvents queryEvents(final long beginTime, final long endTime, boolean obfuscateInstantApps, + boolean hideShortcutInvocationEvents, boolean hideLocusIdEvents) { if (!validRange(checkAndGetTimeLocked(), beginTime, endTime)) { return null; } @@ -504,6 +504,10 @@ class UserUsageStatsService { && event.mEventType == Event.SHORTCUT_INVOCATION) { continue; } + if (hideLocusIdEvents + && event.mEventType == Event.LOCUS_ID_SET) { + continue; + } if (obfuscateInstantApps) { event = event.getObfuscatedIfInstantApp(); } |