Add user event log for deep shortcuts and all apps opening interaction.
b/30114798

Change-Id: I11ad99d0bc1983294d6a5329b98917cb87250823
diff --git a/protos/launcher_log.proto b/protos/launcher_log.proto
index eae02ca..3730555 100644
--- a/protos/launcher_log.proto
+++ b/protos/launcher_log.proto
@@ -61,6 +61,7 @@
   SHORTCUT = 2;
   WIDGET = 3;
   FOLDER_ICON = 4;
+  DEEPSHORTCUT = 5;
 }
 
 // Used to define what type of container a Target would represent.
@@ -74,6 +75,7 @@
   OVERVIEW = 6;
   PREDICTION = 7;
   SEARCHRESULT = 8;
+  DEEPSHORTCUTS = 9;
 }
 
 // Used to define what type of control a Target would represent.
@@ -106,8 +108,16 @@
     FLING = 4;
     PINCH = 5;
   }
+ enum Direction {
+    NONE = 0;
+    UP = 1;
+    DOWN = 2;
+    LEFT = 3;
+    RIGHT = 4;
+  }
   optional Type type = 1;
   optional Touch touch = 2;
+  optional Direction dir = 3;
 }
 
 //
@@ -126,4 +136,4 @@
   optional int64 action_duration_millis = 4;
   optional int64 elapsed_container_millis = 5;
   optional int64 elapsed_session_millis = 6;
-}
\ No newline at end of file
+}
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 73cd800..f57753b 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -117,6 +117,7 @@
 import com.android.launcher3.pageindicators.PageIndicator;
 import com.android.launcher3.shortcuts.DeepShortcutManager;
 import com.android.launcher3.shortcuts.DeepShortcutsContainer;
+import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.util.ComponentKey;
 import com.android.launcher3.util.MultiHashMap;
 import com.android.launcher3.util.PackageManagerHelper;
@@ -2590,6 +2591,8 @@
     protected void onClickAllAppsButton(View v) {
         if (LOGD) Log.d(TAG, "onClickAllAppsButton");
         if (!isAppsViewVisible()) {
+            mUserEventDispatcher.logActionOnControl(LauncherLogProto.Action.TAP,
+                    LauncherLogProto.ALL_APPS_BUTTON);
             showAppsView(true /* animated */, false /* resetListToTop */,
                     true /* updatePredictedApps */, false /* focusSearchBar */);
         }
@@ -2598,6 +2601,8 @@
     protected void onLongClickAllAppsButton(View v) {
         if (LOGD) Log.d(TAG, "onLongClickAllAppsButton");
         if (!isAppsViewVisible()) {
+            mUserEventDispatcher.logActionOnControl(LauncherLogProto.Action.LONGPRESS,
+                    LauncherLogProto.ALL_APPS_BUTTON);
             showAppsView(true /* animated */, false /* resetListToTop */,
                     true /* updatePredictedApps */, true /* focusSearchBar */);
         }
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 03b3107..136308b 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -22,6 +22,7 @@
 import com.android.launcher3.R;
 import com.android.launcher3.Workspace;
 import com.android.launcher3.Workspace.Direction;
+import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.util.TouchController;
 
 /**
@@ -210,6 +211,10 @@
                 calculateDuration(velocity, mAppsView.getTranslationY());
 
                 if (!mLauncher.isAllAppsVisible()) {
+                    mLauncher.getUserEventDispatcher().logActionOnContainer(
+                            LauncherLogProto.Action.FLING,
+                            LauncherLogProto.Action.UP,
+                            LauncherLogProto.HOTSEAT);
                     mLauncher.showAppsView(true, true, false, false);
                 } else {
                     animateToAllApps(mCurrentAnimation, mAnimationDuration, true);
@@ -234,6 +239,10 @@
             } else {
                 calculateDuration(velocity, Math.abs(mAppsView.getTranslationY()));
                 if (!mLauncher.isAllAppsVisible()) {
+                    mLauncher.getUserEventDispatcher().logActionOnContainer(
+                            LauncherLogProto.Action.SWIPE,
+                            LauncherLogProto.Action.UP,
+                            LauncherLogProto.HOTSEAT);
                     mLauncher.showAppsView(true, true, false, false);
                 } else {
                     animateToAllApps(mCurrentAnimation, mAnimationDuration, true);
diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java
index 584e38e..9e92721 100644
--- a/src/com/android/launcher3/logging/LoggerUtils.java
+++ b/src/com/android/launcher3/logging/LoggerUtils.java
@@ -1,15 +1,9 @@
 package com.android.launcher3.logging;
 
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.launcher3.LauncherSettings;
-import com.android.launcher3.ShortcutInfo;
 import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 
-
 /**
  * Debugging helper methods.
  * toString() cannot be overriden inside auto generated {@link LauncherLogProto}.
@@ -24,12 +18,17 @@
             case Action.LONGPRESS: return "LONGPRESS";
             case Action.DRAGDROP: return "DRAGDROP";
             case Action.PINCH: return "PINCH";
+            case Action.SWIPE: return "SWIPE";
+            case Action.FLING: return "FLING";
             default: return "UNKNOWN";
         }
     }
 
     public static String getTargetStr(Target t) {
-        String typeStr;
+        String typeStr = "";
+        if (t == null){
+            return typeStr;
+        }
         switch (t.type) {
             case Target.ITEM:
                 return getItemStr(t);
@@ -44,6 +43,9 @@
 
     private static String getItemStr(Target t) {
         String typeStr = "";
+        if (t == null){
+            return typeStr;
+        }
         switch(t.itemType){
             case LauncherLogProto.APP_ICON: typeStr = "ICON"; break;
             case LauncherLogProto.SHORTCUT: typeStr = "SHORTCUT"; break;
@@ -58,6 +60,9 @@
     }
 
     private static String getControlStr(Target t) {
+        if (t == null){
+            return "";
+        }
         switch(t.controlType) {
             case LauncherLogProto.ALL_APPS_BUTTON: return "ALL_APPS_BUTTON";
             case LauncherLogProto.WIDGETS_BUTTON: return "WIDGETS_BUTTON";
@@ -72,8 +77,10 @@
     }
 
     private static String getContainerStr(LauncherLogProto.Target t) {
-        String str;
-        Log.d(TAG, "t.containerType" + t.containerType);
+        String str = "";
+        if (t == null) {
+            return str;
+        }
         switch (t.containerType) {
             case LauncherLogProto.WORKSPACE:
                 str = "WORKSPACE";
@@ -122,4 +129,18 @@
         event.action.type = actionType;
         return event;
     }
+
+    public static LauncherLogProto.LauncherEvent initLauncherEvent(
+            int actionType,
+            int childTargetType){
+        LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent();
+
+        event.srcTarget = new LauncherLogProto.Target[1];
+        event.srcTarget[0] = new LauncherLogProto.Target();
+        event.srcTarget[0].type = childTargetType;
+
+        event.action = new LauncherLogProto.Action();
+        event.action.type = actionType;
+        return event;
+    }
 }
diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java
index 0deee57..f67f487 100644
--- a/src/com/android/launcher3/logging/UserEventDispatcher.java
+++ b/src/com/android/launcher3/logging/UserEventDispatcher.java
@@ -37,8 +37,8 @@
 public class UserEventDispatcher {
 
     private static final boolean DEBUG_LOGGING = false;
-
     private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5;
+
     /**
      * Implemented by containers to provide a launch source for a given child.
      */
@@ -46,10 +46,11 @@
 
         /**
          * Copies data from the source to the destination proto.
-         * @param v                 source of the data
-         * @param info          source of the data
-         * @param target            dest of the data
-         * @param targetParent      dest of the data
+         *
+         * @param v            source of the data
+         * @param info         source of the data
+         * @param target       dest of the data
+         * @param targetParent dest of the data
          */
         void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent);
     }
