From 5c46d93bd8121e5681beaef0b6344471dde6980b Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Tue, 21 May 2019 09:45:26 -0700 Subject: [PATCH] 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 --- .../simstatus/SimStatusDialogController.java | 9 ++++---- .../SimStatusDialogControllerTest.java | 22 ++++++++++++++----- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java index c18ec787b91..3fafd14f625 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java @@ -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(); } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java index 76c444e2c1a..0f39fc9a520 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java @@ -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(); + } }