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

Commit a60d1f9b authored by Samuel Fufa's avatar Samuel Fufa
Browse files

Migrate from Plugin SearchTarget to API search Target [2/3]

- Adds support for android.app.search.SearchTarget in plugin while maintaining plugin SearchTarget support
- Introduces SEARCH_TARGET_LEGACY temporary to switch between plugin and sdk variants.
- Maps resultType and layoutType pairs to the appropriate view

Bug: 177223401
Test: Manual
Change-Id: If8d4bb7c21c47a12447dcb0c56eed8781bd21e54
parent 992ab433
Loading
Loading
Loading
Loading
+28 −6
Original line number Diff line number Diff line
@@ -18,15 +18,18 @@ package com.android.launcher3.search;

import static com.android.launcher3.allapps.AllAppsGridAdapter.VIEW_TYPE_ICON;

import android.app.search.SearchTarget;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.allapps.AllAppsContainerView;
import com.android.launcher3.allapps.AllAppsGridAdapter;
import com.android.launcher3.allapps.search.SearchAdapterProvider;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.launcher3.config.FeatureFlags;
import com.android.systemui.plugins.shared.SearchTargetLegacy;

/**
 * Provides views for on-device search results
@@ -45,11 +48,13 @@ public class DeviceSearchAdapterProvider extends SearchAdapterProvider {
    public static final int VIEW_TYPE_SEARCH_WIDGET_LIVE = 1 << 15;
    public static final int VIEW_TYPE_SEARCH_WIDGET_PREVIEW = 1 << 16;

    private final AllAppsContainerView mAppsView;

    private final SparseIntArray mViewTypeToLayoutMap = new SparseIntArray();

    public DeviceSearchAdapterProvider(Launcher launcher) {
    public DeviceSearchAdapterProvider(Launcher launcher, AllAppsContainerView appsView) {
        super(launcher);
        mAppsView = appsView;

        mViewTypeToLayoutMap.put(VIEW_TYPE_SEARCH_ICON, R.layout.search_result_icon);
        mViewTypeToLayoutMap.put(VIEW_TYPE_SEARCH_CORPUS_TITLE, R.layout.search_section_title);
@@ -68,13 +73,17 @@ public class DeviceSearchAdapterProvider extends SearchAdapterProvider {

    @Override
    public void onBindView(AllAppsGridAdapter.ViewHolder holder, int position) {
        SearchAdapterItem item = (SearchAdapterItem) Launcher.getLauncher(mLauncher)
                .getAppsView().getApps().getAdapterItems().get(position);
        SearchAdapterItem item = (SearchAdapterItem) mAppsView.getApps().getAdapterItems().get(
                position);
        SearchTargetHandler
                payloadResultView =
                (SearchTargetHandler) holder.itemView;
        if (FeatureFlags.SEARCH_TARGET_LEGACY.get()) {
            payloadResultView.applySearchTarget(item.getSearchTargetLegacy());
        } else {
            payloadResultView.applySearchTarget(item.getSearchTarget());
        }
    }

    @Override
    public boolean isSearchView(int viewType) {
@@ -101,10 +110,23 @@ public class DeviceSearchAdapterProvider extends SearchAdapterProvider {
    @Override
    public boolean onAdapterItemSelected(AllAppsGridAdapter.AdapterItem focusedItem) {
        if (focusedItem instanceof SearchTargetHandler) {
            SearchTarget searchTarget = ((SearchAdapterItem) focusedItem).getSearchTarget();
            SearchTargetLegacy searchTarget = ((SearchAdapterItem) focusedItem)
                    .getSearchTargetLegacy();
            SearchEventTracker.INSTANCE.get(mLauncher).quickSelect(searchTarget);
            return true;
        }
        return false;
    }

    /**
     * Determines what view type should be used to present search target.
     * Returns -1 if viewType is not found
     */
    public int getViewTypeForSearchTarget(SearchTarget t) {
        //TODO: Replace with values from :SearchUi
        if (t.getResultType() == 1 && t.getLayoutType().equals("icon")) {
            return VIEW_TYPE_SEARCH_ICON;
        }
        return -1;
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -27,13 +27,16 @@ import static com.android.launcher3.search.DeviceSearchAdapterProvider.VIEW_TYPE
import static com.android.launcher3.search.DeviceSearchAdapterProvider.VIEW_TYPE_SEARCH_WIDGET_LIVE;
import static com.android.launcher3.search.DeviceSearchAdapterProvider.VIEW_TYPE_SEARCH_WIDGET_PREVIEW;

import android.app.search.SearchTarget;

import com.android.launcher3.allapps.AllAppsGridAdapter;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetLegacy;

/**
 * Extension of AdapterItem that contains an extra payload specific to item
 */
public class SearchAdapterItem extends AllAppsGridAdapter.AdapterItem {
    private SearchTargetLegacy mSearchTargetLegacy;
    private SearchTarget mSearchTarget;


@@ -43,11 +46,21 @@ public class SearchAdapterItem extends AllAppsGridAdapter.AdapterItem {
            | VIEW_TYPE_SEARCH_WIDGET_PREVIEW | VIEW_TYPE_SEARCH_WIDGET_LIVE
            | VIEW_TYPE_SEARCH_SUGGEST;

    public SearchAdapterItem(SearchTargetLegacy searchTargetLegacy, int type) {
        mSearchTargetLegacy = searchTargetLegacy;
        viewType = type;
    }


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

    public SearchTargetLegacy getSearchTargetLegacy() {
        return mSearchTargetLegacy;
    }

    public SearchTarget getSearchTarget() {
        return mSearchTarget;
    }
+9 −8
Original line number Diff line number Diff line
@@ -23,8 +23,8 @@ import androidx.annotation.Nullable;

import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.systemui.plugins.AllAppsSearchPlugin;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetEvent;
import com.android.systemui.plugins.shared.SearchTargetEventLegacy;
import com.android.systemui.plugins.shared.SearchTargetLegacy;

import java.util.WeakHashMap;

@@ -34,7 +34,7 @@ import java.util.WeakHashMap;
public class SearchEventTracker {
    @Nullable
    private AllAppsSearchPlugin mPlugin;
    private final WeakHashMap<SearchTarget, SearchTargetHandler>
    private final WeakHashMap<SearchTargetLegacy, SearchTargetHandler>
            mCallbacks = new WeakHashMap<>();

    public static final MainThreadInitializedObject<SearchEventTracker> INSTANCE =
@@ -60,26 +60,27 @@ public class SearchEventTracker {
    /**
     * Sends SearchTargetEvent to search provider
     */
    public void notifySearchTargetEvent(SearchTargetEvent searchTargetEvent) {
    public void notifySearchTargetEvent(SearchTargetEventLegacy searchTargetEvent) {
        if (mPlugin != null) {
            UI_HELPER_EXECUTOR.post(() -> mPlugin.notifySearchTargetEvent(searchTargetEvent));
            UI_HELPER_EXECUTOR.post(() -> mPlugin.notifySearchTargetEventLegacy(searchTargetEvent));
        }
    }

    /**
     * Registers a {@link SearchTargetHandler} to handle quick launch for specified SearchTarget.
     */
    public void registerWeakHandler(SearchTarget searchTarget, SearchTargetHandler targetHandler) {
    public void registerWeakHandler(SearchTargetLegacy searchTarget,
            SearchTargetHandler targetHandler) {
        mCallbacks.put(searchTarget, targetHandler);
    }

    /**
     * Handles quick select for SearchTarget
     */
    public void quickSelect(SearchTarget searchTarget) {
    public void quickSelect(SearchTargetLegacy searchTarget) {
        SearchTargetHandler searchTargetHandler = mCallbacks.get(searchTarget);
        if (searchTargetHandler != null) {
            searchTargetHandler.handleSelection(SearchTargetEvent.QUICK_SELECT);
            searchTargetHandler.handleSelection(SearchTargetEventLegacy.QUICK_SELECT);
        }
    }

+17 −8
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;

import android.app.RemoteAction;
import android.app.search.SearchTarget;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ShortcutInfo;
@@ -42,8 +43,8 @@ import com.android.launcher3.model.data.RemoteActionItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
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 com.android.systemui.plugins.shared.SearchTargetEventLegacy;
import com.android.systemui.plugins.shared.SearchTargetLegacy;

import java.util.function.Consumer;

@@ -69,7 +70,7 @@ public class SearchResultIcon extends BubbleTextView implements

    private final Launcher mLauncher;

    private SearchTarget mSearchTarget;
    private SearchTargetLegacy mSearchTarget;
    private Consumer<ItemInfoWithIcon> mOnItemInfoChanged;

    public SearchResultIcon(Context context) {
@@ -100,13 +101,13 @@ public class SearchResultIcon extends BubbleTextView implements
     * Applies search target with a ItemInfoWithIcon consumer to be called after itemInfo is
     * constructed
     */
    public void applySearchTarget(SearchTarget searchTarget, Consumer<ItemInfoWithIcon> cb) {
    public void applySearchTarget(SearchTargetLegacy searchTarget, Consumer<ItemInfoWithIcon> cb) {
        mOnItemInfoChanged = cb;
        applySearchTarget(searchTarget);
    }

    @Override
    public void applySearchTarget(SearchTarget searchTarget) {
    public void applySearchTarget(SearchTargetLegacy searchTarget) {
        mSearchTarget = searchTarget;
        SearchEventTracker.getInstance(getContext()).registerWeakHandler(mSearchTarget, this);
        setVisibility(VISIBLE);
@@ -127,9 +128,16 @@ public class SearchResultIcon extends BubbleTextView implements
        }
    }

    @Override
    public void applySearchTarget(SearchTarget searchTarget) {
        prepareUsingApp(new ComponentName(searchTarget.getPackageName(),
                searchTarget.getExtras().getString("class")), searchTarget.getUserHandle());
    }

    private void prepareUsingApp(ComponentName componentName, UserHandle userHandle) {
        AllAppsStore appsStore = mLauncher.getAppsView().getAppsStore();
        AppInfo appInfo = appsStore.getApp(new ComponentKey(componentName, userHandle));

        if (appInfo == null) {
            setVisibility(GONE);
            return;
@@ -181,7 +189,8 @@ public class SearchResultIcon extends BubbleTextView implements
    }

    private void reportEvent(int eventType) {
        SearchTargetEvent.Builder b = new SearchTargetEvent.Builder(mSearchTarget, eventType);
        SearchTargetEventLegacy.Builder b = new SearchTargetEventLegacy.Builder(mSearchTarget,
                eventType);
        if (mSearchTarget.getItemType().equals(TARGET_TYPE_SHORTCUT)) {
            b.setShortcutPosition(0);
        }
@@ -191,7 +200,7 @@ public class SearchResultIcon extends BubbleTextView implements

    @Override
    public void onClick(View view) {
        handleSelection(SearchTargetEvent.SELECT);
        handleSelection(SearchTargetEventLegacy.SELECT);
    }

    @Override
@@ -199,7 +208,7 @@ public class SearchResultIcon extends BubbleTextView implements
        if (!supportsLongPress(mSearchTarget.getItemType())) {
            return false;
        }
        reportEvent(SearchTargetEvent.LONG_PRESS);
        reportEvent(SearchTargetEventLegacy.LONG_PRESS);
        return ItemLongClickListener.INSTANCE_ALL_APPS.onLongClick(view);

    }
+7 −6
Original line number Diff line number Diff line
@@ -39,8 +39,8 @@ import com.android.launcher3.R;
import com.android.launcher3.model.data.ItemInfoWithIcon;
import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetEvent;
import com.android.systemui.plugins.shared.SearchTargetEventLegacy;
import com.android.systemui.plugins.shared.SearchTargetLegacy;

import java.util.ArrayList;
import java.util.List;
@@ -63,7 +63,7 @@ public class SearchResultIconRow extends LinearLayout implements
    private TextView mDescriptionView;
    private BubbleTextView[] mShortcutViews = new BubbleTextView[2];

    private SearchTarget mSearchTarget;
    private SearchTargetLegacy mSearchTarget;
    private PackageItemInfo mProviderInfo;


@@ -100,8 +100,9 @@ public class SearchResultIconRow extends LinearLayout implements
            lp.width = iconSize;
            bubbleTextView.setOnClickListener(view -> {
                WorkspaceItemInfo itemInfo = (WorkspaceItemInfo) bubbleTextView.getTag();
                SearchTargetEvent event = new SearchTargetEvent.Builder(mSearchTarget,
                        SearchTargetEvent.CHILD_SELECT).setShortcutPosition(itemInfo.rank).build();
                SearchTargetEventLegacy event = new SearchTargetEventLegacy.Builder(mSearchTarget,
                        SearchTargetEventLegacy.CHILD_SELECT).setShortcutPosition(
                        itemInfo.rank).build();
                SearchEventTracker.getInstance(getContext()).notifySearchTargetEvent(event);
                mLauncher.getItemOnClickListener().onClick(view);
            });
@@ -111,7 +112,7 @@ public class SearchResultIconRow extends LinearLayout implements
    }

    @Override
    public void applySearchTarget(SearchTarget searchTarget) {
    public void applySearchTarget(SearchTargetLegacy searchTarget) {
        mSearchTarget = searchTarget;
        mResultIcon.applySearchTarget(searchTarget, this);
        String itemType = searchTarget.getItemType();
Loading