diff options
author | Hyunyoung Song <hyunyoungs@google.com> | 2016-09-01 12:47:12 -0700 |
---|---|---|
committer | Hyunyoung Song <hyunyoungs@google.com> | 2016-09-01 12:47:12 -0700 |
commit | 59a238095e82fd02355f4cb53abe01655a50b051 (patch) | |
tree | 59aed70bde91588fff3a51c2940c42fb814d6d07 /src/com/android/launcher3/logging | |
parent | 4a4b49ff3482cbe7f8192807cdc99437810fe518 (diff) | |
download | android_packages_apps_Trebuchet-59a238095e82fd02355f4cb53abe01655a50b051.tar.gz android_packages_apps_Trebuchet-59a238095e82fd02355f4cb53abe01655a50b051.tar.bz2 android_packages_apps_Trebuchet-59a238095e82fd02355f4cb53abe01655a50b051.zip |
Support user event logging for drag and drop
b/30039490
Supported in this CL:
- DnD: drag from container [WORKSPACE|HOTSEAT|FOLDER|ALLAPPS|WIDGETS|DEEPSHORTCUTS]
drag to container [HOTSEAT,WORKSPACE,FOLDER,DROPTARGETS]
- Source and target can be [FOLDER_ICON, ICON, DEEPSHORTCUT, WIDGET]
- $ adb shell setprop log.tag.UserEvent DEBUG will turn on debugging
Change-Id: I0b8b879b80e6dce85bbde6e7794f9e0677832603
Diffstat (limited to 'src/com/android/launcher3/logging')
-rw-r--r-- | src/com/android/launcher3/logging/LoggerUtils.java | 63 | ||||
-rw-r--r-- | src/com/android/launcher3/logging/UserEventDispatcher.java | 106 |
2 files changed, 132 insertions, 37 deletions
diff --git a/src/com/android/launcher3/logging/LoggerUtils.java b/src/com/android/launcher3/logging/LoggerUtils.java index dc045977d..845dbc2bc 100644 --- a/src/com/android/launcher3/logging/LoggerUtils.java +++ b/src/com/android/launcher3/logging/LoggerUtils.java @@ -2,8 +2,12 @@ package com.android.launcher3.logging; import android.view.View; +import com.android.launcher3.ButtonDropTarget; +import com.android.launcher3.DeleteDropTarget; +import com.android.launcher3.InfoDropTarget; 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.Target; @@ -164,14 +168,35 @@ public class LoggerUtils { return event; } - private static Target initTarget(View v) { + /** + * Used for drag and drop interaction. + */ + public static LauncherLogProto.LauncherEvent initLauncherEvent( + int actionType, + View v, + ItemInfo info, + int parentSrcTargetType, + View parentDestTargetType){ + LauncherLogProto.LauncherEvent event = new LauncherLogProto.LauncherEvent(); + + event.srcTarget = new LauncherLogProto.Target[2]; + event.srcTarget[0] = initTarget(v, info); + event.srcTarget[1] = new LauncherLogProto.Target(); + event.srcTarget[1].type = parentSrcTargetType; + + event.destTarget = new LauncherLogProto.Target[2]; + event.destTarget[0] = initTarget(v, info); + event.destTarget[1] = initDropTarget(parentDestTargetType); + + event.action = new LauncherLogProto.Action(); + event.action.type = actionType; + return event; + } + + private static Target initTarget(View v, ItemInfo info) { Target t = new LauncherLogProto.Target(); t.type = Target.ITEM; - if (!(v.getTag() instanceof ItemInfo)) { - return t; - } - ItemInfo itemInfo = (ItemInfo) v.getTag(); - switch (itemInfo.itemType) { + switch (info.itemType) { case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: t.itemType = LauncherLogProto.APP_ICON; break; @@ -190,4 +215,30 @@ public class LoggerUtils { } return t; } + + private static Target initDropTarget(View v) { + Target t = new LauncherLogProto.Target(); + t.type = (v instanceof ButtonDropTarget)? Target.CONTROL : Target.CONTAINER; + if (t.type == Target.CONTAINER) { + return t; + } + + if (v instanceof InfoDropTarget) { + t.controlType = LauncherLogProto.APPINFO_TARGET; + } else if (v instanceof UninstallDropTarget) { + t.controlType = LauncherLogProto.UNINSTALL_TARGET; + } else if (v instanceof DeleteDropTarget) { + t.controlType = LauncherLogProto.REMOVE_TARGET; + } + return t; + } + + private static Target initTarget(View v) { + Target t = new LauncherLogProto.Target(); + t.type = Target.ITEM; + if (!(v.getTag() instanceof ItemInfo)) { + return t; + } + return initTarget(v, (ItemInfo) v.getTag()); + } } diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index e4cc182cf..0356a9c7b 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -18,12 +18,15 @@ package com.android.launcher3.logging; import android.content.ComponentName; import android.content.Intent; +import android.os.SystemClock; import android.util.Log; import android.view.View; import android.view.ViewParent; +import com.android.launcher3.DropTarget; import com.android.launcher3.ItemInfo; -import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.Utilities; +import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.LauncherEvent; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -37,10 +40,15 @@ import java.util.Locale; */ public class UserEventDispatcher { - private static final boolean DEBUG_LOGGING = false; private final static int MAXIMUM_VIEW_HIERARCHY_LEVEL = 5; + private final boolean mIsVerbose; + /** + * TODO: change the name of this interface to LogContainerProvider + * and the method name to fillInLogContainerData. Not changed to minimize CL diff + * in this branch. + * * Implemented by containers to provide a launch source for a given child. */ public interface LaunchSourceProvider { @@ -61,6 +69,7 @@ public class UserEventDispatcher { */ public static LaunchSourceProvider getLaunchProviderRecursive(View v) { ViewParent parent = null; + if (v != null) { parent = v.getParent(); } else { @@ -88,6 +97,14 @@ public class UserEventDispatcher { // 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 @@ -104,7 +121,7 @@ public class UserEventDispatcher { // TODO: make this percolate up the view hierarchy if needed. int idx = 0; LaunchSourceProvider provider = getLaunchProviderRecursive(v); - if (!(v.getTag() instanceof ItemInfo)) { + if (v == null || !(v.getTag() instanceof ItemInfo) || provider == null) { return null; } ItemInfo itemInfo = (ItemInfo) v.getTag(); @@ -122,8 +139,8 @@ public class UserEventDispatcher { } // Fill in the duration of time spent navigating in Launcher and the container. - event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis; - event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis; + event.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; + event.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; return event; } @@ -139,8 +156,8 @@ public class UserEventDispatcher { 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; + event.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; + event.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; dispatchUserEvent(event, null); } @@ -149,8 +166,8 @@ public class UserEventDispatcher { event.action.touch = action; event.action.dir = dir; event.srcTarget[0].containerType = containerType; - event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis; - event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis; + event.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; + event.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; dispatchUserEvent(event, null); } @@ -158,14 +175,14 @@ public class UserEventDispatcher { LauncherEvent event = LoggerUtils.initLauncherEvent( Action.TOUCH, icon, Target.CONTAINER); LaunchSourceProvider provider = getLaunchProviderRecursive(icon); - if (!(icon.getTag() instanceof ItemInfo)) { + if (icon == null && !(icon.getTag() instanceof ItemInfo)) { return; } ItemInfo info = (ItemInfo) icon.getTag(); provider.fillInLaunchSourceData(icon, info, event.srcTarget[0], event.srcTarget[1]); event.action.touch = Action.LONGPRESS; - event.elapsedContainerMillis = System.currentTimeMillis() - mElapsedContainerMillis; - event.elapsedSessionMillis = System.currentTimeMillis() - mElapsedSessionMillis; + event.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; + event.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; dispatchUserEvent(event, null); } @@ -173,39 +190,66 @@ public class UserEventDispatcher { mPredictedApps = predictedApps; } + public void logDragNDrop(DropTarget.DragObject dragObj, View dropTargetAsView) { + LauncherEvent event = LoggerUtils.initLauncherEvent(Action.TOUCH, + dragObj.dragView, + dragObj.originalDragInfo, + Target.CONTAINER, + dropTargetAsView); + event.action.touch = Action.DRAGDROP; + + dragObj.dragSource.fillInLaunchSourceData(null, dragObj.originalDragInfo, + event.srcTarget[0], event.srcTarget[1]); + + if (dropTargetAsView instanceof LaunchSourceProvider) { + ((LaunchSourceProvider) dropTargetAsView).fillInLaunchSourceData(null, + dragObj.dragInfo, event.destTarget[0], event.destTarget[1]); + + } + + event.elapsedContainerMillis = SystemClock.uptimeMillis() - mElapsedContainerMillis; + event.elapsedSessionMillis = SystemClock.uptimeMillis() - mElapsedSessionMillis; + event.actionDurationMillis = SystemClock.uptimeMillis() - mActionDurationMillis; + dispatchUserEvent(event, null); + } + /** * Currently logs following containers: workspace, allapps, widget tray. */ public final void resetElapsedContainerMillis() { - mElapsedContainerMillis = System.currentTimeMillis(); + mElapsedContainerMillis = SystemClock.uptimeMillis(); } public final void resetElapsedSessionMillis() { - mElapsedSessionMillis = System.currentTimeMillis(); - mElapsedContainerMillis = System.currentTimeMillis(); + mElapsedSessionMillis = SystemClock.uptimeMillis(); + mElapsedContainerMillis = SystemClock.uptimeMillis(); } public final void resetActionDurationMillis() { - mActionDurationMillis = System.currentTimeMillis(); + mActionDurationMillis = SystemClock.uptimeMillis(); } public void dispatchUserEvent(LauncherEvent ev, Intent intent) { - if (DEBUG_LOGGING) { - 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.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.length > 1 ? ev.destTarget[1] : null))); - } + if (!mIsVerbose) { + 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, - " Elapsed container %d ms session %d ms", - ev.elapsedContainerMillis, - ev.elapsedSessionMillis)); + " 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))); } + Log.d(TAG, String.format(Locale.US, + " Elapsed container %d ms session %d ms action %d ms", + ev.elapsedContainerMillis, + ev.elapsedSessionMillis, + ev.actionDurationMillis)); } } |