diff options
| author | 2018-01-19 06:55:08 -0800 | |
|---|---|---|
| committer | 2018-01-23 18:34:34 -0800 | |
| commit | bfc4bf5febe3d97d3f51206c9ead2f7d2b05e700 (patch) | |
| tree | c91cc2b74f98b59ec61610b88272b765d46f0e17 | |
| parent | 3733b8ed7b085bb7fa3459af831d7d8f00013e2b (diff) | |
Keep history of standby bucket changes.
Push standby bucket changes into UsageStats as events.
Don't use the event for aggregation.
Bug: 63527785
Test: atest CtsUsageStatsTestCases:UsageStatsTest
Change-Id: Icd152b21935e3ef73aaa1a62f09574e51ce921bd
5 files changed, 66 insertions, 1 deletions
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java index f04e9074ec4a..edb992bd265c 100644 --- a/core/java/android/app/usage/UsageEvents.java +++ b/core/java/android/app/usage/UsageEvents.java @@ -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; @@ -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; @@ -189,6 +202,7 @@ public final class UsageEvents implements Parcelable { mContentType = orig.mContentType; mContentAnnotations = orig.mContentAnnotations; mFlags = orig.mFlags; + mBucket = orig.mBucket; } /** @@ -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; } } @@ -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; } } diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java index cb32d1fb97c1..4d458b027429 100644 --- a/services/usage/java/com/android/server/usage/IntervalStats.java +++ b/services/usage/java/com/android/server/usage/IntervalStats.java @@ -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); @@ -109,7 +120,7 @@ class IntervalStats { usageStats.mLastEvent = eventType; } - if (eventType != UsageEvents.Event.SYSTEM_INTERACTION) { + if (isUserVisibleEvent(eventType)) { usageStats.mLastTimeUsed = timeStamp; } usageStats.mEndTimeStamp = timeStamp; diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 78cc81f2bab6..3492fb9231c8 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -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); } @@ -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(); diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java index cc53a9cc0b70..d1ed59921d4d 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java +++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java @@ -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"; @@ -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) { @@ -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); diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index f02221cb1699..ec12da231568 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -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(); } @@ -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"; } |