Explicitly disable strict mode during the assisted dialing action.

Dialing is a critical path and there is no opportunity to perform
this action asynchronously.

Starting in P we could leverage the libphonenumber instance
that would live in PhoneGlobals and share that to warm up
the disk reads.

Bug: 70860471
Test: none. Unit tests do not trigger strict mode violations.
PiperOrigin-RevId: 183292426
Change-Id: I607c6af4d725272152f31e619367fdde5ed07302
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index c1ffbd3..2561e28 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -29,6 +29,7 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProvider;
 import com.android.dialer.configprovider.ConfigProviderBindings;
+import com.android.dialer.strictmode.StrictModeUtils;
 
 /**
  * A Creator for AssistedDialingMediators.
@@ -90,8 +91,11 @@
     return new AssistedDialingMediatorImpl(
         new LocationDetector(
             telephonyManager,
-            PreferenceManager.getDefaultSharedPreferences(context)
-                .getString(context.getString(R.string.assisted_dialing_setting_cc_key), null)),
+            StrictModeUtils.bypass(
+                () ->
+                    PreferenceManager.getDefaultSharedPreferences(context)
+                        .getString(
+                            context.getString(R.string.assisted_dialing_setting_cc_key), null))),
         new NumberTransformer(constraints));
   }
 
diff --git a/java/com/android/dialer/assisteddialing/Constraints.java b/java/com/android/dialer/assisteddialing/Constraints.java
index f95312a..788b875 100644
--- a/java/com/android/dialer/assisteddialing/Constraints.java
+++ b/java/com/android/dialer/assisteddialing/Constraints.java
@@ -25,6 +25,7 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
+import com.android.dialer.strictmode.StrictModeUtils;
 import com.google.i18n.phonenumbers.NumberParseException;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
@@ -36,7 +37,7 @@
 @TargetApi(VERSION_CODES.N)
 @SuppressWarnings("AndroidApiChecker") // Use of optional
 final class Constraints {
-  private final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
+  private final PhoneNumberUtil phoneNumberUtil;
   private final Context context;
   private final CountryCodeProvider countryCodeProvider;
 
@@ -56,10 +57,8 @@
       throw new NullPointerException("Provided configProviderCountryCodes cannot be null");
     }
 
-    // We allow dynamic country support only in Dialer; this should be removed in the framework
-    // implementation.
-    // TODO(erfanian): Remove in the framework implementation.
     this.countryCodeProvider = countryCodeProvider;
+    this.phoneNumberUtil = StrictModeUtils.bypass(() -> PhoneNumberUtil.getInstance());
   }
 
   /**
@@ -148,16 +147,18 @@
    */
   private Optional<PhoneNumber> parsePhoneNumber(
       @NonNull String numberToParse, @NonNull String userHomeCountryCode) {
-    try {
-      // TODO(erfanian): confirm behavior of blocking the foreground thread when moving to the
-      // framework
-      return Optional.of(phoneNumberUtil.parseAndKeepRawInput(numberToParse, userHomeCountryCode));
-    } catch (NumberParseException e) {
-      Logger.get(context)
-          .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_PARSING_FAILURE);
-      LogUtil.i("Constraints.parsePhoneNumber", "could not parse the number");
-      return Optional.empty();
-    }
+    return StrictModeUtils.bypass(
+        () -> {
+          try {
+            return Optional.of(
+                phoneNumberUtil.parseAndKeepRawInput(numberToParse, userHomeCountryCode));
+          } catch (NumberParseException e) {
+            Logger.get(context)
+                .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_PARSING_FAILURE);
+            LogUtil.i("Constraints.parsePhoneNumber", "could not parse the number");
+            return Optional.empty();
+          }
+        });
   }
 
   /** Returns a boolean indicating if the provided number is already internationally formatted. */
@@ -195,7 +196,8 @@
 
   /** Returns a boolean indicating if the provided number is considered to be a valid number. */
   private boolean isValidNumber(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
-    boolean result = PhoneNumberUtil.getInstance().isValidNumber(parsedPhoneNumber.get());
+    boolean result =
+        StrictModeUtils.bypass(() -> phoneNumberUtil.isValidNumber(parsedPhoneNumber.get()));
     LogUtil.i("Constraints.isValidNumber", String.valueOf(result));
 
     return result;
diff --git a/java/com/android/dialer/assisteddialing/NumberTransformer.java b/java/com/android/dialer/assisteddialing/NumberTransformer.java
index 0156f2e..8bbad32 100644
--- a/java/com/android/dialer/assisteddialing/NumberTransformer.java
+++ b/java/com/android/dialer/assisteddialing/NumberTransformer.java
@@ -21,6 +21,7 @@
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.strictmode.StrictModeUtils;
 import com.google.i18n.phonenumbers.NumberParseException;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
@@ -29,11 +30,12 @@
 /** Responsible for transforming numbers to make them dialable and valid when roaming. */
 final class NumberTransformer {
 
-  private final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
+  private final PhoneNumberUtil phoneNumberUtil;
   private final Constraints constraints;
 
   public NumberTransformer(Constraints constraints) {
     this.constraints = constraints;
+    this.phoneNumberUtil = StrictModeUtils.bypass(() -> PhoneNumberUtil.getInstance());
   }
 
   /**
@@ -68,16 +70,27 @@
       return Optional.empty();
     }
 
-    PhoneNumber phoneNumber;
-    try {
-      phoneNumber = phoneNumberUtil.parse(numbertoTransform, userHomeCountryCode);
-    } catch (NumberParseException e) {
-      LogUtil.i("NumberTransformer.doAssistedDialingTransformation", "number failed to parse");
+    PhoneNumber phoneNumber =
+        StrictModeUtils.bypass(
+            () -> {
+              try {
+                return phoneNumberUtil.parse(numbertoTransform, userHomeCountryCode);
+              } catch (NumberParseException e) {
+                LogUtil.i(
+                    "NumberTransformer.doAssistedDialingTransformation", "number failed to parse");
+                return null;
+              }
+            });
+
+    if (phoneNumber == null) {
       return Optional.empty();
     }
 
     String transformedNumber =
-        phoneNumberUtil.formatNumberForMobileDialing(phoneNumber, userRoamingCountryCode, true);
+        StrictModeUtils.bypass(
+            () ->
+                phoneNumberUtil.formatNumberForMobileDialing(
+                    phoneNumber, userRoamingCountryCode, true));
 
     // formatNumberForMobileDialing may return an empty String.
     if (TextUtils.isEmpty(transformedNumber)) {