Integrate wide screen kb in settings search results

Bug: 172068293
Test: Manual
Change-Id: Ice37cf4959681325f8aa9ff7fd5be49df79a43d5
Merged-In: Ice37cf4959681325f8aa9ff7fd5be49df79a43d5
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 @@
         }
         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 @@
 
 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.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.savedqueries.car.CarSavedQueryController;
 import com.android.settings.intelligence.search.savedqueries.car.CarSavedQueryViewHolder;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -51,6 +63,8 @@
  */
 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 @@
 
         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 @@
     /**
      * 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 @@
     @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.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 @@
     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 @@
                 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 @@
         mIcon.setImageResource(R.drawable.ic_restore);
         mSummary.setVisibility(View.GONE);
         itemView.setOnClickListener(v -> {
-            fragment.onSavedQueryClicked(CarSavedQueryViewHolder.this, result.title);
+            fragment.onSavedQueryClicked(result.title);
         });
     }
 }