diff options
4 files changed, 112 insertions, 38 deletions
diff --git a/src/com/android/settings/intelligence/search/car/CarIntentSearchViewHolder.java b/src/com/android/settings/intelligence/search/car/CarIntentSearchViewHolder.java index bc3ef60..a8353cd 100644 --- a/src/com/android/settings/intelligence/search/car/CarIntentSearchViewHolder.java +++ b/src/com/android/settings/intelligence/search/car/CarIntentSearchViewHolder.java @@ -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) { diff --git a/src/com/android/settings/intelligence/search/car/CarSearchFragment.java b/src/com/android/settings/intelligence/search/car/CarSearchFragment.java index 0c49b11..702be42 100644 --- a/src/com/android/settings/intelligence/search/car/CarSearchFragment.java +++ b/src/com/android/settings/intelligence/search/car/CarSearchFragment.java @@ -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) { } diff --git a/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryController.java b/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryController.java index fa222a0..4c9a458 100644 --- a/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryController.java +++ b/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryController.java @@ -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; } } diff --git a/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryViewHolder.java b/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryViewHolder.java index 0f03c23..12051a8 100644 --- a/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryViewHolder.java +++ b/src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryViewHolder.java @@ -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); }); } } |