Setup logging pipeline for search results

Bug: 168121204
Test: Manual
Change-Id: I4abb6c75aa0f22416616a713733bef2802b703d1
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 1f51566..5079469 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -67,6 +67,9 @@
 import com.android.launcher3.util.Themes;
 import com.android.launcher3.views.RecyclerViewFastScroller;
 import com.android.launcher3.views.SpringRelativeLayout;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
+
+import java.util.function.IntConsumer;
 
 /**
  * The all apps view container.
@@ -538,34 +541,35 @@
      * Handles selection on focused view and returns success
      */
     public boolean selectFocusedView(View v) {
-        ItemInfo itemInfo = getHighlightedItemInfo();
-        if (itemInfo != null) {
-            return mLauncher.startActivitySafely(v, itemInfo.getIntent(), itemInfo);
+        ItemInfo headerItem = getHighlightedItemFromHeader();
+        if (headerItem != null) {
+            return mLauncher.startActivitySafely(v, headerItem.getIntent(), headerItem);
         }
         AdapterItem focusedItem = getActiveRecyclerView().getApps().getFocusedChild();
         if (focusedItem instanceof AdapterItemWithPayload) {
-            Runnable onSelection = ((AdapterItemWithPayload) focusedItem).getSelectionHandler();
+            IntConsumer onSelection =
+                    ((AdapterItemWithPayload) focusedItem).getSelectionHandler();
             if (onSelection != null) {
-                onSelection.run();
+                onSelection.accept(SearchTargetEvent.QUICK_SELECT);
                 return true;
             }
         }
+        if (focusedItem.appInfo != null) {
+            ItemInfo itemInfo = focusedItem.appInfo;
+            return mLauncher.startActivitySafely(v, itemInfo.getIntent(), itemInfo);
+        }
         return false;
     }
 
     /**
-     * Returns the ItemInfo of a view that is in focus, ready to be launched by an IME.
+     * Returns the ItemInfo of a focused view inside {@link FloatingHeaderView}
      */
-    public ItemInfo getHighlightedItemInfo() {
+    public ItemInfo getHighlightedItemFromHeader() {
         View view = getFloatingHeaderView().getFocusedChild();
         if (view != null && view.getTag() instanceof ItemInfo) {
             return ((ItemInfo) view.getTag());
         }
-        if (getActiveRecyclerView().getApps().getFocusedChild() != null) {
-            // TODO: when new pipelines are included, getSearchResults
-            // should be supported at recycler view level and not apps list level.
-            return getActiveRecyclerView().getApps().getFocusedChild().appInfo;
-        }
+
         return null;
     }
 
diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
index 4e801a7..f077173 100644
--- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
@@ -21,6 +21,7 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.net.Uri;
+import android.os.Bundle;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -54,8 +55,13 @@
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.model.data.AppInfo;
 import com.android.launcher3.util.PackageManagerHelper;
+import com.android.launcher3.views.HeroSearchResultView;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
+import com.android.systemui.plugins.shared.SearchTarget;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.util.List;
+import java.util.function.IntConsumer;
 
 /**
  * The grid view adapter of all the apps.
@@ -196,18 +202,28 @@
      */
     public static class AdapterItemWithPayload<T> extends AdapterItem {
         private T mPayload;
-        private Runnable mSelectionHandler;
+        private AllAppsSearchPlugin mPlugin;
+        private IntConsumer mSelectionHandler;
 
-        public AdapterItemWithPayload(T payload, int type) {
-            mPayload = payload;
-            viewType = type;
+        public AllAppsSearchPlugin getPlugin() {
+            return mPlugin;
         }
 
-        public void setSelectionHandler(Runnable runnable) {
+        public void setPlugin(AllAppsSearchPlugin plugin) {
+            mPlugin = plugin;
+        }
+
+        public AdapterItemWithPayload(T payload, int type, AllAppsSearchPlugin plugin) {
+            mPayload = payload;
+            viewType = type;
+            mPlugin = plugin;
+        }
+
+        public void setSelectionHandler(IntConsumer runnable) {
             mSelectionHandler = runnable;
         }
 
-        public Runnable getSelectionHandler() {
+        public IntConsumer getSelectionHandler() {
             return mSelectionHandler;
         }
 
@@ -396,10 +412,12 @@
             case VIEW_TYPE_ICON:
                 BubbleTextView icon = (BubbleTextView) mLayoutInflater.inflate(
                         R.layout.all_apps_icon, parent, false);
-                icon.setOnClickListener(mOnIconClickListener);
-                icon.setOnLongClickListener(mOnIconLongClickListener);
                 icon.setLongPressTimeoutFactor(1f);
                 icon.setOnFocusChangeListener(mIconFocusListener);
+                if (!FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
+                    icon.setOnClickListener(mOnIconClickListener);
+                    icon.setOnLongClickListener(mOnIconLongClickListener);
+                }
 
                 // Ensure the all apps icon height matches the workspace icons in portrait mode.
                 icon.getLayoutParams().height = mLauncher.getDeviceProfile().allAppsCellHeightPx;
@@ -419,7 +437,6 @@
             case VIEW_TYPE_SEARCH_CORPUS_TITLE:
                 return new ViewHolder(
                         mLayoutInflater.inflate(R.layout.search_section_title, parent, false));
-
             case VIEW_TYPE_SEARCH_HERO_APP:
                 return new ViewHolder(mLayoutInflater.inflate(
                         R.layout.search_result_hero_app, parent, false));
@@ -447,10 +464,36 @@
     public void onBindViewHolder(ViewHolder holder, int position) {
         switch (holder.getItemViewType()) {
             case VIEW_TYPE_ICON:
-                AppInfo info = mApps.getAdapterItems().get(position).appInfo;
+                AdapterItem adapterItem = mApps.getAdapterItems().get(position);
+                AppInfo info = adapterItem.appInfo;
                 BubbleTextView icon = (BubbleTextView) holder.itemView;
                 icon.reset();
                 icon.applyFromApplicationInfo(info);
+                if (!FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
+                    break;
+                }
+                //TODO: replace with custom TopHitBubbleTextView with support for both shortcut
+                // and apps
+                if (adapterItem instanceof AdapterItemWithPayload) {
+                    AdapterItemWithPayload withPayload = (AdapterItemWithPayload) adapterItem;
+                    IntConsumer selectionHandler = type -> {
+                        SearchTargetEvent e = new SearchTargetEvent(SearchTarget.ItemType.APP,
+                                type);
+                        e.bundle = HeroSearchResultView.getAppBundle(info);
+                        if (withPayload.getPlugin() != null) {
+                            withPayload.getPlugin().notifySearchTargetEvent(e);
+                        }
+                    };
+                    icon.setOnClickListener(view -> {
+                        selectionHandler.accept(SearchTargetEvent.SELECT);
+                        mOnIconClickListener.onClick(view);
+                    });
+                    icon.setOnLongClickListener(view -> {
+                        selectionHandler.accept(SearchTargetEvent.LONG_PRESS);
+                        return mOnIconLongClickListener.onLongClick(view);
+                    });
+                    withPayload.setSelectionHandler(selectionHandler);
+                }
                 break;
             case VIEW_TYPE_EMPTY_SEARCH:
                 TextView emptyViewText = (TextView) holder.itemView;
@@ -468,11 +511,22 @@
                 break;
             case VIEW_TYPE_SEARCH_SLICE:
                 SliceView sliceView = (SliceView) holder.itemView;
-                Uri uri = ((AdapterItemWithPayload<Uri>) mApps.getAdapterItems().get(position))
-                        .getPayload();
+                AdapterItemWithPayload<Uri> item =
+                        (AdapterItemWithPayload<Uri>) mApps.getAdapterItems().get(position);
+                sliceView.setOnSliceActionListener((info1, s) -> {
+                    if (item.getPlugin() != null) {
+                        SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
+                                SearchTarget.ItemType.SETTINGS_SLICE,
+                                SearchTargetEvent.CHILD_SELECT);
+                        searchTargetEvent.bundle = new Bundle();
+                        searchTargetEvent.bundle.putParcelable("uri", item.getPayload());
+                        item.getPlugin().notifySearchTargetEvent(searchTargetEvent);
+                    }
+                });
                 try {
-                    LiveData<Slice> liveData = SliceLiveData.fromUri(mLauncher, uri);
+                    LiveData<Slice> liveData = SliceLiveData.fromUri(mLauncher, item.getPayload());
                     liveData.observe(this::getLifecycle, sliceView);
+                    sliceView.setTag(liveData);
                 } catch (Exception ignored) {
                 }
                 break;
@@ -493,6 +547,25 @@
     }
 
     @Override
+    public void onViewRecycled(@NonNull ViewHolder holder) {
+        super.onViewRecycled(holder);
+        if (!FeatureFlags.ENABLE_DEVICE_SEARCH.get()) return;
+        if (holder.itemView instanceof BubbleTextView) {
+            BubbleTextView icon = (BubbleTextView) holder.itemView;
+            icon.setOnClickListener(mOnIconClickListener);
+            icon.setOnLongClickListener(mOnIconLongClickListener);
+        } else if (holder.itemView instanceof SliceView) {
+            SliceView sliceView = (SliceView) holder.itemView;
+            sliceView.setOnSliceActionListener(null);
+            if (sliceView.getTag() instanceof LiveData) {
+                LiveData sliceLiveData = (LiveData) sliceView.getTag();
+                sliceLiveData.removeObservers(this::getLifecycle);
+            }
+        }
+    }
+
+
+    @Override
     public boolean onFailedToRecycleView(ViewHolder holder) {
         // Always recycle and we will reset the view when it is bound
         return true;
diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
index 29e3404..3320189 100644
--- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
+++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
@@ -115,11 +115,6 @@
             if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                 // selectFocusedView should return SearchTargetEvent that is passed onto onClick
                 if (Launcher.getLauncher(mLauncher).getAppsView().selectFocusedView(v)) {
-                    if (mSearchAlgorithm instanceof PluginWrapper) {
-                        ((PluginWrapper) mSearchAlgorithm).runOnPluginIfConnected(plugin -> {
-                            plugin.onClick(false, null);
-                        });
-                    }
                     return true;
                 }
             }
diff --git a/src/com/android/launcher3/views/HeroSearchResultView.java b/src/com/android/launcher3/views/HeroSearchResultView.java
index 761ef0d..a8e1c6b 100644
--- a/src/com/android/launcher3/views/HeroSearchResultView.java
+++ b/src/com/android/launcher3/views/HeroSearchResultView.java
@@ -18,7 +18,9 @@
 import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_ALL_APPS;
 
 import android.content.Context;
+import android.content.Intent;
 import android.graphics.Point;
+import android.os.Bundle;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewGroup;
@@ -41,6 +43,9 @@
 import com.android.launcher3.model.data.WorkspaceItemInfo;
 import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
 import com.android.launcher3.touch.ItemLongClickListener;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
+import com.android.systemui.plugins.shared.SearchTarget;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.util.List;
 
@@ -54,6 +59,7 @@
     BubbleTextView mBubbleTextView;
     View mIconView;
     BubbleTextView[] mDeepShortcutTextViews = new BubbleTextView[2];
+    AllAppsSearchPlugin mPlugin;
 
     public HeroSearchResultView(Context context) {
         super(context);
@@ -79,7 +85,10 @@
 
 
         mBubbleTextView = findViewById(R.id.bubble_text);
-        mBubbleTextView.setOnClickListener(launcher.getItemOnClickListener());
+        mBubbleTextView.setOnClickListener(view -> {
+            handleSelection(SearchTargetEvent.SELECT);
+            launcher.getItemOnClickListener().onClick(view);
+        });
         mBubbleTextView.setOnLongClickListener(new HeroItemDragHandler(getContext(), this));
         setLayoutParams(
                 new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, grid.allAppsCellHeightPx));
@@ -91,7 +100,18 @@
             bubbleTextView.setLayoutParams(
                     new LinearLayout.LayoutParams(grid.allAppsIconSizePx,
                             grid.allAppsIconSizePx));
-            bubbleTextView.setOnClickListener(launcher.getItemOnClickListener());
+            bubbleTextView.setOnClickListener(view -> {
+                WorkspaceItemInfo itemInfo = (WorkspaceItemInfo) bubbleTextView.getTag();
+                SearchTargetEvent event = new SearchTargetEvent(
+                        SearchTarget.ItemType.APP_HERO,
+                        SearchTargetEvent.CHILD_SELECT);
+                event.bundle = getAppBundle(itemInfo);
+                event.bundle.putString("shortcut_id", itemInfo.getDeepShortcutId());
+                if (mPlugin != null) {
+                    mPlugin.notifySearchTargetEvent(event);
+                }
+                launcher.getItemOnClickListener().onClick(view);
+            });
         }
     }
 
@@ -110,6 +130,8 @@
                 mDeepShortcutTextViews[i].applyFromItemInfoWithIcon(shorcutInfos.get(i));
             }
         }
+        mPlugin = adapterItem.getPlugin();
+        adapterItem.setSelectionHandler(this::handleSelection);
     }
 
     @Override
@@ -147,7 +169,38 @@
             mLauncher.getWorkspace().beginDragShared(mContainer.mBubbleTextView,
                     draggableView, mContainer, itemInfo, previewProvider, new DragOptions());
 
+            SearchTargetEvent event = new SearchTargetEvent(
+                    SearchTarget.ItemType.APP_HERO, SearchTargetEvent.LONG_PRESS);
+            event.bundle = getAppBundle(itemInfo);
+            if (mContainer.mPlugin != null) {
+                mContainer.mPlugin.notifySearchTargetEvent(event);
+            }
+
             return false;
         }
     }
