Move country constraint logic into standalone class.

In a subsequent change, the assisted dialing settings
will be able to use the parsing logic to filter
the available countries listed in the settings.

Bug: 69274259
Test: existing tests
PiperOrigin-RevId: 177338864
Change-Id: I8ef76874d5f6d885b415174371225b738cc68716
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index 8067645..1563b35 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -86,9 +86,7 @@
       return new AssistedDialingMediatorStub();
     }
 
-    Constraints constraints =
-        new Constraints(
-            context, configProvider.getString("assisted_dialing_csv_country_codes", ""));
+    Constraints constraints = new Constraints(context, getCountryCodeProvider(configProvider));
     return new AssistedDialingMediatorImpl(
         new LocationDetector(
             telephonyManager,
@@ -108,4 +106,16 @@
             && Build.VERSION.SDK_INT <= BUILD_CODE_CEILING)
         && configProvider.getBoolean("assisted_dialing_enabled", false);
   }
+
+  /**
+   * Returns a CountryCodeProvider responsible for providing countries eligible for assisted Dialing
+   */
+  public static CountryCodeProvider getCountryCodeProvider(ConfigProvider configProvider) {
+    if (configProvider == null) {
+      LogUtil.i("ConcreteCreator.getCountryCodeProvider", "provided configProvider was null");
+      throw new NullPointerException("Provided configProvider was null");
+    }
+
+    return new CountryCodeProvider(configProvider);
+  }
 }
diff --git a/java/com/android/dialer/assisteddialing/Constraints.java b/java/com/android/dialer/assisteddialing/Constraints.java
index 3766a6d..f95312a 100644
--- a/java/com/android/dialer/assisteddialing/Constraints.java
+++ b/java/com/android/dialer/assisteddialing/Constraints.java
@@ -20,10 +20,8 @@
 import android.content.Context;
 import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
-import android.util.ArraySet;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
@@ -31,14 +29,8 @@
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
 import java.util.Locale;
 import java.util.Optional;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.stream.Collectors;
 
 /** Ensures that a number is eligible for Assisted Dialing */
 @TargetApi(VERSION_CODES.N)
