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

Commit 95261b92 authored by Daniel Nishi's avatar Daniel Nishi
Browse files

Fix storage settings crash.

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: I1b96b0697f4041be356260d6c675593affc1cb69
Merged-In: If556db7b5a299ba53a29baefbbe9709ba6d12190
Fixes: 36793223
Fixes: 36793372
Test: Settings unit test
parent ba7a4751
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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());
    }

+9 −2
Original line number Diff line number Diff line
@@ -79,8 +79,15 @@ 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.
                Log.w("App unexpectedly not found", e);
                continue;
            }

            long attributedAppSizeInBytes = stats.getDataBytes();
            // This matches how the package manager calculates sizes -- by zeroing out code sizes of
+14 −0
Original line number Diff line number Diff line
@@ -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 =