Add user event log for deep shortcuts and all apps opening interaction.
b/30114798 Change-Id: I11ad99d0bc1983294d6a5329b98917cb87250823
This commit is contained in:
parent
06580312ed
commit
5aa2714959
|
@ -61,6 +61,7 @@ enum ItemType {
|
|||
SHORTCUT = 2;
|
||||
WIDGET = 3;
|
||||
FOLDER_ICON = 4;
|
||||
DEEPSHORTCUT = 5;
|
||||
}
|
||||
|
||||
// Used to define what type of container a Target would represent.
|
||||
|
@ -74,6 +75,7 @@ enum ContainerType {
|
|||
OVERVIEW = 6;
|
||||
PREDICTION = 7;
|
||||
SEARCHRESULT = 8;
|
||||
DEEPSHORTCUTS = 9;
|
||||
}
|
||||
|
||||
// Used to define what type of control a Target would represent.
|
||||
|
@ -106,8 +108,16 @@ message Action {
|
|||
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 @@ message LauncherEvent {
|
|||
optional int64 action_duration_millis = 4;
|
||||
optional int64 elapsed_container_millis = 5;
|
||||
optional int64 elapsed_session_millis = 6;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -117,6 +117,7 @@ import com.android.launcher3.model.WidgetsModel;
|
|||
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 @@ public class Launcher extends Activity
|
|||
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 @@ public class Launcher extends Activity
|
|||
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 */);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ import com.android.launcher3.PagedView;
|
|||
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 @@ public class AllAppsTransitionController implements TouchController, VerticalPul
|
|||
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 @@ public class AllAppsTransitionController implements TouchController, VerticalPul
|
|||
} 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);
|
||||
|
|
|
@ -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 @@ public class LoggerUtils {
|
|||
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 @@ public class LoggerUtils {
|
|||
|
||||
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 @@ public class LoggerUtils {
|
|||
}
|
||||
|
||||
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 @@ public class LoggerUtils {
|
|||
}
|
||||
|
||||
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 @@ public class LoggerUtils {
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,8 +37,8 @@ import java.util.Locale;
|
|||
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 @@ public class UserEventDispatcher {
|
|||
|
||||
/**
|
||||
* 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 @@ public class UserEventDispatcher {
|
|||
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 class UserEventDispatcher {
|
|||
public final void resetElapsedSessionMillis() {
|
||||
mElapsedSessionMillis = System.currentTimeMillis();
|
||||
mElapsedContainerMillis = System.currentTimeMillis();
|
||||
|
||||
}
|
||||
|
||||
public final void resetActionDurationMillis() {
|
||||
|
@ -164,8 +175,8 @@ public class UserEventDispatcher {
|
|||
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));
|
||||
}
|
||||
|
|
|
@ -486,10 +486,8 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
|
|||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue