From f81e8b002a4e7242795718b5fc6061173e98af33 Mon Sep 17 00:00:00 2001 From: thiruram Date: Wed, 15 Apr 2020 10:22:28 -0700 Subject: [PATCH 1/2] Implement LAUNCHER_ITEM_DRAG_STARTED event. * Fixes null component issue when ItemInfo object copiedFrom. * Fixes missing container when item is dragged from hybrid hotseat. Sample Logs: 2020-04-30 14:09:45.499 30472-30472/com.google.android.apps.nexuslauncher D/StatsLogManager: LAUNCHER_ITEM_DRAG_STARTED # com.android.launcher3.logger.LauncherAtom$ItemInfo@260f31f8 application { component_name: "com.android.chrome/com.google.android.apps.chrome.Main" package_name: "com.android.chrome" } container_info { workspace { grid_x: 2 grid_y: 2 page_index: 2 } } is_work: false 2020-04-30 14:23:15.230 31320-31320/com.google.android.apps.nexuslauncher D/StatsLogManager: LAUNCHER_ITEM_DRAG_STARTED # com.android.launcher3.logger.LauncherAtom$ItemInfo@608f101 application { component_name: "com.google.android.gm/.ConversationListActivityGmail" package_name: "com.google.android.gm" } container_info { hotseat { index: 1 } } is_work: false Bug: 152978018 Change-Id: I3d3ce213fd2fc6eb5ffb239e048ceb7c0fa88b53 --- protos/launcher_atom.proto | 2 +- .../logging/StatsLogCompatManager.java | 11 +++------- .../launcher3/BaseDraggingActivity.java | 2 +- src/com/android/launcher3/Workspace.java | 6 ++++++ .../launcher3/logging/StatsLogManager.java | 19 ++++++++++++++++-- .../launcher3/model/data/ItemInfo.java | 20 +++++++++++-------- 6 files changed, 40 insertions(+), 20 deletions(-) diff --git a/protos/launcher_atom.proto b/protos/launcher_atom.proto index f0ecba39e8..036fb02243 100644 --- a/protos/launcher_atom.proto +++ b/protos/launcher_atom.proto @@ -25,7 +25,7 @@ message ItemInfo { Application application = 1; Task task = 2; Shortcut shortcut = 3; - Widget widget = 4; + Widget widget = 4; } // When used for launch event, stores the global predictive rank optional int32 rank = 5; diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java index ac2200dcc4..2d51732e54 100644 --- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -56,11 +56,6 @@ public class StatsLogCompatManager extends StatsLogManager { sContext = context; } - @Override - public void log(LauncherEvent eventId, LauncherAtom.ItemInfo item) { - // Call StatsLog method - } - @Override public void verify() { if (!(StatsLogUtils.LAUNCHER_STATE_ALLAPPS == ALLAPPS @@ -88,17 +83,17 @@ public class StatsLogCompatManager extends StatsLogManager { ArrayList appWidgets = (ArrayList) dataModel.appWidgets.clone(); for (ItemInfo info : workspaceItems) { - LauncherAtom.ItemInfo atomInfo = info.buildProto(null, null); + LauncherAtom.ItemInfo atomInfo = info.buildProto(null); // call StatsLog method } for (FolderInfo fInfo : folders) { for (ItemInfo info : fInfo.contents) { - LauncherAtom.ItemInfo atomInfo = info.buildProto(null, fInfo); + LauncherAtom.ItemInfo atomInfo = info.buildProto(fInfo); // call StatsLog method } } for (ItemInfo info : appWidgets) { - LauncherAtom.ItemInfo atomInfo = info.buildProto(null, null); + LauncherAtom.ItemInfo atomInfo = info.buildProto(null); // call StatsLog method } } diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index db69341b4f..09fe64a89b 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -185,7 +185,7 @@ public abstract class BaseDraggingActivity extends BaseActivity getUserEventDispatcher().logAppLaunch(v, intent, user); getStatsLogManager().log(APP_LAUNCH_TAP, item == null ? null - : item.buildProto(null, null)); + : item.buildProto(null)); return true; } catch (NullPointerException|ActivityNotFoundException|SecurityException e) { Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 10c05d315b..2111162a31 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -79,6 +79,8 @@ import com.android.launcher3.folder.PreviewBackground; import com.android.launcher3.graphics.DragPreviewProvider; import com.android.launcher3.graphics.PreloadIconDrawable; import com.android.launcher3.icons.BitmapRenderer; +import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.logging.StatsLogManager.LauncherEvent; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.FolderInfo; @@ -409,6 +411,10 @@ public class Workspace extends PagedView // Always enter the spring loaded mode mLauncher.getStateManager().goToState(SPRING_LOADED); + StatsLogManager.newInstance(getContext()) + .log( + LauncherEvent.LAUNCHER_ITEM_DRAG_STARTED, + dragObject.originalDragInfo.buildProto(null)); } public void deferRemoveExtraEmptyScreen() { diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index 2829951da2..05dd473ea7 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -16,6 +16,7 @@ package com.android.launcher3.logging; import android.content.Context; +import android.util.Log; import com.android.launcher3.R; import com.android.launcher3.logger.LauncherAtom; @@ -28,6 +29,8 @@ import com.android.launcher3.util.ResourceBasedOverride; */ public class StatsLogManager implements ResourceBasedOverride { + private static final String TAG = "StatsLogManager"; + interface EventEnum { int getId(); } @@ -40,7 +43,9 @@ public class StatsLogManager implements ResourceBasedOverride { @LauncherUiEvent(doc = "Task launched from overview using SWIPE DOWN") TASK_LAUNCH_SWIPE_DOWN(2), @LauncherUiEvent(doc = "TASK dismissed from overview using SWIPE UP") - TASK_DISMISS_SWIPE_UP(3); + TASK_DISMISS_SWIPE_UP(3), + @LauncherUiEvent(doc = "User dragged a launcher item") + LAUNCHER_ITEM_DRAG_STARTED(383); // ADD MORE private final int mId; @@ -54,6 +59,13 @@ public class StatsLogManager implements ResourceBasedOverride { protected LogStateProvider mStateProvider; + /** + * Creates a new instance of {@link StatsLogManager} based on provided context. + */ + public static StatsLogManager newInstance(Context context) { + return newInstance(context, null); + } + public static StatsLogManager newInstance(Context context, LogStateProvider stateProvider) { StatsLogManager mgr = Overrides.getObject(StatsLogManager.class, context.getApplicationContext(), R.string.stats_log_manager_class); @@ -65,7 +77,10 @@ public class StatsLogManager implements ResourceBasedOverride { /** * Logs an event and accompanying {@link ItemInfo} */ - public void log(LauncherEvent eventId, LauncherAtom.ItemInfo itemInfo) { } + public void log(LauncherEvent event, LauncherAtom.ItemInfo itemInfo) { + Log.d(TAG, String.format("%s\n%s", event.name(), itemInfo)); + // Call StatsLog method + } /** * Logs snapshot, or impression of the current workspace. diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java index 7ee2090c13..14f9934314 100644 --- a/src/com/android/launcher3/model/data/ItemInfo.java +++ b/src/com/android/launcher3/model/data/ItemInfo.java @@ -18,6 +18,7 @@ package com.android.launcher3.model.data; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET; import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT; @@ -123,6 +124,12 @@ public class ItemInfo { */ public CharSequence contentDescription; + /** + * When the instance is created using {@link #copyFrom}, this field is used to keep track of + * original {@link ComponentName}. + */ + private ComponentName mComponentName; + public UserHandle user; public ItemInfo() { @@ -145,6 +152,7 @@ public class ItemInfo { container = info.container; user = info.user; contentDescription = info.contentDescription; + mComponentName = info.getTargetComponent(); } public Intent getIntent() { @@ -153,12 +161,7 @@ public class ItemInfo { @Nullable public ComponentName getTargetComponent() { - Intent intent = getIntent(); - if (intent != null) { - return intent.getComponent(); - } else { - return null; - } + return Optional.ofNullable(getIntent()).map(Intent::getComponent).orElse(mComponentName); } public void writeToValues(ContentWriter writer) { @@ -247,8 +250,7 @@ public class ItemInfo { /** * Creates {@link LauncherAtom.ItemInfo} with important fields and parent container info. */ - public LauncherAtom.ItemInfo buildProto(Intent intent, FolderInfo fInfo) { - + public LauncherAtom.ItemInfo buildProto(FolderInfo fInfo) { LauncherAtom.ItemInfo.Builder itemBuilder = LauncherAtom.ItemInfo.newBuilder(); itemBuilder.setIsWork(user != Process.myUserHandle()); Optional nullableComponent = Optional.ofNullable(getTargetComponent()); @@ -282,6 +284,7 @@ public class ItemInfo { switch (fInfo.container) { case CONTAINER_HOTSEAT: + case CONTAINER_HOTSEAT_PREDICTION: folderBuilder.setHotseat(LauncherAtom.HotseatContainer.newBuilder() .setIndex(fInfo.screenId)); break; @@ -295,6 +298,7 @@ public class ItemInfo { } else { switch (container) { case CONTAINER_HOTSEAT: + case CONTAINER_HOTSEAT_PREDICTION: itemBuilder.setContainerInfo( ContainerInfo.newBuilder().setHotseat( LauncherAtom.HotseatContainer.newBuilder().setIndex(screenId))); From 0707f2c702761ebff4d13ab19e550e92c9f49151 Mon Sep 17 00:00:00 2001 From: thiruram Date: Thu, 30 Apr 2020 14:58:29 -0700 Subject: [PATCH 2/2] Fixes missing components info when logging Widget item. Sample Log: LAUNCHER_ITEM_DRAG_STARTED # com.android.launcher3.logger.LauncherAtom$ItemInfo@5c06a6d1 container_info { workspace { grid_x: 3 grid_y: 3 page_index: 3 } } is_work: false widget { component_name: "com.google.android.deskclock/com.android.alarmclock.DigitalAppWidgetProvider" package_name: "com.google.android.deskclock" span_x: 2 span_y: 1 } Change-Id: I3d468c77632c694454fcdca24f9d2ccd1c4f918c --- src/com/android/launcher3/model/data/ItemInfo.java | 9 ++++++++- .../launcher3/model/data/LauncherAppWidgetInfo.java | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java index 14f9934314..561b4ed1f0 100644 --- a/src/com/android/launcher3/model/data/ItemInfo.java +++ b/src/com/android/launcher3/model/data/ItemInfo.java @@ -272,7 +272,14 @@ public class ItemInfo { .orElse(LauncherAtom.Shortcut.newBuilder())); break; case ITEM_TYPE_APPWIDGET: - setItemBuilder(itemBuilder); + itemBuilder + .setWidget(nullableComponent + .map(component -> LauncherAtom.Widget.newBuilder() + .setComponentName(component.flattenToShortString()) + .setPackageName(component.getPackageName())) + .orElse(LauncherAtom.Widget.newBuilder()) + .setSpanX(spanX) + .setSpanY(spanY)); break; default: break; diff --git a/src/com/android/launcher3/model/data/LauncherAppWidgetInfo.java b/src/com/android/launcher3/model/data/LauncherAppWidgetInfo.java index adb97dc072..b0d19a609a 100644 --- a/src/com/android/launcher3/model/data/LauncherAppWidgetInfo.java +++ b/src/com/android/launcher3/model/data/LauncherAppWidgetInfo.java @@ -21,6 +21,8 @@ import android.content.ComponentName; import android.content.Intent; import android.os.Process; +import androidx.annotation.Nullable; + import com.android.launcher3.AppWidgetResizeFrame; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherSettings; @@ -142,6 +144,12 @@ public class LauncherAppWidgetInfo extends ItemInfo { return appWidgetId <= CUSTOM_WIDGET_ID; } + @Nullable + @Override + public ComponentName getTargetComponent() { + return providerName; + } + @Override public void onAddToDatabase(ContentWriter writer) { super.onAddToDatabase(writer);