diff --git a/res/xml/storage_category_fragment.xml b/res/xml/storage_category_fragment.xml
index 72623d7..fb62bee 100644
--- a/res/xml/storage_category_fragment.xml
+++ b/res/xml/storage_category_fragment.xml
@@ -24,8 +24,7 @@
         android:order="4"
         android:title="@string/storage_free_up_space_title"
         android:summary="@string/storage_free_up_space_summary"
-        android:icon="@drawable/ic_files_go_round"
-        settings:allowDividerAbove="true"/>
+        android:icon="@drawable/ic_files_go_round"/>
     <!-- Preference order 100~200 are 'ONLY' for storage category preferences below. -->
     <Preference
         android:key="pref_public_storage"
diff --git a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
index 035c112..98736e3 100644
--- a/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageCategoryFragment.java
@@ -37,7 +37,6 @@
 import com.android.settings.Utils;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
-import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
 import com.android.settings.deviceinfo.storage.SecondaryUserController;
 import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
 import com.android.settings.deviceinfo.storage.StorageEntry;
@@ -54,6 +53,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Storage Settings main UI is composed by 3 fragments:
@@ -85,7 +85,6 @@
     private StorageEntry mSelectedStorageEntry;
     private PrivateStorageInfo mStorageInfo;
     private SparseArray<StorageAsyncLoader.StorageResult> mAppsResult;
-    private CachedStorageValuesHelper mCachedStorageValuesHelper;
 
     private StorageItemPreferenceController mPreferenceController;
     private List<AbstractPreferenceController> mSecondaryUsers;
@@ -104,6 +103,10 @@
             return;
         }
 
+        // To prevent flicker, hides secondary users preference.
+        // onReceivedSizes will set it visible for private storage.
+        setSecondaryUsersVisible(false);
+
         if (!mSelectedStorageEntry.isMounted()) {
             // Set null volume to hide category stats.
             mPreferenceController.setVolume(null);
@@ -114,6 +117,10 @@
             mAppsResult = null;
             maybeSetLoading(isQuotaSupported());
 
+            // To prevent flicker, sets null volume to hide category preferences.
+            // onReceivedSizes will setVolume with the volume of selected storage.
+            mPreferenceController.setVolume(null);
+
             // Stats data is only available on private volumes.
             getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
             getLoaderManager()
@@ -157,7 +164,6 @@
     @Override
     public void onViewCreated(View v, Bundle savedInstanceState) {
         super.onViewCreated(v, savedInstanceState);
-        initializeCacheProvider();
 
         EntityHeaderController.newInstance(getActivity(), this /*fragment*/,
                 null /* header view */)
@@ -184,6 +190,10 @@
             return;
         }
 
+        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
+            setLoading(false /* loading */, true /* animate */);
+        }
+
         final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
         mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
         mPreferenceController.setUsedSize(privateUsedBytes);
@@ -198,10 +208,7 @@
 
         mPreferenceController.onLoadFinished(mAppsResult, mUserId);
         updateSecondaryUserControllers(mSecondaryUsers, mAppsResult);
-
-        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
-            setLoading(false, true);
-        }
+        setSecondaryUsersVisible(true);
     }
 
     @Override
@@ -263,7 +270,6 @@
     public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.StorageResult>> loader,
             SparseArray<StorageAsyncLoader.StorageResult> data) {
         mAppsResult = data;
-        maybeCacheFreshValues();
         onReceivedSizes();
     }
 
@@ -287,11 +293,6 @@
     }
 
     @VisibleForTesting
-    public void setCachedStorageValuesHelper(CachedStorageValuesHelper helper) {
-        mCachedStorageValuesHelper = helper;
-    }
-
-    @VisibleForTesting
     public PrivateStorageInfo getPrivateStorageInfo() {
         return mStorageInfo;
     }
@@ -311,19 +312,6 @@
         mAppsResult = info;
     }
 
-    @VisibleForTesting
-    void initializeCachedValues() {
-        final PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo();
-        final SparseArray<StorageAsyncLoader.StorageResult> loaderResult =
-                mCachedStorageValuesHelper.getCachedStorageResult();
-        if (info == null || loaderResult == null) {
-            return;
-        }
-
-        mStorageInfo = info;
-        mAppsResult = loaderResult;
-    }
-
     /**
      * Activate loading UI and animation if it's necessary.
      */
@@ -337,24 +325,22 @@
         }
     }
 
-    private void initializeCacheProvider() {
-        mCachedStorageValuesHelper = new CachedStorageValuesHelper(getContext(), mUserId);
-        initializeCachedValues();
-        onReceivedSizes();
-    }
-
-    private void maybeCacheFreshValues() {
-        if (mStorageInfo != null && mAppsResult != null) {
-            mCachedStorageValuesHelper.cacheResult(mStorageInfo, mAppsResult.get(mUserId));
-        }
-    }
-
     private boolean isQuotaSupported() {
         return mSelectedStorageEntry.isMounted()
                 && getActivity().getSystemService(StorageStatsManager.class)
                         .isQuotaSupported(mSelectedStorageEntry.getFsUuid());
     }
 
