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