blob: d4fb3f64bf4f68ad10766c362589e3549b8e14bc [file] [log] [blame]
/*
* 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.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.telephony.TelephonyManager;
import com.android.dialer.assisteddialing.AssistedDialingMediator;
import com.android.dialer.assisteddialing.ConcreteCreator;
import com.android.dialer.assisteddialing.CountryCodeProvider;
import com.android.dialer.common.LogUtil;
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;
import java.util.Optional;
/** The setting for Assisted Dialing */
@TargetApi(VERSION_CODES.N)
@SuppressWarnings("AndroidApiChecker") // Java 8 APIs
public class AssistedDialingSettingFragment extends PreferenceFragment {
private CountryCodeProvider countryCodeProvider;
private AssistedDialingMediator assistedDialingMediator;
@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);
assistedDialingMediator =
ConcreteCreator.createNewAssistedDialingMediator(
getContext().getSystemService(TelephonyManager.class), getContext());
countryCodeProvider =
ConcreteCreator.getCountryCodeProvider(ConfigProviderBindings.get(getContext()));
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.assisted_dialing_setting);
SwitchPreference switchPref =
(SwitchPreference)
findPreference(getContext().getString(R.string.assisted_dialing_setting_toggle_key));
ListPreference countryChooserPref =
(ListPreference)
findPreference(getContext().getString(R.string.assisted_dialing_setting_cc_key));
updateCountryChoices(countryChooserPref);
updateCountryChooserSummary(countryChooserPref);
countryChooserPref.setOnPreferenceChangeListener(this::updateListSummary);
switchPref.setOnPreferenceChangeListener(this::logIfUserDisabledFeature);
}
private void updateCountryChooserSummary(ListPreference countryChooserPref) {
String defaultSummaryText = countryChooserPref.getEntries()[0].toString();
if (countryChooserPref.getEntry().equals(defaultSummaryText)) {
Optional<String> userHomeCountryCode = assistedDialingMediator.userHomeCountryCode();
if (userHomeCountryCode.isPresent()) {
CharSequence[] entries = countryChooserPref.getEntries();
try {
CharSequence regionalDisplayName =
entries[countryChooserPref.findIndexOfValue(userHomeCountryCode.get())];
countryChooserPref.setSummary(
getContext()
.getString(
R.string.assisted_dialing_setting_cc_default_summary, regionalDisplayName));
} catch (ArrayIndexOutOfBoundsException e) {
// This might happen if there is a mismatch between the automatically
// detected home country, and the countries currently eligible to select in the settings.
LogUtil.i(
"AssistedDialingSettingFragment.onCreate",
"Failed to find human readable mapping for country code, using default.");
}
}
} else {
countryChooserPref.setSummary(countryChooserPref.getEntry());
}
}
/**
* 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();
listPref.setSummary(entries[listPref.findIndexOfValue(newValue.toString())]);
return true;
}
boolean logIfUserDisabledFeature(Preference pref, Object newValue) {
if (!((boolean) newValue)) {
Logger.get(getActivity().getApplicationContext())
.logImpression(DialerImpression.Type.ASSISTED_DIALING_FEATURE_DISABLED_BY_USER);
}
return true;
}
}