+    private void setSecondaryUsersVisible(boolean visible) {
+        final Optional<SecondaryUserController> secondaryUserController = mSecondaryUsers.stream()
+                .filter(controller -> controller instanceof SecondaryUserController)
+                .map(controller -> (SecondaryUserController) controller)
+                .findAny();
+        if (secondaryUserController.isPresent()) {
+            secondaryUserController.get().setPreferenceGroupVisible(visible);
+        }
+    }
+
     /**
      * IconLoaderCallbacks exists because StorageCategoryFragment already implements
      * LoaderCallbacks for a different type.
@@ -414,7 +400,6 @@
             }
 
             mStorageInfo = privateStorageInfo;
-            maybeCacheFreshValues();
             onReceivedSizes();
         }
     }
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index b76d1cb..6dbc3aa 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -44,7 +44,6 @@
 import com.android.settings.Utils;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchPreferenceController;
-import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
 import com.android.settings.deviceinfo.storage.DiskInitFragment;
 import com.android.settings.deviceinfo.storage.SecondaryUserController;
 import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
@@ -68,6 +67,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * Storage Settings main UI is composed by 3 fragments:
@@ -101,7 +101,6 @@
     private StorageEntry mSelectedStorageEntry;
     private PrivateStorageInfo mStorageInfo;
     private SparseArray<StorageAsyncLoader.StorageResult> mAppsResult;
-    private CachedStorageValuesHelper mCachedStorageValuesHelper;
 
     private StorageItemPreferenceController mPreferenceController;
     private VolumeOptionMenuController mOptionMenuController;
@@ -232,6 +231,10 @@
         mOptionMenuController.setSelectedStorageEntry(mSelectedStorageEntry);
         getActivity().invalidateOptionsMenu();
 
+        // To prevent flicker, hides secondary users preference.
+        // onReceivedSizes will set it visible for private storage.
+        setSecondaryUsersVisible(false);
+
         if (!mSelectedStorageEntry.isMounted()) {
             // Set null volume to hide category stats.
             mPreferenceController.setVolume(null);
@@ -242,6 +245,10 @@
             mAppsResult = null;
             maybeSetLoading(isQuotaSupported());
 
+            // To prevent flicker, sets null volume to hide category preferences.
+            // onReceivedSizes will setVolume with the volume of selected storage.
+            mPreferenceController.setVolume(null);
+
             // Stats data is only available on private volumes.
             getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
             getLoaderManager()
@@ -316,7 +323,6 @@
     @Override
     public void onViewCreated(View v, Bundle savedInstanceState) {
         super.onViewCreated(v, savedInstanceState);
-        initializeCacheProvider();
 
         EntityHeaderController.newInstance(getActivity(), this /*fragment*/,
                 null /* header view */)
@@ -355,6 +361,10 @@
             return;
         }
 
+        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
+            setLoading(false /* loading */, true /* animate */);
+        }
+
         final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
         mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
         mPreferenceController.setUsedSize(privateUsedBytes);
@@ -369,10 +379,7 @@
 
         mPreferenceController.onLoadFinished(mAppsResult, mUserId);
         updateSecondaryUserControllers(mSecondaryUsers, mAppsResult);
-
-        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
-            setLoading(false, true);
-        }
+        setSecondaryUsersVisible(true);
     }
 
     @Override
@@ -463,7 +470,6 @@
     public void onLoadFinished(Loader<SparseArray<StorageAsyncLoader.StorageResult>> loader,
             SparseArray<StorageAsyncLoader.StorageResult> data) {
         mAppsResult = data;
-        maybeCacheFreshValues();
         onReceivedSizes();
     }
 
@@ -487,11 +493,6 @@
     }
 
     @VisibleForTesting
-    public void setCachedStorageValuesHelper(CachedStorageValuesHelper helper) {
-        mCachedStorageValuesHelper = helper;
-    }
-
-    @VisibleForTesting
     public PrivateStorageInfo getPrivateStorageInfo() {
         return mStorageInfo;
     }
@@ -511,19 +512,6 @@
         mAppsResult = info;
     }
 
-    @VisibleForTesting
-    void initializeCachedValues() {
-        final PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo();
-        final SparseArray<StorageAsyncLoader.StorageResult> loaderResult =
-                mCachedStorageValuesHelper.getCachedStorageResult();
-        if (info == null || loaderResult == null) {
-            return;
-        }
-
-        mStorageInfo = info;
-        mAppsResult = loaderResult;
-    }
-
     /**
      * Activate loading UI and animation if it's necessary.
      */
@@ -537,24 +525,22 @@
         }
     }
 
-    private void initializeCacheProvider() {
-        mCachedStorageValuesHelper = new CachedStorageValuesHelper(getContext(), mUserId);
-        initializeCachedValues();
-        onReceivedSizes();
-    }
-
-    private void maybeCacheFreshValues() {
-        if (mStorageInfo != null && mAppsResult != null) {
-            mCachedStorageValuesHelper.cacheResult(mStorageInfo, mAppsResult.get(mUserId));
-        }
-    }
-
     private boolean isQuotaSupported() {
         return mSelectedStorageEntry.isMounted()
                 && getActivity().getSystemService(StorageStatsManager.class)
                         .isQuotaSupported(mSelectedStorageEntry.getFsUuid());
     }
 
