From 1359d4fe0e1b445b7e8b36b1573ab03f8bcb3da1 Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Tue, 28 Mar 2017 10:44:37 -0700 Subject: [PATCH] Fake the cache size to be 0 bytes when cleared. The fast track storage calculation returns a non-zero answer after the storage has been cleared. The simplest workaround here is to fake the size as 0 bytes in the view after cache clearing. It will not be zero if the user exits and comes back, but this should be fine. MARK IT ZERO! Change-Id: Ia012c2cf2842040d5eac3d4a72539ec7dcfb9570 Fixes: 34965659 Test: Settings Robotest (cherry picked from commit bf1f8e9ca74736ea2d795ce918e45c972dfea52c) --- .../applications/AppStorageSettings.java | 19 ++++++++++++++++++- .../AppStorageSizesController.java | 12 +++++++++++- .../AppStorageSizesControllerTest.java | 18 ++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java index d5d72bcd5a0..8d41558acc6 100644 --- a/src/com/android/settings/applications/AppStorageSettings.java +++ b/src/com/android/settings/applications/AppStorageSettings.java @@ -101,6 +101,8 @@ public class AppStorageSettings extends AppInfoWithHeader private static final String KEY_URI_CATEGORY = "uri_category"; private static final String KEY_CLEAR_URI = "clear_uri_button"; + private static final String KEY_CACHE_CLEARED = "cache_cleared"; + // Views related to cache info private Preference mCacheSize; private Button mClearDataButton; @@ -115,6 +117,7 @@ public class AppStorageSettings extends AppInfoWithHeader private PreferenceCategory mUri; private boolean mCanClearData = true; + private boolean mCacheCleared; private AppStorageStats mLastResult; private AppStorageSizesController mSizeController; @@ -133,6 +136,9 @@ public class AppStorageSettings extends AppInfoWithHeader @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + mCacheCleared = savedInstanceState.getBoolean(KEY_CACHE_CLEARED, false); + } addPreferencesFromResource(R.xml.app_storage_settings); setupViews(); @@ -145,6 +151,12 @@ public class AppStorageSettings extends AppInfoWithHeader updateSize(); } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(KEY_CACHE_CLEARED, mCacheCleared); + } + private void setupViews() { mComputingStr = getActivity().getText(R.string.computing_size); mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value); @@ -523,6 +535,10 @@ public class AppStorageSettings extends AppInfoWithHeader } private void updateUiWithSize(AppStorageStats result) { + if (mCacheCleared) { + mSizeController.setCacheCleared(true); + } + mSizeController.updateUi(getContext()); if (result == null) { @@ -539,7 +555,7 @@ public class AppStorageSettings extends AppInfoWithHeader mClearDataButton.setEnabled(true); mClearDataButton.setOnClickListener(this); } - if (cacheSize <= 0) { + if (cacheSize <= 0 || mCacheCleared) { mClearCacheButton.setEnabled(false); } else { mClearCacheButton.setEnabled(true); @@ -562,6 +578,7 @@ public class AppStorageSettings extends AppInfoWithHeader processClearMsg(msg); break; case MSG_CLEAR_CACHE: + mCacheCleared = true; // Refresh size info updateSize(); break; diff --git a/src/com/android/settings/applications/AppStorageSizesController.java b/src/com/android/settings/applications/AppStorageSizesController.java index bc8f680cc2c..94935bdbfd8 100644 --- a/src/com/android/settings/applications/AppStorageSizesController.java +++ b/src/com/android/settings/applications/AppStorageSizesController.java @@ -39,6 +39,7 @@ public class AppStorageSizesController { @Nullable private StorageStatsSource.AppStorageStats mLastResult; private boolean mLastResultFailed; + private boolean mCachedCleared; private long mLastCodeSize = -1; private long mLastDataSize = -1; private long mLastCacheSize = -1; @@ -77,7 +78,7 @@ public class AppStorageSizesController { mLastDataSize = dataSize; mDataSize.setSummary(getSizeStr(context, dataSize)); } - long cacheSize = mLastResult.getCacheBytes(); + long cacheSize = mCachedCleared ? 0 : mLastResult.getCacheBytes(); if (mLastCacheSize != cacheSize) { mLastCacheSize = cacheSize; mCacheSize.setSummary(getSizeStr(context, cacheSize)); @@ -100,6 +101,15 @@ public class AppStorageSizesController { mLastResultFailed = result == null; } + /** + * Sets if we have cleared the cache and should zero the cache bytes. + * When the cache is cleared, the cache directories are recreated. These directories have + * some size, but are empty. We zero this out to best match user expectations. + */ + public void setCacheCleared(boolean isCleared) { + mCachedCleared = isCleared; + } + private String getSizeStr(Context context, long size) { return Formatter.formatFileSize(context, size); } diff --git a/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java index 7204bd13f70..127100f788d 100644 --- a/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppStorageSizesControllerTest.java @@ -92,4 +92,22 @@ public class AppStorageSizesControllerTest { assertThat(mDataPreference.getSummary()).isEqualTo("100B"); assertThat(mTotalPreference.getSummary()).isEqualTo("111B"); } + + @Test + public void fakeCacheFlagSetsCacheToZero() { + AppStorageStats result = mock(AppStorageStats.class); + when(result.getCodeBytes()).thenReturn(1L); + when(result.getCacheBytes()).thenReturn(10L); + when(result.getDataBytes()).thenReturn(100L); + when(result.getTotalBytes()).thenReturn(111L); + + mController.setResult(result); + mController.setCacheCleared(true); + mController.updateUi(mContext); + + assertThat(mAppPreference.getSummary()).isEqualTo("1.00B"); + assertThat(mCachePreference.getSummary()).isEqualTo("0.00B"); + assertThat(mDataPreference.getSummary()).isEqualTo("100B"); + assertThat(mTotalPreference.getSummary()).isEqualTo("101B"); + } }