@@ -126,12 +127,23 @@
         dispatchUserEvent(createLauncherEvent(v, intent), intent);
     }
 
-    public void logTap(View v) {
-        // TODO
+    public void logActionOnControl(int action, int controlType) {
+        LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTROL);
+        event.action.touch = action;
+        event.srcTarget[0].controlType = controlType;
+        event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis;
+        event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis;
+        dispatchUserEvent(event, null);
     }
 
-    public void logLongPress() {
-        // TODO
+    public void logActionOnContainer(int action, int dir, int containerType) {
+        LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, Target.CONTAINER);
+        event.action.touch = action;
+        event.action.dir = dir;
+        event.srcTarget[0].containerType = containerType;
+        event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis;
+        event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis;
+        dispatchUserEvent(event, null);
     }
 
     public void logDragNDrop() {
@@ -152,7 +164,6 @@
     public final void resetElapsedSessionMillis() {
         mElapsedSessionMillis = System.currentTimeMillis();
         mElapsedContainerMillis = System.currentTimeMillis();
-
     }
 
     public final void resetActionDurationMillis() {
@@ -164,8 +175,8 @@
             Log.d("UserEvent", String.format(Locale.US,
                     "action:%s\nchild:%s\nparent:%s\nelapsed container %d ms session %d ms",
                     LoggerUtils.getActionStr(ev.action),
-                    LoggerUtils.getTargetStr(ev.srcTarget[0]),
-                    LoggerUtils.getTargetStr(ev.srcTarget[1]),
+                    LoggerUtils.getTargetStr(ev.srcTarget != null ? ev.srcTarget[0] : null),
+                    LoggerUtils.getTargetStr(ev.srcTarget.length > 1 ? ev.srcTarget[1] : null),
                     ev.elapsedContainerMillis,
                     ev.elapsedSessionMillis));
         }
diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
index f91665f..9f59e06 100644
--- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
+++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
@@ -486,10 +486,8 @@
 
     @Override
     public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) {
-        target.itemType = LauncherLogProto.SHORTCUT; // TODO: change to DYNAMIC_SHORTCUT
-        target.gridX = info.cellX;
-        target.gridY = info.cellY;
-        target.pageIndex = 0;
-        targetParent.containerType = LauncherLogProto.FOLDER; // TODO: change to DYNAMIC_SHORTCUTS
+        target.itemType = LauncherLogProto.DEEPSHORTCUT;
+        // TODO: add target.rank
+        targetParent.containerType = LauncherLogProto.DEEPSHORTCUTS;
     }
 }