Loading core/java/android/app/usage/UsageEvents.java +20 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,12 @@ public final class UsageEvents implements Parcelable { */ public static final int NOTIFICATION_SEEN = 10; /** * An event type denoting a change in App Standby Bucket. * @hide */ public static final int STANDBY_BUCKET_CHANGED = 11; /** @hide */ public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0; Loading Loading @@ -170,6 +176,13 @@ public final class UsageEvents implements Parcelable { */ public String[] mContentAnnotations; /** * The app standby bucket assigned. * Only present for {@link #STANDBY_BUCKET_CHANGED} event types * {@hide} */ public int mBucket; /** @hide */ @EventFlags public int mFlags; Loading @@ -189,6 +202,7 @@ public final class UsageEvents implements Parcelable { mContentType = orig.mContentType; mContentAnnotations = orig.mContentAnnotations; mFlags = orig.mFlags; mBucket = orig.mBucket; } /** Loading Loading @@ -399,6 +413,9 @@ public final class UsageEvents implements Parcelable { p.writeString(event.mContentType); p.writeStringArray(event.mContentAnnotations); break; case Event.STANDBY_BUCKET_CHANGED: p.writeInt(event.mBucket); break; } } Loading Loading @@ -442,6 +459,9 @@ public final class UsageEvents implements Parcelable { eventOut.mContentType = p.readString(); eventOut.mContentAnnotations = p.createStringArray(); break; case Event.STANDBY_BUCKET_CHANGED: eventOut.mBucket = p.readInt(); break; } } Loading services/usage/java/com/android/server/usage/IntervalStats.java +12 −1 Original line number Diff line number Diff line Loading @@ -92,6 +92,17 @@ class IntervalStats { return false; } /** * Returns whether the event type is one caused by user visible * interaction. Excludes those that are internally generated. * @param eventType * @return */ private boolean isUserVisibleEvent(int eventType) { return eventType != UsageEvents.Event.SYSTEM_INTERACTION && eventType != UsageEvents.Event.STANDBY_BUCKET_CHANGED; } void update(String packageName, long timeStamp, int eventType) { UsageStats usageStats = getOrCreateUsageStats(packageName); Loading @@ -109,7 +120,7 @@ class IntervalStats { usageStats.mLastEvent = eventType; } if (eventType != UsageEvents.Event.SYSTEM_INTERACTION) { if (isUserVisibleEvent(eventType)) { usageStats.mLastTimeUsed = timeStamp; } usageStats.mEndTimeStamp = timeStamp; Loading services/usage/java/com/android/server/usage/UsageStatsService.java +21 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,26 @@ public class UsageStatsService extends SystemService implements AppStandbyController mAppStandby; private UsageStatsManagerInternal.AppIdleStateChangeListener mStandbyChangeListener = new UsageStatsManagerInternal.AppIdleStateChangeListener() { @Override public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket) { Event event = new Event(); event.mEventType = Event.STANDBY_BUCKET_CHANGED; event.mBucket = bucket; event.mPackage = packageName; // This will later be converted to system time. event.mTimeStamp = SystemClock.elapsedRealtime(); mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget(); } @Override public void onParoleStateChanged(boolean isParoleOn) { } }; public UsageStatsService(Context context) { super(context); } Loading @@ -129,6 +149,7 @@ public class UsageStatsService extends SystemService implements mAppStandby = new AppStandbyController(getContext(), BackgroundThread.get().getLooper()); mAppStandby.addListener(mStandbyChangeListener); File systemDataDir = new File(Environment.getDataDirectory(), "system"); mUsageStatsDir = new File(systemDataDir, "usagestats"); mUsageStatsDir.mkdirs(); Loading services/usage/java/com/android/server/usage/UsageStatsXmlV1.java +8 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ final class UsageStatsXmlV1 { private static final String LAST_EVENT_ATTR = "lastEvent"; private static final String TYPE_ATTR = "type"; private static final String SHORTCUT_ID_ATTR = "shortcutId"; private static final String STANDBY_BUCKET_ATTR = "standbyBucket"; // Time attributes stored as an offset of the beginTime. private static final String LAST_TIME_ACTIVE_ATTR = "lastTimeActive"; Loading Loading @@ -173,6 +174,9 @@ final class UsageStatsXmlV1 { final String id = XmlUtils.readStringAttribute(parser, SHORTCUT_ID_ATTR); event.mShortcutId = (id != null) ? id.intern() : null; break; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: event.mBucket = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0); break; } if (statsOut.events == null) { Loading Loading @@ -276,6 +280,10 @@ final class UsageStatsXmlV1 { XmlUtils.writeStringAttribute(xml, SHORTCUT_ID_ATTR, event.mShortcutId); } break; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: if (event.mBucket != 0) { XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucket); } } xml.endTag(null, EVENT_TAG); Loading services/usage/java/com/android/server/usage/UserUsageStatsService.java +5 −0 Original line number Diff line number Diff line Loading @@ -599,6 +599,9 @@ class UserUsageStatsService { if (event.mShortcutId != null) { pw.printPair("shortcutId", event.mShortcutId); } if (event.mEventType == UsageEvents.Event.STANDBY_BUCKET_CHANGED) { pw.printPair("standbyBucket", event.mBucket); } pw.printHexPair("flags", event.mFlags); pw.println(); } Loading Loading @@ -645,6 +648,8 @@ class UserUsageStatsService { return "CHOOSER_ACTION"; case UsageEvents.Event.NOTIFICATION_SEEN: return "NOTIFICATION_SEEN"; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: return "STANDBY_BUCKET_CHANGED"; default: return "UNKNOWN"; } Loading Loading
core/java/android/app/usage/UsageEvents.java +20 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,12 @@ public final class UsageEvents implements Parcelable { */ public static final int NOTIFICATION_SEEN = 10; /** * An event type denoting a change in App Standby Bucket. * @hide */ public static final int STANDBY_BUCKET_CHANGED = 11; /** @hide */ public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0; Loading Loading @@ -170,6 +176,13 @@ public final class UsageEvents implements Parcelable { */ public String[] mContentAnnotations; /** * The app standby bucket assigned. * Only present for {@link #STANDBY_BUCKET_CHANGED} event types * {@hide} */ public int mBucket; /** @hide */ @EventFlags public int mFlags; Loading @@ -189,6 +202,7 @@ public final class UsageEvents implements Parcelable { mContentType = orig.mContentType; mContentAnnotations = orig.mContentAnnotations; mFlags = orig.mFlags; mBucket = orig.mBucket; } /** Loading Loading @@ -399,6 +413,9 @@ public final class UsageEvents implements Parcelable { p.writeString(event.mContentType); p.writeStringArray(event.mContentAnnotations); break; case Event.STANDBY_BUCKET_CHANGED: p.writeInt(event.mBucket); break; } } Loading Loading @@ -442,6 +459,9 @@ public final class UsageEvents implements Parcelable { eventOut.mContentType = p.readString(); eventOut.mContentAnnotations = p.createStringArray(); break; case Event.STANDBY_BUCKET_CHANGED: eventOut.mBucket = p.readInt(); break; } } Loading
services/usage/java/com/android/server/usage/IntervalStats.java +12 −1 Original line number Diff line number Diff line Loading @@ -92,6 +92,17 @@ class IntervalStats { return false; } /** * Returns whether the event type is one caused by user visible * interaction. Excludes those that are internally generated. * @param eventType * @return */ private boolean isUserVisibleEvent(int eventType) { return eventType != UsageEvents.Event.SYSTEM_INTERACTION && eventType != UsageEvents.Event.STANDBY_BUCKET_CHANGED; } void update(String packageName, long timeStamp, int eventType) { UsageStats usageStats = getOrCreateUsageStats(packageName); Loading @@ -109,7 +120,7 @@ class IntervalStats { usageStats.mLastEvent = eventType; } if (eventType != UsageEvents.Event.SYSTEM_INTERACTION) { if (isUserVisibleEvent(eventType)) { usageStats.mLastTimeUsed = timeStamp; } usageStats.mEndTimeStamp = timeStamp; Loading
services/usage/java/com/android/server/usage/UsageStatsService.java +21 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,26 @@ public class UsageStatsService extends SystemService implements AppStandbyController mAppStandby; private UsageStatsManagerInternal.AppIdleStateChangeListener mStandbyChangeListener = new UsageStatsManagerInternal.AppIdleStateChangeListener() { @Override public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket) { Event event = new Event(); event.mEventType = Event.STANDBY_BUCKET_CHANGED; event.mBucket = bucket; event.mPackage = packageName; // This will later be converted to system time. event.mTimeStamp = SystemClock.elapsedRealtime(); mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget(); } @Override public void onParoleStateChanged(boolean isParoleOn) { } }; public UsageStatsService(Context context) { super(context); } Loading @@ -129,6 +149,7 @@ public class UsageStatsService extends SystemService implements mAppStandby = new AppStandbyController(getContext(), BackgroundThread.get().getLooper()); mAppStandby.addListener(mStandbyChangeListener); File systemDataDir = new File(Environment.getDataDirectory(), "system"); mUsageStatsDir = new File(systemDataDir, "usagestats"); mUsageStatsDir.mkdirs(); Loading
services/usage/java/com/android/server/usage/UsageStatsXmlV1.java +8 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ final class UsageStatsXmlV1 { private static final String LAST_EVENT_ATTR = "lastEvent"; private static final String TYPE_ATTR = "type"; private static final String SHORTCUT_ID_ATTR = "shortcutId"; private static final String STANDBY_BUCKET_ATTR = "standbyBucket"; // Time attributes stored as an offset of the beginTime. private static final String LAST_TIME_ACTIVE_ATTR = "lastTimeActive"; Loading Loading @@ -173,6 +174,9 @@ final class UsageStatsXmlV1 { final String id = XmlUtils.readStringAttribute(parser, SHORTCUT_ID_ATTR); event.mShortcutId = (id != null) ? id.intern() : null; break; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: event.mBucket = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0); break; } if (statsOut.events == null) { Loading Loading @@ -276,6 +280,10 @@ final class UsageStatsXmlV1 { XmlUtils.writeStringAttribute(xml, SHORTCUT_ID_ATTR, event.mShortcutId); } break; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: if (event.mBucket != 0) { XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucket); } } xml.endTag(null, EVENT_TAG); Loading
services/usage/java/com/android/server/usage/UserUsageStatsService.java +5 −0 Original line number Diff line number Diff line Loading @@ -599,6 +599,9 @@ class UserUsageStatsService { if (event.mShortcutId != null) { pw.printPair("shortcutId", event.mShortcutId); } if (event.mEventType == UsageEvents.Event.STANDBY_BUCKET_CHANGED) { pw.printPair("standbyBucket", event.mBucket); } pw.printHexPair("flags", event.mFlags); pw.println(); } Loading Loading @@ -645,6 +648,8 @@ class UserUsageStatsService { return "CHOOSER_ACTION"; case UsageEvents.Event.NOTIFICATION_SEEN: return "NOTIFICATION_SEEN"; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: return "STANDBY_BUCKET_CHANGED"; default: return "UNKNOWN"; } Loading