+
+    private void handleSelection(int eventType) {
+        ItemInfo itemInfo = (ItemInfo) mBubbleTextView.getTag();
+        if (itemInfo == null) return;
+        Launcher launcher = Launcher.getLauncher(getContext());
+        launcher.startActivitySafely(this, itemInfo.getIntent(), itemInfo);
+
+        SearchTargetEvent event = new SearchTargetEvent(
+                SearchTarget.ItemType.APP_HERO, eventType);
+        event.bundle = getAppBundle(itemInfo);
+        if (mPlugin != null) {
+            mPlugin.notifySearchTargetEvent(event);
+        }
+    }
+
+    /**
+     * Helper method to generate {@link SearchTargetEvent} bundle from {@link ItemInfo}
+     */
+    public static Bundle getAppBundle(ItemInfo itemInfo) {
+        Bundle b = new Bundle();
+        b.putParcelable(Intent.EXTRA_COMPONENT_NAME, itemInfo.getTargetComponent());
+        b.putParcelable(Intent.EXTRA_USER, itemInfo.user);
+        return b;
+    }
 }
diff --git a/src/com/android/launcher3/views/SearchResultPeopleView.java b/src/com/android/launcher3/views/SearchResultPeopleView.java
index d1e34fa..78e9841 100644
--- a/src/com/android/launcher3/views/SearchResultPeopleView.java
+++ b/src/com/android/launcher3/views/SearchResultPeopleView.java
@@ -45,6 +45,9 @@
 import com.android.launcher3.allapps.AllAppsGridAdapter;
 import com.android.launcher3.allapps.search.AllAppsSearchBarController;
 import com.android.launcher3.util.Themes;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
