Merge "Add filtration logic to Assisted Dialing Settings."
diff --git a/java/com/android/dialer/assisteddialing/AndroidManifest.xml b/java/com/android/dialer/assisteddialing/AndroidManifest.xml
new file mode 100644
index 0000000..6625dff
--- /dev/null
+++ b/java/com/android/dialer/assisteddialing/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<!-- 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.dialer.assisteddialing">
+
+  <uses-sdk
+      android:minSdkVersion="23"
+      android:targetSdkVersion="24"/>
+
+</manifest>
\ No newline at end of file
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index 8a5661e..73817d7 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -25,7 +25,6 @@
 import android.support.annotation.VisibleForTesting;
 import android.support.v4.os.UserManagerCompat;
 import android.telephony.TelephonyManager;
-import com.android.dialer.assisteddialing.ui.R;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProvider;
 import com.android.dialer.configprovider.ConfigProviderBindings;
diff --git a/java/com/android/dialer/assisteddialing/CountryCodeProvider.java b/java/com/android/dialer/assisteddialing/CountryCodeProvider.java
index b12b3dd..118696e 100644
--- a/java/com/android/dialer/assisteddialing/CountryCodeProvider.java
+++ b/java/com/android/dialer/assisteddialing/CountryCodeProvider.java
@@ -34,7 +34,7 @@
 /** A class to provide the appropriate country codes related to assisted dialing. */
 @TargetApi(VERSION_CODES.N)
 @SuppressWarnings("AndroidApiChecker") // Java 8 APIs
