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