From b22b85b593f63d38d29718ecd37e6a260011584e Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Thu, 22 Jun 2017 17:09:59 -0700 Subject: [PATCH] Count cache in storage categories. This makes the System size more consistent because cache is not attributed to the system (when the cache is under quota). Change-Id: I680e70daf5e98b9a205023a218dfd1dcc8ee8334 Fixes: 62623731 Test: Settings Unit Test --- .../storage/StorageAsyncLoader.java | 12 +++++++++- .../storage/StorageAsyncLoaderTest.java | 22 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java index 0b685d0f957..630df8576ab 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java +++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java @@ -105,7 +105,17 @@ public class StorageAsyncLoader continue; } - long blamedSize = stats.getDataBytes() - stats.getCacheBytes(); + final long dataSize = stats.getDataBytes(); + final long cacheQuota = mStatsManager.getCacheQuotaBytes(mUuid, app.uid); + final long cacheBytes = stats.getCacheBytes(); + long blamedSize = dataSize; + // Technically, we could overages as freeable on the storage settings screen. + // If the app is using more cache than its quota, we would accidentally subtract the + // overage from the system size (because it shows up as unused) during our attribution. + // Thus, we cap the attribution at the quota size. + if (cacheQuota < cacheBytes) { + blamedSize = blamedSize - cacheBytes + cacheQuota; + } // This isn't quite right because it slams the first user by user id with the whole code // size, but this ensures that we count all apps seen once. diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java index 28bd8617dc5..5a3569c2248 100644 --- a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java +++ b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java @@ -29,6 +29,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; +import android.net.TrafficStats; import android.os.UserHandle; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -55,6 +56,7 @@ public class StorageAsyncLoaderTest { private static final int SECONDARY_USER_ID = 10; private static final String PACKAGE_NAME_1 = "com.blah.test"; private static final String PACKAGE_NAME_2 = "com.blah.test2"; + private static final long DEFAULT_QUOTA = 64 * TrafficStats.MB_IN_BYTES; @Mock private StorageStatsSource mSource; @@ -81,6 +83,7 @@ public class StorageAsyncLoaderTest { mUsers = new ArrayList<>(); mUsers.add(info); when(mUserManager.getUsers()).thenReturn(mUsers); + when(mSource.getCacheQuotaBytes(anyString(), anyInt())).thenReturn(DEFAULT_QUOTA); } @Test @@ -120,13 +123,13 @@ public class StorageAsyncLoaderTest { } @Test - public void testCacheIsIgnored() throws Exception { + public void testCacheIsNotIgnored() throws Exception { addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED); SparseArray result = mLoader.loadInBackground(); assertThat(result.size()).isEqualTo(1); - assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(11L); + assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(111L); } @Test @@ -155,7 +158,7 @@ public class StorageAsyncLoaderTest { SparseArray result = mLoader.loadInBackground(); assertThat(result.size()).isEqualTo(1); - assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(11L); + assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(111L); } @Test @@ -207,12 +210,23 @@ public class StorageAsyncLoaderTest { assertThat(result.get(SECONDARY_USER_ID).videoAppsSize).isEqualTo(10L); } + @Test + public void testCacheOveragesAreCountedAsFree() throws Exception { + addPackage(PACKAGE_NAME_1, DEFAULT_QUOTA + 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED); + + SparseArray result = mLoader.loadInBackground(); + + assertThat(result.size()).isEqualTo(1); + assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(DEFAULT_QUOTA + 11); + } + private ApplicationInfo addPackage(String packageName, long cacheSize, long codeSize, long dataSize, int category) throws Exception { StorageStatsSource.AppStorageStats storageStats = mock(StorageStatsSource.AppStorageStats.class); when(storageStats.getCodeBytes()).thenReturn(codeSize); - when(storageStats.getDataBytes()).thenReturn(dataSize); + when(storageStats.getDataBytes()).thenReturn(dataSize + cacheSize); + when(storageStats.getCacheBytes()).thenReturn(cacheSize); when(mSource.getStatsForPackage(anyString(), eq(packageName), any(UserHandle.class))) .thenReturn(storageStats);