Using java_style enum generation for proto

This makes it easier to track various method parameters and simplifies
debug logging

Change-Id: Ib7c3d52590d0c36b2c8460c889ee3bead3454569
diff --git a/Android.mk b/Android.mk
index 28beff2..713d082 100644
--- a/Android.mk
+++ b/Android.mk
@@ -41,6 +41,8 @@
 
 LOCAL_PROTOC_OPTIMIZE_TYPE := nano
 LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
+LOCAL_PROTO_JAVA_OUTPUT_PARAMS := enum_style=java
+
 LOCAL_AAPT_FLAGS := \
     --auto-add-overlay \
     --extra-packages android.support.v7.recyclerview \
@@ -66,6 +68,7 @@
 
 LOCAL_PROTOC_OPTIMIZE_TYPE := nano
 LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
+LOCAL_PROTO_JAVA_OUTPUT_PARAMS := enum_style=java
 
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := launcher_proto_lib
diff --git a/build.gradle b/build.gradle
index 4629caa..982ae2e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -85,6 +85,7 @@
                     remove java
                     javanano {
                         option "java_package=launcher_log.proto|com.android.launcher3.userevent.nano"
+                        option "enum_style=java"
                     }
                 }
             }
diff --git a/proguard.flags b/proguard.flags
index f1a3eaf..6cbab08 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -91,3 +91,6 @@
 #}
 -keep class android.support.v7.widget.RecyclerView { *; }
 
+-keep interface com.android.launcher3.userevent.nano.LauncherLogProto.** {
+  *;
+}
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index 3648fb7..4a8a272 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -38,7 +38,7 @@
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.dynamicui.ExtractedColors;
 import com.android.launcher3.logging.UserEventDispatcher;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 
 public class Hotseat extends FrameLayout
