Merge "Handle invalid PhoneAccountHandle for CarrierIdentifier"
diff --git a/java/com/android/voicemail/impl/CarrierIdentifier.java b/java/com/android/voicemail/impl/CarrierIdentifier.java
index 82b6a24..76576e7 100644
--- a/java/com/android/voicemail/impl/CarrierIdentifier.java
+++ b/java/com/android/voicemail/impl/CarrierIdentifier.java
@@ -19,14 +19,16 @@
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.os.Build.VERSION_CODES;
+import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import com.google.auto.value.AutoValue;
+import java.util.Optional;
 
 /** Identifies a carrier. */
 @AutoValue
 @TargetApi(VERSION_CODES.O)
-@SuppressWarnings("missingpermission")
+@SuppressWarnings({"missingpermission", "AndroidApiChecker"})
 public abstract class CarrierIdentifier {
 
   public abstract String mccMnc();
@@ -52,20 +54,25 @@
     return new AutoValue_CarrierIdentifier.Builder().setGid1("");
   }
 
-  public static CarrierIdentifier forHandle(
-      Context context, PhoneAccountHandle phoneAccountHandle) {
+  /** Create a identifier for a {@link PhoneAccountHandle}. Absent if the handle is not valid. */
+  public static Optional<CarrierIdentifier> forHandle(
+      Context context, @Nullable PhoneAccountHandle phoneAccountHandle) {
+    if (phoneAccountHandle == null) {
+      return Optional.empty();
+    }
     TelephonyManager telephonyManager =
         context
             .getSystemService(TelephonyManager.class)
             .createForPhoneAccountHandle(phoneAccountHandle);
     if (telephonyManager == null) {
-      throw new IllegalArgumentException("Invalid PhoneAccountHandle");
+      return Optional.empty();
     }
     String gid1 = telephonyManager.getGroupIdLevel1();
     if (gid1 == null) {
       gid1 = "";
     }
 
-    return builder().setMccMnc(telephonyManager.getSimOperator()).setGid1(gid1).build();
+    return Optional.of(
+        builder().setMccMnc(telephonyManager.getSimOperator()).setGid1(gid1).build());
   }
 }
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index b56f792..4c4df27 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -39,6 +39,7 @@
 import com.android.voicemail.impl.sms.StatusMessage;
 import com.android.voicemail.impl.sync.VvmAccountManager;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -55,7 +56,7 @@
  * <p>TODO(twyen): refactor this to an interface.
  */
 @TargetApi(VERSION_CODES.O)
-@SuppressWarnings("missingpermission")
+@SuppressWarnings({"missingpermission", "AndroidApiChecker"})
 public class OmtpVvmCarrierConfigHelper {
 
   private static final String TAG = "OmtpVvmCarrierCfgHlpr";
@@ -105,25 +106,25 @@
   public OmtpVvmCarrierConfigHelper(Context context, @Nullable PhoneAccountHandle handle) {
     this.context = context;
     phoneAccountHandle = handle;
-    TelephonyManager telephonyManager =
-        context
-            .getSystemService(TelephonyManager.class)
-            .createForPhoneAccountHandle(phoneAccountHandle);
-    if (telephonyManager == null) {
-      VvmLog.e(TAG, "PhoneAccountHandle is invalid");
-      carrierConfig = null;
-      telephonyConfig = null;
-      overrideConfig = null;
-      vvmType = null;
-      protocol = null;
-      return;
-    }
-
     if (overrideConfigForTest != null) {
       overrideConfig = overrideConfigForTest;
       carrierConfig = new PersistableBundle();
       telephonyConfig = new PersistableBundle();
     } else {
+      Optional<CarrierIdentifier> carrierIdentifier = CarrierIdentifier.forHandle(context, handle);
+      TelephonyManager telephonyManager =
+          context
+              .getSystemService(TelephonyManager.class)
+              .createForPhoneAccountHandle(phoneAccountHandle);
+      if (telephonyManager == null || !carrierIdentifier.isPresent()) {
+        VvmLog.e(TAG, "PhoneAccountHandle is invalid");
+        carrierConfig = null;
+        telephonyConfig = null;
+        overrideConfig = null;
+        vvmType = null;
+        protocol = null;
+        return;
+      }
       if (ConfigOverrideFragment.isOverridden(context)) {
         overrideConfig = ConfigOverrideFragment.getConfig(context);
         VvmLog.w(TAG, "Config override is activated: " + overrideConfig);
@@ -132,9 +133,7 @@
       }
 
       carrierConfig = getCarrierConfig(telephonyManager);
-      telephonyConfig =
-          new DialerVvmConfigManager(context)
-              .getConfig(CarrierIdentifier.forHandle(context, phoneAccountHandle));
+      telephonyConfig = new DialerVvmConfigManager(context).getConfig(carrierIdentifier.get());
     }
 
     vvmType = getVvmType();