diff options
author | erfanian <erfanian@google.com> | 2017-12-04 15:50:59 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2017-12-04 15:52:03 -0800 |
commit | 7658f34ae01715d496573bf7e29e748cb5459f69 (patch) | |
tree | da3e26b8b0f06771ddd3a36b61716d12a2dbb8b6 | |
parent | 9ffe71da47f4623e227102ca5fe231f280c6d32e (diff) |
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
8 files changed, 123 insertions, 9 deletions
diff --git a/java/com/android/dialer/assisteddialing/AndroidManifest.xml b/java/com/android/dialer/assisteddialing/AndroidManifest.xml new file mode 100644 index 000000000..6625dff07 --- /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 8a5661e03..73817d7fc 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.NonNull; 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 b12b3ddc0..118696e9b 100644 --- a/java/com/android/dialer/assisteddialing/CountryCodeProvider.java +++ b/java/com/android/dialer/assisteddialing/CountryCodeProvider.java @@ -34,7 +34,7 @@ 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 { +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 000000000..f9cb123e0 --- /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 6625dff07..724874750 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 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<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 1dc778f59..3a81780a9 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 c86e276ef..ce425a90f 100644 --- a/packages.mk +++ b/packages.mk @@ -8,6 +8,7 @@ LOCAL_AAPT_FLAGS := \ 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 \ |