+    private void setSecondaryUsersVisible(boolean visible) {
+        final Optional<SecondaryUserController> secondaryUserController = mSecondaryUsers.stream()
+                .filter(controller -> controller instanceof SecondaryUserController)
+                .map(controller -> (SecondaryUserController) controller)
+                .findAny();
+        if (secondaryUserController.isPresent()) {
+            secondaryUserController.get().setPreferenceGroupVisible(visible);
+        }
+    }
+
     /**
      * IconLoaderCallbacks exists because StorageDashboardFragment already implements
      * LoaderCallbacks for a different type.
@@ -614,7 +600,6 @@
             }
 
             mStorageInfo = privateStorageInfo;
-            maybeCacheFreshValues();
             onReceivedSizes();
         }
     }
diff --git a/src/com/android/settings/deviceinfo/StorageItemPreference.java b/src/com/android/settings/deviceinfo/StorageItemPreference.java
index cdb9f9d..934ff3f 100644
--- a/src/com/android/settings/deviceinfo/StorageItemPreference.java
+++ b/src/com/android/settings/deviceinfo/StorageItemPreference.java
@@ -43,7 +43,6 @@
     public StorageItemPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         setLayoutResource(R.layout.storage_item);
-        setSummary(R.string.memory_calculating_size);
     }
 
     public void setStorageSize(long size, long total) {
diff --git a/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelper.java b/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelper.java
deleted file mode 100644
index 4ca623d..0000000
--- a/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelper.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo.storage;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.provider.Settings;
-import android.util.SparseArray;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settingslib.applications.StorageStatsSource;
-import com.android.settingslib.deviceinfo.PrivateStorageInfo;
-
-import java.util.concurrent.TimeUnit;
-
-public class CachedStorageValuesHelper {
-
-    @VisibleForTesting public static final String SHARED_PREFERENCES_NAME = "CachedStorageValues";
-    public static final String TIMESTAMP_KEY = "last_query_timestamp";
-    public static final String FREE_BYTES_KEY = "free_bytes";
-    public static final String TOTAL_BYTES_KEY = "total_bytes";
-    public static final String GAME_APPS_SIZE_KEY = "game_apps_size";
-    public static final String AUDIO_SIZE_KEY = "audio_size";
-    public static final String VIDEOS_SIZE_KEY = "videos_size";
-    public static final String IMAGES_SIZE_KEY = "images_size";
-    public static final String DOCUMENTS_AND_OTHER_SIZE_KEY = "documents_and_other_size";
-    public static final String TRASH_SIZE_KEY = "trash_size";
-    public static final String OTHER_APPS_SIZE_KEY = "other_apps_size";
-    public static final String CACHE_APPS_SIZE_KEY = "cache_apps_size";
-    public static final String EXTERNAL_TOTAL_BYTES = "external_total_bytes";
-    public static final String EXTERNAL_AUDIO_BYTES = "external_audio_bytes";
-    public static final String EXTERNAL_VIDEO_BYTES = "external_video_bytes";
-    public static final String EXTERNAL_IMAGE_BYTES = "external_image_bytes";
-    public static final String EXTERNAL_APP_BYTES = "external_apps_bytes";
-    public static final String USER_ID_KEY = "user_id";
-    private final Long mClobberThreshold;
-    private final SharedPreferences mSharedPreferences;
-    private final int mUserId;
-    // This clock is used to provide the time. By default, it uses the system clock, but can be
-    // replaced for test purposes.
-    protected Clock mClock;
-
-    public CachedStorageValuesHelper(Context context, int userId) {
-        mSharedPreferences =
-                context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
-        mClock = new Clock();
-        mUserId = userId;
-        mClobberThreshold =
-                Settings.Global.getLong(
-                        context.getContentResolver(),
-                        Settings.Global.STORAGE_SETTINGS_CLOBBER_THRESHOLD,
-                        TimeUnit.MINUTES.toMillis(5));
-    }
-
-    public PrivateStorageInfo getCachedPrivateStorageInfo() {
-        if (!isDataValid()) {
-            return null;
-        }
-        final long freeBytes = mSharedPreferences.getLong(FREE_BYTES_KEY, -1);
-        final long totalBytes = mSharedPreferences.getLong(TOTAL_BYTES_KEY, -1);
-        if (freeBytes < 0 || totalBytes < 0) {
-            return null;
-        }
-
-        return new PrivateStorageInfo(freeBytes, totalBytes);
-    }
-
-    /** Returns cached storage result or null if it's not available. */
-    public SparseArray<StorageAsyncLoader.StorageResult> getCachedStorageResult() {
-        if (!isDataValid()) {
-            return null;
-        }
-        final long gamesSize = mSharedPreferences.getLong(GAME_APPS_SIZE_KEY, -1);
-        final long audioSize = mSharedPreferences.getLong(AUDIO_SIZE_KEY, -1);
-        final long videosSize = mSharedPreferences.getLong(VIDEOS_SIZE_KEY, -1);
-        final long imagesSize = mSharedPreferences.getLong(IMAGES_SIZE_KEY, -1);
-        final long documentsAndOtherSize =
-                mSharedPreferences.getLong(DOCUMENTS_AND_OTHER_SIZE_KEY, -1);
-        final long trashSize = mSharedPreferences.getLong(TRASH_SIZE_KEY, -1);
-        final long allAppsExceptGamesSize = mSharedPreferences.getLong(OTHER_APPS_SIZE_KEY, -1);
-        final long cacheSize = mSharedPreferences.getLong(CACHE_APPS_SIZE_KEY, -1);
-        if (gamesSize < 0
-                || audioSize < 0
-                || videosSize < 0
-                || imagesSize < 0
-                || documentsAndOtherSize < 0
-                || trashSize < 0
-                || allAppsExceptGamesSize < 0
-                || cacheSize < 0) {
-            return null;
-        }
-
-        final long externalTotalBytes = mSharedPreferences.getLong(EXTERNAL_TOTAL_BYTES, -1);
-        final long externalAudioBytes = mSharedPreferences.getLong(EXTERNAL_AUDIO_BYTES, -1);
-        final long externalVideoBytes = mSharedPreferences.getLong(EXTERNAL_VIDEO_BYTES, -1);
-        final long externalImageBytes = mSharedPreferences.getLong(EXTERNAL_IMAGE_BYTES, -1);
-        final long externalAppBytes = mSharedPreferences.getLong(EXTERNAL_APP_BYTES, -1);
-        if (externalTotalBytes < 0
-                || externalAudioBytes < 0
-                || externalVideoBytes < 0
-                || externalImageBytes < 0
-                || externalAppBytes < 0) {
-            return null;
-        }
-
-        final StorageStatsSource.ExternalStorageStats externalStats =
-                new StorageStatsSource.ExternalStorageStats(
-                        externalTotalBytes,
-                        externalAudioBytes,
-                        externalVideoBytes,
-                        externalImageBytes,
-                        externalAppBytes);
-        final StorageAsyncLoader.StorageResult result = new StorageAsyncLoader.StorageResult();
-        result.gamesSize = gamesSize;
-        result.audioSize = audioSize;
-        result.videosSize = videosSize;
-        result.imagesSize = imagesSize;
-        result.documentsAndOtherSize = documentsAndOtherSize;
-        result.trashSize = trashSize;
-        result.allAppsExceptGamesSize = allAppsExceptGamesSize;
-        result.cacheSize = cacheSize;
-        result.externalStats = externalStats;
-        final SparseArray<StorageAsyncLoader.StorageResult> resultArray = new SparseArray<>();
-        resultArray.append(mUserId, result);
-        return resultArray;
-    }
-
-    public void cacheResult(
-            PrivateStorageInfo storageInfo, StorageAsyncLoader.StorageResult result) {
-        mSharedPreferences
-                .edit()
-                .putLong(FREE_BYTES_KEY, storageInfo.freeBytes)
-                .putLong(TOTAL_BYTES_KEY, storageInfo.totalBytes)
-                .putLong(GAME_APPS_SIZE_KEY, result.gamesSize)
-                .putLong(AUDIO_SIZE_KEY, result.audioSize)
-                .putLong(VIDEOS_SIZE_KEY, result.videosSize)
-                .putLong(IMAGES_SIZE_KEY, result.imagesSize)
-                .putLong(DOCUMENTS_AND_OTHER_SIZE_KEY, result.documentsAndOtherSize)
-                .putLong(TRASH_SIZE_KEY, result.trashSize)
-                .putLong(OTHER_APPS_SIZE_KEY, result.allAppsExceptGamesSize)
-                .putLong(CACHE_APPS_SIZE_KEY, result.cacheSize)
-                .putLong(EXTERNAL_TOTAL_BYTES, result.externalStats.totalBytes)
-                .putLong(EXTERNAL_AUDIO_BYTES, result.externalStats.audioBytes)
-                .putLong(EXTERNAL_VIDEO_BYTES, result.externalStats.videoBytes)
-                .putLong(EXTERNAL_IMAGE_BYTES, result.externalStats.imageBytes)
-                .putLong(EXTERNAL_APP_BYTES, result.externalStats.appBytes)
-                .putInt(USER_ID_KEY, mUserId)
-                .putLong(TIMESTAMP_KEY, mClock.getCurrentTime())
-                .apply();
-    }
-
-    private boolean isDataValid() {
-        final int cachedUserId = mSharedPreferences.getInt(USER_ID_KEY, -1);
-        if (cachedUserId != mUserId) {
-            return false;
-        }
-
-        final long lastQueryTime = mSharedPreferences.getLong(TIMESTAMP_KEY, Long.MAX_VALUE);
-        final long currentTime = mClock.getCurrentTime();
-        return currentTime - lastQueryTime < mClobberThreshold;
-    }
-
-    /** Clock provides the current time. */
-    static class Clock {
-        public long getCurrentTime() {
-            return System.currentTimeMillis();
-        }
-    }
-}
diff --git a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
index 6475029..f87a06a 100644
--- a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
+++ b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java
@@ -53,9 +53,11 @@
     UserInfo mUser;
     private @Nullable
     StorageItemPreference mStoragePreference;