+import com.android.systemui.plugins.shared.SearchTarget;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.net.URISyntaxException;
 import java.util.ArrayList;
@@ -58,9 +61,12 @@
     private final int mIconSize;
     private final int mButtonSize;
     private final PackageManager mPackageManager;
-    View mIconView;
-    TextView mTitleView;
-    ImageButton[] mProviderButtons = new ImageButton[3];
+    private View mIconView;
+    private TextView mTitleView;
+    private ImageButton[] mProviderButtons = new ImageButton[3];
+    private AllAppsSearchPlugin mPlugin;
+    private Uri mContactUri;
+
 
     public SearchResultPeopleView(Context context) {
         this(context, null, 0);
@@ -93,14 +99,14 @@
             button.getLayoutParams().width = mButtonSize;
             button.getLayoutParams().height = mButtonSize;
         }
-        setOnClickListener(v -> handleSelection());
+        setOnClickListener(v -> handleSelection(SearchTargetEvent.SELECT));
     }
 
     @Override
     public void applyAdapterInfo(
             AllAppsGridAdapter.AdapterItemWithPayload<Bundle> adapterItemWithPayload) {
-        Launcher launcher = Launcher.getLauncher(getContext());
         Bundle payload = adapterItemWithPayload.getPayload();
+        mPlugin = adapterItemWithPayload.getPlugin();
         mTitleView.setText(payload.getString("title"));
         mContactUri = payload.getParcelable("contact_uri");
         Bitmap icon = payload.getParcelable("icon");
@@ -122,8 +128,8 @@
                     Bundle provider = providers.get(i);
                     Intent intent = Intent.parseUri(provider.getString("intent_uri_str"),
                             URI_ANDROID_APP_SCHEME | URI_ALLOW_UNSAFE);
+                    setupProviderButton(button, provider, intent);
                     String pkg = provider.getString("package_name");
-                    button.setOnClickListener(b -> launcher.startActivitySafely(b, intent, null));
                     UI_HELPER_EXECUTOR.post(() -> {
                         try {
                             ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(
@@ -144,13 +150,35 @@
         adapterItemWithPayload.setSelectionHandler(this::handleSelection);
     }
 
-    Uri mContactUri;
+    private void setupProviderButton(ImageButton button, Bundle provider, Intent intent) {
+        Launcher launcher = Launcher.getLauncher(getContext());
+        button.setOnClickListener(b -> {
+            launcher.startActivitySafely(b, intent, null);
+            SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
+                    SearchTarget.ItemType.PEOPLE,
+                    SearchTargetEvent.CHILD_SELECT);
+            searchTargetEvent.bundle = new Bundle();
+            searchTargetEvent.bundle.putParcelable("contact_uri", mContactUri);
+            searchTargetEvent.bundle.putBundle("provider", provider);
+            if (mPlugin != null) {
+                mPlugin.notifySearchTargetEvent(searchTargetEvent);
+            }
+        });
+    }
 
-    private void handleSelection() {
+
+    private void handleSelection(int eventType) {
         if (mContactUri != null) {
             Launcher launcher = Launcher.getLauncher(getContext());
             launcher.startActivitySafely(this, new Intent(Intent.ACTION_VIEW, mContactUri).setFlags(
                     Intent.FLAG_ACTIVITY_NEW_TASK), null);
+            SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
+                    SearchTarget.ItemType.PEOPLE, eventType);
+            searchTargetEvent.bundle = new Bundle();
+            searchTargetEvent.bundle.putParcelable("contact_uri", mContactUri);
+            if (mPlugin != null) {
+                mPlugin.notifySearchTargetEvent(searchTargetEvent);
+            }
         }
     }
 }
diff --git a/src/com/android/launcher3/views/SearchResultPlayItem.java b/src/com/android/launcher3/views/SearchResultPlayItem.java
index 19a4c5d..8624609 100644
--- a/src/com/android/launcher3/views/SearchResultPlayItem.java
+++ b/src/com/android/launcher3/views/SearchResultPlayItem.java
@@ -38,6 +38,9 @@
 import com.android.launcher3.R;
 import com.android.launcher3.allapps.AllAppsGridAdapter.AdapterItemWithPayload;
 import com.android.launcher3.allapps.search.AllAppsSearchBarController;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
+import com.android.systemui.plugins.shared.SearchTarget;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.io.IOException;
 import java.net.URL;
@@ -54,6 +57,7 @@
     private Button mPreviewButton;
     private String mPackageName;
     private boolean mIsInstantGame;
+    private AllAppsSearchPlugin mPlugin;
 
     public SearchResultPlayItem(Context context) {
         this(context, null, 0);
@@ -84,13 +88,14 @@
         ViewGroup.LayoutParams iconParams = mIconView.getLayoutParams();
         iconParams.height = mDeviceProfile.allAppsIconSizePx;
         iconParams.width = mDeviceProfile.allAppsIconSizePx;
-        setOnClickListener(view -> handleSelection());
+        setOnClickListener(view -> handleSelection(SearchTargetEvent.SELECT));
 
     }
 
     @Override
     public void applyAdapterInfo(AdapterItemWithPayload<Bundle> adapterItemWithPayload) {
         Bundle bundle = adapterItemWithPayload.getPayload();
+        mPlugin = adapterItemWithPayload.getPlugin();
         adapterItemWithPayload.setSelectionHandler(this::handleSelection);
         if (bundle.getString("package", "").equals(mPackageName)) {
             return;
@@ -129,13 +134,14 @@
         }
     }
 
-    private void handleSelection() {
+    private void handleSelection(int eventType) {
         if (mPackageName == null) return;
         Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(
                 "https://play.google.com/store/apps/details?id="
                         + mPackageName));
         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         getContext().startActivity(i);
+        logSearchEvent(eventType);
     }
 
     private void launchInstantGame() {
@@ -150,5 +156,16 @@
         intent.putExtra("callerId", getContext().getPackageName());
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         getContext().startActivity(intent);
+        logSearchEvent(SearchTargetEvent.CHILD_SELECT);
+    }
+
+    private void logSearchEvent(int eventType) {
+        SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
+                SearchTarget.ItemType.PLAY_RESULTS, eventType);
+        searchTargetEvent.bundle = new Bundle();
+        searchTargetEvent.bundle.putString("package_name", mPackageName);
+        if (mPlugin != null) {
+            mPlugin.notifySearchTargetEvent(searchTargetEvent);
+        }
     }
 }
