From ff48451ecd6dc161fa1caa607764444673ad973b Mon Sep 17 00:00:00 2001 From: thiruram Date: Mon, 11 May 2020 11:19:58 -0700 Subject: [PATCH] Adds westworld logging events for drag and drop on target bar buttons. This would add below set of LauncherEvents: * LAUNCHER_ITEM_DROPPED_ON_REMOVE * LAUNCHER_ITEM_DROPPED_ON_CANCEL * LAUNCHER_ITEM_DROPPED_ON_DONT_SUGGEST * LAUNCHER_ITEM_DROPPED_ON_UNINSTALL * LAUNCHER_ITEM_UNINSTALL_COMPLETED * LAUNCHER_ITEM_UNINSTALL_CANCELLED Sample Logs: https://docs.google.com/document/d/1CBP2yTcXdFhPdNG5ZmWFKSgd8mDbMevY-akVlUXPLDo/edit#bookmark=id.3ndtl1dalhdt Bug: 152978018 Change-Id: I055a1b001524753eea71384b4765522f5946fbbc --- .../android/launcher3/DeleteDropTarget.java | 11 +++++ .../launcher3/SecondaryDropTarget.java | 16 ++++++- .../launcher3/logging/StatsLogManager.java | 45 +++++++++++++++++-- .../launcher3/model/data/ItemInfo.java | 2 +- 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java index b4c5f96acb..d75d712280 100644 --- a/src/com/android/launcher3/DeleteDropTarget.java +++ b/src/com/android/launcher3/DeleteDropTarget.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_CANCEL; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_REMOVE; import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch.TAP; import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.UNDO; @@ -27,6 +29,7 @@ import android.view.View; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.logging.LoggerUtils; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.ModelWriter; import com.android.launcher3.model.data.FolderInfo; import com.android.launcher3.model.data.ItemInfo; @@ -38,6 +41,8 @@ import com.android.launcher3.views.Snackbar; public class DeleteDropTarget extends ButtonDropTarget { + private final StatsLogManager mStatsLogManager; + private int mControlType = ControlType.DEFAULT_CONTROLTYPE; public DeleteDropTarget(Context context, AttributeSet attrs) { @@ -46,6 +51,7 @@ public class DeleteDropTarget extends ButtonDropTarget { public DeleteDropTarget(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + this.mStatsLogManager = StatsLogManager.newInstance(context); } @Override @@ -120,6 +126,11 @@ public class DeleteDropTarget extends ButtonDropTarget { d.dragInfo.container = NO_ID; } super.onDrop(d, options); + mStatsLogManager.log( + mControlType == ControlType.REMOVE_TARGET + ? LAUNCHER_ITEM_DROPPED_ON_REMOVE + : LAUNCHER_ITEM_DROPPED_ON_CANCEL, + d.logInstanceId); } @Override diff --git a/src/com/android/launcher3/SecondaryDropTarget.java b/src/com/android/launcher3/SecondaryDropTarget.java index 9dbb5fc675..fbac0bd32a 100644 --- a/src/com/android/launcher3/SecondaryDropTarget.java +++ b/src/com/android/launcher3/SecondaryDropTarget.java @@ -7,6 +7,10 @@ import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.DISMISS_PREDICTION; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.RECONFIGURE; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.UNINSTALL; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_DONT_SUGGEST; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROPPED_ON_UNINSTALL; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_UNINSTALL_CANCELLED; +import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_UNINSTALL_COMPLETED; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_SYSTEM_MASK; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_SYSTEM_NO; @@ -34,6 +38,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.LoggerUtils; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.ItemInfoWithIcon; @@ -58,7 +63,7 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList private static final long CACHE_EXPIRE_TIMEOUT = 5000; private final ArrayMap mUninstallDisabledCache = new ArrayMap<>(1); - + private final StatsLogManager mStatsLogManager; private final Alarm mCacheExpireAlarm; private boolean mHadPendingAlarm; @@ -69,8 +74,8 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList public SecondaryDropTarget(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - mCacheExpireAlarm = new Alarm(); + mStatsLogManager = StatsLogManager.newInstance(context); } @Override @@ -214,6 +219,11 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList // Defer onComplete d.dragSource = new DeferredOnComplete(d.dragSource, getContext()); super.onDrop(d, options); + if (mCurrentAccessibilityAction == UNINSTALL) { + mStatsLogManager.log(LAUNCHER_ITEM_DROPPED_ON_UNINSTALL, d.logInstanceId); + } else if (mCurrentAccessibilityAction == DISMISS_PREDICTION) { + mStatsLogManager.log(LAUNCHER_ITEM_DROPPED_ON_DONT_SUGGEST, d.logInstanceId); + } } @Override @@ -338,8 +348,10 @@ public class SecondaryDropTarget extends ButtonDropTarget implements OnAlarmList mDragObject.dragInfo.user, PackageManager.MATCH_UNINSTALLED_PACKAGES) == null) { mDragObject.dragSource = mOriginal; mOriginal.onDropCompleted(SecondaryDropTarget.this, mDragObject, true); + mStatsLogManager.log(LAUNCHER_ITEM_UNINSTALL_COMPLETED, mDragObject.logInstanceId); } else { sendFailure(); + mStatsLogManager.log(LAUNCHER_ITEM_UNINSTALL_CANCELLED, mDragObject.logInstanceId); } } diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index fdd32b8a3c..9455bd3fa0 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -16,20 +16,24 @@ package com.android.launcher3.logging; import android.content.Context; +import android.util.Log; import com.android.launcher3.R; import com.android.launcher3.logger.LauncherAtom; +import com.android.launcher3.logger.LauncherAtom.ItemInfo; import com.android.launcher3.logging.StatsLogUtils.LogStateProvider; import com.android.launcher3.util.ResourceBasedOverride; /** * Handles the user event logging in R+. - * All of the event id is defined here. + * All of the event ids are defined here. * Most of the methods are dummy methods for Launcher3 * Actual call happens only for Launcher variant that implements QuickStep. */ public class StatsLogManager implements ResourceBasedOverride { + private static final String TAG = "StatsLogManager"; + interface EventEnum { int getId(); } @@ -37,19 +41,46 @@ public class StatsLogManager implements ResourceBasedOverride { public enum LauncherEvent implements EventEnum { @LauncherUiEvent(doc = "App launched from workspace, hotseat or folder in launcher") LAUNCHER_APP_LAUNCH_TAP(338), + @LauncherUiEvent(doc = "Task launched from overview using TAP") LAUNCHER_TASK_LAUNCH_TAP(339), + @LauncherUiEvent(doc = "Task launched from overview using SWIPE DOWN") LAUNCHER_TASK_LAUNCH_SWIPE_DOWN(340), + @LauncherUiEvent(doc = "TASK dismissed from overview using SWIPE UP") LAUNCHER_TASK_DISMISS_SWIPE_UP(341), + @LauncherUiEvent(doc = "User dragged a launcher item") LAUNCHER_ITEM_DRAG_STARTED(383), + @LauncherUiEvent(doc = "A dragged launcher item is successfully dropped") LAUNCHER_ITEM_DROP_COMPLETED(385), + @LauncherUiEvent(doc = "A dragged launcher item is successfully dropped on another item " - + "resulting in new folder creation") - LAUNCHER_ITEM_DROP_FOLDER_CREATED(386); + + "resulting in a new folder creation") + LAUNCHER_ITEM_DROP_FOLDER_CREATED(386), + + @LauncherUiEvent(doc = "A dragged item is dropped on 'Remove' button in the target bar") + LAUNCHER_ITEM_DROPPED_ON_REMOVE(465), + + @LauncherUiEvent(doc = "A dragged item is dropped on 'Cancel' button in the target bar") + LAUNCHER_ITEM_DROPPED_ON_CANCEL(466), + + @LauncherUiEvent(doc = "A predicted item is dragged and dropped on 'Don't suggest app'" + + " button in the target bar") + LAUNCHER_ITEM_DROPPED_ON_DONT_SUGGEST(467), + + @LauncherUiEvent(doc = "A dragged item is dropped on 'Uninstall' button in target bar") + LAUNCHER_ITEM_DROPPED_ON_UNINSTALL(468), + + @LauncherUiEvent(doc = "User completed uninstalling the package after dropping on " + + "the icon onto 'Uninstall' button in the target bar") + LAUNCHER_ITEM_UNINSTALL_COMPLETED(469), + + @LauncherUiEvent(doc = "User cancelled uninstalling the package after dropping on " + + "the icon onto 'Uninstall' button in the target bar") + LAUNCHER_ITEM_UNINSTALL_CANCELLED(470); // ADD MORE private final int mId; @@ -77,6 +108,14 @@ public class StatsLogManager implements ResourceBasedOverride { return mgr; } + /** + * Logs an event and accompanying {@link ItemInfo} + */ + public void log(LauncherEvent event, InstanceId instanceId) { + Log.d(TAG, String.format("%s(InstanceId:%s)", event.name(), instanceId)); + // Call StatsLog method + } + /** * Logs an event and accompanying {@link LauncherAtom.ItemInfo} */ diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java index 4359f251cc..7611ee74b4 100644 --- a/src/com/android/launcher3/model/data/ItemInfo.java +++ b/src/com/android/launcher3/model/data/ItemInfo.java @@ -303,7 +303,7 @@ public class ItemInfo { break; } itemBuilder.setContainerInfo(ContainerInfo.newBuilder().setFolder(folderBuilder)); - } else { + } else if (getContainerInfo().getContainerCase().getNumber() > 0) { itemBuilder.setContainerInfo(getContainerInfo()); } return itemBuilder.build();