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

Commit 96b6106f authored by Arc Wang's avatar Arc Wang
Browse files

Reduce flickers when launching Storage Settings

This change remove unnecessary UI dpdate of
StorageItemPreferenceController.

- For StorageItemPreferenceController:
  Remove UI update at #displayPreference since onLoadFinished will update.
  Don't update order at #setVolume since onLoadFinished will update.

- StorageDashboardFragment & StorageCategoryFragment update
  StorageItemPreferenceController only when both StorageInfo
  and StorageResult are loaded.

Bug: 185547228
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
      Click each file category to count files size is the same as
      displayed in Storage Settings.
      manual visual
Change-Id: Id449003827a3e340e7a90f706152100b5568f834
parent aab74b24
Loading
Loading
Loading
Loading
+21 −26
Original line number Diff line number Diff line
@@ -104,14 +104,16 @@ public class StorageCategoryFragment extends DashboardFragment
            return;
        }

        mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());

        if (!mSelectedStorageEntry.isMounted()) {
            // Set null volume to hide category stats.
            mPreferenceController.setVolume(null);
            return;
        }
        if (mSelectedStorageEntry.isPrivate()) {
            mStorageInfo = null;
            mAppsResult = null;
            maybeSetLoading(isQuotaSupported());

            // Stats data is only available on private volumes.
            getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
            getLoaderManager()
@@ -156,7 +158,6 @@ public class StorageCategoryFragment extends DashboardFragment
    public void onViewCreated(View v, Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);
        initializeCacheProvider();
        maybeSetLoading(isQuotaSupported());

        EntityHeaderController.newInstance(getActivity(), this /*fragment*/,
                null /* header view */)
@@ -179,8 +180,10 @@ public class StorageCategoryFragment extends DashboardFragment
    }

    private void onReceivedSizes() {
        boolean stopLoading = false;
        if (mStorageInfo != null) {
        if (mStorageInfo == null || mAppsResult == null) {
            return;
        }

        final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
        mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
        mPreferenceController.setUsedSize(privateUsedBytes);
@@ -192,22 +195,14 @@ public class StorageCategoryFragment extends DashboardFragment
                userController.setTotalSize(mStorageInfo.totalBytes);
            }
        }
            stopLoading = true;
        }

        if (mAppsResult != null) {
        mPreferenceController.onLoadFinished(mAppsResult, mUserId);
        updateSecondaryUserControllers(mSecondaryUsers, mAppsResult);
            stopLoading = true;
        }

        // setLoading always causes a flicker, so let's avoid doing it.
        if (stopLoading) {
        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
            setLoading(false, true);
        }
    }
    }

    @Override
    public int getMetricsCategory() {
+21 −26
Original line number Diff line number Diff line
@@ -232,14 +232,16 @@ public class StorageDashboardFragment extends DashboardFragment
        mOptionMenuController.setSelectedStorageEntry(mSelectedStorageEntry);
        getActivity().invalidateOptionsMenu();

        mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());

        if (!mSelectedStorageEntry.isMounted()) {
            // Set null volume to hide category stats.
            mPreferenceController.setVolume(null);
            return;
        }
        if (mSelectedStorageEntry.isPrivate()) {
            mStorageInfo = null;
            mAppsResult = null;
            maybeSetLoading(isQuotaSupported());

            // Stats data is only available on private volumes.
            getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
            getLoaderManager()
@@ -315,7 +317,6 @@ public class StorageDashboardFragment extends DashboardFragment
    public void onViewCreated(View v, Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);
        initializeCacheProvider();
        maybeSetLoading(isQuotaSupported());

        EntityHeaderController.newInstance(getActivity(), this /*fragment*/,
                null /* header view */)
@@ -350,8 +351,10 @@ public class StorageDashboardFragment extends DashboardFragment
    }

    private void onReceivedSizes() {
        boolean stopLoading = false;
        if (mStorageInfo != null) {
        if (mStorageInfo == null || mAppsResult == null) {
            return;
        }

        final long privateUsedBytes = mStorageInfo.totalBytes - mStorageInfo.freeBytes;
        mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
        mPreferenceController.setUsedSize(privateUsedBytes);
@@ -363,22 +366,14 @@ public class StorageDashboardFragment extends DashboardFragment
                userController.setTotalSize(mStorageInfo.totalBytes);
            }
        }
            stopLoading = true;
        }

        if (mAppsResult != null) {
        mPreferenceController.onLoadFinished(mAppsResult, mUserId);
        updateSecondaryUserControllers(mSecondaryUsers, mAppsResult);
            stopLoading = true;
        }

        // setLoading always causes a flicker, so let's avoid doing it.
        if (stopLoading) {
        if (getView().findViewById(R.id.loading_container).getVisibility() == View.VISIBLE) {
            setLoading(false, true);
        }
    }
    }

    @Override
    public int getMetricsCategory() {
+1 −8
Original line number Diff line number Diff line
@@ -222,7 +222,6 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        mVolume = volume;

        updateCategoryPreferencesVisibility();
        updatePrivateStorageCategoryPreferencesOrder();
    }

    // Stats data is only available on private volumes.
@@ -353,14 +352,10 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        mDocumentsAndOtherPreference = screen.findPreference(DOCUMENTS_AND_OTHER_KEY);
        mSystemPreference = screen.findPreference(SYSTEM_KEY);
        mTrashPreference = screen.findPreference(TRASH_KEY);

        updateCategoryPreferencesVisibility();
        updatePrivateStorageCategoryPreferencesOrder();
    }

    /** Fragments use it to set storage result and update UI of this controller. */
    public void onLoadFinished(SparseArray<StorageAsyncLoader.StorageResult> result,
            int userId) {
    public void onLoadFinished(SparseArray<StorageAsyncLoader.StorageResult> result, int userId) {
        final StorageAsyncLoader.StorageResult data = result.get(userId);

        mImagesPreference.setStorageSize(data.imagesSize, mTotalSize);
@@ -374,8 +369,6 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
        if (mSystemPreference != null) {
            // Everything else that hasn't already been attributed is tracked as
            // belonging to system.
            // TODO(b/170918505): Should revamp system size calculation with the data
            // from media provider.
            long attributedSize = 0;
            for (int i = 0; i < result.size(); i++) {
                final StorageAsyncLoader.StorageResult otherData = result.valueAt(i);
+0 −20
Original line number Diff line number Diff line
@@ -397,25 +397,6 @@ public class StorageItemPreferenceControllerTest {
        assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isTrue();
    }

    @Test
    public void displayPreference_hideFilePreferenceWhenEmulatedStorageUnreadable() {
        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
        when(mVolume.isMountedReadable()).thenReturn(false);

        mController.displayPreference(mPreferenceScreen);

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

    @Test
    public void displayPreference_noEmulatedInternalStorage_hidePreference() {
        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(null);

        mController.displayPreference(mPreferenceScreen);

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

    @Test
    public void setVolume_updateFilePreferenceToHideAfterSettingVolume_hidePreference() {
        when(mSvp.findEmulatedForPrivate(nullable(VolumeInfo.class))).thenReturn(mVolume);
@@ -430,7 +411,6 @@ public class StorageItemPreferenceControllerTest {
        assertThat(mController.mDocumentsAndOtherPreference.isVisible()).isFalse();
    }


    @Test
    public void setVolume_updateFilePreferenceToShowAfterSettingVolume_showPreference() {
        // This will hide it initially.