+    private PreferenceGroup mPreferenceGroup;
     private Drawable mUserIcon;
     private long mSize;
     private long mTotalSizeBytes;
+    private boolean mIsVisible;
 
     /**
      * Adds the appropriate controllers to a controller list for handling all secondary users on
@@ -115,16 +117,15 @@
         if (mStoragePreference == null) {
             mStoragePreference = new StorageItemPreference(screen.getContext());
 
-            PreferenceGroup group =
-                    screen.findPreference(TARGET_PREFERENCE_GROUP_KEY);
+            mPreferenceGroup = screen.findPreference(TARGET_PREFERENCE_GROUP_KEY);
             mStoragePreference.setTitle(mUser.name);
             mStoragePreference.setKey(PREFERENCE_KEY_BASE + mUser.id);
             if (mSize != SIZE_NOT_SET) {
                 mStoragePreference.setStorageSize(mSize, mTotalSizeBytes);
             }
 
-            group.setVisible(true);
-            group.addPreference(mStoragePreference);
+            mPreferenceGroup.setVisible(mIsVisible);
+            mPreferenceGroup.addPreference(mStoragePreference);
             maybeSetIcon();
         }
     }
@@ -168,6 +169,18 @@
         mTotalSizeBytes = totalSizeBytes;
     }
 
+    /**
+     * Sets visibility of the PreferenceGroup of secondary user.
+     *
+     * @param visible Visibility of the PreferenceGroup.
+     */
+    public void setPreferenceGroupVisible(boolean visible) {
+        mIsVisible = visible;
+        if (mPreferenceGroup != null) {
+            mPreferenceGroup.setVisible(mIsVisible);
+        }
+    }
+
     @Override
     public void handleResult(SparseArray<StorageAsyncLoader.StorageResult> stats) {
         final StorageAsyncLoader.StorageResult result = stats.get(getUser().id);
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 41e26ee..22ea98f 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -221,7 +221,15 @@
     public void setVolume(VolumeInfo volume) {
         mVolume = volume;
 
-        updateCategoryPreferencesVisibility();
+        if (mPublicStoragePreference != null) {
+            mPublicStoragePreference.setVisible(isValidPublicVolume());
+        }
+
+        // If isValidPrivateVolume() is true, these preferences will become visible at
+        // onLoadFinished.
+        if (!isValidPrivateVolume()) {
+            setPrivateStorageCategoryPreferencesVisibility(false);
+        }
     }
 
     // Stats data is only available on private volumes.
@@ -242,30 +250,28 @@
                 || mVolume.getState() == VolumeInfo.STATE_MOUNTED_READ_ONLY);
     }
 
