Adding APIs for smart search ranking.
Test: RunSettingsRoboTests Bug: 36866337 Change-Id: I20a26e5ac7a57582cea24951120717a4f2c93ce0
This commit is contained in:
@@ -51,6 +51,7 @@ public class IntentSearchViewHolder extends SearchViewHolder {
|
||||
mMetricsFeatureProvider.action(v.getContext(),
|
||||
MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT,
|
||||
resultName, rank);
|
||||
mSearchFeatureProvider.searchResultClicked(fragment.mQuery, result);
|
||||
fragment.startActivity(intent);
|
||||
});
|
||||
}
|
||||
|
@@ -22,6 +22,8 @@ import android.view.Menu;
|
||||
import android.view.View;
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* FeatureProvider for Settings Search
|
||||
*/
|
||||
@@ -89,5 +91,29 @@ public interface SearchFeatureProvider {
|
||||
default void hideFeedbackButton() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Ranks search results based on the input query.
|
||||
*
|
||||
* @param query input user query
|
||||
* @param searchResults list of search results to be ranked
|
||||
*/
|
||||
default void rankSearchResults(String query, List<SearchResult> searchResults) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify that a search result is clicked.
|
||||
*
|
||||
* @param query input user query
|
||||
* @param searchResult clicked result
|
||||
*/
|
||||
default void searchResultClicked(String query, SearchResult searchResult) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true to enable search ranking.
|
||||
*/
|
||||
default boolean isSmartSearchRankingEnabled(Context context) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -117,7 +117,7 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
final LoaderManager loaderManager = getLoaderManager();
|
||||
mSearchAdapter = new SearchResultsAdapter(this);
|
||||
mSearchAdapter = new SearchResultsAdapter(this, mSearchFeatureProvider);
|
||||
mSavedQueryController = new SavedQueryController(
|
||||
getContext(), loaderManager, mSearchAdapter);
|
||||
mSearchFeatureProvider.initFeedbackButton();
|
||||
@@ -251,7 +251,7 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O
|
||||
if (mUnfinishedLoadersCount.decrementAndGet() != 0) {
|
||||
return;
|
||||
}
|
||||
final int resultCount = mSearchAdapter.displaySearchResults();
|
||||
final int resultCount = mSearchAdapter.displaySearchResults(mQuery);
|
||||
mNoResultsView.setVisibility(resultCount == 0 ? View.VISIBLE : View.GONE);
|
||||
mSearchFeatureProvider.showFeedbackButton(this, getView());
|
||||
}
|
||||
|
@@ -40,11 +40,14 @@ public class SearchResultsAdapter extends RecyclerView.Adapter<SearchViewHolder>
|
||||
private final List<SearchResult> mSearchResults;
|
||||
private final SearchFragment mFragment;
|
||||
private Map<String, List<? extends SearchResult>> mResultsMap;
|
||||
private final SearchFeatureProvider mSearchFeatureProvider;
|
||||
|
||||
public SearchResultsAdapter(SearchFragment fragment) {
|
||||
public SearchResultsAdapter(SearchFragment fragment,
|
||||
SearchFeatureProvider searchFeatureProvider) {
|
||||
mFragment = fragment;
|
||||
mSearchResults = new ArrayList<>();
|
||||
mResultsMap = new ArrayMap<>();
|
||||
mSearchFeatureProvider = searchFeatureProvider;
|
||||
|
||||
setHasStableIds(true);
|
||||
}
|
||||
@@ -119,9 +122,10 @@ public class SearchResultsAdapter extends RecyclerView.Adapter<SearchViewHolder>
|
||||
* Merge the results from each of the loaders into one list for the adapter.
|
||||
* Prioritizes results from the local database over installed apps.
|
||||
*
|
||||
* @param query user query corresponding to these results
|
||||
* @return Number of matched results
|
||||
*/
|
||||
public int displaySearchResults() {
|
||||
public int displaySearchResults(String query) {
|
||||
final List<? extends SearchResult> databaseResults = mResultsMap
|
||||
.get(DatabaseResultLoader.class.getName());
|
||||
final List<? extends SearchResult> installedAppResults = mResultsMap
|
||||
@@ -151,6 +155,12 @@ public class SearchResultsAdapter extends RecyclerView.Adapter<SearchViewHolder>
|
||||
results.add(installedAppResults.get(appIndex++));
|
||||
}
|
||||
|
||||
if (mSearchFeatureProvider
|
||||
.isSmartSearchRankingEnabled(mFragment.getContext().getApplicationContext())) {
|
||||
// TODO: run this in parallel to loading the results if takes too long
|
||||
mSearchFeatureProvider.rankSearchResults(query, results);
|
||||
}
|
||||
|
||||
mSearchResults.addAll(results);
|
||||
notifyDataSetChanged();
|
||||
|
||||
|
@@ -40,11 +40,14 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder {
|
||||
public final ImageView iconView;
|
||||
|
||||
protected final MetricsFeatureProvider mMetricsFeatureProvider;
|
||||
protected final SearchFeatureProvider mSearchFeatureProvider;
|
||||
|
||||
public SearchViewHolder(View view) {
|
||||
super(view);
|
||||
mMetricsFeatureProvider = FeatureFactory.getFactory(view.getContext())
|
||||
.getMetricsFeatureProvider();
|
||||
final FeatureFactory featureFactory = FeatureFactory
|
||||
.getFactory(view.getContext().getApplicationContext());
|
||||
mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
|
||||
mSearchFeatureProvider = featureFactory.getSearchFeatureProvider();
|
||||
titleView = view.findViewById(android.R.id.title);
|
||||
summaryView = view.findViewById(android.R.id.summary);
|
||||
iconView = view.findViewById(android.R.id.icon);
|
||||
|
Reference in New Issue
Block a user