From 55c6691e3a2e953dc9882ad0bc0a4c1ee2d42e67 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 1 Aug 2016 16:42:19 -0700 Subject: [PATCH] Add logging for shortcuts opening. - Log as long press with child type DEEPSHORTCUTS container - Parent type can be one of WORKSPACE, HOTSEAT, FOLDER, ALLAPPS, PREDICTION, or SEARCHRESULT. Bug: 30537079 Change-Id: Ie62e4889ee06c845f959ca998781787a7fdaf00e --- .../allapps/AllAppsRecyclerView.java | 14 +++++----- src/com/android/launcher3/folder/Folder.java | 1 + .../launcher3/logging/LoggerUtils.java | 4 +++ .../logging/UserEventDispatcher.java | 14 +++++++++- .../shortcuts/DeepShortcutsContainer.java | 27 ++++++++++++++++++- 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index 641656c90b..55f544caac 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -29,10 +29,10 @@ import com.android.launcher3.BubbleTextView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.logging.UserEventDispatcher.LaunchSourceProvider; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; + import java.util.List; /** @@ -208,8 +208,12 @@ public class AllAppsRecyclerView extends BaseRecyclerView @Override public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + targetParent.containerType = getContainerType(v); + } + + public int getContainerType(View v) { if (mApps.hasFilter()) { - targetParent.containerType = LauncherLogProto.SEARCHRESULT; + return LauncherLogProto.SEARCHRESULT; } else { if (v instanceof BubbleTextView) { BubbleTextView icon = (BubbleTextView) v; @@ -218,13 +222,11 @@ public class AllAppsRecyclerView extends BaseRecyclerView List items = mApps.getAdapterItems(); AlphabeticalAppsList.AdapterItem item = items.get(position); if (item.viewType == AllAppsGridAdapter.VIEW_TYPE_PREDICTION_ICON) { - targetParent.containerType = LauncherLogProto.PREDICTION; - return; + return LauncherLogProto.PREDICTION; } } } - - targetParent.containerType = LauncherLogProto.ALLAPPS; + return LauncherLogProto.ALLAPPS; } } diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index fdbb214309..3684136639 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -585,6 +585,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList public void run() { mContent.setLayerType(LAYER_TYPE_NONE, null); mFooter.setLayerType(LAYER_TYPE_NONE, null); + mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); } }; } diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index 9e927218b3..aad266b7b5 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -50,6 +50,7 @@ public class LoggerUtils { case LauncherLogProto.APP_ICON: typeStr = "ICON"; break; case LauncherLogProto.SHORTCUT: typeStr = "SHORTCUT"; break; case LauncherLogProto.WIDGET: typeStr = "WIDGET"; break; + case LauncherLogProto.DEEPSHORTCUT: typeStr = "DEEPSHORTCUT"; break; default: typeStr = "UNKNOWN"; } @@ -106,6 +107,9 @@ public class LoggerUtils { case LauncherLogProto.SEARCHRESULT: str = "SEARCHRESULT"; break; + case LauncherLogProto.DEEPSHORTCUTS: + str = "DEEPSHORTCUTS"; + break; default: str = "UNKNOWN"; } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index f67f487916..e780cc91b9 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -23,6 +23,7 @@ import android.view.View; import android.view.ViewParent; import com.android.launcher3.ItemInfo; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -146,6 +147,17 @@ public class UserEventDispatcher { dispatchUserEvent(event, null); } + public void logDeepShortcutsOpen(int containerType) { + LauncherEvent event = LoggerUtils.initLauncherEvent( + Action.TOUCH, Target.ITEM, Target.CONTAINER); + event.action.touch = Action.LONGPRESS; + event.srcTarget[0].itemType = LauncherLogProto.DEEPSHORTCUT; + event.srcTarget[1].containerType = containerType; + event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis; + event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis; + dispatchUserEvent(event, null); + } + public void logDragNDrop() { // TODO } @@ -172,7 +184,7 @@ public class UserEventDispatcher { public void dispatchUserEvent(LauncherEvent ev, Intent intent) { if (DEBUG_LOGGING) { - Log.d("UserEvent", String.format(Locale.US, + Log.d(TAG, 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 != null ? ev.srcTarget[0] : null), diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java index 819a653328..53a28de427 100644 --- a/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java +++ b/src/com/android/launcher3/shortcuts/DeepShortcutsContainer.java @@ -27,13 +27,13 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.graphics.drawable.ShapeDrawable; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.AttributeSet; +import android.util.Log; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; @@ -53,6 +53,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAnimUtils; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; +import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherViewPropertyAnimator; import com.android.launcher3.LogAccelerateInterpolator; import com.android.launcher3.R; @@ -60,10 +61,12 @@ import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.Workspace; import com.android.launcher3.accessibility.ShortcutMenuAccessibilityDelegate; +import com.android.launcher3.allapps.AllAppsRecyclerView; import com.android.launcher3.compat.UserHandleCompat; import com.android.launcher3.dragndrop.DragController; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragView; +import com.android.launcher3.folder.Folder; import com.android.launcher3.graphics.TriangleShape; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.userevent.nano.LauncherLogProto; @@ -734,11 +737,33 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC container.populateAndShow(icon, ids); icon.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); + logOpen(launcher, icon); return container; } return null; } + private static void logOpen(Launcher launcher, View icon) { + ItemInfo info = (ItemInfo) icon.getTag(); + long iconContainer = info.container; + Folder openFolder = launcher.getWorkspace().getOpenFolder(); + int containerType; + if (iconContainer == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + containerType = LauncherLogProto.WORKSPACE; + } else if (iconContainer == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { + containerType = LauncherLogProto.HOTSEAT; + } else if (openFolder != null && iconContainer == openFolder.getInfo().id) { + containerType = LauncherLogProto.FOLDER; + } else if (icon.getParent() instanceof AllAppsRecyclerView) { + containerType = ((AllAppsRecyclerView) icon.getParent()).getContainerType(icon); + } else { + // This should not happen. + Log.w(TAG, "Couldn't determine parent of shortcut container"); + containerType = LauncherLogProto.DEFAULT_CONTAINERTYPE; + } + launcher.getUserEventDispatcher().logDeepShortcutsOpen(containerType); + } + /** * Extension of {@link ShortcutInfo} which does not badge the icons. */