Merge "Reduce Data Saver Settings launch time"
diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java
index 744f692..31a62d4 100644
--- a/src/com/android/settings/datausage/DataSaverSummary.java
+++ b/src/com/android/settings/datausage/DataSaverSummary.java
@@ -55,17 +55,21 @@
     // Flag used to avoid infinite loop due if user switch it on/off too quicky.
     private boolean mSwitching;
 
+    private Runnable mLoadAppRunnable = () -> {
+        mApplicationsState = ApplicationsState.getInstance(
+                (Application) getContext().getApplicationContext());
+        mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
+        mSession = mApplicationsState.newSession(this, getSettingsLifecycle());
+        mDataUsageBridge.resume(true /* forceLoadAllApps */);
+    };
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.data_saver);
         mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
-        mApplicationsState = ApplicationsState.getInstance(
-                (Application) getContext().getApplicationContext());
         mDataSaverBackend = new DataSaverBackend(getContext());
-        mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
-        mSession = mApplicationsState.newSession(this, getSettingsLifecycle());
     }
 
     @Override
@@ -83,14 +87,20 @@
         mDataSaverBackend.refreshAllowlist();
         mDataSaverBackend.refreshDenylist();
         mDataSaverBackend.addListener(this);
-        mDataUsageBridge.resume(true /* forceLoadAllApps */);
+        if (mDataUsageBridge != null) {
+            mDataUsageBridge.resume(true /* forceLoadAllApps */);
+        } else {
+            getView().post(mLoadAppRunnable);
+        }
     }
 
     @Override
     public void onPause() {
         super.onPause();
         mDataSaverBackend.remListener(this);
-        mDataUsageBridge.pause();
+        if (mDataUsageBridge != null) {
+            mDataUsageBridge.pause();
+        }
     }
 
     @Override
@@ -132,24 +142,7 @@
 
     @Override
     public void onExtraInfoUpdated() {
-        if (!isAdded()) {
-            return;
-        }
-        int count = 0;
-        final ArrayList<AppEntry> allApps = mSession.getAllApps();
-        final int N = allApps.size();
-        for (int i = 0; i < N; i++) {
-            final AppEntry entry = allApps.get(i);
-            if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
-                continue;
-            }
-            if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
-                    entry.extraInfo).isDataSaverAllowlisted) {
-                count++;
-            }
-        }
-        mUnrestrictedAccess.setSummary(getResources().getQuantityString(
-                R.plurals.data_saver_unrestricted_summary, count, count));
+        updateUnrestrictedAccessSummary();
     }
 
     @Override
@@ -179,12 +172,12 @@
 
     @Override
     public void onAllSizesComputed() {
-
+        updateUnrestrictedAccessSummary();
     }
 
     @Override
     public void onLauncherInfoChanged() {
-
+        updateUnrestrictedAccessSummary();
     }
 
     @Override
@@ -192,6 +185,23 @@
 
     }
 
+    private void updateUnrestrictedAccessSummary() {
+        if (!isAdded() || isFinishingOrDestroyed() || mSession == null) return;
+
+        int count = 0;
+        for (AppEntry entry : mSession.getAllApps()) {
+            if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
+                continue;
+            }
+            if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
+                    entry.extraInfo).isDataSaverAllowlisted) {
+                count++;
+            }
+        }
+        mUnrestrictedAccess.setSummary(getResources().getQuantityString(
+                R.plurals.data_saver_unrestricted_summary, count, count));
+    }
+
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.data_saver) {