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