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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user