OSDN Git Service

Fix storage settings crash.
authorDaniel Nishi <dhnishi@google.com>
Fri, 31 Mar 2017 01:02:16 +0000 (18:02 -0700)
committerDaniel Nishi <dhnishi@google.com>
Mon, 10 Apr 2017 23:06:16 +0000 (16:06 -0700)
It may crash if opened during the uninstall of an app. By catching
the exception which may occur, we can just skip the uninstalled app
and avoid crashing.

Change-Id: If556db7b5a299ba53a29baefbbe9709ba6d12190
Fixes: 36793223
Fixes: 36793372
Test: Settings unit test

src/com/android/settings/deviceinfo/StorageDashboardFragment.java
src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java

index 602e65f..bc64ffa 100644 (file)
@@ -117,7 +117,7 @@ public class StorageDashboardFragment extends DashboardFragment
     @Override
     public void onResume() {
         super.onResume();
-        getLoaderManager().initLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
+        getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
         getLoaderManager().initLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
     }
 
index e83c5d2..86472f9 100644 (file)
@@ -79,8 +79,14 @@ public class StorageAsyncLoader
         UserHandle myUser = UserHandle.of(userId);
         for (int i = 0, size = applicationInfos.size(); i < size; i++) {
             ApplicationInfo app = applicationInfos.get(i);
-            StorageStatsSource.AppStorageStats stats =
-                    mStatsManager.getStatsForPackage(mUuid, app.packageName, myUser);
+
+            StorageStatsSource.AppStorageStats stats;
+            try {
+                stats = mStatsManager.getStatsForPackage(mUuid, app.packageName, myUser);
+            } catch (IllegalStateException e) {
+                // This may happen if the package was removed during our calculation.
+                continue;
+            }
 
             long attributedAppSizeInBytes = stats.getDataBytes();
             // This matches how the package manager calculates sizes -- by zeroing out code sizes of
index e82482e..f7131b3 100644 (file)
@@ -180,6 +180,20 @@ public class StorageAsyncLoaderTest {
         assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(0);
     }
 
+    @Test
+    public void testRemovedPackageDoesNotCrash() throws Exception {
+        ApplicationInfo info = new ApplicationInfo();
+        info.packageName = PACKAGE_NAME_1;
+        info.category = ApplicationInfo.CATEGORY_UNDEFINED;
+        mInfo.add(info);
+        when(mSource.getStatsForPackage(anyString(), anyString(), any(UserHandle.class)))
+                .thenThrow(new IllegalStateException());
+
+        SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+        // Should not crash.
+    }
+
     private ApplicationInfo addPackage(
             String packageName, long cacheSize, long codeSize, long dataSize, int category) {
         StorageStatsSource.AppStorageStats storageStats =