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

Commit 013ff860 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Integrate settings search with IME wide screen to display the search results."

parents 2fc29e42 ff29a28a
Loading
Loading
Loading
Loading
+1 −24
Original line number Diff line number Diff line
@@ -16,25 +16,18 @@

package com.android.settings.intelligence.search.car;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;

import com.android.settings.intelligence.R;
import com.android.settings.intelligence.search.AppSearchResult;
import com.android.settings.intelligence.search.SearchResult;

import java.util.List;

/**
 * ViewHolder for intent based search results.
 */
public class CarIntentSearchViewHolder extends CarSearchViewHolder {
    private static final String TAG = "CarIntentSearchViewHolder";
    private static final int REQUEST_CODE_NO_OP = 0;

    public CarIntentSearchViewHolder(View view) {
        super(view);
@@ -52,23 +45,7 @@ public class CarIntentSearchViewHolder extends CarSearchViewHolder {
        }
        bindBreadcrumbView(result);

        itemView.setOnClickListener(v -> {
            fragment.onSearchResultClicked(/* resultViewHolder= */ this, result);
            Intent intent = result.payload.getIntent();
            if (result instanceof AppSearchResult) {
                AppSearchResult appResult = (AppSearchResult) result;
                fragment.getActivity().startActivity(intent);
            } else {
                PackageManager pm = fragment.getActivity().getPackageManager();
                List<ResolveInfo> info = pm.queryIntentActivities(intent, /* flags= */ 0);
                if (info != null && !info.isEmpty()) {
                    fragment.startActivityForResult(intent, REQUEST_CODE_NO_OP);
                } else {
                    Log.e(TAG, "Cannot launch search result, title: "
                            + result.title + ", " + intent);
                }
            }
        });
        itemView.setOnClickListener(v -> fragment.onSearchResultClicked(result));
    }

