Merge "Add generic "INTERACTION" event type to UsageStatsManager"
diff --git a/api/current.txt b/api/current.txt
index a9cd058..00afda2 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5783,6 +5783,7 @@
     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 52586ed..0a68000 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5962,6 +5962,7 @@
     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 3cf3c95..58279d7 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -68,6 +68,11 @@
         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}
          */
         public String mPackage;
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index 083a48a..0122069 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -37,6 +37,16 @@
     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.
      *
      * @param config The new device configuration.
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index 5f639ab..869d6e1 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 @@
         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 @@
                 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 485b2a2..5eefe6a 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -488,6 +488,23 @@
         }
 
         @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) {
                 Slog.w(TAG, "Configuration event reported with a null config");
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 6596781..75fa030 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 @@
                 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 d9a3b61..8e6daea 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 @@
                 case UsageEvents.Event.CONFIGURATION_CHANGE:
                     return "Config change";
 
+                case UsageEvents.Event.INTERACTION:
+                    return "Interaction";
+
                 default:
                     return "Unknown: " + eventType;
             }