From f7fa542eb69b598ac014bb9b54b9e5b105c51e59 Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Mon, 1 May 2017 11:30:14 -0700 Subject: [PATCH] Don't overly hide the Files preference. This occurred this because the files preference was initialized during displayPreference(), but the volume used to initialize it was not being set until after the displayPreference() call. In this case, the files preference would hide itself and never come back. This fixes this by double-checking the Files visibility status whenever we set the volume. Change-Id: I0b1a7a9566e9caece39ec58706fbca034ef4c1c2 Fixes: 37790776 Test: Settings robotest --- .../StorageItemPreferenceController.java | 27 +++++--- .../StorageItemPreferenceControllerTest.java | 65 +++++++++++++++++++ 2 files changed, 84 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java index 377ec1e2fa0..ac54c1788b6 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -81,6 +81,7 @@ public class StorageItemPreferenceController extends PreferenceController { private long mUsedBytes; private long mTotalSize; + private PreferenceScreen mScreen; private StorageItemPreference mPhotoPreference; private StorageItemPreference mAudioPreference; private StorageItemPreference mGamePreference; @@ -169,6 +170,22 @@ public class StorageItemPreferenceController extends PreferenceController { */ public void setVolume(VolumeInfo volume) { mVolume = volume; + setFilesPreferenceVisibility(); + } + + private void setFilesPreferenceVisibility() { + if (mScreen != null) { + 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. + final boolean hideFilePreference = + (sharedVolume == null) || !sharedVolume.isMountedReadable(); + if (hideFilePreference) { + mScreen.removePreference(mFilePreference); + } else { + mScreen.addPreference(mFilePreference); + } + } } /** @@ -207,6 +224,7 @@ public class StorageItemPreferenceController extends PreferenceController { @Override public void displayPreference(PreferenceScreen screen) { + mScreen = screen; mPhotoPreference = (StorageItemPreference) screen.findPreference(PHOTO_KEY); mAudioPreference = (StorageItemPreference) screen.findPreference(AUDIO_KEY); mGamePreference = (StorageItemPreference) screen.findPreference(GAME_KEY); @@ -215,14 +233,7 @@ public class StorageItemPreferenceController extends PreferenceController { mSystemPreference = (StorageItemPreference) screen.findPreference(SYSTEM_KEY); mFilePreference = (StorageItemPreference) screen.findPreference(FILES_KEY); - 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. - final boolean hideFilePreference = - (sharedVolume == null) || !sharedVolume.isMountedReadable(); - if (hideFilePreference) { - screen.removePreference(mFilePreference); - } + setFilesPreferenceVisibility(); } public void onLoadFinished(StorageAsyncLoader.AppsStorageResult data) { 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 efe44efa086..82e04ecc42d 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java @@ -391,4 +391,69 @@ public class StorageItemPreferenceControllerTest { verify(screen).removePreference(files); } + + @Test + public void displayPreference_updateFilePreferenceToHideAfterSettingVolume() { + StorageItemPreference audio = new StorageItemPreference(mContext); + StorageItemPreference image = new StorageItemPreference(mContext); + StorageItemPreference games = new StorageItemPreference(mContext); + StorageItemPreference apps = new StorageItemPreference(mContext); + StorageItemPreference system = new StorageItemPreference(mContext); + StorageItemPreference files = new StorageItemPreference(mContext); + PreferenceScreen screen = mock(PreferenceScreen.class); + when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY))) + .thenReturn(audio); + when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY))) + .thenReturn(image); + when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games); + when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY))) + .thenReturn(apps); + when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY))) + .thenReturn(system); + when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY))) + .thenReturn(files); + + when(mSvp.findEmulatedForPrivate(any(VolumeInfo.class))).thenReturn(mVolume); + when(mVolume.isMountedReadable()).thenReturn(true); + + mController.displayPreference(screen); + when(mSvp.findEmulatedForPrivate(any(VolumeInfo.class))).thenReturn(null); + mController.setVolume(mVolume); + + verify(screen).removePreference(files); + } + + + @Test + public void displayPreference_updateFilePreferenceToShowAfterSettingVolume() { + StorageItemPreference audio = new StorageItemPreference(mContext); + StorageItemPreference image = new StorageItemPreference(mContext); + StorageItemPreference games = new StorageItemPreference(mContext); + StorageItemPreference apps = new StorageItemPreference(mContext); + StorageItemPreference system = new StorageItemPreference(mContext); + StorageItemPreference files = new StorageItemPreference(mContext); + PreferenceScreen screen = mock(PreferenceScreen.class); + when(screen.findPreference(eq(StorageItemPreferenceController.AUDIO_KEY))) + .thenReturn(audio); + when(screen.findPreference(eq(StorageItemPreferenceController.PHOTO_KEY))) + .thenReturn(image); + when(screen.findPreference(eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games); + when(screen.findPreference(eq(StorageItemPreferenceController.OTHER_APPS_KEY))) + .thenReturn(apps); + when(screen.findPreference(eq(StorageItemPreferenceController.SYSTEM_KEY))) + .thenReturn(system); + when(screen.findPreference(eq(StorageItemPreferenceController.FILES_KEY))) + .thenReturn(files); + + // This will hide it initially. + mController.displayPreference(screen); + + when(mSvp.findEmulatedForPrivate(any(VolumeInfo.class))).thenReturn(mVolume); + when(mVolume.isMountedReadable()).thenReturn(true); + + // And we bring it back. + mController.setVolume(mVolume); + + verify(screen).addPreference(files); + } } \ No newline at end of file