diff --git a/src/com/android/launcher3/views/SearchResultShortcut.java b/src/com/android/launcher3/views/SearchResultShortcut.java
index a402719..307cf34 100644
--- a/src/com/android/launcher3/views/SearchResultShortcut.java
+++ b/src/com/android/launcher3/views/SearchResultShortcut.java
@@ -36,7 +36,9 @@
 import com.android.launcher3.allapps.search.AllAppsSearchBarController;
 import com.android.launcher3.model.data.WorkspaceItemInfo;
 import com.android.launcher3.touch.ItemClickHandler;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
 import com.android.systemui.plugins.shared.SearchTarget;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 /**
  * A view representing a stand alone shortcut search result
@@ -44,8 +46,10 @@
 public class SearchResultShortcut extends FrameLayout implements
         AllAppsSearchBarController.PayloadResultHandler<SearchTarget> {
 
-    BubbleTextView mBubbleTextView;
-    View mIconView;
+    private BubbleTextView mBubbleTextView;
+    private View mIconView;
+    private ShortcutInfo mShortcutInfo;
+    private AllAppsSearchPlugin mPlugin;
 
     public SearchResultShortcut(@NonNull Context context) {
         super(context);
@@ -71,28 +75,36 @@
         iconParams.height = grid.allAppsIconSizePx;
         iconParams.width = grid.allAppsIconSizePx;
         mBubbleTextView = findViewById(R.id.bubble_text);
-        setOnClickListener(v -> handleSelection());
+        setOnClickListener(v -> handleSelection(SearchTargetEvent.SELECT));
     }
 
     @Override
     public void applyAdapterInfo(
             AllAppsGridAdapter.AdapterItemWithPayload<SearchTarget> adapterItemWithPayload) {
         SearchTarget payload = adapterItemWithPayload.getPayload();
-        ShortcutInfo si = payload.shortcuts.get(0);
-        WorkspaceItemInfo workspaceItemInfo = new WorkspaceItemInfo(si, getContext());
+        mPlugin = adapterItemWithPayload.getPlugin();
+        mShortcutInfo = payload.shortcuts.get(0);
+        WorkspaceItemInfo workspaceItemInfo = new WorkspaceItemInfo(mShortcutInfo, getContext());
         mBubbleTextView.applyFromWorkspaceItem(workspaceItemInfo);
         mIconView.setBackground(mBubbleTextView.getIcon());
         LauncherAppState launcherAppState = LauncherAppState.getInstance(getContext());
         MODEL_EXECUTOR.execute(() -> {
-            launcherAppState.getIconCache().getShortcutIcon(workspaceItemInfo, si);
+            launcherAppState.getIconCache().getShortcutIcon(workspaceItemInfo, mShortcutInfo);
             mBubbleTextView.applyFromWorkspaceItem(workspaceItemInfo);
             mIconView.setBackground(mBubbleTextView.getIcon());
         });
         adapterItemWithPayload.setSelectionHandler(this::handleSelection);
     }
 
-    private void handleSelection() {
-        ItemClickHandler.onClickAppShortcut(this, (WorkspaceItemInfo) mBubbleTextView.getTag(),
-                Launcher.getLauncher(getContext()));
+    private void handleSelection(int eventType) {
+        WorkspaceItemInfo itemInfo = (WorkspaceItemInfo) mBubbleTextView.getTag();
+        ItemClickHandler.onClickAppShortcut(this, itemInfo, Launcher.getLauncher(getContext()));
+
+        SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
+                SearchTarget.ItemType.SHORTCUT, eventType);
+        searchTargetEvent.shortcut = mShortcutInfo;
+        if (mPlugin != null) {
+            mPlugin.notifySearchTargetEvent(searchTargetEvent);
+        }
     }
 }
diff --git a/src/com/android/launcher3/views/SearchSettingsRowView.java b/src/com/android/launcher3/views/SearchSettingsRowView.java
index 08c78ff..93bcee2 100644
--- a/src/com/android/launcher3/views/SearchSettingsRowView.java
+++ b/src/com/android/launcher3/views/SearchSettingsRowView.java
@@ -31,6 +31,9 @@
 import com.android.launcher3.R;
 import com.android.launcher3.allapps.AllAppsGridAdapter;
 import com.android.launcher3.allapps.search.AllAppsSearchBarController;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
+import com.android.systemui.plugins.shared.SearchTarget;
+import com.android.systemui.plugins.shared.SearchTargetEvent;
 
 import java.util.ArrayList;
 
@@ -44,6 +47,7 @@
     private TextView mDescriptionView;
     private TextView mBreadcrumbsView;
     private Intent mIntent;
+    private AllAppsSearchPlugin mPlugin;
 
     public SearchSettingsRowView(@NonNull Context context) {
         super(context);
@@ -72,6 +76,7 @@
     public void applyAdapterInfo(
             AllAppsGridAdapter.AdapterItemWithPayload<Bundle> adapterItemWithPayload) {
         Bundle bundle = adapterItemWithPayload.getPayload();
+        mPlugin = adapterItemWithPayload.getPlugin();
         mIntent = bundle.getParcelable("intent");
         showIfAvailable(mTitleView, bundle.getString("title"));
         showIfAvailable(mDescriptionView, bundle.getString("description"));
@@ -79,7 +84,7 @@
         //TODO: implement RTL friendly breadcrumbs view
         showIfAvailable(mBreadcrumbsView, breadcrumbs != null
                 ? String.join(" > ", breadcrumbs) : null);
-        adapterItemWithPayload.setSelectionHandler(() -> onClick(this));
+        adapterItemWithPayload.setSelectionHandler(this::handleSelection);
     }
 
     private void showIfAvailable(TextView view, @Nullable String string) {
@@ -93,10 +98,22 @@
 
     @Override
     public void onClick(View view) {
+        handleSelection(SearchTargetEvent.SELECT);
+    }
+
+    private void handleSelection(int eventType) {
         if (mIntent == null) return;
         // TODO: create ItemInfo object and then use it to call startActivityForResult for proper
         //  WW logging
-        Launcher launcher = Launcher.getLauncher(view.getContext());
+        Launcher launcher = Launcher.getLauncher(getContext());
         launcher.startActivityForResult(mIntent, 0);
+
+        SearchTargetEvent searchTargetEvent = new SearchTargetEvent(
+                SearchTarget.ItemType.SETTINGS_ROW, eventType);
+        searchTargetEvent.bundle = new Bundle();
+        searchTargetEvent.bundle.putParcelable("intent", mIntent);
+        if (mPlugin != null) {
+            mPlugin.notifySearchTargetEvent(searchTargetEvent);
+        }
     }
 }
diff --git a/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java b/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java
index 9949678..437cf3c 100644
--- a/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java
+++ b/src_plugins/com/android/systemui/plugins/AllAppsSearchPlugin.java
@@ -47,7 +47,10 @@
      */
     void performSearch(String query, Consumer<List<SearchTarget>> results);
 
