Add filtration logic to Assisted Dialing Settings.
The filtration logic will only show countries
in the country picker if the feature is enabled
for those countries.
This will not cover the regressive case where
a user has already selected a default option,
but then the option is later removed. This
behavior is currently undefined.
Bug: 69274259
Test: unit tests
PiperOrigin-RevId: 177881199
Change-Id: I113f6d25249c42c1bd98383fd6ee0bc6a8c0e615
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 \