From 7658f34ae01715d496573bf7e29e748cb5459f69 Mon Sep 17 00:00:00 2001 From: erfanian Date: Mon, 4 Dec 2017 15:50:59 -0800 Subject: 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 --- .../ui/AssistedDialingSettingFragment.java | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) (limited to 'java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java') diff --git a/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java b/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java index 05ca6d912..03418940a 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 @@ public class AssistedDialingSettingFragment extends PreferenceFragment { (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 @@ public class AssistedDialingSettingFragment extends PreferenceFragment { 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 defaultCountryChoices = + buildDefaultCountryChooserKeysAndValues(countryChooserPref); + + // Always include the default preference. + List newKeys = new ArrayList<>(); + List 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 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 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(); -- cgit v1.2.3