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

View File

@@ -121,8 +121,8 @@ public class SimStatusDialogControllerTest {
mLifecycle = new Lifecycle(mLifecycleOwner); mLifecycle = new Lifecycle(mLifecycleOwner);
mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */)); mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */));
doReturn(mServiceState).when(mController).getCurrentServiceState(); doReturn(mServiceState).when(mController).getCurrentServiceState();
doReturn(0).when(mController).getDbm(any()); doReturn(0).when(mSignalStrength).getDbm();
doReturn(0).when(mController).getAsuLevel(any()); doReturn(0).when(mSignalStrength).getAsuLevel();
doReturn(mPhoneStateListener).when(mController).getPhoneStateListener(); doReturn(mPhoneStateListener).when(mController).getPhoneStateListener();
doReturn("").when(mController).getPhoneNumber(); doReturn("").when(mController).getPhoneNumber();
doReturn(mSignalStrength).when(mController).getSignalStrength(); doReturn(mSignalStrength).when(mController).getSignalStrength();
@@ -136,6 +136,9 @@ public class SimStatusDialogControllerTest {
ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager); ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager);
ReflectionHelpers.setField(mController, "mSubscriptionManager", mSubscriptionManager); ReflectionHelpers.setField(mController, "mSubscriptionManager", mSubscriptionManager);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle); when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle);
when(mPersistableBundle.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL))
.thenReturn(true);
final ShadowPackageManager shadowPackageManager = final ShadowPackageManager shadowPackageManager =
Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()); Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager());
@@ -228,8 +231,8 @@ public class SimStatusDialogControllerTest {
public void initialize_updateSignalStrengthWith50_shouldUpdateSignalStrengthTo50() { public void initialize_updateSignalStrengthWith50_shouldUpdateSignalStrengthTo50() {
final int signalDbm = 50; final int signalDbm = 50;
final int signalAsu = 50; final int signalAsu = 50;
doReturn(signalDbm).when(mController).getDbm(mSignalStrength); doReturn(signalDbm).when(mSignalStrength).getDbm();
doReturn(signalAsu).when(mController).getAsuLevel(mSignalStrength); doReturn(signalAsu).when(mSignalStrength).getAsuLevel();
when(mPersistableBundle.getBoolean( when(mPersistableBundle.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true); CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true);
@@ -249,8 +252,8 @@ public class SimStatusDialogControllerTest {
final int signalDbm = 50; final int signalDbm = 50;
final int signalAsu = 50; final int signalAsu = 50;
doReturn(signalDbm).when(mController).getDbm(mSignalStrength); doReturn(signalDbm).when(mSignalStrength).getDbm();
doReturn(signalAsu).when(mController).getAsuLevel(mSignalStrength); doReturn(signalAsu).when(mSignalStrength).getAsuLevel();
when(mPersistableBundle.getBoolean( when(mPersistableBundle.getBoolean(
CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true); 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_LABEL_ID);
verify(mDialog).removeSettingFromScreen(IMS_REGISTRATION_STATE_VALUE_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();
}
} }