From 51b3e7a09336f1f0701eed5a94cfaaf4e41fb79f Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Mon, 31 May 2021 11:50:22 +0800 Subject: [PATCH] Storage Settings hides categories when loading To hide sorting animation. - Storage Settings always loads cache and updates UI, then loads storage size and updates UI. Remove the chche design because storage category preferences will hide during loading, it no meaning to load from cache and update UI. - Hides loading circle before storage category preferences become visible, it prevents flickers. - Remove Calculating... summary of StorageItemPreference. - Private storage category preferences and secondary user preference become visible at StorageItemPreferenceController#onLoadFinished. Bug: 188731179 Bug: 185547228 Bug: 188615591 Test: atest com.android.settings.deviceinfo atest com.android.settings.deviceinfo.storage make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.deviceinfo make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.deviceinfo.storage manual visual Change-Id: I3ebef5829ef4f806add07f58fa02520804768be5 --- res/xml/storage_category_fragment.xml | 3 +- .../deviceinfo/StorageCategoryFragment.java | 63 ++-- .../deviceinfo/StorageDashboardFragment.java | 63 ++-- .../deviceinfo/StorageItemPreference.java | 1 - .../storage/CachedStorageValuesHelper.java | 184 ----------- .../storage/SecondaryUserController.java | 21 +- .../StorageItemPreferenceController.java | 45 +-- .../StorageDashboardFragmentTest.java | 43 --- .../deviceinfo/StorageItemPreferenceTest.java | 6 - .../CachedStorageValuesHelperTest.java | 304 ------------------ .../StorageItemPreferenceControllerTest.java | 11 +- 11 files changed, 95 insertions(+), 649 deletions(-) delete mode 100644 src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelper.java delete mode 100644 tests/robotests/src/com/android/settings/deviceinfo/storage/CachedStorageValuesHelperTest.java diff --git a/res/xml/storage_category_fragment.xml b/res/xml/storage_category_fragment.xml index 72623d7b269..fb62beeaecf 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"/> mAppsResult; - private CachedStorageValuesHelper mCachedStorageValuesHelper; private StorageItemPreferenceController mPreferenceController; private List mSecondaryUsers; @@ -104,6 +103,10 @@ public class StorageCategoryFragment extends DashboardFragment 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 @@ public class StorageCategoryFragment extends DashboardFragment 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 @@ public class StorageCategoryFragment extends DashboardFragment @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 @@ public class StorageCategoryFragment extends DashboardFragment 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 @@ public class StorageCategoryFragment extends DashboardFragment 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 class StorageCategoryFragment extends DashboardFragment public void onLoadFinished(Loader> loader, SparseArray data) { mAppsResult = data; - maybeCacheFreshValues(); onReceivedSizes(); } @@ -286,11 +292,6 @@ public class StorageCategoryFragment extends DashboardFragment return false; } - @VisibleForTesting - public void setCachedStorageValuesHelper(CachedStorageValuesHelper helper) { - mCachedStorageValuesHelper = helper; - } - @VisibleForTesting public PrivateStorageInfo getPrivateStorageInfo() { return mStorageInfo; @@ -311,19 +312,6 @@ public class StorageCategoryFragment extends DashboardFragment mAppsResult = info; } - @VisibleForTesting - void initializeCachedValues() { - final PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo(); - final SparseArray 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 @@ public class StorageCategoryFragment extends DashboardFragment } } - 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 = 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 @@ public class StorageCategoryFragment extends DashboardFragment } mStorageInfo = privateStorageInfo; - maybeCacheFreshValues(); onReceivedSizes(); } } diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java index b76d1cbdbf5..6dbc3aa9a7e 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.R; 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 com.android.settingslib.search.SearchIndexable; 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 @@ public class StorageDashboardFragment extends DashboardFragment private StorageEntry mSelectedStorageEntry; private PrivateStorageInfo mStorageInfo; private SparseArray mAppsResult; - private CachedStorageValuesHelper mCachedStorageValuesHelper; private StorageItemPreferenceController mPreferenceController; private VolumeOptionMenuController mOptionMenuController; @@ -232,6 +231,10 @@ public class StorageDashboardFragment extends DashboardFragment 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 @@ public class StorageDashboardFragment extends DashboardFragment 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 @@ public class StorageDashboardFragment extends DashboardFragment @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 @@ public class StorageDashboardFragment extends DashboardFragment 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 @@ public class StorageDashboardFragment extends DashboardFragment 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 class StorageDashboardFragment extends DashboardFragment public void onLoadFinished(Loader> loader, SparseArray data) { mAppsResult = data; - maybeCacheFreshValues(); onReceivedSizes(); } @@ -486,11 +492,6 @@ public class StorageDashboardFragment extends DashboardFragment return false; } - @VisibleForTesting - public void setCachedStorageValuesHelper(CachedStorageValuesHelper helper) { - mCachedStorageValuesHelper = helper; - } - @VisibleForTesting public PrivateStorageInfo getPrivateStorageInfo() { return mStorageInfo; @@ -511,19 +512,6 @@ public class StorageDashboardFragment extends DashboardFragment mAppsResult = info; } - @VisibleForTesting - void initializeCachedValues() { - final PrivateStorageInfo info = mCachedStorageValuesHelper.getCachedPrivateStorageInfo(); - final SparseArray 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 @@ public class StorageDashboardFragment extends DashboardFragment } } - 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 = 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 @@ public class StorageDashboardFragment extends DashboardFragment } mStorageInfo = privateStorageInfo; - maybeCacheFreshValues(); onReceivedSizes(); } } diff --git a/src/com/android/settings/deviceinfo/StorageItemPreference.java b/src/com/android/settings/deviceinfo/StorageItemPreference.java index cdb9f9d6fe1..934ff3f603b 100644 --- a/src/com/android/settings/deviceinfo/StorageItemPreference.java +++ b/src/com/android/settings/deviceinfo/StorageItemPreference.java @@ -43,7 +43,6 @@ public class StorageItemPreference extends Preference { 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 4ca623dc53d..00000000000 --- 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 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 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 6475029f21b..f87a06a76f0 100644 --- a/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java +++ b/src/com/android/settings/deviceinfo/storage/SecondaryUserController.java @@ -53,9 +53,11 @@ public class SecondaryUserController extends AbstractPreferenceController implem 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 @@ public class SecondaryUserController extends AbstractPreferenceController implem 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 @@ public class SecondaryUserController extends AbstractPreferenceController implem 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 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 41e26ee983e..22ea98fda3e 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -221,7 +221,15 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle 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 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle || 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 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle } 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 af1900ac83a..411a3cf3efa 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 android.view.View; 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; @@ -72,47 +70,6 @@ public class StorageDashboardFragmentTest { verify(activity).invalidateOptionsMenu(); } - @Test - public void test_cacheProviderProvidesValuesIfBothCached() { - CachedStorageValuesHelper helper = mock(CachedStorageValuesHelper.class); - PrivateStorageInfo info = new PrivateStorageInfo(0, 0); - when(helper.getCachedPrivateStorageInfo()).thenReturn(info); - SparseArray 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 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); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java index 24543801ef7..984d945dac6 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageItemPreferenceTest.java @@ -45,12 +45,6 @@ public class StorageItemPreferenceTest { mPreference = new StorageItemPreference(mContext); } - @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); 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 ccc9152a014..00000000000 --- 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 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 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 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 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 cfc9e933ab9..3eab600d841 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java @@ -150,12 +150,6 @@ public class StorageItemPreferenceControllerTest { return screen; } - @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"; @@ -398,16 +392,17 @@ public class StorageItemPreferenceControllerTest { } @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(); }