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