1 /** 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy 6 * 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, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 17 package android.app.usage; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.annotation.UserIdInt; 22 import android.app.usage.UsageStatsManager.StandbyBuckets; 23 import android.content.ComponentName; 24 import android.content.LocusId; 25 import android.content.res.Configuration; 26 import android.os.IBinder; 27 import android.os.UserHandle; 28 import android.os.UserManager; 29 30 import java.util.List; 31 import java.util.Set; 32 33 /** 34 * UsageStatsManager local system service interface. 35 * 36 * {@hide} Only for use within the system server. 37 */ 38 public abstract class UsageStatsManagerInternal { 39 40 /** 41 * Reports an event to the UsageStatsManager. <br/> 42 * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's 43 * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}), 44 * then this event will be added to a queue and processed once the device is unlocked.</em> 45 * 46 * @param component The component for which this event occurred. 47 * @param userId The user id to which the component belongs to. 48 * @param eventType The event that occurred. Valid values can be found at 49 * {@link UsageEvents} 50 * @param instanceId For activity, hashCode of ActivityRecord's appToken. 51 * For non-activity, it is not used. 52 * @param taskRoot For activity, the name of the package at the root of the task 53 * For non-activity, it is not used. 54 */ reportEvent(ComponentName component, @UserIdInt int userId, int eventType, int instanceId, ComponentName taskRoot)55 public abstract void reportEvent(ComponentName component, @UserIdInt int userId, int eventType, 56 int instanceId, ComponentName taskRoot); 57 58 /** 59 * Reports an event to the UsageStatsManager. <br/> 60 * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's 61 * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}), 62 * then this event will be added to a queue and processed once the device is unlocked.</em> 63 * 64 * @param packageName The package for which this event occurred. 65 * @param userId The user id to which the component belongs to. 66 * @param eventType The event that occurred. Valid values can be found at 67 * {@link UsageEvents} 68 */ reportEvent(String packageName, @UserIdInt int userId, int eventType)69 public abstract void reportEvent(String packageName, @UserIdInt int userId, int eventType); 70 71 /** 72 * Reports a configuration change to the UsageStatsManager. <br/> 73 * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's 74 * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}), 75 * then this event will be added to a queue and processed once the device is unlocked.</em> 76 * 77 * @param config The new device configuration. 78 */ reportConfigurationChange(Configuration config, @UserIdInt int userId)79 public abstract void reportConfigurationChange(Configuration config, @UserIdInt int userId); 80 81 /** 82 * Reports that an application has posted an interruptive notification. <br/> 83 * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's 84 * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}), 85 * then this event will be added to a queue and processed once the device is unlocked.</em> 86 * 87 * @param packageName The package name of the app that posted the notification 88 * @param channelId The ID of the NotificationChannel to which the notification was posted 89 * @param userId The user in which the notification was posted 90 */ reportInterruptiveNotification(String packageName, String channelId, @UserIdInt int userId)91 public abstract void reportInterruptiveNotification(String packageName, String channelId, 92 @UserIdInt int userId); 93 94 /** 95 * Reports that an action equivalent to a ShortcutInfo is taken by the user. <br/> 96 * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's 97 * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}), 98 * then this event will be added to a queue and processed once the device is unlocked.</em> 99 * 100 * @param packageName The package name of the shortcut publisher 101 * @param shortcutId The ID of the shortcut in question 102 * @param userId The user in which the content provider was accessed. 103 * 104 * @see android.content.pm.ShortcutManager#reportShortcutUsed(String) 105 */ reportShortcutUsage(String packageName, String shortcutId, @UserIdInt int userId)106 public abstract void reportShortcutUsage(String packageName, String shortcutId, 107 @UserIdInt int userId); 108 109 /** 110 * Reports that a content provider has been accessed by a foreground app. 111 * @param name The authority of the content provider 112 * @param pkgName The package name of the content provider 113 * @param userId The user in which the content provider was accessed. 114 */ reportContentProviderUsage(String name, String pkgName, @UserIdInt int userId)115 public abstract void reportContentProviderUsage(String name, String pkgName, 116 @UserIdInt int userId); 117 118 119 /** 120 * Reports locusId update for a given activity. 121 * 122 * @param activity The component name of the app. 123 * @param userId The user id of who uses the app. 124 * @param locusId The locusId a unique, stable id that identifies this activity. 125 * @param appToken ActivityRecord's appToken. 126 * {@link UsageEvents} 127 * @hide 128 */ reportLocusUpdate(@onNull ComponentName activity, @UserIdInt int userId, @Nullable LocusId locusId, @NonNull IBinder appToken)129 public abstract void reportLocusUpdate(@NonNull ComponentName activity, @UserIdInt int userId, 130 @Nullable LocusId locusId, @NonNull IBinder appToken); 131 132 /** 133 * Prepares the UsageStatsService for shutdown. 134 */ prepareShutdown()135 public abstract void prepareShutdown(); 136 137 /** 138 * When the device power button is long pressed for 3.5 seconds, prepareForPossibleShutdown() 139 * is called. 140 */ prepareForPossibleShutdown()141 public abstract void prepareForPossibleShutdown(); 142 143 /** 144 * Returns true if the app has not been used for a certain amount of time. How much time? 145 * Could be hours, could be days, who knows? 146 * 147 * @param packageName 148 * @param uidForAppId The uid of the app, which will be used for its app id 149 * @param userId 150 * @return 151 */ isAppIdle(String packageName, int uidForAppId, @UserIdInt int userId)152 public abstract boolean isAppIdle(String packageName, int uidForAppId, @UserIdInt int userId); 153 154 /** 155 * Returns the app standby bucket that the app is currently in. This accessor does 156 * <em>not</em> obfuscate instant apps. 157 * 158 * @param packageName 159 * @param userId 160 * @param nowElapsed The current time, in the elapsedRealtime time base 161 * @return the AppStandby bucket code the app currently resides in. If the app is 162 * unknown in the given user, STANDBY_BUCKET_NEVER is returned. 163 */ getAppStandbyBucket(String packageName, @UserIdInt int userId, long nowElapsed)164 @StandbyBuckets public abstract int getAppStandbyBucket(String packageName, 165 @UserIdInt int userId, long nowElapsed); 166 167 /** 168 * Returns all of the uids for a given user where all packages associating with that uid 169 * are in the app idle state -- there are no associated apps that are not idle. This means 170 * all of the returned uids can be safely considered app idle. 171 */ getIdleUidsForUser(@serIdInt int userId)172 public abstract int[] getIdleUidsForUser(@UserIdInt int userId); 173 174 /** Backup/Restore API */ getBackupPayload(@serIdInt int userId, String key)175 public abstract byte[] getBackupPayload(@UserIdInt int userId, String key); 176 177 /** 178 * ? 179 * @param userId 180 * @param key 181 * @param payload 182 */ applyRestoredPayload(@serIdInt int userId, String key, byte[] payload)183 public abstract void applyRestoredPayload(@UserIdInt int userId, String key, byte[] payload); 184 185 /** 186 * Called by DevicePolicyManagerService to inform that a new admin has been added. 187 * 188 * @param packageName the package in which the admin component is part of. 189 * @param userId the userId in which the admin has been added. 190 */ onActiveAdminAdded(String packageName, int userId)191 public abstract void onActiveAdminAdded(String packageName, int userId); 192 193 /** 194 * Called by DevicePolicyManagerService to inform about the active admins in an user. 195 * 196 * @param adminApps the set of active admins in {@param userId} or null if there are none. 197 * @param userId the userId to which the admin apps belong. 198 */ setActiveAdminApps(Set<String> adminApps, int userId)199 public abstract void setActiveAdminApps(Set<String> adminApps, int userId); 200 201 /** 202 * Called by DevicePolicyManagerService during boot to inform that admin data is loaded and 203 * pushed to UsageStatsService. 204 */ onAdminDataAvailable()205 public abstract void onAdminDataAvailable(); 206 207 /** 208 * Return usage stats. 209 * 210 * @param obfuscateInstantApps whether instant app package names need to be obfuscated in the 211 * result. 212 */ queryUsageStatsForUser(@serIdInt int userId, int interval, long beginTime, long endTime, boolean obfuscateInstantApps)213 public abstract List<UsageStats> queryUsageStatsForUser(@UserIdInt int userId, int interval, 214 long beginTime, long endTime, boolean obfuscateInstantApps); 215 216 /** 217 * Returns the events for the user in the given time period. 218 * 219 * @param flags defines the visibility of certain usage events - see flags defined in 220 * {@link UsageEvents}. 221 */ queryEventsForUser(@serIdInt int userId, long beginTime, long endTime, int flags)222 public abstract UsageEvents queryEventsForUser(@UserIdInt int userId, long beginTime, 223 long endTime, int flags); 224 225 /** 226 * Used to persist the last time a job was run for this app, in order to make decisions later 227 * whether a job should be deferred until later. The time passed in should be in elapsed 228 * realtime since boot. 229 * @param packageName the app that executed a job. 230 * @param userId the user associated with the job. 231 * @param elapsedRealtime the time when the job was executed, in elapsed realtime millis since 232 * boot. 233 */ setLastJobRunTime(String packageName, @UserIdInt int userId, long elapsedRealtime)234 public abstract void setLastJobRunTime(String packageName, @UserIdInt int userId, 235 long elapsedRealtime); 236 237 /** 238 * Returns the time in millis since a job was executed for this app, in elapsed realtime 239 * timebase. This value can be larger than the current elapsed realtime if the job was executed 240 * before the device was rebooted. The default value is {@link Long#MAX_VALUE}. 241 * @param packageName the app you're asking about. 242 * @param userId the user associated with the job. 243 * @return the time in millis since a job was last executed for the app, provided it was 244 * indicated here before by a call to {@link #setLastJobRunTime(String, int, long)}. 245 */ getTimeSinceLastJobRun(String packageName, @UserIdInt int userId)246 public abstract long getTimeSinceLastJobRun(String packageName, @UserIdInt int userId); 247 248 /** 249 * Report a few data points about an app's job state at the current time. 250 * 251 * @param packageName the app whose job state is being described 252 * @param userId which user the app is associated with 253 * @param numDeferredJobs the number of pending jobs that were deferred 254 * due to bucketing policy 255 * @param timeSinceLastJobRun number of milliseconds since the last time one of 256 * this app's jobs was executed 257 */ reportAppJobState(String packageName, @UserIdInt int userId, int numDeferredJobs, long timeSinceLastJobRun)258 public abstract void reportAppJobState(String packageName, @UserIdInt int userId, 259 int numDeferredJobs, long timeSinceLastJobRun); 260 261 /** 262 * Report a sync that was scheduled. 263 * 264 * @param packageName name of the package that owns the sync adapter. 265 * @param userId which user the app is associated with 266 * @param exempted is sync app standby exempted 267 */ reportSyncScheduled(String packageName, @UserIdInt int userId, boolean exempted)268 public abstract void reportSyncScheduled(String packageName, @UserIdInt int userId, 269 boolean exempted); 270 271 /** 272 * Report a sync that was scheduled by a foreground app is about to be executed. 273 * 274 * @param packageName name of the package that owns the sync adapter. 275 * @param userId which user the app is associated with 276 */ reportExemptedSyncStart(String packageName, @UserIdInt int userId)277 public abstract void reportExemptedSyncStart(String packageName, @UserIdInt int userId); 278 279 /** 280 * Returns an object describing the app usage limit for the given package which was set via 281 * {@link UsageStatsManager#registerAppUsageLimitObserver}. 282 * If there are multiple limits that apply to the package, the one with the smallest 283 * time remaining will be returned. 284 * 285 * @param packageName name of the package whose app usage limit will be returned 286 * @param user the user associated with the limit 287 * @return an {@link AppUsageLimitData} object describing the app time limit containing 288 * the given package, with the smallest time remaining. 289 */ getAppUsageLimit(String packageName, UserHandle user)290 public abstract AppUsageLimitData getAppUsageLimit(String packageName, UserHandle user); 291 292 /** A class which is used to share the usage limit data for an app or a group of apps. */ 293 public static class AppUsageLimitData { 294 private final long mTotalUsageLimit; 295 private final long mUsageRemaining; 296 AppUsageLimitData(long totalUsageLimit, long usageRemaining)297 public AppUsageLimitData(long totalUsageLimit, long usageRemaining) { 298 this.mTotalUsageLimit = totalUsageLimit; 299 this.mUsageRemaining = usageRemaining; 300 } 301 getTotalUsageLimit()302 public long getTotalUsageLimit() { 303 return mTotalUsageLimit; 304 } getUsageRemaining()305 public long getUsageRemaining() { 306 return mUsageRemaining; 307 } 308 } 309 310 /** 311 * Called by {@link com.android.server.usage.UsageStatsIdleService} when the device is idle to 312 * prune usage stats data for uninstalled packages. 313 * 314 * @param userId the user associated with the job 315 * @return {@code true} if the pruning was successful, {@code false} otherwise 316 */ pruneUninstalledPackagesData(@serIdInt int userId)317 public abstract boolean pruneUninstalledPackagesData(@UserIdInt int userId); 318 319 /** 320 * Called by {@link com.android.server.usage.UsageStatsIdleService} between 24 to 48 hours of 321 * when the user is first unlocked to update the usage stats package mappings data that might 322 * be stale or have existed from a restore and belongs to packages that are not installed for 323 * this user anymore. 324 * Note: this is only executed for the system user. 325 * 326 * @return {@code true} if the updating was successful, {@code false} otherwise 327 */ updatePackageMappingsData()328 public abstract boolean updatePackageMappingsData(); 329 330 /** 331 * Listener interface for usage events. 332 */ 333 public interface UsageEventListener { 334 /** Callback to inform listeners of a new usage event. */ onUsageEvent(@serIdInt int userId, @NonNull UsageEvents.Event event)335 void onUsageEvent(@UserIdInt int userId, @NonNull UsageEvents.Event event); 336 } 337 338 /** Register a listener that will be notified of every new usage event. */ registerListener(@onNull UsageEventListener listener)339 public abstract void registerListener(@NonNull UsageEventListener listener); 340 341 /** Unregister a listener from being notified of every new usage event. */ unregisterListener(@onNull UsageEventListener listener)342 public abstract void unregisterListener(@NonNull UsageEventListener listener); 343 } 344