Merge cherrypicks of [8549820, 8549668, 8549613, 8549614, 8549935, 8549808, 8549876, 8549809, 8549552] into qt-release

Change-Id: I9d4e0032c124831e73c042f5b7e263a6ab7fb740
diff --git a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
index c6fc23b..fdc5feb 100644
--- a/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
@@ -20,10 +20,13 @@
 import android.os.storage.StorageManager;
 import android.text.format.Formatter;
 
+import androidx.preference.Preference;
+
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.text.NumberFormat;
 
@@ -44,14 +47,22 @@
     }
 
     @Override
-    public CharSequence getSummary() {
-        // TODO: Register listener.
-        final NumberFormat percentageFormat = NumberFormat.getPercentInstance();
-        final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
-                mStorageManagerVolumeProvider);
-        double privateUsedBytes = info.totalBytes - info.freeBytes;
-        return mContext.getString(R.string.storage_summary,
-                percentageFormat.format(privateUsedBytes / info.totalBytes),
-                Formatter.formatFileSize(mContext, info.freeBytes));
+    protected void refreshSummary(Preference preference) {
+        if (preference == null) {
+            return;
+        }
+
+        ThreadUtils.postOnBackgroundThread(() -> {
+            final NumberFormat percentageFormat = NumberFormat.getPercentInstance();
+            final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
+                    mStorageManagerVolumeProvider);
+            final double privateUsedBytes = info.totalBytes - info.freeBytes;
+
+            ThreadUtils.postOnMainThread(() -> {
+                preference.setSummary(mContext.getString(R.string.storage_summary,
+                        percentageFormat.format(privateUsedBytes / info.totalBytes),
+                        Formatter.formatFileSize(mContext, info.freeBytes)));
+            });
+        });
     }
 }