Move indexing into the Search Fragment

Cold start latency for Settings increased drastically
from the indexing of the Search Database. Moving it into
the Search Fragment moves that latency to cases where
users are actually searching.

Change-Id: I11368af610ac9e80f9901654f980c2c1e26342a5
Fixes: 34142852
Test: make RunSettingsRoboTests
This commit is contained in:
Matthew Fritze
2017-01-18 18:24:56 -08:00
parent c3fdc3e813
commit 34c27609d6
6 changed files with 46 additions and 14 deletions

View File

@@ -191,12 +191,14 @@ public class SettingsActivity extends SettingsDrawerActivity
private final BroadcastReceiver mUserAddRemoveReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (mSearchFeatureProvider != null && !mSearchFeatureProvider.isEnabled(context)) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_USER_ADDED)
|| action.equals(Intent.ACTION_USER_REMOVED)) {
mSearchFeatureProvider.updateIndex(getApplicationContext());
}
}
}
};
private DynamicIndexableContentMonitor mDynamicIndexableContentMonitor;
@@ -251,8 +253,10 @@ public class SettingsActivity extends SettingsDrawerActivity
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (!mSearchFeatureProvider.isEnabled(this)) {
mSearchFeatureProvider.updateIndex(getApplicationContext());
}
}
@Override
protected void onStart() {
@@ -400,7 +404,7 @@ public class SettingsActivity extends SettingsDrawerActivity
getFragmentManager().addOnBackStackChangedListener(this);
if (mIsShowingDashboard) {
if (mIsShowingDashboard && !mSearchFeatureProvider.isEnabled(this)) {
// Run the Index update only if we have some space
if (!Utils.isLowStorage(this)) {
mSearchFeatureProvider.updateIndex(getApplicationContext());
@@ -642,8 +646,10 @@ public class SettingsActivity extends SettingsDrawerActivity
mDevelopmentPreferencesListener);
registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
if (!mSearchFeatureProvider.isEnabled(this)) {
registerReceiver(mUserAddRemoveReceiver, new IntentFilter(Intent.ACTION_USER_ADDED));
registerReceiver(mUserAddRemoveReceiver, new IntentFilter(Intent.ACTION_USER_REMOVED));
}
if (mDynamicIndexableContentMonitor == null) {
mDynamicIndexableContentMonitor = new DynamicIndexableContentMonitor();
}
@@ -659,7 +665,9 @@ public class SettingsActivity extends SettingsDrawerActivity
protected void onPause() {
super.onPause();
unregisterReceiver(mBatteryInfoReceiver);
if (!mSearchFeatureProvider.isEnabled(this)) {
unregisterReceiver(mUserAddRemoveReceiver);
}
if (mDynamicIndexableContentMonitor != null) {
mDynamicIndexableContentMonitor.unregister(this, LOADER_ID_INDEXABLE_CONTENT_MONITOR);
}

View File

@@ -201,7 +201,7 @@ public class IndexDatabaseHelper extends SQLiteOpenHelper {
reconstruct(db);
}
private void reconstruct(SQLiteDatabase db) {
public void reconstruct(SQLiteDatabase db) {
dropTables(db);
bootstrapDB(db);
}

View File

@@ -152,7 +152,7 @@ public class DatabaseIndexingManager {
return mIsAvailable.get();
}
public void update() {
public void indexDatabase() {
AsyncTask.execute(new Runnable() {
@Override
public void run() {

View File

@@ -85,10 +85,11 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
public void updateIndex(Context context) {
long indexStartTime = System.currentTimeMillis();
if (isEnabled(context)) {
getIndexingManager(context).update();
getIndexingManager(context).indexDatabase();
} else {
Index.getInstance(context).update();
}
Log.d(TAG, "Index.update() took " + (System.currentTimeMillis() - indexStartTime) + " ms");
Log.d(TAG, "IndexDatabase() took " +
(System.currentTimeMillis() - indexStartTime) + " ms");
}
}

View File

@@ -26,6 +26,7 @@ import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -34,6 +35,7 @@ import android.widget.SearchView;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
@@ -92,10 +94,19 @@ public class SearchFragment extends InstrumentedFragment implements
loaderManager.initLoader(LOADER_ID_DATABASE, null, this);
loaderManager.initLoader(LOADER_ID_INSTALLED_APPS, null, this);
}
final ActionBar actionBar = getActivity().getActionBar();
final Activity activity = getActivity();
final ActionBar actionBar = activity.getActionBar();
actionBar.setCustomView(makeSearchView(actionBar, mQuery));
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
// Run the Index update only if we have some space
if (!Utils.isLowStorage(activity)) {
mSearchFeatureProvider.updateIndex(activity);
} else {
Log.w(TAG, "Cannot update the Indexer as we are running low on storage space!");
}
}
@Override

View File

@@ -113,4 +113,16 @@ public class SearchFragmentTest {
verify(mFeatureFactory.searchFeatureProvider)
.getInstalledAppSearchLoader(any(Context.class), anyString());
}
@Test
public void updateIndex_TriggerOnCreate() {
ActivityController<SearchActivity> activityController =
Robolectric.buildActivity(SearchActivity.class);
activityController.setup();
SearchFragment fragment = (SearchFragment) activityController.get().getFragmentManager()
.findFragmentById(R.id.main_content);
fragment.onAttach(null);
verify(mFeatureFactory.searchFeatureProvider).updateIndex(any(Context.class));
}
}