Speed up dev options

 - Put memory updates on background thread
 - Prevent update state from being called twice

Bug: 69000975
Test: Manual
Change-Id: I186bc25f6b74a5098b1737891efee3a6855dc996
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 669f4fb..9857280 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -23,7 +23,7 @@
         android:key="memory"
         android:icon="@drawable/ic_settings_memory"
         android:title="@string/memory_settings_title"
-        android:summary="@string/summary_empty"
+        android:summary="@string/summary_placeholder"
         android:fragment="com.android.settings.applications.ProcessStatsSummary" />
 
     <com.android.settings.BugreportPreference
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 6796c26..3551d23 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -87,9 +87,11 @@
         // Set ComparisonCallback so we get better animation when list changes.
         getPreferenceManager().setPreferenceComparisonCallback(
                 new PreferenceManager.SimplePreferenceComparisonCallback());
-        // Upon rotation configuration change we need to update preference states before any
-        // editing dialog is recreated (that would happen before onResume is called).
-        updatePreferenceStates();
+        if (icicle != null) {
+            // Upon rotation configuration change we need to update preference states before any
+            // editing dialog is recreated (that would happen before onResume is called).
+            updatePreferenceStates();
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/development/MemoryUsagePreferenceController.java b/src/com/android/settings/development/MemoryUsagePreferenceController.java
index 1b589fd..9471b90 100644
--- a/src/com/android/settings/development/MemoryUsagePreferenceController.java
+++ b/src/com/android/settings/development/MemoryUsagePreferenceController.java
@@ -27,6 +27,7 @@
 import com.android.settings.applications.ProcessStatsBase;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.development.DeveloperOptionsPreferenceController;
+import com.android.settingslib.utils.ThreadUtils;
 
 public class MemoryUsagePreferenceController extends DeveloperOptionsPreferenceController implements
         PreferenceControllerMixin {
@@ -56,14 +57,19 @@
 
     @Override
     public void updateState(Preference preference) {
-        mProcStatsData.refreshStats(true);
-        final ProcStatsData.MemInfo memInfo = mProcStatsData.getMemInfo();
-        final String usedResult = Formatter.formatShortFileSize(mContext,
-                (long) memInfo.realUsedRam);
-        final String totalResult = Formatter.formatShortFileSize(mContext,
-                (long) memInfo.realTotalRam);
-        mPreference.setSummary(mContext.getString(R.string.memory_summary,
-                usedResult, totalResult));
+        // This is posted on the background thread to speed up fragment launch time for dev options
+        // mProcStasData.refreshStats(true) takes ~20ms to run.
+        ThreadUtils.postOnBackgroundThread(() -> {
+            mProcStatsData.refreshStats(true);
+            final ProcStatsData.MemInfo memInfo = mProcStatsData.getMemInfo();
+            final String usedResult = Formatter.formatShortFileSize(mContext,
+                    (long) memInfo.realUsedRam);
+            final String totalResult = Formatter.formatShortFileSize(mContext,
+                    (long) memInfo.realTotalRam);
+            ThreadUtils.postOnMainThread(
+                    () -> mPreference.setSummary(mContext.getString(R.string.memory_summary,
+                            usedResult, totalResult)));
+        });
     }
 
     @VisibleForTesting
diff --git a/tests/robotests/src/com/android/settings/development/MemoryUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/MemoryUsagePreferenceControllerTest.java
index a949eef..d68f276 100644
--- a/tests/robotests/src/com/android/settings/development/MemoryUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/MemoryUsagePreferenceControllerTest.java
@@ -30,6 +30,7 @@
 import com.android.settings.TestConfig;
 import com.android.settings.applications.ProcStatsData;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowThreadUtils;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -68,6 +69,9 @@
     }
 
     @Test
+    @Config(shadows = {
+            ShadowThreadUtils.class
+    })
     public void updateState_shouldUpdatePreferenceSummary() {
         mController.updateState(mPreference);