@@ -175,7 +175,7 @@
     public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) {
         target.gridX = info.cellX;
         target.gridY = info.cellY;
-        targetParent.containerType = LauncherLogProto.HOTSEAT;
+        targetParent.containerType = ContainerType.HOTSEAT;
     }
 
     public void updateColor(ExtractedColors extractedColors, boolean animate) {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 8bb4a5b..75534b2 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -111,7 +111,9 @@
 import com.android.launcher3.shortcuts.DeepShortcutManager;
 import com.android.launcher3.shortcuts.DeepShortcutsContainer;
 import com.android.launcher3.shortcuts.ShortcutKey;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
 import com.android.launcher3.util.ActivityResultInfo;
 import com.android.launcher3.util.ComponentKey;
 import com.android.launcher3.util.ItemInfoMatcher;
@@ -1350,7 +1352,7 @@
 
         // Bind wallpaper button actions
         View wallpaperButton = findViewById(R.id.wallpaper_button);
-        new OverviewButtonClickListener(LauncherLogProto.WALLPAPER_BUTTON) {
+        new OverviewButtonClickListener(ControlType.WALLPAPER_BUTTON) {
             @Override
             public void handleViewClick(View view) {
                 onClickWallpaperPicker(view);
@@ -1360,7 +1362,7 @@
 
         // Bind widget button actions
         mWidgetsButton = findViewById(R.id.widget_button);
-        new OverviewButtonClickListener(LauncherLogProto.WIDGETS_BUTTON) {
+        new OverviewButtonClickListener(ControlType.WIDGETS_BUTTON) {
             @Override
             public void handleViewClick(View view) {
                 onClickAddWidgetButton(view);
@@ -1372,7 +1374,7 @@
         View settingsButton = findViewById(R.id.settings_button);
         boolean hasSettings = hasSettings();
         if (hasSettings) {
-            new OverviewButtonClickListener(LauncherLogProto.SETTINGS_BUTTON) {
+            new OverviewButtonClickListener(ControlType.SETTINGS_BUTTON) {
                 @Override
                 public void handleViewClick(View view) {
                     onClickSettingsButton(view);
@@ -1694,13 +1696,13 @@
 
             AbstractFloatingView topOpenView = AbstractFloatingView.getTopOpenView(this);
             if (topOpenView instanceof DeepShortcutsContainer) {
-                ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT,
-                        topOpenView.getExtendedTouchView(), LauncherLogProto.DEEPSHORTCUTS);
+                ued.logActionCommand(Action.Command.HOME_INTENT,
+                        topOpenView.getExtendedTouchView(), ContainerType.DEEPSHORTCUTS);
             } else if (topOpenView instanceof Folder) {
-                ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT,
-                            ((Folder) topOpenView).getFolderIcon(), LauncherLogProto.FOLDER);
+                ued.logActionCommand(Action.Command.HOME_INTENT,
+                            ((Folder) topOpenView).getFolderIcon(), ContainerType.FOLDER);
             } else if (alreadyOnHome) {
-                ued.logActionCommand(LauncherLogProto.Action.HOME_INTENT,
+                ued.logActionCommand(Action.Command.HOME_INTENT,
                         mWorkspace.getState().containerType, mWorkspace.getCurrentPage());
             }
 
@@ -2216,22 +2218,22 @@
                 topView.getActiveTextView().dispatchBackKey();
             } else {
                 if (topView instanceof DeepShortcutsContainer) {
-                    ued.logActionCommand(LauncherLogProto.Action.BACK,
-                            topView.getExtendedTouchView(), LauncherLogProto.DEEPSHORTCUTS);
+                    ued.logActionCommand(Action.Command.BACK,
+                            topView.getExtendedTouchView(), ContainerType.DEEPSHORTCUTS);
                 } else if (topView instanceof Folder) {
-                    ued.logActionCommand(LauncherLogProto.Action.BACK,
-                            ((Folder) topView).getFolderIcon(), LauncherLogProto.FOLDER);
+                    ued.logActionCommand(Action.Command.BACK,
+                            ((Folder) topView).getFolderIcon(), ContainerType.FOLDER);
                 }
                 topView.close(true);
             }
         } else if (isAppsViewVisible()) {
-            ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.ALLAPPS);
+            ued.logActionCommand(Action.Command.BACK, ContainerType.ALLAPPS);
             showWorkspace(true);
         } else if (isWidgetsViewVisible())  {
-            ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.WIDGETS);
+            ued.logActionCommand(Action.Command.BACK, ContainerType.WIDGETS);
             showOverviewMode(true);
         } else if (mWorkspace.isInOverviewMode()) {
-            ued.logActionCommand(LauncherLogProto.Action.BACK, LauncherLogProto.OVERVIEW);
+            ued.logActionCommand(Action.Command.BACK, ContainerType.OVERVIEW);
             showWorkspace(true);
         } else {
             // TODO: Log this case.
@@ -2365,8 +2367,8 @@
     protected void onClickAllAppsButton(View v) {
         if (LOGD) Log.d(TAG, "onClickAllAppsButton");
         if (!isAppsViewVisible()) {
-            getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.TAP,
-                    LauncherLogProto.ALL_APPS_BUTTON);
+            getUserEventDispatcher().logActionOnControl(Action.Touch.TAP,
+                    ControlType.ALL_APPS_BUTTON);
             showAppsView(true /* animated */, true /* updatePredictedApps */,
                     false /* focusSearchBar */);
         }
@@ -2375,8 +2377,8 @@
     protected void onLongClickAllAppsButton(View v) {
         if (LOGD) Log.d(TAG, "onLongClickAllAppsButton");
         if (!isAppsViewVisible()) {
-            getUserEventDispatcher().logActionOnControl(LauncherLogProto.Action.LONGPRESS,
-                    LauncherLogProto.ALL_APPS_BUTTON);
+            getUserEventDispatcher().logActionOnControl(Action.Touch.LONGPRESS,
+                    ControlType.ALL_APPS_BUTTON);
             showAppsView(true /* animated */,
                     true /* updatePredictedApps */, true /* focusSearchBar */);
         }
@@ -2759,8 +2761,8 @@
         if (v instanceof Workspace) {
             if (!mWorkspace.isInOverviewMode()) {
                 if (!mWorkspace.isTouchActive() && !ignoreLongPressToOverview) {
-                    getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS,
-                            LauncherLogProto.Action.NONE, LauncherLogProto.WORKSPACE,
+                    getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS,
+                            Action.Direction.NONE, ContainerType.WORKSPACE,
                             mWorkspace.getCurrentPage());
                     showOverviewMode(true);
                     mWorkspace.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,
@@ -2790,14 +2792,14 @@
                 // User long pressed on empty space
                 if (mWorkspace.isInOverviewMode()) {
                     mWorkspace.startReordering(v);
-                    getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS,
-                            LauncherLogProto.Action.NONE, LauncherLogProto.OVERVIEW);
+                    getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS,
+                            Action.Direction.NONE, ContainerType.OVERVIEW);
                 } else {
                     if (ignoreLongPressToOverview) {
                         return false;
                     }
-                    getUserEventDispatcher().logActionOnContainer(LauncherLogProto.Action.LONGPRESS,
-                            LauncherLogProto.Action.NONE, LauncherLogProto.WORKSPACE,
+                    getUserEventDispatcher().logActionOnContainer(Action.Touch.LONGPRESS,
+                            Action.Direction.NONE, ContainerType.WORKSPACE,
                             mWorkspace.getCurrentPage());
                     showOverviewMode(true);
                 }
diff --git a/src/com/android/launcher3/OverviewButtonClickListener.java b/src/com/android/launcher3/OverviewButtonClickListener.java
index c98f1d7..dd670d2 100644
--- a/src/com/android/launcher3/OverviewButtonClickListener.java
+++ b/src/com/android/launcher3/OverviewButtonClickListener.java
@@ -2,7 +2,7 @@
 
 import android.view.View;
 
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
 
 /**
  * A specialized listener for Overview buttons where both clicks and long clicks are logged
@@ -11,7 +11,7 @@
 public abstract class OverviewButtonClickListener implements View.OnClickListener,
         View.OnLongClickListener {
 
-    private int mControlType; /** ControlType enum as defined in {@link LauncherLogProto} */
+    private int mControlType; /** ControlType enum as defined in {@link Action.Touch} */
 
     public OverviewButtonClickListener(int controlType) {
         mControlType = controlType;
@@ -25,14 +25,14 @@
     @Override
     public void onClick(View view) {
         if (shouldPerformClick(view)) {
-            handleViewClick(view, LauncherLogProto.Action.TAP);
+            handleViewClick(view, Action.Touch.TAP);
         }
     }
 
     @Override
     public boolean onLongClick(View view) {
         if (shouldPerformClick(view)) {
-            handleViewClick(view, LauncherLogProto.Action.LONGPRESS);
+            handleViewClick(view, Action.Touch.LONGPRESS);
         }
         return true;
     }
diff --git a/src/com/android/launcher3/PinchAnimationManager.java b/src/com/android/launcher3/PinchAnimationManager.java
index 41074be..bae246e 100644
--- a/src/com/android/launcher3/PinchAnimationManager.java
+++ b/src/com/android/launcher3/PinchAnimationManager.java
@@ -24,7 +24,8 @@
 import android.view.View;
 import android.view.animation.LinearInterpolator;
 
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 
 import static com.android.launcher3.Workspace.State.NORMAL;
 import static com.android.launcher3.Workspace.State.OVERVIEW;
@@ -164,14 +165,14 @@
             // Passing threshold 3 ends the pinch and snaps to the new state.
             if (startState == OVERVIEW && goingTowards == NORMAL) {
                 mLauncher.getUserEventDispatcher().logActionOnContainer(
-                        LauncherLogProto.Action.PINCH, LauncherLogProto.Action.NONE,
-                        LauncherLogProto.OVERVIEW, mWorkspace.getCurrentPage());
+                        Action.Touch.PINCH, Action.Direction.NONE,
+                        ContainerType.OVERVIEW, mWorkspace.getCurrentPage());
                 mLauncher.showWorkspace(true);
                 mWorkspace.snapToPage(mWorkspace.getCurrentPage());
             } else if (startState == NORMAL && goingTowards == OVERVIEW) {
                 mLauncher.getUserEventDispatcher().logActionOnContainer(
-                        LauncherLogProto.Action.PINCH, LauncherLogProto.Action.NONE,
-                        LauncherLogProto.WORKSPACE, mWorkspace.getCurrentPage());
+                        Action.Touch.PINCH, Action.Direction.NONE,
+                        ContainerType.WORKSPACE, mWorkspace.getCurrentPage());
                 mLauncher.showOverviewMode(true);
             }
         } else {
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 6520a2b..3cfb3e1 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -73,7 +73,7 @@
 import com.android.launcher3.folder.FolderIcon;
 import com.android.launcher3.graphics.DragPreviewProvider;
 import com.android.launcher3.shortcuts.DeepShortcutsContainer;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 import com.android.launcher3.util.ItemInfoMatcher;
 import com.android.launcher3.util.LongArrayMap;
@@ -188,11 +188,11 @@
     // in all apps or customize mode)
 
     public enum State {
-        NORMAL          (false, false, LauncherLogProto.WORKSPACE),
-        NORMAL_HIDDEN   (false, false, LauncherLogProto.ALLAPPS),
-        SPRING_LOADED   (false, true, LauncherLogProto.WORKSPACE),
-        OVERVIEW        (true, true, LauncherLogProto.OVERVIEW),
-        OVERVIEW_HIDDEN (true, false, LauncherLogProto.WIDGETS);
+        NORMAL          (false, false, ContainerType.WORKSPACE),
+        NORMAL_HIDDEN   (false, false, ContainerType.ALLAPPS),
+        SPRING_LOADED   (false, true, ContainerType.WORKSPACE),
+        OVERVIEW        (true, true, ContainerType.OVERVIEW),
+        OVERVIEW_HIDDEN (true, false, ContainerType.WIDGETS);
 
         public final boolean shouldUpdateWidget;
         public final boolean hasMultipleVisiblePages;
@@ -4155,12 +4155,12 @@
         target.gridX = info.cellX;
         target.gridY = info.cellY;
         target.pageIndex = getCurrentPage();
-        targetParent.containerType = LauncherLogProto.WORKSPACE;
+        targetParent.containerType = ContainerType.WORKSPACE;
         if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
             target.rank = info.rank;
-            targetParent.containerType = LauncherLogProto.HOTSEAT;
+            targetParent.containerType = ContainerType.HOTSEAT;
         } else if (info.container >= 0) {
-            targetParent.containerType = LauncherLogProto.FOLDER;
+            targetParent.containerType = ContainerType.FOLDER;
         }
     }
 
diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
index ab34287..10d4c15 100644
--- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
@@ -29,7 +29,7 @@
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.R;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 
 import java.util.List;
 
@@ -184,7 +184,7 @@
 
     public int getContainerType(View v) {
         if (mApps.hasFilter()) {
-            return LauncherLogProto.SEARCHRESULT;
+            return ContainerType.SEARCHRESULT;
         } else {
             if (v instanceof BubbleTextView) {
                 BubbleTextView icon = (BubbleTextView) v;
@@ -193,11 +193,11 @@
                     List<AlphabeticalAppsList.AdapterItem> items = mApps.getAdapterItems();
                     AlphabeticalAppsList.AdapterItem item = items.get(position);
                     if (item.viewType == AllAppsGridAdapter.VIEW_TYPE_PREDICTION_ICON) {
-                        return LauncherLogProto.PREDICTION;
+                        return ContainerType.PREDICTION;
                     }
                 }
             }
-            return LauncherLogProto.ALLAPPS;
+            return ContainerType.ALLAPPS;
         }
     }
 
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 4667806..99cac41 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -27,6 +27,8 @@
 import com.android.launcher3.Workspace;
 import com.android.launcher3.shortcuts.DeepShortcutsContainer;
 import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 import com.android.launcher3.util.TouchController;
 
 /**
@@ -225,9 +227,9 @@
 
                 if (!mLauncher.isAllAppsVisible()) {
                     mLauncher.getUserEventDispatcher().logActionOnContainer(
-                            LauncherLogProto.Action.FLING,
-                            LauncherLogProto.Action.UP,
-                            LauncherLogProto.HOTSEAT);
+                            Action.Touch.FLING,
+                            Action.Direction.UP,
+                            ContainerType.HOTSEAT);
                 }
                 mLauncher.showAppsView(true /* animated */,
                         false /* updatePredictedApps */,
@@ -245,9 +247,9 @@
                 calculateDuration(velocity, Math.abs(mAppsView.getTranslationY()));
                 if (!mLauncher.isAllAppsVisible()) {
                     mLauncher.getUserEventDispatcher().logActionOnContainer(
-                            LauncherLogProto.Action.SWIPE,
-                            LauncherLogProto.Action.UP,
-                            LauncherLogProto.HOTSEAT);
+                            Action.Touch.SWIPE,
+                            Action.Direction.UP,
+                            ContainerType.HOTSEAT);
                 }
                 mLauncher.showAppsView(true, /* animated */
                         false /* updatePredictedApps */,
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index 7018811..52c6abc 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -76,7 +76,7 @@
 import com.android.launcher3.dragndrop.DragLayer;
 import com.android.launcher3.dragndrop.DragOptions;
 import com.android.launcher3.pageindicators.PageIndicatorDots;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 import com.android.launcher3.util.CircleRevealOutlineProvider;
 import com.android.launcher3.util.Thunk;
@@ -1448,7 +1448,7 @@
         target.gridX = info.cellX;
         target.gridY = info.cellY;
         target.pageIndex = mContent.getCurrentPage();
-        targetParent.containerType = LauncherLogProto.FOLDER;
+        targetParent.containerType = ContainerType.FOLDER;
     }
 
     private class OnScrollHintListener implements OnAlarmListener {
diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java
index f1a12ff..c13e8b3 100644
--- a/src/com/android/launcher3/logging/LoggerUtils.java
+++ b/src/com/android/launcher3/logging/LoggerUtils.java
@@ -1,5 +1,7 @@
 package com.android.launcher3.logging;
 
+import android.util.ArrayMap;
+import android.util.SparseArray;
 import android.view.View;
 
 import com.android.launcher3.ButtonDropTarget;
@@ -8,81 +10,73 @@
 import com.android.launcher3.ItemInfo;
 import com.android.launcher3.LauncherSettings;
 import com.android.launcher3.UninstallDropTarget;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ControlType;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
 /**
- * Debugging helper methods.
- * toString() cannot be overriden inside auto generated {@link LauncherLogProto}.
- * Note: switch statement cannot be replaced with reflection as proguard strips the constants
+ * Helper methods for logging.
  */
 public class LoggerUtils {
-    private static final String TAG = "LoggerUtils";
+    private static final ArrayMap<Class, SparseArray<String>> sNameCache = new ArrayMap<>();
+    private static final String UNKNOWN = "UNKNOWN";
 
-    private static String getCommandStr(Action action) {
-        switch (action.command) {
-            case Action.HOME_INTENT: return "HOME_INTENT";
-            case Action.BACK: return "BACK";
-            default: return "UNKNOWN";
+    private static String getFieldName(int value, Class c) {
+        SparseArray<String> cache;
+        synchronized (sNameCache) {
+            cache = sNameCache.get(c);
+            if (cache == null) {
+                cache = new SparseArray<>();
+                for (Field f : c.getDeclaredFields()) {
+                    if (f.getType() == int.class && Modifier.isStatic(f.getModifiers())) {
+                        try {
+                            f.setAccessible(true);
+                            cache.put(f.getInt(null), f.getName());
+                        } catch (IllegalAccessException e) {
+                            // Ignore
+                        }
+                    }
+                }
+                sNameCache.put(c, cache);
+            }
         }
+        String result = cache.get(value);
+        return result != null ? result : UNKNOWN;
     }
 
-    private static String getTouchStr(Action action) {
-        switch (action.touch) {
-            case Action.TAP: return "TAP";
-            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 getActionStr(LauncherLogProto.Action action) {
+    public static String getActionStr(Action action) {
         switch (action.type) {
-            case Action.TOUCH: return getTouchStr(action);
-            case Action.COMMAND: return getCommandStr(action);
-            default: return "UNKNOWN";
+            case Action.Type.TOUCH: return getFieldName(action.touch, Action.Touch.class);
+            case Action.Type.COMMAND: return getFieldName(action.command, Action.Command.class);
+            default: return UNKNOWN;
         }
     }
 
     public static String getTargetStr(Target t) {
-        String typeStr = "";
         if (t == null){
-            return typeStr;
+            return "";
         }
         switch (t.type) {
-            case Target.ITEM:
+            case Target.Type.ITEM:
                 return getItemStr(t);
-            case Target.CONTROL:
-                return getControlStr(t);
-            case Target.CONTAINER:
-                return getContainerStr(t);
+            case Target.Type.CONTROL:
+                return getFieldName(t.controlType, ControlType.class);
+            case Target.Type.CONTAINER:
+                return getFieldName(t.containerType, ContainerType.class)
+                        + " id=" + t.pageIndex;
             default:
                 return "UNKNOWN TARGET TYPE";
         }
     }
 
     private static String getItemStr(Target t) {
-        String typeStr = "";
-        if (t == null){
-            return typeStr;
-        }
-        switch(t.itemType){
-            case LauncherLogProto.APP_ICON: typeStr = "APPICON"; break;
-            case LauncherLogProto.SHORTCUT: typeStr = "SHORTCUT"; break;
-            case LauncherLogProto.WIDGET: typeStr = "WIDGET"; break;
-            case LauncherLogProto.DEEPSHORTCUT: typeStr = "DEEPSHORTCUT"; break;
-            case LauncherLogProto.FOLDER_ICON: typeStr = "FOLDERICON"; break;
-            case LauncherLogProto.SEARCHBOX: typeStr = "SEARCHBOX"; break;
-            case LauncherLogProto.EDITTEXT: typeStr = "EDITTEXT"; break;
-
-            default: typeStr = "UNKNOWN";
-        }
-
+        String typeStr = getFieldName(t.itemType, ItemType.class);
         if (t.packageNameHash != 0) {
             typeStr += ", packageHash=" + t.packageNameHash;
         }
@@ -95,88 +89,32 @@
         if (t.spanX != 0) {
             typeStr += ", spanX=" + t.spanX;
         }
-        return typeStr += ", grid=(" + t.gridX + "," + t.gridY + "), id=" + t.pageIndex;
-    }
-
-    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";
-            case LauncherLogProto.WALLPAPER_BUTTON: return "WALLPAPER_BUTTON";
-            case LauncherLogProto.SETTINGS_BUTTON: return "SETTINGS_BUTTON";
-            case LauncherLogProto.REMOVE_TARGET: return "REMOVE_TARGET";
-            case LauncherLogProto.UNINSTALL_TARGET: return "UNINSTALL_TARGET";
-            case LauncherLogProto.APPINFO_TARGET: return "APPINFO_TARGET";
-            case LauncherLogProto.RESIZE_HANDLE: return "RESIZE_HANDLE";
-            default: return "UNKNOWN";
-        }
-    }
-
-    private static String getContainerStr(LauncherLogProto.Target t) {
-        String str = "";
-        if (t == null) {
-            return str;
-        }
-        switch (t.containerType) {
-            case LauncherLogProto.WORKSPACE:
-                str = "WORKSPACE";
-                break;
-            case LauncherLogProto.HOTSEAT:
-                str = "HOTSEAT";
-                break;
-            case LauncherLogProto.FOLDER:
-                str = "FOLDER";
-                break;
-            case LauncherLogProto.ALLAPPS:
-                str = "ALLAPPS";
-                break;
-            case LauncherLogProto.WIDGETS:
-                str = "WIDGETS";
-                break;
-            case LauncherLogProto.OVERVIEW:
-                str = "OVERVIEW";
-                break;
-            case LauncherLogProto.PREDICTION:
-                str = "PREDICTION";
-                break;
-            case LauncherLogProto.SEARCHRESULT:
-                str = "SEARCHRESULT";
-                break;
-            case LauncherLogProto.DEEPSHORTCUTS:
-                str = "DEEPSHORTCUTS";
-                break;
-            default:
-                str = "UNKNOWN";
-        }
-        return str + " id=" + t.pageIndex;
+        return typeStr + ", grid=(" + t.gridX + "," + t.gridY + "), id=" + t.pageIndex;
     }
 
     public static Target newItemTarget(View v) {
         return (v.getTag() instanceof ItemInfo)
                 ? newItemTarget((ItemInfo) v.getTag())
-                : newTarget(Target.ITEM);
+                : newTarget(Target.Type.ITEM);
     }
 
     public static Target newItemTarget(ItemInfo info) {
-        Target t = newTarget(Target.ITEM);
+        Target t = newTarget(Target.Type.ITEM);
         switch (info.itemType) {
             case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
-                t.itemType = LauncherLogProto.APP_ICON;
+                t.itemType = ItemType.APP_ICON;
                 break;
             case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
-                t.itemType = LauncherLogProto.SHORTCUT;
+                t.itemType = ItemType.SHORTCUT;
                 break;
             case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
-                t.itemType = LauncherLogProto.FOLDER_ICON;
+                t.itemType = ItemType.FOLDER_ICON;
                 break;
             case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
-                t.itemType = LauncherLogProto.WIDGET;
+                t.itemType = ItemType.WIDGET;
                 break;
             case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:
-                t.itemType = LauncherLogProto.DEEPSHORTCUT;
+                t.itemType = ItemType.DEEPSHORTCUT;
                 break;
         }
         return t;
@@ -184,26 +122,26 @@
 
     public static Target newDropTarget(View v) {
         if (!(v instanceof ButtonDropTarget)) {
-            return newTarget(Target.CONTAINER);
+            return newTarget(Target.Type.CONTAINER);
         }
-        Target t = newTarget(Target.CONTROL);
+        Target t = newTarget(Target.Type.CONTROL);
         if (v instanceof InfoDropTarget) {
-            t.controlType = LauncherLogProto.APPINFO_TARGET;
+            t.controlType = ControlType.APPINFO_TARGET;
         } else if (v instanceof UninstallDropTarget) {
-            t.controlType = LauncherLogProto.UNINSTALL_TARGET;
+            t.controlType = ControlType.UNINSTALL_TARGET;
         } else if (v instanceof DeleteDropTarget) {
-            t.controlType = LauncherLogProto.REMOVE_TARGET;
+            t.controlType = ControlType.REMOVE_TARGET;
         }
         return t;
     }
 
     public static Target newTarget(int targetType) {
-        Target t = new LauncherLogProto.Target();
+        Target t = new Target();
         t.type = targetType;
         return t;
     }
     public static Target newContainerTarget(int containerType) {
-        Target t = newTarget(Target.CONTAINER);
+        Target t = newTarget(Target.Type.CONTAINER);
         t.containerType = containerType;
         return t;
     }
@@ -214,18 +152,18 @@
         return a;
     }
     public static Action newCommandAction(int command) {
-        Action a = newAction(Action.COMMAND);
+        Action a = newAction(Action.Type.COMMAND);
         a.command = command;
         return a;
     }
     public static Action newTouchAction(int touch) {
-        Action a = newAction(Action.TOUCH);
+        Action a = newAction(Action.Type.TOUCH);
         a.touch = touch;
         return a;
     }
 
     public static LauncherEvent newLauncherEvent(Action action, Target... srcTargets) {
-        LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent();
+        LauncherEvent event = new LauncherEvent();
         event.srcTarget = srcTargets;
         event.action = action;
         return event;
diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java
index 4bc5819..8ded6b8 100644
--- a/src/com/android/launcher3/logging/UserEventDispatcher.java
+++ b/src/com/android/launcher3/logging/UserEventDispatcher.java
@@ -27,8 +27,8 @@
 import com.android.launcher3.ItemInfo;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.config.ProviderConfig;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 import com.android.launcher3.util.ComponentKey;
@@ -54,7 +54,9 @@
 
     private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5;
 
-    private final boolean mIsVerbose;
+    private static final String TAG = "UserEvent";
+    private static final boolean IS_VERBOSE =
+            ProviderConfig.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(TAG);
 
     /**
      * Implemented by containers to provide a container source for a given child.
@@ -76,8 +78,7 @@
      * Recursively finds the parent of the given child which implements IconLogInfoProvider
      */
     public static LogContainerProvider getLaunchProviderRecursive(View v) {
-        ViewParent parent = null;
-
+        ViewParent parent;
         if (v != null) {
             parent = v.getParent();
         } else {
@@ -96,8 +97,6 @@
         return null;
     }
 
-    private String TAG = "UserEvent";
-
     private long mElapsedContainerMillis;
     private long mElapsedSessionMillis;
     private long mActionDurationMillis;
@@ -105,14 +104,6 @@
     // Used for filling in predictedRank on {@link Target}s.
     private List<ComponentKey> mPredictedApps;
 
-    public UserEventDispatcher() {
-        if (ProviderConfig.IS_DOGFOOD_BUILD) {
-            mIsVerbose = Utilities.isPropertyEnabled(TAG);
-        } else {
-            mIsVerbose = false;
-        }
-    }
-
     //                      APP_ICON    SHORTCUT    WIDGET
     // --------------------------------------------------------------
     // packageNameHash      required    optional    required
@@ -121,8 +112,8 @@
     // --------------------------------------------------------------
 
     protected LauncherEvent createLauncherEvent(View v, Intent intent) {
-        LauncherEvent event = newLauncherEvent(newTouchAction(Action.TAP),
-                newItemTarget(v), newTarget(Target.CONTAINER));
+        LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.TAP),
+                newItemTarget(v), newTarget(Target.Type.CONTAINER));
 
         // TODO: make idx percolate up the view hierarchy if needed.
         int idx = 0;
@@ -176,20 +167,21 @@
      * TODO: Make this function work when a container view is passed as the 2nd param.
      */
     public void logActionCommand(int command, View itemView, int containerType) {
-        LauncherEvent event = newLauncherEvent(
-                newCommandAction(command), newItemTarget(itemView), newTarget(Target.CONTAINER));
+        LauncherEvent event = newLauncherEvent(newCommandAction(command),
+                newItemTarget(itemView), newTarget(Target.Type.CONTAINER));
 
         if (fillInLogContainerData(event, itemView)) {
             // TODO: Remove the following two lines once fillInLogContainerData can take in a
             // container view.
-            event.srcTarget[0].type = Target.CONTAINER;
+            event.srcTarget[0].type = Target.Type.CONTAINER;
             event.srcTarget[0].containerType = containerType;
         }
         dispatchUserEvent(event, null);
     }
 
     public void logActionOnControl(int action, int controlType) {
-        LauncherEvent event = newLauncherEvent(newTouchAction(action), newTarget(Target.CONTROL));
+        LauncherEvent event = newLauncherEvent(
+                newTouchAction(action), newTarget(Target.Type.CONTROL));
         event.srcTarget[0].controlType = controlType;
         dispatchUserEvent(event, null);
     }
@@ -212,8 +204,8 @@
             return;
         }
         ItemInfo info = (ItemInfo) icon.getTag();
-        LauncherEvent event = newLauncherEvent(
-                newTouchAction(Action.LONGPRESS), newItemTarget(info), newTarget(Target.CONTAINER));
+        LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.LONGPRESS),
+                newItemTarget(info), newTarget(Target.Type.CONTAINER));
         provider.fillInLogContainerData(icon, info, event.srcTarget[0], event.srcTarget[1]);
         dispatchUserEvent(event, null);
 
@@ -227,16 +219,16 @@
     /* Currently we are only interested in whether this event happens or not and don't
     * care about which screen moves to where. */
     public void logOverviewReorder() {
-        LauncherEvent event = newLauncherEvent(newTouchAction(Action.DRAGDROP),
-                newContainerTarget(LauncherLogProto.WORKSPACE),
-                newContainerTarget(LauncherLogProto.OVERVIEW));
+        LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP),
+                newContainerTarget(ContainerType.WORKSPACE),
+                newContainerTarget(ContainerType.OVERVIEW));
         dispatchUserEvent(event, null);
     }
 
     public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) {
-        LauncherEvent event = newLauncherEvent(newTouchAction(Action.DRAGDROP),
-                newItemTarget(dragObj.originalDragInfo), newTarget(Target.CONTAINER));
-        event.destTarget = new LauncherLogProto.Target[] {
+        LauncherEvent event = newLauncherEvent(newTouchAction(Action.Touch.DRAGDROP),
+                newItemTarget(dragObj.originalDragInfo), newTarget(Target.Type.CONTAINER));
+        event.destTarget = new Target[] {
                 newItemTarget(dragObj.originalDragInfo), newDropTarget(dropTargetAsView)
         };
 
@@ -272,26 +264,26 @@
         ev.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis;
         ev.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis;
 
-        if (!mIsVerbose) {
+        if (!IS_VERBOSE) {
             return;
         }
-        Log.d(TAG, String.format(Locale.US,
-                "\naction:%s\n Source child:%s\tparent:%s",
-                LoggerUtils.getActionStr(ev.action),
-                LoggerUtils.getTargetStr(ev.srcTarget != null ? ev.srcTarget[0] : null),
-                LoggerUtils.getTargetStr(ev.srcTarget != null && ev.srcTarget.length > 1 ?
-                        ev.srcTarget[1] : null)));
-        if (ev.destTarget != null && ev.destTarget.length > 0) {
-            Log.d(TAG, String.format(Locale.US,
-                    " Destination child:%s\tparent:%s",
-                    LoggerUtils.getTargetStr(ev.destTarget != null ? ev.destTarget[0] : null),
-                    LoggerUtils.getTargetStr(ev.destTarget != null && ev.destTarget.length > 1 ?
-                            ev.destTarget[1] : null)));
+        String log = "action:" + LoggerUtils.getActionStr(ev.action);
+        if (ev.srcTarget != null && ev.srcTarget.length > 0) {
+            log += "\n Source " + getTargetsStr(ev.srcTarget);
         }
-        Log.d(TAG, String.format(Locale.US,
-                " Elapsed container %d ms session %d ms action %d ms",
+        if (ev.destTarget != null && ev.destTarget.length > 0) {
+            log += "\n Destination " + getTargetsStr(ev.destTarget);
+        }
+        log += String.format(Locale.US,
+                "\n Elapsed container %d ms session %d ms action %d ms",
                 ev.elapsedContainerMillis,
                 ev.elapsedSessionMillis,
-                ev.actionDurationMillis));
+                ev.actionDurationMillis);
+        Log.d(TAG, log);
+    }
+
+    private static String getTargetsStr(Target[] targets) {
+        return "child:" + LoggerUtils.getTargetStr(targets[0]) +
+                (targets.length > 1 ? "\tparent:" + LoggerUtils.getTargetStr(targets[1]) : "");
     }
 }
diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
index a253492..9cbd5f8 100644
--- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
+++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java
@@ -66,7 +66,8 @@
 import com.android.launcher3.dragndrop.DragOptions;
 import com.android.launcher3.dragndrop.DragView;
 import com.android.launcher3.graphics.TriangleShape;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ItemType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 
 import java.util.Collections;
@@ -523,9 +524,9 @@
 
     @Override
     public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) {
-        target.itemType = LauncherLogProto.DEEPSHORTCUT;
+        target.itemType = ItemType.DEEPSHORTCUT;
         // TODO: add target.rank
-        targetParent.containerType = LauncherLogProto.DEEPSHORTCUTS;
+        targetParent.containerType = ContainerType.DEEPSHORTCUTS;
     }
 
     @Override
diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java
index d0ead48..310c1df 100644
--- a/src/com/android/launcher3/widget/WidgetsContainerView.java
+++ b/src/com/android/launcher3/widget/WidgetsContainerView.java
@@ -46,6 +46,7 @@
 import com.android.launcher3.model.PackageItemInfo;
 import com.android.launcher3.model.WidgetItem;
 import com.android.launcher3.userevent.nano.LauncherLogProto;
+import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
 import com.android.launcher3.util.MultiHashMap;
 import com.android.launcher3.util.Thunk;
@@ -309,6 +310,6 @@
 
     @Override
     public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) {
-        targetParent.containerType = LauncherLogProto.WIDGETS;
+        targetParent.containerType = ContainerType.WIDGETS;
     }
 }
\ No newline at end of file
diff --git a/src_config/com/android/launcher3/config/ProviderConfig.java b/src_config/com/android/launcher3/config/ProviderConfig.java
index 1d964b1..491fa65 100644
--- a/src_config/com/android/launcher3/config/ProviderConfig.java
+++ b/src_config/com/android/launcher3/config/ProviderConfig.java
@@ -20,5 +20,5 @@
 
     public static final String AUTHORITY = "com.android.launcher3.settings".intern();
 
-    public static boolean IS_DOGFOOD_BUILD = true;
+    public static final boolean IS_DOGFOOD_BUILD = true;
 }