From 34c27609d6fa8de0fc3bd2599b79a3d9c54a6356 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Wed, 18 Jan 2017 18:24:56 -0800 Subject: [PATCH] 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 --- .../android/settings/SettingsActivity.java | 26 ++++++++++++------- .../settings/search/IndexDatabaseHelper.java | 2 +- .../search2/DatabaseIndexingManager.java | 2 +- .../search2/SearchFeatureProviderImpl.java | 5 ++-- .../settings/search2/SearchFragment.java | 13 +++++++++- .../settings/search2/SearchFragmentTest.java | 12 +++++++++ 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 0751b814c17..13bc0488d3b 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -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); } diff --git a/src/com/android/settings/search/IndexDatabaseHelper.java b/src/com/android/settings/search/IndexDatabaseHelper.java index fcf5e7cf63e..ba53e94c320 100644 --- a/src/com/android/settings/search/IndexDatabaseHelper.java +++ b/src/com/android/settings/search/IndexDatabaseHelper.java @@ -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); } diff --git a/src/com/android/settings/search2/DatabaseIndexingManager.java b/src/com/android/settings/search2/DatabaseIndexingManager.java index e29ffeb9122..2cd0cea274e 100644 --- a/src/com/android/settings/search2/DatabaseIndexingManager.java +++ b/src/com/android/settings/search2/DatabaseIndexingManager.java @@ -152,7 +152,7 @@ public class DatabaseIndexingManager { return mIsAvailable.get(); } - public void update() { + public void indexDatabase() { AsyncTask.execute(new Runnable() { @Override public void run() { diff --git a/src/com/android/settings/search2/SearchFeatureProviderImpl.java b/src/com/android/settings/search2/SearchFeatureProviderImpl.java index 97b7bfe0d13..a76d9055d74 100644 --- a/src/com/android/settings/search2/SearchFeatureProviderImpl.java +++ b/src/com/android/settings/search2/SearchFeatureProviderImpl.java @@ -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"); } } diff --git a/src/com/android/settings/search2/SearchFragment.java b/src/com/android/settings/search2/SearchFragment.java index 757a0e2ac0c..e26f5edbf2d 100644 --- a/src/com/android/settings/search2/SearchFragment.java +++ b/src/com/android/settings/search2/SearchFragment.java @@ -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 diff --git a/tests/robotests/src/com/android/settings/search2/SearchFragmentTest.java b/tests/robotests/src/com/android/settings/search2/SearchFragmentTest.java index 64d602e502d..d97360d0414 100644 --- a/tests/robotests/src/com/android/settings/search2/SearchFragmentTest.java +++ b/tests/robotests/src/com/android/settings/search2/SearchFragmentTest.java @@ -113,4 +113,16 @@ public class SearchFragmentTest { verify(mFeatureFactory.searchFeatureProvider) .getInstalledAppSearchLoader(any(Context.class), anyString()); } + + @Test + public void updateIndex_TriggerOnCreate() { + ActivityController 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)); + } }