Cache mechanism for Storage page
- Use SharedPreference to cache the size info
- Improve the flicker problem on Documents & other preference
- The jobs are destroied on onPause to prevent the jobs being
restarting when back to Storage page
- Enable progress bar animation for each storage item
Bug: 191117970
Test: manual test
1) The loading spinner will be shown when entering Storage page
at first time.
2) Back to Settings homepage and switch back to Storage page, the
loading spinner shouldn't be shown.
3) Click each preference in the Storage page and switch between these
pages, the size info should be updated if something removed and the
order of preference shouldn't be changed.
Change-Id: I75533742a025dc61116207285a894ee728d0af68
Merged-In: I75533742a025dc61116207285a894ee728d0af68
(cherry picked from commit 77775a66f2
)
This commit is contained in:
@@ -47,6 +47,7 @@ import com.android.settings.deviceinfo.storage.AutomaticStorageManagementSwitchP
|
||||
import com.android.settings.deviceinfo.storage.DiskInitFragment;
|
||||
import com.android.settings.deviceinfo.storage.SecondaryUserController;
|
||||
import com.android.settings.deviceinfo.storage.StorageAsyncLoader;
|
||||
import com.android.settings.deviceinfo.storage.StorageCacheHelper;
|
||||
import com.android.settings.deviceinfo.storage.StorageEntry;
|
||||
import com.android.settings.deviceinfo.storage.StorageItemPreferenceController;
|
||||
import com.android.settings.deviceinfo.storage.StorageSelectionPreferenceController;
|
||||
@@ -109,6 +110,8 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
private boolean mIsWorkProfile;
|
||||
private int mUserId;
|
||||
private Preference mFreeUpSpacePreference;
|
||||
private boolean mIsLoadedFromCache;
|
||||
private StorageCacheHelper mStorageCacheHelper;
|
||||
|
||||
private final StorageEventListener mStorageEventListener = new StorageEventListener() {
|
||||
@Override
|
||||
@@ -239,15 +242,27 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
mPreferenceController.setVolume(null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mStorageCacheHelper.hasCachedSizeInfo() && mSelectedStorageEntry.isPrivate()) {
|
||||
StorageCacheHelper.StorageCache cachedData = mStorageCacheHelper.retrieveCachedSize();
|
||||
mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
|
||||
mPreferenceController.setUsedSize(cachedData.usedSize);
|
||||
mPreferenceController.setTotalSize(cachedData.totalSize);
|
||||
}
|
||||
|
||||
if (mSelectedStorageEntry.isPrivate()) {
|
||||
mStorageInfo = null;
|
||||
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);
|
||||
|
||||
// Hide the loading spinner if there is cached data.
|
||||
if (mStorageCacheHelper.hasCachedSizeInfo()) {
|
||||
//TODO(b/220259287): apply cache mechanism to secondary user
|
||||
mPreferenceController.onLoadFinished(mAppsResult, mUserId);
|
||||
} else {
|
||||
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()
|
||||
@@ -277,6 +292,16 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
|
||||
initializePreference();
|
||||
initializeOptionsMenu(activity);
|
||||
|
||||
if (mStorageCacheHelper.hasCachedSizeInfo()) {
|
||||
mIsLoadedFromCache = true;
|
||||
mStorageEntries.clear();
|
||||
mStorageEntries.addAll(
|
||||
StorageUtils.getAllStorageEntries(getContext(), mStorageManager));
|
||||
refreshUi();
|
||||
updateSecondaryUserControllers(mSecondaryUsers, mAppsResult);
|
||||
setSecondaryUsersVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void initializePreference() {
|
||||
@@ -291,6 +316,7 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
mUserManager = context.getSystemService(UserManager.class);
|
||||
mIsWorkProfile = false;
|
||||
mUserId = UserHandle.myUserId();
|
||||
mStorageCacheHelper = new StorageCacheHelper(getContext(), mUserId);
|
||||
|
||||
super.onAttach(context);
|
||||
use(AutomaticStorageManagementSwitchPreferenceController.class).setFragmentManager(
|
||||
@@ -323,9 +349,14 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
mStorageEntries.clear();
|
||||
mStorageEntries.addAll(StorageUtils.getAllStorageEntries(getContext(), mStorageManager));
|
||||
refreshUi();
|
||||
if (mIsLoadedFromCache) {
|
||||
mIsLoadedFromCache = false;
|
||||
} else {
|
||||
mStorageEntries.clear();
|
||||
mStorageEntries.addAll(
|
||||
StorageUtils.getAllStorageEntries(getContext(), mStorageManager));
|
||||
refreshUi();
|
||||
}
|
||||
mStorageManager.registerListener(mStorageEventListener);
|
||||
}
|
||||
|
||||
@@ -333,6 +364,11 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
mStorageManager.unregisterListener(mStorageEventListener);
|
||||
// Destroy the data loaders to prevent unnecessary data loading when switching back to the
|
||||
// page.
|
||||
getLoaderManager().destroyLoader(STORAGE_JOB_ID);
|
||||
getLoaderManager().destroyLoader(ICON_JOB_ID);
|
||||
getLoaderManager().destroyLoader(VOLUME_SIZE_JOB_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -359,6 +395,8 @@ public class StorageDashboardFragment extends DashboardFragment
|
||||
mPreferenceController.setVolume(mSelectedStorageEntry.getVolumeInfo());
|
||||
mPreferenceController.setUsedSize(privateUsedBytes);
|
||||
mPreferenceController.setTotalSize(mStorageInfo.totalBytes);
|
||||
// Cache total size and used size
|
||||
mStorageCacheHelper.cacheTotalSizeAndUsedSize(mStorageInfo.totalBytes, privateUsedBytes);
|
||||
for (int i = 0, size = mSecondaryUsers.size(); i < size; i++) {
|
||||
final AbstractPreferenceController controller = mSecondaryUsers.get(i);
|
||||
if (controller instanceof SecondaryUserController) {
|
||||
|
Reference in New Issue
Block a user