Loading src/com/android/settings/intelligence/search/car/CarIntentSearchViewHolder.java +1 −24 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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) { Loading src/com/android/settings/intelligence/search/car/CarSearchFragment.java +80 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; /** Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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(); Loading @@ -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) { } Loading src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryController.java +30 −2 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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 Loading @@ -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; } } Loading src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryViewHolder.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); }); } } Loading
src/com/android/settings/intelligence/search/car/CarIntentSearchViewHolder.java +1 −24 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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) { Loading
src/com/android/settings/intelligence/search/car/CarSearchFragment.java +80 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; /** Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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(); Loading @@ -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) { } Loading
src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryController.java +30 −2 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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 Loading @@ -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; } } Loading
src/com/android/settings/intelligence/search/savedqueries/car/CarSavedQueryViewHolder.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); }); } }