From 0b83954f1c86a5269b4b863e6ad0958dba03fed9 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Tue, 23 May 2017 17:01:39 -0700 Subject: [PATCH] Add NPE check for refreshUi The reason for NPE is that callback is registered too early, so one callback is invoked before controller is fully inited. This cl fix it in two ways: 1. Add NPE check in refreshUi, since this method in InstalledAppDetail is robost to NPE 2. Move the callback to the end of constructor. Bug: 37913054 Test: RunSettingsRoboTests Change-Id: I54b03fb51a958a8e63bfe8a7ccfda79be1fa1956 --- .../fuelgauge/AppButtonsPreferenceController.java | 14 +++++++++----- .../AppButtonsPreferenceControllerTest.java | 8 ++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java index 49a01793d94..89f03b3533f 100644 --- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java +++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java @@ -98,6 +98,8 @@ public class AppButtonsPreferenceController extends PreferenceController impleme @VisibleForTesting Button mUninstallButton; @VisibleForTesting + String mPackageName; + @VisibleForTesting boolean mDisableAfterUninstall = false; private final int mRequestUninstall; @@ -113,7 +115,6 @@ public class AppButtonsPreferenceController extends PreferenceController impleme private MetricsFeatureProvider mMetricsFeatureProvider; private LayoutPreference mButtonsPref; - private String mPackageName; private int mUserId; private boolean mUpdatedSysApp = false; private boolean mListeningToPackageRemove = false; @@ -134,7 +135,6 @@ public class AppButtonsPreferenceController extends PreferenceController impleme mMetricsFeatureProvider = FeatureFactory.getFactory(activity).getMetricsFeatureProvider(); mState = state; - mSession = mState.newSession(this); mDpm = dpm; mUserManager = userManager; mPm = packageManager; @@ -145,10 +145,10 @@ public class AppButtonsPreferenceController extends PreferenceController impleme mRequestUninstall = requestUninstall; mRequestRemoveDeviceAdmin = requestRemoveDeviceAdmin; - lifecycle.addObserver(this); - if (packageName != null) { mAppEntry = mState.getEntry(packageName, mUserId); + mSession = mState.newSession(this); + lifecycle.addObserver(this); } else { mFinishing = true; } @@ -620,7 +620,11 @@ public class AppButtonsPreferenceController extends PreferenceController impleme return false; } - private boolean refreshUi() { + @VisibleForTesting + boolean refreshUi() { + if (mPackageName == null) { + return false; + } retrieveAppEntry(); if (mAppEntry == null || mPackageInfo == null) { return false; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java index a341d8361d7..b40cb9e6858 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AppButtonsPreferenceControllerTest.java @@ -344,6 +344,14 @@ public class AppButtonsPreferenceControllerTest { assertThat(controllable).isTrue(); } + @Test + public void testRefreshUi_packageNull_shouldNotCrash() { + mController.mPackageName = null; + + // Should not crash in this method + assertThat(mController.refreshUi()).isFalse(); + } + /** * The test fragment which implements * {@link ButtonActionDialogFragment.AppButtonsDialogListener}