From 637d419157a68c7e90398ec7a28b31bcc535a5b9 Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Fri, 28 Jun 2019 18:17:14 +0800 Subject: [PATCH] Fix crash after uninstalling app updateState was invoked in loader callback. But the package was uninstalled at the callback time caused null pointer exception. Add null check to prevent null pointer access. Fixes: 136170218 Fixes: 133771724 Test: make RunSettingsRoboTests, manual Change-Id: I2715e77f6e32af42a4bce70c9f409b0311eb36c4 (cherry picked from commit 790a822526251236af196c3ae17f1990c75fb133) --- .../appinfo/AppStoragePreferenceController.java | 10 +++++++--- .../appinfo/AppStoragePreferenceControllerTest.java | 11 +++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppStoragePreferenceController.java b/src/com/android/settings/applications/appinfo/AppStoragePreferenceController.java index d887634a540..b0d49390cd0 100644 --- a/src/com/android/settings/applications/appinfo/AppStoragePreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppStoragePreferenceController.java @@ -31,6 +31,7 @@ import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.AppStorageSettings; import com.android.settings.applications.FetchPackageStorageAsyncLoader; +import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.StorageStatsSource; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; @@ -48,9 +49,12 @@ public class AppStoragePreferenceController extends AppInfoPreferenceControllerB @Override public void updateState(Preference preference) { - final boolean isExternal = - (mParent.getAppEntry().info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; - preference.setSummary(getStorageSummary(mLastResult, isExternal)); + final ApplicationsState.AppEntry entry = mParent.getAppEntry(); + if (entry != null && entry.info != null) { + final boolean isExternal = + (entry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; + preference.setSummary(getStorageSummary(mLastResult, isExternal)); + } } @Override diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppStoragePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppStoragePreferenceControllerTest.java index 809d2cfefd1..065544b2f68 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppStoragePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppStoragePreferenceControllerTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -99,6 +100,16 @@ public class AppStoragePreferenceControllerTest { verify(preference).setSummary(any()); } + @Test + public void updateState_entryIsNull_shouldNotUpdatePreferenceSummary() { + when(mFragment.getAppEntry()).thenReturn(null); + Preference preference = mock(Preference.class); + + mController.updateState(preference); + + verify(preference, never()).setSummary(any()); + } + @Test public void getStorageSummary_shouldWorkForExternal() { final StorageStatsSource.AppStorageStats stats =