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.UserIdInt; 20 import android.app.usage.UsageStatsManager.StandbyBuckets; 21 import android.content.ComponentName; 22 import android.content.res.Configuration; 23 import android.os.UserHandle; 24 25 import java.util.List; 26 import java.util.Set; 27 28 /** 29 * UsageStatsManager local system service interface. 30 * 31 * {@hide} Only for use within the system server. 32 */ 33 public abstract class UsageStatsManagerInternal { 34 35 /** 36 * Reports an event to the UsageStatsManager. 37 * 38 * @param component The component for which this event occurred. 39 * @param userId The user id to which the component belongs to. 40 * @param eventType The event that occurred. Valid values can be found at 41 * {@link UsageEvents} 42 * @param instanceId For activity, hashCode of ActivityRecord's appToken. 43 * For non-activity, it is not used. 44 * @param taskRoot For activity, the name of the package at the root of the task 45 * For non-activity, it is not used. 46 */ reportEvent(ComponentName component, @UserIdInt int userId, int eventType, int instanceId, ComponentName taskRoot)47 public abstract void reportEvent(ComponentName component, @UserIdInt int userId, int eventType, 48 int instanceId, ComponentName taskRoot); 49 50 /** 51 * Reports an event to the UsageStatsManager. 52 * 53 * @param packageName The package for which this event occurred. 54 * @param userId The user id to which the component belongs to. 55 * @param eventType The event that occurred. Valid values can be found at 56 * {@link UsageEvents} 57 */ reportEvent(String packageName, @UserIdInt int userId, int eventType)58 public abstract void reportEvent(String packageName, @UserIdInt int userId, int eventType); 59 60 /** 61 * Reports a configuration change to the UsageStatsManager. 62 * 63 * @param config The new device configuration. 64 */ reportConfigurationChange(Configuration config, @UserIdInt int userId)65 public abstract void reportConfigurationChange(Configuration config, @UserIdInt int userId); 66 67 /** 68 * Reports that an application has posted an interruptive notification. 69 * 70 * @param packageName The package name of the app that posted the notification 71 * @param channelId The ID of the NotificationChannel to which the notification was posted 72 * @param userId The user in which the notification was posted 73 */ reportInterruptiveNotification(String packageName, String channelId, @UserIdInt int userId)74 public abstract void reportInterruptiveNotification(String packageName, String channelId, 75 @UserIdInt int userId); 76 77 /** 78 * Reports that an action equivalent to a ShortcutInfo is taken by the user. 79 * 80 * @param packageName The package name of the shortcut publisher 81 * @param shortcutId The ID of the shortcut in question 82 * @param userId The user in which the content provider was accessed. 83 * 84 * @see android.content.pm.ShortcutManager#reportShortcutUsed(String) 85 */ reportShortcutUsage(String packageName, String shortcutId, @UserIdInt int userId)86 public abstract void reportShortcutUsage(String packageName, String shortcutId, 87 @UserIdInt int userId); 88 89 /** 90 * Reports that a content provider has been accessed by a foreground app. 91 * @param name The authority of the content provider 92 * @param pkgName The package name of the content provider 93 * @param userId The user in which the content provider was accessed. 94 */ reportContentProviderUsage(String name, String pkgName, @UserIdInt int userId)95 public abstract void reportContentProviderUsage(String name, String pkgName, 96 @UserIdInt int userId); 97 98 /** 99 * Prepares the UsageStatsService for shutdown. 100 */ prepareShutdown()101 public abstract void prepareShutdown(); 102 103 /** 104 * When the device power button is long pressed for 3.5 seconds, prepareForPossibleShutdown() 105 * is called. 106 */ prepareForPossibleShutdown()107 public abstract void prepareForPossibleShutdown(); 108 109 /** 110 * Returns true if the app has not been used for a certain amount of time. How much time? 111 * Could be hours, could be days, who knows? 112 * 113 * @param packageName 114 * @param uidForAppId The uid of the app, which will be used for its app id 115 * @param userId 116 * @return 117 */ isAppIdle(String packageName, int uidForAppId, @UserIdInt int userId)118 public abstract boolean isAppIdle(String packageName, int uidForAppId, @UserIdInt int userId); 119 120 /** 121 * Returns the app standby bucket that the app is currently in. This accessor does 122 * <em>not</em> obfuscate instant apps. 123 * 124 * @param packageName 125 * @param userId 126 * @param nowElapsed The current time, in the elapsedRealtime time base 127 * @return the AppStandby bucket code the app currently resides in. If the app is 128 * unknown in the given user, STANDBY_BUCKET_NEVER is returned. 129 */ getAppStandbyBucket(String packageName, @UserIdInt int userId, long nowElapsed)130 @StandbyBuckets public abstract int getAppStandbyBucket(String packageName, 131 @UserIdInt int userId, long nowElapsed); 132 133 /** 134 * Returns all of the uids for a given user where all packages associating with that uid 135 * are in the app idle state -- there are no associated apps that are not idle. This means 136 * all of the returned uids can be safely considered app idle. 137 */ getIdleUidsForUser(@serIdInt int userId)138 public abstract int[] getIdleUidsForUser(@UserIdInt int userId); 139 140 /** 141 * @return True if currently app idle parole mode is on. This means all idle apps are allow to 142 * run for a short period of time. 143 */ isAppIdleParoleOn()144 public abstract boolean isAppIdleParoleOn(); 145 146 /** 147 * Sets up a listener for changes to packages being accessed. 148 * @param listener A listener within the system process. 149 */ addAppIdleStateChangeListener( AppIdleStateChangeListener listener)150 public abstract void addAppIdleStateChangeListener( 151 AppIdleStateChangeListener listener); 152 153 /** 154 * Removes a listener that was previously added for package usage state changes. 155 * @param listener The listener within the system process to remove. 156 */ removeAppIdleStateChangeListener( AppIdleStateChangeListener listener)157 public abstract void removeAppIdleStateChangeListener( 158 AppIdleStateChangeListener listener); 159 160 public static abstract class AppIdleStateChangeListener { 161 162 /** Callback to inform listeners that the idle state has changed to a new bucket. */ onAppIdleStateChanged(String packageName, @UserIdInt int userId, boolean idle, int bucket, int reason)163 public abstract void onAppIdleStateChanged(String packageName, @UserIdInt int userId, 164 boolean idle, int bucket, int reason); 165 166 /** 167 * Callback to inform listeners that the parole state has changed. This means apps are 168 * allowed to do work even if they're idle or in a low bucket. 169 */ onParoleStateChanged(boolean isParoleOn)170 public abstract void onParoleStateChanged(boolean isParoleOn); 171 172 /** 173 * Optional callback to inform the listener that the app has transitioned into 174 * an active state due to user interaction. 175 */ onUserInteractionStarted(String packageName, @UserIdInt int userId)176 public void onUserInteractionStarted(String packageName, @UserIdInt int userId) { 177 // No-op by default 178 } 179 } 180 181 /** Backup/Restore API */ getBackupPayload(@serIdInt int userId, String key)182 public abstract byte[] getBackupPayload(@UserIdInt int userId, String key); 183 184 /** 185 * ? 186 * @param userId 187 * @param key 188 * @param payload 189 */ applyRestoredPayload(@serIdInt int userId, String key, byte[] payload)190 public abstract void applyRestoredPayload(@UserIdInt int userId, String key, byte[] payload); 191 192 /** 193 * Called by DevicePolicyManagerService to inform that a new admin has been added. 194 * 195 * @param packageName the package in which the admin component is part of. 196 * @param userId the userId in which the admin has been added. 197 */ onActiveAdminAdded(String packageName, int userId)198 public abstract void onActiveAdminAdded(String packageName, int userId); 199 200 /** 201 * Called by DevicePolicyManagerService to inform about the active admins in an user. 202 * 203 * @param adminApps the set of active admins in {@param userId} or null if there are none. 204 * @param userId the userId to which the admin apps belong. 205 */ setActiveAdminApps(Set<String> adminApps, int userId)206 public abstract void setActiveAdminApps(Set<String> adminApps, int userId); 207 208 /** 209 * Called by DevicePolicyManagerService during boot to inform that admin data is loaded and 210 * pushed to UsageStatsService. 211 */ onAdminDataAvailable()212 public abstract void onAdminDataAvailable(); 213 214 /** 215 * Return usage stats. 216 * 217 * @param obfuscateInstantApps whether instant app package names need to be obfuscated in the 218 * result. 219 */ queryUsageStatsForUser(@serIdInt int userId, int interval, long beginTime, long endTime, boolean obfuscateInstantApps)220 public abstract List<UsageStats> queryUsageStatsForUser(@UserIdInt int userId, int interval, 221 long beginTime, long endTime, boolean obfuscateInstantApps); 222 223 /** 224 * Used to persist the last time a job was run for this app, in order to make decisions later 225 * whether a job should be deferred until later. The time passed in should be in elapsed 226 * realtime since boot. 227 * @param packageName the app that executed a job. 228 * @param userId the user associated with the job. 229 * @param elapsedRealtime the time when the job was executed, in elapsed realtime millis since 230 * boot. 231 */ setLastJobRunTime(String packageName, @UserIdInt int userId, long elapsedRealtime)232 public abstract void setLastJobRunTime(String packageName, @UserIdInt int userId, 233 long elapsedRealtime); 234 235 /** 236 * Returns the time in millis since a job was executed for this app, in elapsed realtime 237 * timebase. This value can be larger than the current elapsed realtime if the job was executed 238 * before the device was rebooted. The default value is {@link Long#MAX_VALUE}. 239 * @param packageName the app you're asking about. 240 * @param userId the user associated with the job. 241 * @return the time in millis since a job was last executed for the app, provided it was 242 * indicated here before by a call to {@link #setLastJobRunTime(String, int, long)}. 243 */ getTimeSinceLastJobRun(String packageName, @UserIdInt int userId)244 public abstract long getTimeSinceLastJobRun(String packageName, @UserIdInt int userId); 245 246 /** 247 * Report a few data points about an app's job state at the current time. 248 * 249 * @param packageName the app whose job state is being described 250 * @param userId which user the app is associated with 251 * @param numDeferredJobs the number of pending jobs that were deferred 252 * due to bucketing policy 253 * @param timeSinceLastJobRun number of milliseconds since the last time one of 254 * this app's jobs was executed 255 */ reportAppJobState(String packageName, @UserIdInt int userId, int numDeferredJobs, long timeSinceLastJobRun)256 public abstract void reportAppJobState(String packageName, @UserIdInt int userId, 257 int numDeferredJobs, long timeSinceLastJobRun); 258 259 /** 260 * Report a sync that was scheduled. 261 * 262 * @param packageName name of the package that owns the sync adapter. 263 * @param userId which user the app is associated with 264 * @param exempted is sync app standby exempted 265 */ reportSyncScheduled(String packageName, @UserIdInt int userId, boolean exempted)266 public abstract void reportSyncScheduled(String packageName, @UserIdInt int userId, 267 boolean exempted); 268 269 /** 270 * Report a sync that was scheduled by a foreground app is about to be executed. 271 * 272 * @param packageName name of the package that owns the sync adapter. 273 * @param userId which user the app is associated with 274 */ reportExemptedSyncStart(String packageName, @UserIdInt int userId)275 public abstract void reportExemptedSyncStart(String packageName, @UserIdInt int userId); 276 277 /** 278 * Returns an object describing the app usage limit for the given package which was set via 279 * {@link UsageStatsManager#registerAppUsageLimitObserver}. 280 * If there are multiple limits that apply to the package, the one with the smallest 281 * time remaining will be returned. 282 * 283 * @param packageName name of the package whose app usage limit will be returned 284 * @param user the user associated with the limit 285 * @return an {@link AppUsageLimitData} object describing the app time limit containing 286 * the given package, with the smallest time remaining. 287 */ getAppUsageLimit(String packageName, UserHandle user)288 public abstract AppUsageLimitData getAppUsageLimit(String packageName, UserHandle user); 289 290 /** A class which is used to share the usage limit data for an app or a group of apps. */ 291 public static class AppUsageLimitData { 292 private final long mTotalUsageLimit; 293 private final long mUsageRemaining; 294 AppUsageLimitData(long totalUsageLimit, long usageRemaining)295 public AppUsageLimitData(long totalUsageLimit, long usageRemaining) { 296 this.mTotalUsageLimit = totalUsageLimit; 297 this.mUsageRemaining = usageRemaining; 298 } 299 getTotalUsageLimit()300 public long getTotalUsageLimit() { 301 return mTotalUsageLimit; 302 } getUsageRemaining()303 public long getUsageRemaining() { 304 return mUsageRemaining; 305 } 306 } 307 } 308