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
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 0751b81..13bc048 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -191,10 +191,12 @@
     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 @@
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        mSearchFeatureProvider.updateIndex(getApplicationContext());
+        if (!mSearchFeatureProvider.isEnabled(this)) {
+            mSearchFeatureProvider.updateIndex(getApplicationContext());
+        }
     }
 
     @Override
@@ -400,7 +404,7 @@
 
         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 @@
                 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 @@
     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 fcf5e7c..ba53e94 100644
--- a/src/com/android/settings/search/IndexDatabaseHelper.java
+++ b/src/com/android/settings/search/IndexDatabaseHelper.java
@@ -201,7 +201,7 @@
         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 e29ffeb..2cd0cea 100644
--- a/src/com/android/settings/search2/DatabaseIndexingManager.java
+++ b/src/com/android/settings/search2/DatabaseIndexingManager.java
@@ -152,7 +152,7 @@
         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 97b7bfe..a76d905 100644
--- a/src/com/android/settings/search2/SearchFeatureProviderImpl.java
+++ b/src/com/android/settings/search2/SearchFeatureProviderImpl.java
@@ -85,10 +85,11 @@
     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 757a0e2..e26f5ed 100644
--- a/src/com/android/settings/search2/SearchFragment.java
+++ b/src/com/android/settings/search2/SearchFragment.java
@@ -26,6 +26,7 @@
 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 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 @@
             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 64d602e..d97360d 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 @@
         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));
+    }
 }