Move search querying into a single API
Settings now collects search results from a single loader which fetches from an aggregator. This is to facilitate the separation of search functionalitiy, where "query" becomes a single synchronous call. In this case, the aggregator will move to the unbundled app and would be called on the other end of the Query call. i.e. the new search result loader will just call query, and unbundled search will handle everything else. An important implication is that the results will be returned in a ranked order. Thus the ranking and merging logic has been moved out of the RecyclerView adapter (which is a good clean-up, anyway). The SearchResultAggregator starts a Future for each of the data sources: - Static Results - Installed Apps - Input Devices - Accessibility Services We allow up to 500ms to collect the static results, and then an additional 150ms for each subsequent loader. In my quick tests, the static results take about 20-30ms to load. The longest loader is installed apps which takes roughly 50-60ms seconds (note that this will be improved with dynamic result caching). To handle the ranking in DatabaseResultLoader, we start a Future to collect the dynamic ranking before we start the SQL queries. When the SQL is done, we wait the same timeout as before. Then we merge the results, as before. For now we have not changed how the Dynamic results are collected, but eventually they will be a cache of dynamic results. Bug: 33577327 Bug: 67360547 Test: robotests Change-Id: I91fb03f9fd059672a970f48bea21c8d655007fa3
This commit is contained in:
@@ -19,10 +19,14 @@ package com.android.settings.search;
|
||||
import android.annotation.NonNull;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.util.Pair;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.settings.dashboard.SiteMapManager;
|
||||
import com.android.settings.search.ranking.SearchResultsRankerCallback;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.FutureTask;
|
||||
|
||||
/**
|
||||
* FeatureProvider for Settings Search
|
||||
@@ -43,26 +47,31 @@ public interface SearchFeatureProvider {
|
||||
void verifyLaunchSearchResultPageCaller(Context context, @NonNull ComponentName caller)
|
||||
throws SecurityException, IllegalArgumentException;
|
||||
|
||||
/**
|
||||
* Returns a new loader to get settings search results.
|
||||
*/
|
||||
SearchResultLoader getSearchResultLoader(Context context, String query);
|
||||
|
||||
/**
|
||||
* Returns a new loader to search in index database.
|
||||
*/
|
||||
DatabaseResultLoader getDatabaseSearchLoader(Context context, String query);
|
||||
DatabaseResultLoader getStaticSearchResultTask(Context context, String query);
|
||||
|
||||
/**
|
||||
* Returns a new loader to search installed apps.
|
||||
*/
|
||||
InstalledAppResultLoader getInstalledAppSearchLoader(Context context, String query);
|
||||
InstalledAppResultLoader getInstalledAppSearchTask(Context context, String query);
|
||||
|
||||
/**
|
||||
* Returns a new loader to search accessibility services.
|
||||
*/
|
||||
AccessibilityServiceResultLoader getAccessibilityServiceResultLoader(Context context,
|
||||
AccessibilityServiceResultLoader getAccessibilityServiceResultTask(Context context,
|
||||
String query);
|
||||
|
||||
/**
|
||||
* Returns a new loader to search input devices.
|
||||
*/
|
||||
InputDeviceResultLoader getInputDeviceResultLoader(Context context, String query);
|
||||
InputDeviceResultLoader getInputDeviceResultTask(Context context, String query);
|
||||
|
||||
/**
|
||||
* Returns a new loader to get all recently saved queries search terms.
|
||||
@@ -95,6 +104,11 @@ public interface SearchFeatureProvider {
|
||||
*/
|
||||
boolean isIndexingComplete(Context context);
|
||||
|
||||
/**
|
||||
* @return a {@link ExecutorService} to be shared between search tasks.
|
||||
*/
|
||||
ExecutorService getExecutorService();
|
||||
|
||||
/**
|
||||
* Initializes the feedback button in case it was dismissed.
|
||||
*/
|
||||
@@ -114,23 +128,6 @@ public interface SearchFeatureProvider {
|
||||
default void hideFeedbackButton() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Query search results based on the input query.
|
||||
*
|
||||
* @param context application context
|
||||
* @param query input user query
|
||||
* @param searchResultsRankerCallback {@link SearchResultsRankerCallback}
|
||||
*/
|
||||
default void querySearchResults(Context context, String query,
|
||||
SearchResultsRankerCallback searchResultsRankerCallback) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel pending search query
|
||||
*/
|
||||
default void cancelPendingSearchQuery(Context context) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify that a search result is clicked.
|
||||
*
|
||||
@@ -161,4 +158,10 @@ public interface SearchFeatureProvider {
|
||||
default void searchRankingWarmup(Context context) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a FutureTask to get a list of scores for search results.
|
||||
*/
|
||||
default FutureTask<List<Pair<String, Float>>> getRankerTask(Context context, String query) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user