Prevent NullPointerException in SimStatusDialogController

In rare cases the SignalStrength we get for a SIM can be null, which
wasn't checked for in this code. This CL adds a null check and fixes the
tests so it's possible to verify the fix (one of the methods that would
have crashed was being spy'd over unnecessarily).

Fixes: 132570076
Test: make RunSettingsRobotests
Change-Id: Ifdec24f184ee2d93e5e242eb2c20695249992fc6
This commit is contained in:
Antony Sargent
2019-05-21 09:45:26 -07:00
parent 76cf0dbddd
commit 5c46d93bd8
2 changed files with 21 additions and 10 deletions

View File

@@ -297,6 +297,9 @@ public class SimStatusDialogController implements LifecycleObserver, OnResume, O
}
private void updateSignalStrength(SignalStrength signalStrength) {
if (signalStrength == null) {
return;
}
final int subscriptionId = mSubscriptionInfo.getSubscriptionId();
final PersistableBundle carrierConfig =
mCarrierConfigManager.getConfigForSubId(subscriptionId);
@@ -430,13 +433,11 @@ public class SimStatusDialogController implements LifecycleObserver, OnResume, O
mSubscriptionInfo.getSubscriptionId());
}
@VisibleForTesting
int getDbm(SignalStrength signalStrength) {
private int getDbm(SignalStrength signalStrength) {
return signalStrength.getDbm();
}
@VisibleForTesting
int getAsuLevel(SignalStrength signalStrength) {
private int getAsuLevel(SignalStrength signalStrength) {
return signalStrength.getAsuLevel();
}

View File

@@ -121,8 +121,8 @@ public class SimStatusDialogControllerTest {
mLifecycle = new Lifecycle(mLifecycleOwner);
mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
doReturn(mServiceState).when(mController).getCurrentServiceState();
doReturn(0).when(mController).getDbm(any());
doReturn(0).when(mController).getAsuLevel(any());
doReturn(0).when(mSignalStrength).getDbm();
doReturn(0).when(mSignalStrength).getAsuLevel();
doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
doReturn("").when(mController).getPhoneNumber();
doReturn(mSignalStrength).when(mController).getSignalStrength();
@@ -136,6 +136,9 @@ public class SimStatusDialogControllerTest {
ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager);
ReflectionHelpers.setField(mController, "mSubscriptionManager", mSubscriptionManager);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle);
when(mPersistableBundle.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL))
.thenReturn(true);
final ShadowPackageManager shadowPackageManager =
Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager());
@@ -228,8 +231,8 @@ public class SimStatusDialogControllerTest {
public void initialize_updateSignalStrengthWith50_shouldUpdateSignalStrengthTo50() {
final int signalDbm = 50;
final int signalAsu = 50;
doReturn(signalDbm).when(mController).getDbm(mSignalStrength);
doReturn(signalAsu).when(mController).getAsuLevel(mSignalStrength);
doReturn(signalDbm).when(mSignalStrength).getDbm();
doReturn(signalAsu).when(mSignalStrength).getAsuLevel();
when(mPersistableBundle.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
@@ -249,8 +252,8 @@ public class SimStatusDialogControllerTest {
final int signalDbm = 50;
final int signalAsu = 50;
doReturn(signalDbm).when(mController).getDbm(mSignalStrength);
doReturn(signalAsu).when(mController).getAsuLevel(mSignalStrength);
doReturn(signalDbm).when(mSignalStrength).getDbm();
doReturn(signalAsu).when(mSignalStrength).getAsuLevel();
when(mPersistableBundle.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
@@ -415,4 +418,11 @@ public class SimStatusDialogControllerTest {
verify(mDialog).removeSettingFromScreen(IMS_REGISTRATION_STATE_LABEL_ID);
verify(mDialog).removeSettingFromScreen(IMS_REGISTRATION_STATE_VALUE_ID);
}
@Test
public void initialize_nullSignalStrength_noCrash() {
doReturn(null).when(mController).getSignalStrength();
// we should not crash when running the following line
mController.initialize();
}
}