-    private void updateCategoryPreferencesVisibility() {
+    @VisibleForTesting
+    void setPrivateStorageCategoryPreferencesVisibility(boolean visible) {
         if (mScreen == null) {
             return;
         }
 
-        mPublicStoragePreference.setVisible(isValidPublicVolume());
+        mImagesPreference.setVisible(visible);
+        mVideosPreference.setVisible(visible);
+        mAudioPreference.setVisible(visible);
+        mAppsPreference.setVisible(visible);
+        mGamesPreference.setVisible(visible);
+        mSystemPreference.setVisible(visible);
+        mTrashPreference.setVisible(visible);
 
-        final boolean privateStoragePreferencesVisible = isValidPrivateVolume();
-        mImagesPreference.setVisible(privateStoragePreferencesVisible);
-        mVideosPreference.setVisible(privateStoragePreferencesVisible);
-        mAudioPreference.setVisible(privateStoragePreferencesVisible);
-        mAppsPreference.setVisible(privateStoragePreferencesVisible);
-        mGamesPreference.setVisible(privateStoragePreferencesVisible);
-        mDocumentsAndOtherPreference.setVisible(privateStoragePreferencesVisible);
-        mSystemPreference.setVisible(privateStoragePreferencesVisible);
-        mTrashPreference.setVisible(privateStoragePreferencesVisible);
-
-        if (privateStoragePreferencesVisible) {
+        // If we don't have a shared volume for our internal storage (or the shared volume isn't
+        // mounted as readable for whatever reason), we should hide the File preference.
+        if (visible) {
             final VolumeInfo sharedVolume = mSvp.findEmulatedForPrivate(mVolume);
-            // If we don't have a shared volume for our internal storage (or the shared volume isn't
-            // mounted as readable for whatever reason), we should hide the File preference.
-            if (sharedVolume == null || !sharedVolume.isMountedReadable()) {
-                mDocumentsAndOtherPreference.setVisible(false);
-            }
+            mDocumentsAndOtherPreference.setVisible(sharedVolume != null
+                    && sharedVolume.isMountedReadable());
+        } else {
+            mDocumentsAndOtherPreference.setVisible(false);
         }
     }
 
@@ -390,6 +396,7 @@
         }
 
         updatePrivateStorageCategoryPreferencesOrder();
+        setPrivateStorageCategoryPreferencesVisibility(true);
     }
 
     public void setUsedSize(long usedSizeBytes) {
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
index af1900a..411a3cf 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
@@ -33,8 +33,6 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.android.settings.deviceinfo.storage.CachedStorageValuesHelper;
-import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
 import com.android.settingslib.deviceinfo.PrivateStorageInfo;
 import com.android.settingslib.drawer.CategoryKey;
 
@@ -73,47 +71,6 @@
     }
 
     @Test
-    public void test_cacheProviderProvidesValuesIfBothCached() {
-        CachedStorageValuesHelper helper = mock(CachedStorageValuesHelper.class);
-        PrivateStorageInfo info = new PrivateStorageInfo(0, 0);
-        when(helper.getCachedPrivateStorageInfo()).thenReturn(info);
-        SparseArray<StorageAsyncLoader.StorageResult> result = new SparseArray<>();
-        when(helper.getCachedStorageResult()).thenReturn(result);
-
-        mFragment.setCachedStorageValuesHelper(helper);
-        mFragment.initializeCachedValues();
-
-        assertThat(mFragment.getPrivateStorageInfo()).isEqualTo(info);
-        assertThat(mFragment.getStorageResult()).isEqualTo(result);
-    }
-
-    @Test
-    public void test_cacheProviderDoesntProvideValuesIfAppsMissing() {
-        CachedStorageValuesHelper helper = mock(CachedStorageValuesHelper.class);
-        PrivateStorageInfo info = new PrivateStorageInfo(0, 0);
-        when(helper.getCachedPrivateStorageInfo()).thenReturn(info);
-
-        mFragment.setCachedStorageValuesHelper(helper);
-        mFragment.initializeCachedValues();
-
-        assertThat(mFragment.getPrivateStorageInfo()).isNull();
-        assertThat(mFragment.getStorageResult()).isNull();
-    }
-
-    @Test
-    public void test_cacheProviderDoesntProvideValuesIfVolumeInfoMissing() {
-        CachedStorageValuesHelper helper = mock(CachedStorageValuesHelper.class);
-        SparseArray<StorageAsyncLoader.StorageResult> result = new SparseArray<>();
-        when(helper.getCachedStorageResult()).thenReturn(result);
-
-        mFragment.setCachedStorageValuesHelper(helper);
-        mFragment.initializeCachedValues();
-
-        assertThat(mFragment.getPrivateStorageInfo()).isNull();
-        assertThat(mFragment.getStorageResult()).isNull();
-    }
-
-    @Test
     public void test_loadWhenQuotaOffIfVolumeInfoNotLoaded() {
         View fakeView = mock(View.class, RETURNS_DEEP_STUBS);
         RecyclerView fakeRecyclerView = mock(RecyclerView.class, RETURNS_DEEP_STUBS);
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java
index 24543801..984d945 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java
@@ -46,12 +46,6 @@
     }
 
     @Test
