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

Commit 1a12804a authored by Soroosh Mariooryad's avatar Soroosh Mariooryad Committed by Android (Google) Code Review
Browse files

Merge "Adding APIs for smart search ranking."

parents 311a6865 172f888a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
        });
    }
+26 −0
Original line number Diff line number Diff line
@@ -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;
    }

}
+2 −2
Original line number Diff line number Diff line
@@ -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());
    }
+12 −2
Original line number Diff line number Diff line
@@ -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();

+5 −2
Original line number Diff line number Diff line
@@ -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);
Loading