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:
@@ -191,10 +191,12 @@ public class SettingsActivity extends SettingsDrawerActivity
|
||||
private final BroadcastReceiver mUserAddRemoveReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String action = intent.getAction();
|
||||
if (action.equals(Intent.ACTION_USER_ADDED)
|
||||
|| action.equals(Intent.ACTION_USER_REMOVED)) {
|
||||
mSearchFeatureProvider.updateIndex(getApplicationContext());
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -251,7 +253,9 @@ public class SettingsActivity extends SettingsDrawerActivity
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
mSearchFeatureProvider.updateIndex(getApplicationContext());
|
||||
if (!mSearchFeatureProvider.isEnabled(this)) {
|
||||
mSearchFeatureProvider.updateIndex(getApplicationContext());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -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));
|
||||
registerReceiver(mUserAddRemoveReceiver, new IntentFilter(Intent.ACTION_USER_ADDED));
|
||||
registerReceiver(mUserAddRemoveReceiver, new IntentFilter(Intent.ACTION_USER_REMOVED));
|
||||
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);
|
||||
unregisterReceiver(mUserAddRemoveReceiver);
|
||||
if (!mSearchFeatureProvider.isEnabled(this)) {
|
||||
unregisterReceiver(mUserAddRemoveReceiver);
|
||||
}
|
||||
if (mDynamicIndexableContentMonitor != null) {
|
||||
mDynamicIndexableContentMonitor.unregister(this, LOADER_ID_INDEXABLE_CONTENT_MONITOR);
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -152,7 +152,7 @@ public class DatabaseIndexingManager {
|
||||
return mIsAvailable.get();
|
||||
}
|
||||
|
||||
public void update() {
|
||||
public void indexDatabase() {
|
||||
AsyncTask.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
@@ -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");
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user