Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd2f2f51 authored by Arc Wang's avatar Arc Wang Committed by Android (Google) Code Review
Browse files

Merge "Show "Files" category for public storage in Storage Settings" into sc-dev

parents ad8a4029 c6263806
Loading
Loading
Loading
Loading
+21 −8
Original line number Diff line number Diff line
@@ -44,38 +44,51 @@
        android:title="@string/storage_free_up_space_title"
        android:summary="@string/storage_free_up_space_summary"/>
    <!-- Preference order 100~200 are 'ONLY' for storage category preferences below. -->
    <Preference
        android:key="pref_public_storage"
        android:title="@string/storage_files"
        android:icon="@drawable/ic_folder_vd_theme_24"
        android:order="100"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_images"
        android:title="@string/storage_images"
        android:icon="@drawable/ic_photo_library"/>
        android:icon="@drawable/ic_photo_library"
        android:order="101"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_videos"
        android:title="@string/storage_videos"
        android:icon="@drawable/ic_local_movies"/>
        android:icon="@drawable/ic_local_movies"
        android:order="102"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_audios"
        android:title="@string/storage_audios"
        android:icon="@drawable/ic_media_stream"/>
        android:icon="@drawable/ic_media_stream"
        android:order="103"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_apps"
        android:title="@string/storage_apps"
        android:icon="@drawable/ic_storage_apps"/>
        android:icon="@drawable/ic_storage_apps"
        android:order="104"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_games"
        android:title="@string/storage_games"
        android:icon="@drawable/ic_videogame_vd_theme_24"/>
        android:icon="@drawable/ic_videogame_vd_theme_24"
        android:order="105"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_documents_and_other"
        android:title="@string/storage_documents_and_other"
        android:icon="@drawable/ic_folder_vd_theme_24"/>
        android:icon="@drawable/ic_folder_vd_theme_24"
        android:order="106"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_system"
        android:title="@string/storage_system"
        android:icon="@drawable/ic_system_update"/>
        android:icon="@drawable/ic_system_update"
        android:order="107"/>
    <com.android.settings.deviceinfo.StorageItemPreference
        android:key="pref_trash"
        android:title="@string/storage_trash"
        android:icon="@drawable/ic_trash_can"/>
        android:icon="@drawable/ic_trash_can"
        android:order="108"/>
    <!-- Preference order 100~200 are 'ONLY' for storage category preferences above. -->
    <PreferenceCategory
        android:key="pref_secondary_users"
+7 −3
Original line number Diff line number Diff line
@@ -248,15 +248,19 @@ public class StorageDashboardFragment extends DashboardFragment

        mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());

        if (mSelectedStorageEntry.isPrivate() && mSelectedStorageEntry.isMounted()) {
        if (!mSelectedStorageEntry.isMounted()) {
            // Set null volume to hide category stats.
            mPreferenceController.setVolume(null);
            return;
        }
        if (mSelectedStorageEntry.isPrivate()) {
            // Stats data is only available on private volumes.
            getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
            getLoaderManager()
                 .restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
            getLoaderManager().restartLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
        } else {
            // Set null volume to hide category stats.
            mPreferenceController.setVolume(null);
            mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
        }
    }