-    public void testBeforeLoad() {
-        assertThat(mPreference.getSummary())
-            .isEqualTo(mContext.getString(R.string.memory_calculating_size));
-    }
-
-    @Test
     public void testAfterLoad() {
         mPreference.setStorageSize(MEGABYTE_IN_BYTES * 10, MEGABYTE_IN_BYTES * 100);
         assertThat(mPreference.getSummary()).isEqualTo("10 MB");
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelperTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelperTest.java
deleted file mode 100644
index ccc9152..0000000
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelperTest.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.deviceinfo.storage;
-
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.AUDIO_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.CACHE_APPS_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.DOCUMENTS_AND_OTHER_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.EXTERNAL_APP_BYTES;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper
-        .EXTERNAL_AUDIO_BYTES;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper
-        .EXTERNAL_IMAGE_BYTES;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper
-        .EXTERNAL_TOTAL_BYTES;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper
-        .EXTERNAL_VIDEO_BYTES;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.FREE_BYTES_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.GAME_APPS_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.IMAGES_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.OTHER_APPS_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper
-        .SHARED_PREFERENCES_NAME;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.TIMESTAMP_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.TOTAL_BYTES_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.TRASH_SIZE_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.USER_ID_KEY;
-import static com.android.settings.deviceinfo.storage.CachedStorageValuesHelper.VIDEOS_SIZE_KEY;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.SparseArray;
-
-import com.android.settingslib.applications.StorageStatsSource;
-import com.android.settingslib.deviceinfo.PrivateStorageInfo;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class CachedStorageValuesHelperTest {
-
-    private Context mContext;
-
-    @Mock private CachedStorageValuesHelper.Clock mMockClock;
-    private CachedStorageValuesHelper mCachedValuesHelper;
-    private SharedPreferences mSharedPreferences;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
-        mSharedPreferences = mContext.getSharedPreferences(SHARED_PREFERENCES_NAME, 0);
-        mCachedValuesHelper = new CachedStorageValuesHelper(mContext, 0);
-        mCachedValuesHelper.mClock = mMockClock;
-    }
-
-    @Test
-    public void getCachedPrivateStorageInfo_cachedValuesAreLoaded() {
-        when(mMockClock.getCurrentTime()).thenReturn(10001L);
-        mSharedPreferences
-                .edit()
-                .putLong(GAME_APPS_SIZE_KEY, 0)
-                .putLong(AUDIO_SIZE_KEY, 10)
-                .putLong(VIDEOS_SIZE_KEY, 100)
-                .putLong(IMAGES_SIZE_KEY, 1000)
-                .putLong(OTHER_APPS_SIZE_KEY, 10000)
-                .putLong(CACHE_APPS_SIZE_KEY, 100000)
-                .putLong(EXTERNAL_TOTAL_BYTES, 2)
-                .putLong(EXTERNAL_AUDIO_BYTES, 22)
-                .putLong(EXTERNAL_VIDEO_BYTES, 222)
-                .putLong(EXTERNAL_IMAGE_BYTES, 2222)
-                .putLong(EXTERNAL_APP_BYTES, 22222)
-                .putLong(FREE_BYTES_KEY, 1000L)
-                .putLong(TOTAL_BYTES_KEY, 6000L)
-                .putInt(USER_ID_KEY, 0)
-                .putLong(TIMESTAMP_KEY, 10000L)
-                .apply();
-
-        final PrivateStorageInfo info = mCachedValuesHelper.getCachedPrivateStorageInfo();
-
-        assertThat(info.freeBytes).isEqualTo(1000L);
-        assertThat(info.totalBytes).isEqualTo(6000L);
-    }
-
-    @Test
-    public void getCachedStorageResult_cachedValuesAreLoaded() {
-        when(mMockClock.getCurrentTime()).thenReturn(10001L);
-        mSharedPreferences
-                .edit()
-                .putLong(GAME_APPS_SIZE_KEY, 1)
-                .putLong(AUDIO_SIZE_KEY, 10)
-                .putLong(VIDEOS_SIZE_KEY, 100)
-                .putLong(IMAGES_SIZE_KEY, 1000)
-                .putLong(DOCUMENTS_AND_OTHER_SIZE_KEY, 1001)
-                .putLong(TRASH_SIZE_KEY, 1002)
-                .putLong(OTHER_APPS_SIZE_KEY, 10000)
-                .putLong(CACHE_APPS_SIZE_KEY, 100000)
-                .putLong(EXTERNAL_TOTAL_BYTES, 222222)
-                .putLong(EXTERNAL_AUDIO_BYTES, 22)
-                .putLong(EXTERNAL_VIDEO_BYTES, 222)
-                .putLong(EXTERNAL_IMAGE_BYTES, 2222)
-                .putLong(EXTERNAL_APP_BYTES, 22222)
-                .putLong(FREE_BYTES_KEY, 1000L)
-                .putLong(TOTAL_BYTES_KEY, 5000L)
-                .putInt(USER_ID_KEY, 0)
-                .putLong(TIMESTAMP_KEY, 10000L)
-                .apply();
-
-        final SparseArray<StorageAsyncLoader.StorageResult> result =
-                mCachedValuesHelper.getCachedStorageResult();
-
-        StorageAsyncLoader.StorageResult primaryResult = result.get(0);
-        assertThat(primaryResult.gamesSize).isEqualTo(1L);
-        assertThat(primaryResult.audioSize).isEqualTo(10L);
-        assertThat(primaryResult.videosSize).isEqualTo(100L);
-        assertThat(primaryResult.imagesSize).isEqualTo(1000L);
-        assertThat(primaryResult.documentsAndOtherSize).isEqualTo(1001L);
-        assertThat(primaryResult.trashSize).isEqualTo(1002L);
-        assertThat(primaryResult.allAppsExceptGamesSize).isEqualTo(10000L);
-        assertThat(primaryResult.cacheSize).isEqualTo(100000L);
-        assertThat(primaryResult.externalStats.totalBytes).isEqualTo(222222L);
-        assertThat(primaryResult.externalStats.audioBytes).isEqualTo(22L);
-        assertThat(primaryResult.externalStats.videoBytes).isEqualTo(222L);
-        assertThat(primaryResult.externalStats.imageBytes).isEqualTo(2222L);
-        assertThat(primaryResult.externalStats.appBytes).isEqualTo(22222L);
-    }
-
-    @Test
-    public void getCachedPrivateStorageInfo_nullIfDataIsStale() {
-        when(mMockClock.getCurrentTime()).thenReturn(10000000L);
-        mSharedPreferences
-                .edit()
-                .putLong(GAME_APPS_SIZE_KEY, 0)
-                .putLong(AUDIO_SIZE_KEY, 10)
-                .putLong(VIDEOS_SIZE_KEY, 100)
-                .putLong(IMAGES_SIZE_KEY, 1000)
-                .putLong(OTHER_APPS_SIZE_KEY, 10000)
-                .putLong(CACHE_APPS_SIZE_KEY, 100000)
-                .putLong(EXTERNAL_TOTAL_BYTES, 2)
-                .putLong(EXTERNAL_AUDIO_BYTES, 22)
-                .putLong(EXTERNAL_VIDEO_BYTES, 222)
-                .putLong(EXTERNAL_IMAGE_BYTES, 2222)
-                .putLong(EXTERNAL_APP_BYTES, 22222)
-                .putLong(FREE_BYTES_KEY, 1000L)
-                .putLong(TOTAL_BYTES_KEY, 5000L)
-                .putInt(USER_ID_KEY, 0)
-                .putLong(TIMESTAMP_KEY, 10000L)
-                .apply();
-
-        final PrivateStorageInfo info = mCachedValuesHelper.getCachedPrivateStorageInfo();
-        assertThat(info).isNull();
-    }
-
-    @Test
-    public void getCachedStorageResult_nullIfDataIsStale() {
-        when(mMockClock.getCurrentTime()).thenReturn(10000000L);
-        mSharedPreferences
-                .edit()
-                .putLong(GAME_APPS_SIZE_KEY, 0)
-                .putLong(AUDIO_SIZE_KEY, 10)
-                .putLong(VIDEOS_SIZE_KEY, 100)
-                .putLong(IMAGES_SIZE_KEY, 1000)
-                .putLong(OTHER_APPS_SIZE_KEY, 10000)
-                .putLong(CACHE_APPS_SIZE_KEY, 100000)
-                .putLong(EXTERNAL_TOTAL_BYTES, 2)
-                .putLong(EXTERNAL_AUDIO_BYTES, 22)
-                .putLong(EXTERNAL_VIDEO_BYTES, 222)
-                .putLong(EXTERNAL_IMAGE_BYTES, 2222)
-                .putLong(EXTERNAL_APP_BYTES, 22222)
-                .putLong(FREE_BYTES_KEY, 1000L)
-                .putLong(TOTAL_BYTES_KEY, 5000L)
-                .putInt(USER_ID_KEY, 0)
-                .putLong(TIMESTAMP_KEY, 10000L)
-                .apply();
-
-        final SparseArray<StorageAsyncLoader.StorageResult> result =
-                mCachedValuesHelper.getCachedStorageResult();
-        assertThat(result).isNull();
-    }
-
-    @Test
-    public void getCachedPrivateStorageInfo_nullIfWrongUser() {
-        when(mMockClock.getCurrentTime()).thenReturn(10001L);
-        mSharedPreferences
-                .edit()
-                .putLong(GAME_APPS_SIZE_KEY, 0)
-                .putLong(AUDIO_SIZE_KEY, 10)
-                .putLong(VIDEOS_SIZE_KEY, 100)
-                .putLong(IMAGES_SIZE_KEY, 1000)
-                .putLong(OTHER_APPS_SIZE_KEY, 10000)
-                .putLong(CACHE_APPS_SIZE_KEY, 100000)
-                .putLong(EXTERNAL_TOTAL_BYTES, 2)
-                .putLong(EXTERNAL_AUDIO_BYTES, 22)
-                .putLong(EXTERNAL_VIDEO_BYTES, 222)
-                .putLong(EXTERNAL_IMAGE_BYTES, 2222)
-                .putLong(EXTERNAL_APP_BYTES, 22222)
-                .putLong(FREE_BYTES_KEY, 1000L)
-                .putLong(TOTAL_BYTES_KEY, 5000L)
-                .putInt(USER_ID_KEY, 1)
-                .putLong(TIMESTAMP_KEY, 10000L)
-                .apply();
-
-        final PrivateStorageInfo info = mCachedValuesHelper.getCachedPrivateStorageInfo();
-        assertThat(info).isNull();
-    }
-
-    @Test
-    public void getCachedStorageResult_nullIfWrongUser() {
-        when(mMockClock.getCurrentTime()).thenReturn(10001L);
-        mSharedPreferences
-                .edit()
-                .putLong(GAME_APPS_SIZE_KEY, 0)
-                .putLong(AUDIO_SIZE_KEY, 10)
-                .putLong(VIDEOS_SIZE_KEY, 100)
-                .putLong(IMAGES_SIZE_KEY, 1000)
-                .putLong(OTHER_APPS_SIZE_KEY, 10000)
-                .putLong(CACHE_APPS_SIZE_KEY, 100000)
-                .putLong(EXTERNAL_TOTAL_BYTES, 2)
-                .putLong(EXTERNAL_AUDIO_BYTES, 22)
-                .putLong(EXTERNAL_VIDEO_BYTES, 222)
-                .putLong(EXTERNAL_IMAGE_BYTES, 2222)
-                .putLong(EXTERNAL_APP_BYTES, 22222)
-                .putLong(FREE_BYTES_KEY, 1000L)
-                .putLong(TOTAL_BYTES_KEY, 5000L)
-                .putInt(USER_ID_KEY, 1)
-                .putLong(TIMESTAMP_KEY, 10000L)
-                .apply();
-
-        final SparseArray<StorageAsyncLoader.StorageResult> result =
-                mCachedValuesHelper.getCachedStorageResult();
-        assertThat(result).isNull();
-    }
-
-    @Test
-    public void getCachedPrivateStorageInfo_nullIfEmpty() {
-        final PrivateStorageInfo info = mCachedValuesHelper.getCachedPrivateStorageInfo();
-        assertThat(info).isNull();
-    }
-
-    @Test
-    public void getCachedStorageResult_nullIfEmpty() {
-        final SparseArray<StorageAsyncLoader.StorageResult> result =
-                mCachedValuesHelper.getCachedStorageResult();
-        assertThat(result).isNull();
-    }
-
-    @Test
-    public void cacheResult_succeeds() {
-        when(mMockClock.getCurrentTime()).thenReturn(10000L);
-        final StorageStatsSource.ExternalStorageStats externalStats =
-                new StorageStatsSource.ExternalStorageStats(22222L, 2L, 20L, 200L, 2000L);
-        final StorageAsyncLoader.StorageResult result =
-                new StorageAsyncLoader.StorageResult();
-        result.gamesSize = 1L;
-        result.audioSize = 10L;
-        result.videosSize = 100L;
-        result.imagesSize = 1000L;
-        result.allAppsExceptGamesSize = 10000L;
-        result.cacheSize = 100000L;
-        result.externalStats = externalStats;
-        final PrivateStorageInfo info = new PrivateStorageInfo(1000L, 6000L);
-
-        mCachedValuesHelper.cacheResult(info, result);
-
-        assertThat(mSharedPreferences.getLong(GAME_APPS_SIZE_KEY, -1)).isEqualTo(1L);
-        assertThat(mSharedPreferences.getLong(AUDIO_SIZE_KEY, -1)).isEqualTo(10L);
-        assertThat(mSharedPreferences.getLong(VIDEOS_SIZE_KEY, -1)).isEqualTo(100L);
-        assertThat(mSharedPreferences.getLong(IMAGES_SIZE_KEY, -1)).isEqualTo(1000L);
-        assertThat(mSharedPreferences.getLong(OTHER_APPS_SIZE_KEY, -1)).isEqualTo(10000L);
-        assertThat(mSharedPreferences.getLong(CACHE_APPS_SIZE_KEY, -1)).isEqualTo(100000L);
-        assertThat(mSharedPreferences.getLong(EXTERNAL_TOTAL_BYTES, -1)).isEqualTo(22222L);
-        assertThat(mSharedPreferences.getLong(EXTERNAL_AUDIO_BYTES, -1)).isEqualTo(2L);
-        assertThat(mSharedPreferences.getLong(EXTERNAL_VIDEO_BYTES, -1)).isEqualTo(20L);
-        assertThat(mSharedPreferences.getLong(EXTERNAL_IMAGE_BYTES, -1)).isEqualTo(200L);
-        assertThat(mSharedPreferences.getLong(EXTERNAL_APP_BYTES, -1)).isEqualTo(2000L);
-        assertThat(mSharedPreferences.getLong(FREE_BYTES_KEY, -1)).isEqualTo(1000L);
-        assertThat(mSharedPreferences.getLong(TOTAL_BYTES_KEY, -1)).isEqualTo(6000L);
-        assertThat(mSharedPreferences.getInt(USER_ID_KEY, -1)).isEqualTo(0);
-        assertThat(mSharedPreferences.getLong(TIMESTAMP_KEY, -1)).isEqualTo(10000L);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index cfc9e93..3eab600 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -151,12 +151,6 @@
     }
 
     @Test
-    public void testUpdateStateWithInitialState() {
-        assertThat(mPreference.getSummary().toString())
-            .isEqualTo(mContext.getString(R.string.memory_calculating_size));
-    }
-
-    @Test
     public void launchPublicStorageIntent_nonNullBrowseIntent_settingsIntent() {
         final String fakeBrowseAction = "FAKE_BROWSE_ACTION";
         final Intent fakeBrowseIntent = new Intent(fakeBrowseAction);
@@ -398,16 +392,17 @@
     }
 
     @Test
-    public void setVolume_updateFilePreferenceToHideAfterSettingVolume_hidePreference() {
+    public void setPrivateStorageCategoryPreferencesVisibility_updateFilePreferenceToHideAfterSettingVolume_hidePreference() {
         when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
         when(mVolume.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE);
         when(mVolume.getState()).thenReturn(VolumeInfo.STATE_MOUNTED);
         when(mVolume.isMountedReadable()).thenReturn(true);
-
         mController.displayPreference(mPreferenceScreen);
         when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(null);
         mController.setVolume(mVolume);
 
+        mController.setPrivateStorageCategoryPreferencesVisibility(true);
+
         assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isFalse();
     }
 