-    void onClick(boolean isTouch, SearchTargetEvent event);
+    /**
+     * Send over search target interaction events to Plugin
+     */
+    void notifySearchTargetEvent(SearchTargetEvent event);
 
     /**
      * Send signal when user exits all apps.
diff --git a/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java b/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java
index 00aacd0..ac4bc33 100644
--- a/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java
+++ b/src_plugins/com/android/systemui/plugins/shared/SearchTargetEvent.java
@@ -22,18 +22,19 @@
  * Event used for the feedback loop to the plugin. (and future aiai)
  */
 public class SearchTargetEvent {
+    public static final int SELECT = 0;
+    public static final int QUICK_SELECT = 1;
+    public static final int LONG_PRESS = 2;
+    public static final int CHILD_SELECT = 3;
+
     public SearchTarget.ItemType type;
     public ShortcutInfo shortcut;
+    public int eventType;
     public Bundle bundle;
     public float score;
 
-    public SearchTargetEvent(SearchTarget.ItemType itemType,
-            ShortcutInfo shortcut,
-            Bundle bundle,
-            float score) {
+    public SearchTargetEvent(SearchTarget.ItemType itemType, int eventType) {
         this.type = itemType;
-        this.shortcut = shortcut;
-        this.bundle = bundle;
-        this.score = score;
+        this.eventType = eventType;
     }
 }