Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f79eeda authored by Samuel Fufa's avatar Samuel Fufa
Browse files

Remove hardcoded itemTypes from SearchTarget

- Introduces componentName and userHandle members to SearchTarget
- SearchTargetEvent now has searchTarget member
- Builder pattern for SearchTarget and SearchTargetEvent
- Search backend should add headers manually instead of launcher inferring sections

Bug: 171026321
Test: Manual
Change-Id: I28e0455e82b925277a17703b9aa061c8f9f15262
parent 9228ff53
Loading
Loading
Loading
Loading
+2 −14
Original line number Diff line number Diff line
@@ -192,26 +192,15 @@ public class AllAppsGridAdapter extends

    /**
     * Extension of AdapterItem that contains an extra payload specific to item
     *
     * @param <T> Play load Type
     */
    public static class SearchAdapterItem extends AdapterItem {
        private SearchTarget mSearchTarget;
        private String mSearchSessionId;

        public SearchAdapterItem(SearchTarget searchTarget, int type) {
            mSearchTarget = searchTarget;
            viewType = type;
        }

        public void setSearchSessionId(String searchSessionId) {
            mSearchSessionId = searchSessionId;
        }

        public String getSearchSessionId() {
            return mSearchSessionId;
        }

        public SearchTarget getSearchTarget() {
            return mSearchTarget;
        }
@@ -484,8 +473,7 @@ public class AllAppsGridAdapter extends
                SearchAdapterItem slicePayload = (SearchAdapterItem) mApps.getAdapterItems().get(
                        position);
                SearchTarget searchTarget = slicePayload.getSearchTarget();
                sliceView.setTag(new SearchSliceWrapper(mLauncher, sliceView, searchTarget,
                        slicePayload.getSearchSessionId(), slicePayload.position));
                sliceView.setTag(new SearchSliceWrapper(mLauncher, sliceView, searchTarget));

                break;
            case VIEW_TYPE_SEARCH_CORPUS_TITLE:
@@ -500,7 +488,7 @@ public class AllAppsGridAdapter extends
                SearchAdapterItem item =
                        (SearchAdapterItem) mApps.getAdapterItems().get(position);
                SearchTargetHandler payloadResultView = (SearchTargetHandler) holder.itemView;
                payloadResultView.setup(item);
                payloadResultView.applySearchTarget(item.getSearchTarget());
                break;
            case VIEW_TYPE_ALL_APPS_DIVIDER:
                // nothing to do
+0 −16
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@ package com.android.launcher3.allapps;
import static com.android.launcher3.model.data.AppInfo.COMPONENT_KEY_COMPARATOR;
import static com.android.launcher3.model.data.AppInfo.EMPTY_ARRAY;

import android.content.ComponentName;
import android.os.UserHandle;
import android.view.View;
import android.view.ViewGroup;

@@ -29,7 +27,6 @@ import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.PromiseAppInfo;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.PackageUserKey;
import com.android.systemui.plugins.shared.SearchTarget;

import java.util.ArrayList;
import java.util.Arrays;
@@ -89,19 +86,6 @@ public class AllAppsStore {
        return index < 0 ? null : mApps[index];
    }

    /**
     * Gets AppInfo from {@link SearchTarget}
     * TODO: SearchTarget should have userHandle and ComponentKey members
     */
    public AppInfo getAppFromSearchTarget(SearchTarget searchTarget) {
        ComponentName cn = searchTarget.bundle.getParcelable("component_name");
        UserHandle userHandle = searchTarget.bundle.getParcelable("user_handle");
        if (cn == null) {
            throw new IllegalStateException("Component name is required for AppInfo");
        }
        return getApp(new ComponentKey(cn, userHandle));
    }

    public void enableDeferUpdates(int flag) {
        mDeferUpdatesFlags |= flag;
    }
+0 −44
Original line number Diff line number Diff line
@@ -31,12 +31,10 @@ import com.android.launcher3.ExtendedEditText;
import com.android.launcher3.Launcher;
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.AllAppsGridAdapter;
import com.android.launcher3.allapps.AllAppsGridAdapter.SearchAdapterItem;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.systemui.plugins.AllAppsSearchPlugin;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetEvent;

import java.util.ArrayList;
import java.util.List;
@@ -208,56 +206,14 @@ public class AllAppsSearchBarController

    /**
     * An interface for supporting dynamic search results
     *
     * @param <T> Type of payload
     */
    public interface SearchTargetHandler {
        /**
         * Updates View using Adapter's payload
         */

        default void setup(SearchAdapterItem searchAdapterItem) {
            Object[] targetInfo = getTargetInfo();
            if (targetInfo != null) {
                targetInfo[0] = searchAdapterItem.getSearchSessionId();
                targetInfo[1] = searchAdapterItem.position;
            }
            applySearchTarget(searchAdapterItem.getSearchTarget());
        }

        /**
         * Update view using values from {@link SearchTarget}
         */
        void applySearchTarget(SearchTarget searchTarget);

        /**
         * Gets object created by {@link SearchTargetHandler#createTargetInfo()}
         */
        default Object[] getTargetInfo() {
            return null;
        }

        /**
         * Creates a wrapper object to hold searchSessionId and item position
         */
        default Object[] createTargetInfo() {
            return new Object[2];
        }

        /**
         * Generates a SearchTargetEvent object for a PayloadHandlerView
         */
        default SearchTargetEvent getSearchTargetEvent(SearchTarget.ItemType itemType,
                int eventType) {
            Object[] targetInfo = getTargetInfo();
            if (targetInfo == null) return null;

            String searchSessionId = (String) targetInfo[0];
            int position = (int) targetInfo[1];
            return new SearchTargetEvent(itemType, eventType,
                    position, searchSessionId);
        }

        /**
         * Handles selection of SearchTarget
         */
+6 −6
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import com.android.launcher3.allapps.AllAppsSectionDecorator.SectionDecorationHa
 */
public class SearchSectionInfo {

    private String mTitle;
    private String mSectionId;
    private SectionDecorationHandler mDecorationHandler;

    public int getPosStart() {
@@ -48,8 +48,8 @@ public class SearchSectionInfo {
        this(null);
    }

    public SearchSectionInfo(String title) {
        mTitle = title;
    public SearchSectionInfo(String sectionId) {
        mSectionId = sectionId;
    }

    public void setDecorationHandler(SectionDecorationHandler sectionDecorationHandler) {
@@ -62,9 +62,9 @@ public class SearchSectionInfo {
    }

    /**
     * Returns the section's title
     * Returns the section's ID
     */
    public String getTitle() {
        return mTitle == null ? "" : mTitle;
    public String getSectionId() {
        return mSectionId == null ? "" : mSectionId;
    }
}
+21 −39
Original line number Diff line number Diff line
@@ -20,10 +20,8 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;

import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.graphics.Point;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Pair;
import android.view.View;
@@ -49,24 +47,28 @@ import com.android.launcher3.model.data.ItemInfoWithIcon;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
import com.android.launcher3.touch.ItemLongClickListener;
import com.android.launcher3.util.ComponentKey;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetEvent;

import java.util.ArrayList;
import java.util.List;

/**
 * A view representing a high confidence app search result that includes shortcuts
 * TODO (sfufa@) consolidate this with SearchResultIconRow
 */
public class HeroSearchResultView extends LinearLayout implements DragSource, SearchTargetHandler {

    public static final String TARGET_TYPE_HERO_APP = "hero_app";

    public static final int MAX_SHORTCUTS_COUNT = 2;
    public static final String SHORTCUTS_KEY = "shortcut_infos";

    private SearchTarget mSearchTarget;
    private BubbleTextView mBubbleTextView;
    private View mIconView;
    private BubbleTextView[] mDeepShortcutTextViews = new BubbleTextView[2];

    private final Object[] mTargetInfo = createTargetInfo();
    BubbleTextView mBubbleTextView;
    View mIconView;
    BubbleTextView[] mDeepShortcutTextViews = new BubbleTextView[2];

    public HeroSearchResultView(Context context) {
        super(context);
@@ -107,11 +109,9 @@ public class HeroSearchResultView extends LinearLayout implements DragSource, Se
                            grid.allAppsIconSizePx));
            bubbleTextView.setOnClickListener(view -> {
                WorkspaceItemInfo itemInfo = (WorkspaceItemInfo) bubbleTextView.getTag();
                SearchTargetEvent event = getSearchTargetEvent(
                        SearchTarget.ItemType.APP_HERO,
                        SearchTargetEvent.CHILD_SELECT);
                event.bundle = getAppBundle(itemInfo);
                event.bundle.putString("shortcut_id", itemInfo.getDeepShortcutId());
                SearchTargetEvent event = new SearchTargetEvent.Builder(mSearchTarget,
                        SearchTargetEvent.CHILD_SELECT).setShortcutPosition(itemInfo.rank).build();
                SearchEventTracker.getInstance(getContext()).notifySearchTargetEvent(event);
                launcher.getItemOnClickListener().onClick(view);
            });
        }
@@ -119,20 +119,20 @@ public class HeroSearchResultView extends LinearLayout implements DragSource, Se

    @Override
    public void applySearchTarget(SearchTarget searchTarget) {
        mSearchTarget = searchTarget;
        AllAppsStore apps = Launcher.getLauncher(getContext()).getAppsView().getAppsStore();
        AppInfo appInfo = apps.getAppFromSearchTarget(searchTarget);
//        TODO: replace this with searchTarget.shortcuts
        ArrayList<ShortcutInfo> infos = searchTarget.bundle.getParcelableArrayList(
                SHORTCUTS_KEY);
        AppInfo appInfo = apps.getApp(new ComponentKey(searchTarget.getComponentName(),
                searchTarget.getUserHandle()));
        List<ShortcutInfo> infos = mSearchTarget.getShortcutInfos();

        ArrayList<Pair<ShortcutInfo, ItemInfoWithIcon>> shortcuts = new ArrayList<>();
        for (int i = 0; infos != null && i < infos.size() && i < MAX_SHORTCUTS_COUNT; i++) {
            ShortcutInfo shortcutInfo = infos.get(i);
            ItemInfoWithIcon si = new WorkspaceItemInfo(shortcutInfo, getContext());
            si.rank = i;
            shortcuts.add(new Pair<>(shortcutInfo, si));
        }


        mBubbleTextView.applyFromApplicationInfo(appInfo);
        mIconView.setBackground(mBubbleTextView.getIcon());
        mIconView.setTag(appInfo);
@@ -154,11 +154,6 @@ public class HeroSearchResultView extends LinearLayout implements DragSource, Se
        SearchEventTracker.INSTANCE.get(getContext()).registerWeakHandler(searchTarget, this);
    }

    @Override
    public Object[] getTargetInfo() {
        return mTargetInfo;
    }

    @Override
    public void onDropCompleted(View target, DropTarget.DragObject d, boolean success) {
        mBubbleTextView.setVisibility(VISIBLE);
@@ -194,9 +189,8 @@ public class HeroSearchResultView extends LinearLayout implements DragSource, Se
            mLauncher.getWorkspace().beginDragShared(mContainer.mBubbleTextView,
                    draggableView, mContainer, itemInfo, previewProvider, new DragOptions());

            SearchTargetEvent event = mContainer.getSearchTargetEvent(
                    SearchTarget.ItemType.APP_HERO, SearchTargetEvent.LONG_PRESS);
            event.bundle = getAppBundle(itemInfo);
            SearchTargetEvent event = new SearchTargetEvent.Builder(mContainer.mSearchTarget,
                    SearchTargetEvent.LONG_PRESS).build();
            SearchEventTracker.INSTANCE.get(mLauncher).notifySearchTargetEvent(event);
            return false;
        }
@@ -209,19 +203,7 @@ public class HeroSearchResultView extends LinearLayout implements DragSource, Se
        Launcher launcher = Launcher.getLauncher(getContext());
        launcher.startActivitySafely(this, itemInfo.getIntent(), itemInfo);

        SearchTargetEvent event = getSearchTargetEvent(
                SearchTarget.ItemType.APP_HERO, eventType);
        event.bundle = getAppBundle(itemInfo);
        SearchEventTracker.INSTANCE.get(getContext()).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;
        SearchEventTracker.INSTANCE.get(getContext()).notifySearchTargetEvent(
                new SearchTargetEvent.Builder(mSearchTarget, eventType).build());
    }
}
Loading