Add Extra Exception Checks to Null Cipher Toggle

Adds broad exception safety to all TelephonyManager calls.
Without these extra catch blocks, the entire Settings app would
crash if a TelephonyManager API were to throw an exception.

Bug: 262914591
Test: atest NullAlgorithmsPreferenceControllerTest
Change-Id: I997a37fe71bf007d67989c89b3abe3e520d79d3c
diff --git a/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java b/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java
index c4fdcbd..cfb5344 100644
--- a/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java
+++ b/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java
@@ -69,6 +69,12 @@
         } catch (UnsupportedOperationException e) {
             Log.i(LOG_TAG, "Null cipher enablement is unsupported: " + e.getMessage());
             return UNSUPPORTED_ON_DEVICE;
+        } catch (Exception e) {
+            Log.e(LOG_TAG,
+                    "Failed isNullCipherAndIntegrityEnabled. Setting availability to "
+                            + "CONDITIONALLY_UNAVAILABLE. Exception: "
+                            + e.getMessage());
+            return CONDITIONALLY_UNAVAILABLE;
         }
 
         return AVAILABLE;
@@ -83,7 +89,16 @@
      */
     @Override
     public boolean isChecked() {
-        return mTelephonyManager.isNullCipherAndIntegrityPreferenceEnabled();
+        try {
+            return mTelephonyManager.isNullCipherAndIntegrityPreferenceEnabled();
+        } catch (Exception e) {
+            Log.e(LOG_TAG,
+                    "Failed isNullCipherAndIntegrityEnabled. Defaulting toggle to "
+                            + "checked = true. Exception: "
+                            + e.getMessage());
+        }
+        // The default behavior for this toggle is enabled
+        return true;
     }
 
     /**
@@ -105,7 +120,15 @@
         } else {
             Log.i(LOG_TAG, "Disabling null algorithms");
         }
-        mTelephonyManager.setNullCipherAndIntegrityEnabled(isChecked);
+        try {
+            mTelephonyManager.setNullCipherAndIntegrityEnabled(isChecked);
+        } catch (Exception e) {
+            Log.e(LOG_TAG,
+                    "Failed setNullCipherAndIntegrityEnabled. Setting not updated. Exception: "
+                            + e.getMessage());
+            // The underlying setting was not updated
+            return false;
+        }
         return true;
     }
 }
diff --git a/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java
index e57dfcd..99d0a43 100644
--- a/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java
@@ -21,6 +21,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertFalse;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
@@ -120,6 +121,16 @@
     }
 
     @Test
+    public void getAvailabilityStatus_telephonyManagerException_conditionallyUnavailable() {
+        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_CELLULAR_SECURITY,
+                TelephonyManager.PROPERTY_ENABLE_NULL_CIPHER_TOGGLE, Boolean.TRUE.toString(),
+                false);
+        doThrow(IllegalStateException.class).when(
+                mTelephonyManager).isNullCipherAndIntegrityPreferenceEnabled();
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
     public void getAvailabilityStatus_returnAvailable() {
         DeviceConfig.setProperty(DeviceConfig.NAMESPACE_CELLULAR_SECURITY,
                 TelephonyManager.PROPERTY_ENABLE_NULL_CIPHER_TOGGLE, Boolean.TRUE.toString(),
@@ -141,4 +152,12 @@
         mController.setChecked(false);
         verify(mTelephonyManager, times(1)).setNullCipherAndIntegrityEnabled(false);
     }
+
+    @Test
+    public void setChecked_exceptionThrown() {
+        doThrow(IllegalStateException.class).when(
+                mTelephonyManager).setNullCipherAndIntegrityEnabled(true);
+        assertFalse(mController.setChecked(true));
+        verify(mTelephonyManager, times(1)).setNullCipherAndIntegrityEnabled(true);
+    }
 }