From 978a1ed5aa2752cd36ff51df91d2d2d8be2171d9 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Mon, 2 Mar 2015 11:37:24 -0800 Subject: [PATCH] Add generic "INTERACTION" event type to UsageStatsManager This will allow for updating a package's last time used property for packages that are interacted in ways other than launching their activities (interacting with notifications, etc.) Change-Id: Ic6f9519f46fa04abd37ea6fc9475bcd9ea721003 --- api/current.txt | 1 + api/system-current.txt | 1 + core/java/android/app/usage/UsageEvents.java | 5 +++++ .../app/usage/UsageStatsManagerInternal.java | 10 ++++++++++ .../com/android/server/usage/IntervalStats.java | 17 ++++++++++++++++- .../android/server/usage/UsageStatsService.java | 17 +++++++++++++++++ .../server/usage/UserUsageStatsService.java | 2 ++ .../tests/usagestats/UsageLogActivity.java | 3 +++ 8 files changed, 55 insertions(+), 1 deletion(-) diff --git a/api/current.txt b/api/current.txt index 5e9520dc28754..8a076aa36b22e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5773,6 +5773,7 @@ package android.app.usage { method public java.lang.String getPackageName(); method public long getTimeStamp(); field public static final int CONFIGURATION_CHANGE = 5; // 0x5 + field public static final int INTERACTION = 6; // 0x6 field public static final int MOVE_TO_BACKGROUND = 2; // 0x2 field public static final int MOVE_TO_FOREGROUND = 1; // 0x1 field public static final int NONE = 0; // 0x0 diff --git a/api/system-current.txt b/api/system-current.txt index c8a3c0f085f65..bcdabb16e1ad3 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5952,6 +5952,7 @@ package android.app.usage { method public java.lang.String getPackageName(); method public long getTimeStamp(); field public static final int CONFIGURATION_CHANGE = 5; // 0x5 + field public static final int INTERACTION = 6; // 0x6 field public static final int MOVE_TO_BACKGROUND = 2; // 0x2 field public static final int MOVE_TO_FOREGROUND = 1; // 0x1 field public static final int NONE = 0; // 0x0 diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java index 3cf3c954e5b6c..58279d7441245 100644 --- a/core/java/android/app/usage/UsageEvents.java +++ b/core/java/android/app/usage/UsageEvents.java @@ -67,6 +67,11 @@ public final class UsageEvents implements Parcelable { */ public static final int CONFIGURATION_CHANGE = 5; + /** + * An event type denoting that a package was interacted with in some way. + */ + public static final int INTERACTION = 6; + /** * {@hide} */ diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java index 083a48a292d37..0122069cf9664 100644 --- a/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -36,6 +36,16 @@ public abstract class UsageStatsManagerInternal { */ public abstract void reportEvent(ComponentName component, int userId, int eventType); + /** + * Reports an event to the UsageStatsManager. + * + * @param packageName The package for which this event occurred. + * @param userId The user id to which the component belongs to. + * @param eventType The event that occurred. Valid values can be found at + * {@link UsageEvents} + */ + public abstract void reportEvent(String packageName, int userId, int eventType); + /** * Reports a configuration change to the UsageStatsManager. * diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java index 5f639ab5e2e35..869d6e1628d65 100644 --- a/services/usage/java/com/android/server/usage/IntervalStats.java +++ b/services/usage/java/com/android/server/usage/IntervalStats.java @@ -81,6 +81,17 @@ class IntervalStats { return event; } + private boolean isStatefulEvent(int eventType) { + switch (eventType) { + case UsageEvents.Event.MOVE_TO_FOREGROUND: + case UsageEvents.Event.MOVE_TO_BACKGROUND: + case UsageEvents.Event.END_OF_DAY: + case UsageEvents.Event.CONTINUE_PREVIOUS_DAY: + return true; + } + return false; + } + void update(String packageName, long timeStamp, int eventType) { UsageStats usageStats = getOrCreateUsageStats(packageName); @@ -93,7 +104,11 @@ class IntervalStats { usageStats.mTotalTimeInForeground += timeStamp - usageStats.mLastTimeUsed; } } - usageStats.mLastEvent = eventType; + + if (isStatefulEvent(eventType)) { + usageStats.mLastEvent = 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 485b2a2089111..5eefe6ab2b4c0 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -487,6 +487,23 @@ public class UsageStatsService extends SystemService implements mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget(); } + @Override + public void reportEvent(String packageName, int userId, int eventType) { + if (packageName == null) { + Slog.w(TAG, "Event reported without a package name"); + return; + } + + UsageEvents.Event event = new UsageEvents.Event(); + event.mPackage = packageName; + + // This will later be converted to system time. + event.mTimeStamp = SystemClock.elapsedRealtime(); + + event.mEventType = eventType; + mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget(); + } + @Override public void reportConfigurationChange(Configuration config, int userId) { if (config == null) { diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index 6596781c0964a..75fa0303e7532 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -570,6 +570,8 @@ class UserUsageStatsService { return "CONTINUE_PREVIOUS_DAY"; case UsageEvents.Event.CONFIGURATION_CHANGE: return "CONFIGURATION_CHANGE"; + case UsageEvents.Event.INTERACTION: + return "INTERACTION"; default: return "UNKNOWN"; } diff --git a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java index d9a3b6171ffc0..8e6daea43367d 100644 --- a/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java +++ b/tests/UsageStatsTest/src/com/android/tests/usagestats/UsageLogActivity.java @@ -166,6 +166,9 @@ public class UsageLogActivity extends ListActivity implements Runnable { case UsageEvents.Event.CONFIGURATION_CHANGE: return "Config change"; + case UsageEvents.Event.INTERACTION: + return "Interaction"; + default: return "Unknown: " + eventType; }