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
This commit is contained in:
jackqdyulei
2017-05-23 17:01:39 -07:00
parent 7226c9f4c4
commit 0b83954f1c
2 changed files with 17 additions and 5 deletions

View File

@@ -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;

View File

@@ -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}