    private void bindBreadcrumbView(SearchResult result) {
+80 −11
Original line number Diff line number Diff line
@@ -18,11 +18,19 @@ package com.android.settings.intelligence.search.car;

import static com.android.car.ui.core.CarUi.requireInsets;
import static com.android.car.ui.core.CarUi.requireToolbar;
import static com.android.car.ui.utils.CarUiUtils.drawableToBitmap;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

@@ -31,12 +39,15 @@ import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.RecyclerView;

import com.android.car.ui.imewidescreen.CarUiImeSearchListItem;
import com.android.car.ui.preference.PreferenceFragment;
import com.android.car.ui.recyclerview.CarUiContentListItem;
import com.android.car.ui.toolbar.MenuItem;
import com.android.car.ui.toolbar.Toolbar;
import com.android.car.ui.toolbar.ToolbarController;
import com.android.settings.intelligence.R;
import com.android.settings.intelligence.overlay.FeatureFactory;
import com.android.settings.intelligence.search.AppSearchResult;
import com.android.settings.intelligence.search.SearchCommon;
import com.android.settings.intelligence.search.SearchFeatureProvider;
import com.android.settings.intelligence.search.SearchResult;
@@ -44,6 +55,7 @@ import com.android.settings.intelligence.search.indexing.IndexingCallback;
import com.android.settings.intelligence.search.savedqueries.car.CarSavedQueryController;
import com.android.settings.intelligence.search.savedqueries.car.CarSavedQueryViewHolder;

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

/**
@@ -51,6 +63,8 @@ import java.util.List;
 */
public class CarSearchFragment extends PreferenceFragment implements
        LoaderManager.LoaderCallbacks<List<? extends SearchResult>>, IndexingCallback {
    private static final String TAG = "CarSearchFragment";
    private static final int REQUEST_CODE_NO_OP = 0;

    private SearchFeatureProvider mSearchFeatureProvider;

@@ -106,15 +120,15 @@ public class CarSearchFragment extends PreferenceFragment implements

        LoaderManager loaderManager = getLoaderManager();
        mSearchAdapter = new CarSearchResultsAdapter(/* fragment= */ this);
        mToolbar = getToolbar();
        mSavedQueryController = new CarSavedQueryController(
                getContext(), loaderManager, mSearchAdapter);
                getContext(), loaderManager, mSearchAdapter, mToolbar, this);
        mSearchFeatureProvider.updateIndexAsync(getContext(), /* indexingCallback= */ this);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mToolbar = getToolbar();
        if (mToolbar != null) {
            List<MenuItem> items = getToolbarMenuItems();
            mToolbar.setTitle(getPreferenceScreen().getTitle());
@@ -181,20 +195,12 @@ public class CarSearchFragment extends PreferenceFragment implements
    /**
     * Gets called when a saved query is clicked.
     */
    public void onSavedQueryClicked(CarSavedQueryViewHolder vh, CharSequence query) {
    public void onSavedQueryClicked(CharSequence query) {
        String queryString = query.toString();
        mToolbar.setSearchQuery(queryString);
        onQueryTextChange(queryString);
    }

    /**
     * Gets called when a search result is clicked.
     */
    public void onSearchResultClicked(CarSearchViewHolder resultViewHolder, SearchResult result) {
        mSearchFeatureProvider.searchResultClicked(getContext(), mQuery, result);
        mSavedQueryController.saveQuery(mQuery);
    }

    @Override
    public Loader<List<? extends SearchResult>> onCreateLoader(int id, Bundle args) {
        Activity activity = getActivity();
@@ -208,10 +214,73 @@ public class CarSearchFragment extends PreferenceFragment implements
    @Override
    public void onLoadFinished(Loader<List<? extends SearchResult>> loader,
            List<? extends SearchResult> data) {

        if (mToolbar.canShowSearchResultItems()) {
            List<CarUiImeSearchListItem> searchItems = new ArrayList<>();
            for (SearchResult result : data) {
                CarUiImeSearchListItem item = new CarUiImeSearchListItem(
                        CarUiContentListItem.Action.ICON);
                item.setTitle(result.title);
                if (result.breadcrumbs != null && !result.breadcrumbs.isEmpty()) {
                    item.setBody(getBreadcrumb(result));
                }

                if (result instanceof AppSearchResult) {
                    AppSearchResult appResult = (AppSearchResult) result;
                    PackageManager pm = getActivity().getPackageManager();
                    Drawable drawable = appResult.info.loadIcon(pm);
                    Bitmap bm = drawableToBitmap(drawable);
                    BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bm);
                    item.setIcon(bitmapDrawable);
                } else if (result.icon != null) {
                    Bitmap bm = drawableToBitmap(result.icon);
                    BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bm);
                    item.setIcon(bitmapDrawable);
                }
                item.setOnItemClickedListener(v -> onSearchResultClicked(result));

                searchItems.add(item);
            }
            mToolbar.setSearchResultItems(searchItems);
        }

        mSearchAdapter.postSearchResults(data);
        mRecyclerView.scrollToPosition(0);
    }

    private String getBreadcrumb(SearchResult result) {
        String breadcrumb = result.breadcrumbs.get(0);
        int count = result.breadcrumbs.size();
        for (int i = 1; i < count; i++) {
            breadcrumb = getContext().getString(R.string.search_breadcrumb_connector,
                    breadcrumb, result.breadcrumbs.get(i));
        }

        return breadcrumb;
    }

    /**
     * Gets called when a search result is clicked.
     */
    protected void onSearchResultClicked(SearchResult result) {
        mSearchFeatureProvider.searchResultClicked(getContext(), mQuery, result);
        mSavedQueryController.saveQuery(mQuery);

        Intent intent = result.payload.getIntent();
        if (result instanceof AppSearchResult) {
            getActivity().startActivity(intent);
        } else {
            PackageManager pm = getActivity().getPackageManager();
            List<ResolveInfo> info = pm.queryIntentActivities(intent, /* flags= */ 0);
            if (info != null && !info.isEmpty()) {
                startActivityForResult(intent, REQUEST_CODE_NO_OP);
            } else {
                Log.e(TAG, "Cannot launch search result, title: "
                        + result.title + ", " + intent);
            }
        }
    }

    @Override
    public void onLoaderReset(Loader<List<? extends SearchResult>> loader) {
    }
+30 −2
Original line number Diff line number Diff line
@@ -21,17 +21,24 @@ import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;

import com.android.car.ui.imewidescreen.CarUiImeSearchListItem;
import com.android.car.ui.recyclerview.CarUiContentListItem;
import com.android.car.ui.toolbar.ToolbarController;
import com.android.settings.intelligence.R;
import com.android.settings.intelligence.overlay.FeatureFactory;
import com.android.settings.intelligence.search.SearchCommon;
import com.android.settings.intelligence.search.SearchFeatureProvider;
import com.android.settings.intelligence.search.SearchResult;
import com.android.settings.intelligence.search.car.CarSearchFragment;
import com.android.settings.intelligence.search.car.CarSearchResultsAdapter;
import com.android.settings.intelligence.search.savedqueries.SavedQueryRecorder;
import com.android.settings.intelligence.search.savedqueries.SavedQueryRemover;

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

/**
@@ -49,14 +56,19 @@ public class CarSavedQueryController implements LoaderManager.LoaderCallbacks,
    private final LoaderManager mLoaderManager;
    private final SearchFeatureProvider mSearchFeatureProvider;
    private final CarSearchResultsAdapter mResultAdapter;
    private ToolbarController mToolbar;
    private CarSearchFragment mFragment;

    public CarSavedQueryController(Context context, LoaderManager loaderManager,
            CarSearchResultsAdapter resultsAdapter) {
            CarSearchResultsAdapter resultsAdapter, @NonNull ToolbarController toolbar,
            CarSearchFragment fragment) {
        mContext = context;
        mLoaderManager = loaderManager;
        mResultAdapter = resultsAdapter;
        mSearchFeatureProvider = FeatureFactory.get(context)
                .searchFeatureProvider();
        mToolbar = toolbar;
        mFragment = fragment;
    }

    @Override
@@ -83,7 +95,23 @@ public class CarSavedQueryController implements LoaderManager.LoaderCallbacks,
                if (SearchFeatureProvider.DEBUG) {
                    Log.d(TAG, "Saved queries loaded");
                }
                mResultAdapter.displaySavedQuery((List<SearchResult>) data);
                List<SearchResult> results = (List<SearchResult>) data;
                if (mToolbar.canShowSearchResultItems()) {
                    List<CarUiImeSearchListItem> searchItems = new ArrayList<>();
                    for (SearchResult result : results) {
                        CarUiImeSearchListItem item = new CarUiImeSearchListItem(
                                CarUiContentListItem.Action.ICON);
                        item.setTitle(result.title);
                        item.setIconResId(R.drawable.ic_restore);
                        item.setOnItemClickedListener(
                                v -> mFragment.onSavedQueryClicked(result.title));

                        searchItems.add(item);
                    }
                    mToolbar.setSearchResultItems(searchItems);
                }

                mResultAdapter.displaySavedQuery(results);
                break;
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ public class CarSavedQueryViewHolder extends CarSearchViewHolder {
        mIcon.setImageResource(R.drawable.ic_restore);
        mSummary.setVisibility(View.GONE);
        itemView.setOnClickListener(v -> {
            fragment.onSavedQueryClicked(CarSavedQueryViewHolder.this, result.title);
            fragment.onSavedQueryClicked(result.title);
        });
    }
}