+8 −0
Original line number Diff line number Diff line
@@ -236,6 +236,14 @@ public class StorageEntry implements Comparable<StorageEntry>, Parcelable {
        return mVolumeInfo == null ? false : mVolumeInfo.getType() == VolumeInfo.TYPE_PUBLIC;
    }

    /**
     * Stub volume is a volume that is maintained by external party such as the ChromeOS processes
     * in ARC++.
     */
    public boolean isStub() {
        return mVolumeInfo == null ? false : mVolumeInfo.getType() == VolumeInfo.TYPE_STUB;
    }

    /** Returns description. */
    public String getDescription() {
        if (isVolumeInfo()) {
+58 −37
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle

    private static final String SYSTEM_FRAGMENT_TAG = "SystemInfo";

    @VisibleForTesting
    static final String PUBLIC_STORAGE_KEY = "pref_public_storage";
    @VisibleForTesting
    static final String IMAGES_KEY = "pref_images";
    @VisibleForTesting
@@ -103,9 +105,11 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
    private long mUsedBytes;
    private long mTotalSize;

    private List<StorageItemPreference> mStorageItemPreferences;
    private List<StorageItemPreference> mPrivateStorageItemPreferences;
    private PreferenceScreen mScreen;
    @VisibleForTesting
    Preference mPublicStoragePreference;
    @VisibleForTesting
    StorageItemPreference mImagesPreference;
    @VisibleForTesting
    StorageItemPreference mVideosPreference;
@@ -167,6 +171,9 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
            return false;
        }
        switch (preference.getKey()) {
            case PUBLIC_STORAGE_KEY:
                launchPublicStorageIntent();
                return true;
            case IMAGES_KEY:
                launchImagesIntent();
                return true;
@@ -210,37 +217,45 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
    public void setVolume(VolumeInfo volume) {
        mVolume = volume;

        final boolean isValidVolume = isValidVolume();
        setCategoryPreferencesVisibility(isValidVolume);
        if (isValidVolume) {
            updateCategoryPreferencesOrder();
        }
        updateCategoryPreferencesVisibility();
        updatePrivateStorageCategoryPreferencesOrder();
    }

    // Stats data is only available on private volumes.
    private boolean isValidVolume() {
    private boolean isValidPrivateVolume() {
        return mVolume != null
                && mVolume.getType() == VolumeInfo.TYPE_PRIVATE
                && (mVolume.getState() == VolumeInfo.STATE_MOUNTED
                || mVolume.getState() == VolumeInfo.STATE_MOUNTED_READ_ONLY);
    }

    private void setCategoryPreferencesVisibility(boolean visible) {
    private boolean isValidPublicVolume() {
        return mVolume != null
                && (mVolume.getType() == VolumeInfo.TYPE_PUBLIC
                || mVolume.getType() == VolumeInfo.TYPE_STUB)
                && (mVolume.getState() == VolumeInfo.STATE_MOUNTED
                || mVolume.getState() == VolumeInfo.STATE_MOUNTED_READ_ONLY);
    }

    private void updateCategoryPreferencesVisibility() {
        if (mScreen == null) {
            return;
        }

        mImagesPreference.setVisible(visible);
        mVideosPreference.setVisible(visible);
        mAudiosPreference.setVisible(visible);
        mAppsPreference.setVisible(visible);
        mGamesPreference.setVisible(visible);
        mDocumentsAndOtherPreference.setVisible(visible);
        mSystemPreference.setVisible(visible);
        mPublicStoragePreference.setVisible(isValidPublicVolume());

        final boolean privateStoragePreferencesVisible = isValidPrivateVolume();
        mImagesPreference.setVisible(privateStoragePreferencesVisible);
        mVideosPreference.setVisible(privateStoragePreferencesVisible);
        mAudiosPreference.setVisible(privateStoragePreferencesVisible);
        mAppsPreference.setVisible(privateStoragePreferencesVisible);
        mGamesPreference.setVisible(privateStoragePreferencesVisible);
        mDocumentsAndOtherPreference.setVisible(privateStoragePreferencesVisible);
        mSystemPreference.setVisible(privateStoragePreferencesVisible);
        // TODO(b/170918505): Shows trash category after trash category feature complete.
        mTrashPreference.setVisible(false);

        if (visible) {
        if (privateStoragePreferencesVisible) {
            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.
@@ -250,22 +265,22 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        }
    }

    private void updateCategoryPreferencesOrder() {
        if (mScreen == null) {
    private void updatePrivateStorageCategoryPreferencesOrder() {
        if (mScreen == null || !isValidPrivateVolume()) {
            return;
        }

        if (mStorageItemPreferences == null) {
            mStorageItemPreferences = new ArrayList<>();
        if (mPrivateStorageItemPreferences == null) {
            mPrivateStorageItemPreferences = new ArrayList<>();

            mStorageItemPreferences.add(mImagesPreference);
            mStorageItemPreferences.add(mVideosPreference);
            mStorageItemPreferences.add(mAudiosPreference);
            mStorageItemPreferences.add(mAppsPreference);
            mStorageItemPreferences.add(mGamesPreference);
            mStorageItemPreferences.add(mDocumentsAndOtherPreference);
            mStorageItemPreferences.add(mSystemPreference);
            mStorageItemPreferences.add(mTrashPreference);
            mPrivateStorageItemPreferences.add(mImagesPreference);
            mPrivateStorageItemPreferences.add(mVideosPreference);
            mPrivateStorageItemPreferences.add(mAudiosPreference);
            mPrivateStorageItemPreferences.add(mAppsPreference);
            mPrivateStorageItemPreferences.add(mGamesPreference);
            mPrivateStorageItemPreferences.add(mDocumentsAndOtherPreference);
            mPrivateStorageItemPreferences.add(mSystemPreference);
            mPrivateStorageItemPreferences.add(mTrashPreference);
        }
        mScreen.removePreference(mImagesPreference);
        mScreen.removePreference(mVideosPreference);
@@ -277,10 +292,10 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        mScreen.removePreference(mTrashPreference);

        // Sort display order by size.
        Collections.sort(mStorageItemPreferences,
        Collections.sort(mPrivateStorageItemPreferences,
                Comparator.comparingLong(StorageItemPreference::getStorageSize));
        int orderIndex = LAST_STORAGE_CATEGORY_PREFERENCE_ORDER;
        for (StorageItemPreference preference : mStorageItemPreferences) {
        for (StorageItemPreference preference : mPrivateStorageItemPreferences) {
            preference.setOrder(orderIndex--);
            mScreen.addPreference(preference);
        }
@@ -292,6 +307,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
    public void setUserId(UserHandle userHandle) {
        mUserId = userHandle.getIdentifier();

        tintPreference(mPublicStoragePreference);
        tintPreference(mImagesPreference);
        tintPreference(mVideosPreference);
        tintPreference(mAudiosPreference);
@@ -320,6 +336,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
    @Override
    public void displayPreference(PreferenceScreen screen) {
        mScreen = screen;
        mPublicStoragePreference = screen.findPreference(PUBLIC_STORAGE_KEY);
        mImagesPreference = screen.findPreference(IMAGES_KEY);
        mVideosPreference = screen.findPreference(VIDEOS_KEY);
        mAudiosPreference = screen.findPreference(AUDIOS_KEY);
@@ -329,11 +346,8 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        mSystemPreference = screen.findPreference(SYSTEM_KEY);
        mTrashPreference = screen.findPreference(TRASH_KEY);

        final boolean isValidVolume = isValidVolume();
        setCategoryPreferencesVisibility(isValidVolume);
        if (isValidVolume) {
            updateCategoryPreferencesOrder();
        }
        updateCategoryPreferencesVisibility();
        updatePrivateStorageCategoryPreferencesOrder();
    }

    public void onLoadFinished(SparseArray<StorageAsyncLoader.AppsStorageResult> result,
@@ -371,7 +385,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
            mSystemPreference.setStorageSize(systemSize, mTotalSize);
        }

        updateCategoryPreferencesOrder();
        updatePrivateStorageCategoryPreferencesOrder();
    }

    public void setUsedSize(long usedSizeBytes) {
@@ -382,6 +396,13 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        mTotalSize = totalSizeBytes;
    }

    private void launchPublicStorageIntent() {
        final Intent intent = mVolume.buildBrowseIntent();
        if (intent != null) {
            mContext.startActivity(intent);
        }
    }

    // TODO(b/183078080): To simplify StorageItemPreferenceController, move launchxxxIntent to a
    //                    utility object.
    private void launchImagesIntent() {
+46 −0
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ public class StorageItemPreferenceControllerTest {
    }

    private PreferenceScreen getPreferenceScreen() {
        final StorageItemPreference publicStorage = spy(new StorageItemPreference(mContext));
        publicStorage.setIcon(R.drawable.ic_folder_vd_theme_24);
        final StorageItemPreference images = spy(new StorageItemPreference(mContext));
        images.setIcon(R.drawable.ic_photo_library);
        final StorageItemPreference videos = spy(new StorageItemPreference(mContext));
@@ -122,6 +124,8 @@ public class StorageItemPreferenceControllerTest {
        trash.setIcon(R.drawable.ic_trash_can);

        final PreferenceScreen screen = mock(PreferenceScreen.class);
        when(screen.findPreference(eq(StorageItemPreferenceController.PUBLIC_STORAGE_KEY)))
                .thenReturn(publicStorage);
        when(screen.findPreference(eq(StorageItemPreferenceController.IMAGES_KEY)))
                .thenReturn(images);
        when(screen.findPreference(eq(StorageItemPreferenceController.VIDEOS_KEY)))
@@ -148,6 +152,24 @@ public class StorageItemPreferenceControllerTest {
            .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);
        // mContext is not the activity, add FLAG_ACTIVITY_NEW_TASK to avoid AndroidRuntimeException
        // during this test.
        fakeBrowseIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        when(mVolume.buildBrowseIntent()).thenReturn(fakeBrowseIntent);
        mPreference.setKey(StorageItemPreferenceController.PUBLIC_STORAGE_KEY);
        mController.handlePreferenceTreeClick(mPreference);

        final ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class);
        verify(mContext).startActivity(argumentCaptor.capture());

        final Intent intent = argumentCaptor.getValue();
        assertThat(intent.getAction()).isEqualTo(fakeBrowseAction);
    }

    @Test
    public void launchImagesIntent_resolveActionViewNull_settingsIntent() {
        mPreference.setKey(StorageItemPreferenceController.IMAGES_KEY);
@@ -191,6 +213,7 @@ public class StorageItemPreferenceControllerTest {

        mController.setVolume(null);

        assertThat(mController.mPublicStoragePreference.isVisible()).isFalse();
        assertThat(mController.mImagesPreference.isVisible()).isFalse();
        assertThat(mController.mVideosPreference.isVisible()).isFalse();
        assertThat(mController.mAudiosPreference.isVisible()).isFalse();
@@ -347,6 +370,7 @@ public class StorageItemPreferenceControllerTest {

        mController.setUserId(new UserHandle(10));

        verify(mController.mPublicStoragePreference, times(2)).setIcon(nullable(Drawable.class));
        verify(mController.mImagesPreference, times(2)).setIcon(nullable(Drawable.class));
        verify(mController.mVideosPreference, times(2)).setIcon(nullable(Drawable.class));
        verify(mController.mAudiosPreference, times(2)).setIcon(nullable(Drawable.class));
@@ -418,4 +442,26 @@ public class StorageItemPreferenceControllerTest {

        assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isTrue();
    }

    @Test
    public void setVolume_publicStorage_showFilePreference() {
        // This will hide it initially.
        mController.displayPreference(mPreferenceScreen);
        when(mVolume.getType()).thenReturn(VolumeInfo.TYPE_PUBLIC);
        when(mVolume.getState()).thenReturn(VolumeInfo.STATE_MOUNTED);
        when(mVolume.isMountedReadable()).thenReturn(true);

        // And we bring it back.
        mController.setVolume(mVolume);

        assertThat(mController.mPublicStoragePreference.isVisible()).isTrue();
        assertThat(mController.mImagesPreference.isVisible()).isFalse();
        assertThat(mController.mVideosPreference.isVisible()).isFalse();
        assertThat(mController.mAudiosPreference.isVisible()).isFalse();
        assertThat(mController.mAppsPreference.isVisible()).isFalse();
        assertThat(mController.mGamesPreference.isVisible()).isFalse();
        assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isFalse();
        assertThat(mController.mSystemPreference.isVisible()).isFalse();
        assertThat(mController.mTrashPreference.isVisible()).isFalse();
    }
}
Loading