-final class CountryCodeProvider {
+public final class CountryCodeProvider {
 
   // TODO(erfanian): Ensure the below standard is consistent between libphonenumber and the
   // platform.
diff --git a/java/com/android/dialer/assisteddialing/res/values/strings.xml b/java/com/android/dialer/assisteddialing/res/values/strings.xml
new file mode 100644
index 0000000..f9cb123
--- /dev/null
+++ b/java/com/android/dialer/assisteddialing/res/values/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<resources>
+  <!-- Key for the assisted dialing setting toggle-->
+  <string name="assisted_dialing_setting_toggle_key" translatable="false">assisted_dialing_setting_toggle_key</string>
+
+  <!-- Key for the assisted dialing home country setting-->
+  <string name="assisted_dialing_setting_cc_key" translatable="false">assisted_dialing_setting_cc_key</string>
+</resources>
\ No newline at end of file
diff --git a/java/com/android/dialer/assisteddialing/ui/AndroidManifest.xml b/java/com/android/dialer/assisteddialing/ui/AndroidManifest.xml
index 6625dff..7248747 100644
--- a/java/com/android/dialer/assisteddialing/ui/AndroidManifest.xml
+++ b/java/com/android/dialer/assisteddialing/ui/AndroidManifest.xml
@@ -13,7 +13,7 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.dialer.assisteddialing">
+    package="com.android.dialer.assisteddialing.ui">
 
   <uses-sdk
       android:minSdkVersion="23"
diff --git a/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java b/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java
index 05ca6d9..0341894 100644
--- a/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java
+++ b/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java
@@ -15,22 +15,53 @@
  */
 package com.android.dialer.assisteddialing.ui;
 
+import android.annotation.TargetApi;
+import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.SwitchPreference;
 import android.text.TextUtils;
+import com.android.dialer.assisteddialing.ConcreteCreator;
+import com.android.dialer.assisteddialing.CountryCodeProvider;
+import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
+import com.google.auto.value.AutoValue;
+import java.util.ArrayList;
+import java.util.List;
 
 /** The setting for Assisted Dialing */
+@TargetApi(VERSION_CODES.N)
+@SuppressWarnings("AndroidApiChecker") // Java 8 APIs
 public class AssistedDialingSettingFragment extends PreferenceFragment {
 
+  private CountryCodeProvider countryCodeProvider;
+
+  @AutoValue
+  abstract static class DisplayNameAndCountryCodeTuple {
+
+    static DisplayNameAndCountryCodeTuple create(
+        CharSequence countryDisplayName, CharSequence countryCode) {
+      return new AutoValue_AssistedDialingSettingFragment_DisplayNameAndCountryCodeTuple(
+          countryDisplayName, countryCode);
+    }
+
+    // The user-readable name of the country.
+    abstract CharSequence countryDisplayname();
+
+    // The ISO 3166-2 country code of the country.
+    abstract CharSequence countryCode();
+  }
+
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
 
+    countryCodeProvider =
+        ConcreteCreator.getCountryCodeProvider(ConfigProviderBindings.get(getContext()));
+
     // Load the preferences from an XML resource
     addPreferencesFromResource(R.xml.assisted_dialing_setting);
     SwitchPreference switchPref =
@@ -41,6 +72,8 @@
         (ListPreference)
             findPreference(getContext().getString(R.string.assisted_dialing_setting_cc_key));
 
+    updateCountryChoices(countryChooserPref);
+
     if (!TextUtils.isEmpty(countryChooserPref.getEntry())) {
       countryChooserPref.setSummary(countryChooserPref.getEntry());
     }
@@ -48,6 +81,49 @@
     switchPref.setOnPreferenceChangeListener(this::logIfUserDisabledFeature);
   }
 
+  /**
+   * Filters the default entries in the country chooser by only showing those countries in which the
+   * feature in enabled.
+   */
+  private void updateCountryChoices(ListPreference countryChooserPref) {
+
+    List<DisplayNameAndCountryCodeTuple> defaultCountryChoices =
+        buildDefaultCountryChooserKeysAndValues(countryChooserPref);
+
+    // Always include the default preference.
+    List<CharSequence> newKeys = new ArrayList<>();
+    List<CharSequence> newValues = new ArrayList<>();
+    newKeys.add(countryChooserPref.getEntries()[0]);
+    newValues.add(countryChooserPref.getEntryValues()[0]);
+
+    for (DisplayNameAndCountryCodeTuple tuple : defaultCountryChoices) {
+      if (countryCodeProvider.isSupportedCountryCode(tuple.countryCode().toString())) {
+        newKeys.add(tuple.countryDisplayname());
+        newValues.add(tuple.countryCode());
+      }
+    }
+
+    countryChooserPref.setEntries(newKeys.toArray(new CharSequence[newKeys.size()]));
+    countryChooserPref.setEntryValues(newValues.toArray(new CharSequence[newValues.size()]));
+  }
+
+  private List<DisplayNameAndCountryCodeTuple> buildDefaultCountryChooserKeysAndValues(
+      ListPreference countryChooserPref) {
+    CharSequence[] keys = countryChooserPref.getEntries();
+    CharSequence[] values = countryChooserPref.getEntryValues();
+
+    if (keys.length != values.length) {
+      throw new IllegalStateException("Unexpected mismatch in country chooser key/value size");
+    }
+
+    List<DisplayNameAndCountryCodeTuple> displayNamesandCountryCodes = new ArrayList<>();
+    for (int i = 0; i < keys.length; i++) {
+      displayNamesandCountryCodes.add(DisplayNameAndCountryCodeTuple.create(keys[i], values[i]));
+    }
+
+    return displayNamesandCountryCodes;
+  }
+
   boolean updateListSummary(Preference pref, Object newValue) {
     ListPreference listPref = (ListPreference) pref;
     CharSequence[] entries = listPref.getEntries();
diff --git a/java/com/android/dialer/assisteddialing/ui/res/values/strings.xml b/java/com/android/dialer/assisteddialing/ui/res/values/strings.xml
index 1dc778f..3a81780 100644
--- a/java/com/android/dialer/assisteddialing/ui/res/values/strings.xml
+++ b/java/com/android/dialer/assisteddialing/ui/res/values/strings.xml
@@ -22,12 +22,6 @@
   <!-- Label for a setting enabling assisted dialing switch preference-->
   <string name="assisted_dialing_setting_summary">Predict and add a country code when you call while traveling abroad</string>
 
-  <!-- Key for the assisted dialing setting toggle-->
-  <string name="assisted_dialing_setting_toggle_key" translatable="false">assisted_dialing_setting_toggle_key</string>
-
-  <!-- Key for the assisted dialing home country setting-->
-  <string name="assisted_dialing_setting_cc_key" translatable="false">assisted_dialing_setting_cc_key</string>
-
   <!-- Indicates the default state for the home country selector-->
   <string name="assisted_dialing_setting_cc_default_summary">Automatically detected</string>
 
diff --git a/packages.mk b/packages.mk
index c86e276..ce425a9 100644
--- a/packages.mk
+++ b/packages.mk
@@ -8,6 +8,7 @@
 	com.android.dialer.app \
 	com.android.dialer.app.manifests.activities \
 	com.android.dialer.app.voicemail.error \
+	com.android.dialer.assisteddialing \
 	com.android.dialer.assisteddialing.ui \
 	com.android.dialer.backup \
 	com.android.dialer.binary.aosp.testing \