@@ -46,19 +38,7 @@
 final class Constraints {
   private final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
   private final Context context;
-
-  // TODO(erfanian): Ensure the below standard is consistent between libphonenumber and the
-  // platform.
-  // ISO 3166-1 alpha-2 Country Codes that are eligible for assisted dialing.
-  private static final List<String> DEFAULT_COUNTRY_CODES =
-      Arrays.asList(
-          "CA" /* Canada */,
-          "GB" /* United Kingdom */,
-          "JP" /* Japan */,
-          "MX" /* Mexico */,
-          "US" /* United States */);
-
-  @VisibleForTesting final Set<String> supportedCountryCodes;
+  private final CountryCodeProvider countryCodeProvider;
 
   /**
    * Create a new instance of Constraints.
@@ -66,65 +46,20 @@
    * @param context The context used to determine whether or not a number is an emergency number.
    * @param configProviderCountryCodes A csv of supported country codes, e.g. "US,CA"
    */
-  public Constraints(@NonNull Context context, @NonNull String configProviderCountryCodes) {
+  public Constraints(@NonNull Context context, @NonNull CountryCodeProvider countryCodeProvider) {
     if (context == null) {
       throw new NullPointerException("Provided context cannot be null");
     }
     this.context = context;
 
-    if (configProviderCountryCodes == null) {
+    if (countryCodeProvider == null) {
       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, or add a service to provide these
-    // values to the framework.
-    supportedCountryCodes =
-        parseConfigProviderCountryCodes(configProviderCountryCodes)
-            .stream()
-            .map(v -> v.toUpperCase(Locale.US))
-            .collect(Collectors.toCollection(ArraySet::new));
-    LogUtil.i("Constraints.Constraints", "Using country codes: " + supportedCountryCodes);
-  }
-
-  private List<String> parseConfigProviderCountryCodes(String configProviderCountryCodes) {
-    if (TextUtils.isEmpty(configProviderCountryCodes)) {
-      LogUtil.i(
-          "Constraints.parseConfigProviderCountryCodes",
-          "configProviderCountryCodes was empty, returning default");
-      return DEFAULT_COUNTRY_CODES;
-    }
-
-    StringTokenizer tokenizer = new StringTokenizer(configProviderCountryCodes, ",");
-
-    if (tokenizer.countTokens() < 1) {
-      LogUtil.i(
-          "Constraints.parseConfigProviderCountryCodes", "insufficient provided country codes");
-      return DEFAULT_COUNTRY_CODES;
-    }
-
-    List<String> parsedCountryCodes = new ArrayList<>();
-    while (tokenizer.hasMoreTokens()) {
-      String foundLocale = tokenizer.nextToken();
-      if (foundLocale == null) {
-        LogUtil.i(
-            "Constraints.parseConfigProviderCountryCodes",
-            "Unexpected empty value, returning default.");
-        return DEFAULT_COUNTRY_CODES;
-      }
-
-      if (foundLocale.length() != 2) {
-        LogUtil.i(
-            "Constraints.parseConfigProviderCountryCodes",
-            "Unexpected locale %s, returning default",
-            foundLocale);
-        return DEFAULT_COUNTRY_CODES;
-      }
-
-      parsedCountryCodes.add(foundLocale);
-    }
-    return parsedCountryCodes;
+    // TODO(erfanian): Remove in the framework implementation.
+    this.countryCodeProvider = countryCodeProvider;
   }
 
   /**
@@ -201,8 +136,8 @@
     }
 
     boolean result =
-        supportedCountryCodes.contains(userHomeCountryCode)
-            && supportedCountryCodes.contains(userRoamingCountryCode);
+        countryCodeProvider.isSupportedCountryCode(userHomeCountryCode)
+            && countryCodeProvider.isSupportedCountryCode(userRoamingCountryCode);
     LogUtil.i("Constraints.areSupportedCountryCodes", String.valueOf(result));
     return result;
   }
diff --git a/java/com/android/dialer/assisteddialing/CountryCodeProvider.java b/java/com/android/dialer/assisteddialing/CountryCodeProvider.java
new file mode 100644
index 0000000..b12b3dd
--- /dev/null
+++ b/java/com/android/dialer/assisteddialing/CountryCodeProvider.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.assisteddialing;
+
+import android.annotation.TargetApi;
+import android.os.Build.VERSION_CODES;
+import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.configprovider.ConfigProvider;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.stream.Collectors;
+
+/** A class to provide the appropriate country codes related to assisted dialing. */
+@TargetApi(VERSION_CODES.N)
+@SuppressWarnings("AndroidApiChecker") // Java 8 APIs
+final class CountryCodeProvider {
+
+  // TODO(erfanian): Ensure the below standard is consistent between libphonenumber and the
+  // platform.
+  // ISO 3166-1 alpha-2 Country Codes that are eligible for assisted dialing.
+  @VisibleForTesting
+  static final List<String> DEFAULT_COUNTRY_CODES =
+      Arrays.asList(
+          "CA" /* Canada */,
+          "GB" /* United Kingdom */,
+          "JP" /* Japan */,
+          "MX" /* Mexico */,
+          "US" /* United States */);
+
+  private final Set<String> supportedCountryCodes;
+
+  CountryCodeProvider(ConfigProvider configProvider) {
+    supportedCountryCodes =
+        parseConfigProviderCountryCodes(
+                configProvider.getString("assisted_dialing_csv_country_codes", ""))
+            .stream()
+            .map(v -> v.toUpperCase(Locale.US))
+            .collect(Collectors.toCollection(ArraySet::new));
+    LogUtil.i(
+        "CountryCodeProvider.CountryCodeProvider", "Using country codes: " + supportedCountryCodes);
+  }
+
+  /** Checks whether a supplied country code is supported. */
+  public boolean isSupportedCountryCode(String countryCode) {
+    return supportedCountryCodes.contains(countryCode);
+  }
+
+  private List<String> parseConfigProviderCountryCodes(String configProviderCountryCodes) {
+    if (TextUtils.isEmpty(configProviderCountryCodes)) {
+      LogUtil.i(
+          "Constraints.parseConfigProviderCountryCodes",
+          "configProviderCountryCodes was empty, returning default");
+      return DEFAULT_COUNTRY_CODES;
+    }
+
+    StringTokenizer tokenizer = new StringTokenizer(configProviderCountryCodes, ",");
+
+    if (tokenizer.countTokens() < 1) {
+      LogUtil.i(
+          "Constraints.parseConfigProviderCountryCodes", "insufficient provided country codes");
+      return DEFAULT_COUNTRY_CODES;
+    }
+
+    List<String> parsedCountryCodes = new ArrayList<>();
+    while (tokenizer.hasMoreTokens()) {
+      String foundLocale = tokenizer.nextToken();
+      if (foundLocale == null) {
+        LogUtil.i(
+            "Constraints.parseConfigProviderCountryCodes",
+            "Unexpected empty value, returning default.");
+        return DEFAULT_COUNTRY_CODES;
+      }
+
+      if (foundLocale.length() != 2) {
+        LogUtil.i(
+            "Constraints.parseConfigProviderCountryCodes",
+            "Unexpected locale %s, returning default",
+            foundLocale);
+        return DEFAULT_COUNTRY_CODES;
+      }
+
+      parsedCountryCodes.add(foundLocale);
+    }
+    return parsedCountryCodes;
+  }
+}