OSDN Git Service

Prevent NullPointerException in SimStatusDialogController
authorAntony Sargent <asargent@google.com>
Tue, 21 May 2019 16:45:26 +0000 (09:45 -0700)
committerAntony Sargent <asargent@google.com>
Tue, 21 May 2019 17:02:10 +0000 (10:02 -0700)
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

src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java
tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java

index c18ec78..3fafd14 100644 (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();
     }
 
index 76c444e..0f39fc9 100644 (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();
+    }
 }