diff options
Diffstat (limited to 'java/com/android/dialer/app/settings')
-rw-r--r-- | java/com/android/dialer/app/settings/DialerSettingsActivity.java | 61 | ||||
-rw-r--r-- | java/com/android/dialer/app/settings/PhoneAccountSelectionFragment.java | 126 |
2 files changed, 175 insertions, 12 deletions
diff --git a/java/com/android/dialer/app/settings/DialerSettingsActivity.java b/java/com/android/dialer/app/settings/DialerSettingsActivity.java index ff3841aa1..fae5ff3ee 100644 --- a/java/com/android/dialer/app/settings/DialerSettingsActivity.java +++ b/java/com/android/dialer/app/settings/DialerSettingsActivity.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.os.UserManager; import android.preference.PreferenceManager; import android.provider.Settings; +import android.support.annotation.Nullable; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; @@ -151,21 +152,57 @@ public class DialerSettingsActivity extends AppCompatPreferenceActivity { return; } - PhoneAccountHandle phoneAccountHandle = - getSystemService(TelecomManager.class) - .getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL); - if (phoneAccountHandle == null) { - LogUtil.e("DialerSettingsActivity.addVoicemailSettings", "phoneAccountHandle is null"); - return; - } LogUtil.i("DialerSettingsActivity.addVoicemailSettings", "adding voicemail settings"); Header voicemailSettings = new Header(); voicemailSettings.titleRes = R.string.voicemail_settings_label; - voicemailSettings.fragment = voicemailSettingsFragment; - Bundle bundle = new Bundle(); - bundle.putParcelable(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); - voicemailSettings.fragmentArguments = bundle; - target.add(voicemailSettings); + PhoneAccountHandle soleAccount = getSoleSimAccount(); + if (soleAccount == null) { + LogUtil.i( + "DialerSettingsActivity.addVoicemailSettings", "showing multi-SIM voicemail settings"); + voicemailSettings.fragment = PhoneAccountSelectionFragment.class.getName(); + Bundle bundle = new Bundle(); + bundle.putString( + PhoneAccountSelectionFragment.PARAM_TARGET_FRAGMENT, voicemailSettingsFragment); + bundle.putString( + PhoneAccountSelectionFragment.PARAM_PHONE_ACCOUNT_HANDLE_KEY, + VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE); + bundle.putBundle(PhoneAccountSelectionFragment.PARAM_ARGUMENTS, new Bundle()); + bundle.putInt( + PhoneAccountSelectionFragment.PARAM_TARGET_TITLE_RES, R.string.voicemail_settings_label); + voicemailSettings.fragmentArguments = bundle; + target.add(voicemailSettings); + } else { + LogUtil.i( + "DialerSettingsActivity.addVoicemailSettings", "showing single-SIM voicemail settings"); + voicemailSettings.fragment = voicemailSettingsFragment; + Bundle bundle = new Bundle(); + bundle.putParcelable(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE, soleAccount); + voicemailSettings.fragmentArguments = bundle; + target.add(voicemailSettings); + } + } + + /** + * @return the only SIM phone account, or {@code null} if there are none or more than one. Note: + * having a empty SIM slot still count as a PhoneAccountHandle that is "invalid", and + * voicemail settings should still be available for it. + */ + @Nullable + private PhoneAccountHandle getSoleSimAccount() { + TelecomManager telecomManager = getSystemService(TelecomManager.class); + PhoneAccountHandle result = null; + for (PhoneAccountHandle phoneAccountHandle : telecomManager.getCallCapablePhoneAccounts()) { + PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle); + if (phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) { + LogUtil.i( + "DialerSettingsActivity.getSoleSimAccount", phoneAccountHandle + " is a SIM account"); + if (result != null) { + return null; + } + result = phoneAccountHandle; + } + } + return result; } /** diff --git a/java/com/android/dialer/app/settings/PhoneAccountSelectionFragment.java b/java/com/android/dialer/app/settings/PhoneAccountSelectionFragment.java new file mode 100644 index 000000000..8fd276724 --- /dev/null +++ b/java/com/android/dialer/app/settings/PhoneAccountSelectionFragment.java @@ -0,0 +1,126 @@ +/* + * 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.app.settings; + +import android.app.Fragment; +import android.content.Context; +import android.graphics.drawable.Icon; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; +import android.preference.PreferenceScreen; +import android.support.annotation.VisibleForTesting; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import java.util.List; + +/** + * Preference screen that lists SIM phone accounts to select from, and forwards the selected account + * to {@link #PARAM_TARGET_FRAGMENT}. Can only be used in a {@link PreferenceActivity} + */ +public class PhoneAccountSelectionFragment extends PreferenceFragment { + + /** The {@link PreferenceFragment} to launch after the account is selected. */ + public static final String PARAM_TARGET_FRAGMENT = "target_fragment"; + + /** + * The arguments bundle to pass to the {@link #PARAM_TARGET_FRAGMENT} + * + * @see Fragment#getArguments() + */ + public static final String PARAM_ARGUMENTS = "arguments"; + + /** + * The key to insert the selected {@link PhoneAccountHandle} to bundle in {@link #PARAM_ARGUMENTS} + */ + public static final String PARAM_PHONE_ACCOUNT_HANDLE_KEY = "phone_account_handle_key"; + + /** + * The title of the {@link #PARAM_TARGET_FRAGMENT} once it is launched with {@link + * PreferenceActivity#startWithFragment(String, Bundle, Fragment, int)}, as a string resource ID. + */ + public static final String PARAM_TARGET_TITLE_RES = "target_title_res"; + + private String targetFragment; + private Bundle arguments; + private String phoneAccountHandleKey; + private int titleRes; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + targetFragment = getArguments().getString(PARAM_TARGET_FRAGMENT); + arguments = new Bundle(); + arguments.putAll(getArguments().getBundle(PARAM_ARGUMENTS)); + phoneAccountHandleKey = getArguments().getString(PARAM_PHONE_ACCOUNT_HANDLE_KEY); + titleRes = getArguments().getInt(PARAM_TARGET_TITLE_RES, 0); + } + + final class AccountPreference extends Preference { + private final PhoneAccountHandle phoneAccountHandle; + + public AccountPreference( + Context context, PhoneAccountHandle phoneAccountHandle, PhoneAccount phoneAccount) { + super(context); + this.phoneAccountHandle = phoneAccountHandle; + setTitle(phoneAccount.getLabel()); + setSummary(phoneAccount.getShortDescription()); + Icon icon = phoneAccount.getIcon(); + if (icon != null) { + setIcon(icon.loadDrawable(context)); + } + } + + @VisibleForTesting + void click() { + onClick(); + } + + @Override + protected void onClick() { + super.onClick(); + PreferenceActivity preferenceActivity = (PreferenceActivity) getActivity(); + arguments.putParcelable(phoneAccountHandleKey, phoneAccountHandle); + preferenceActivity.startWithFragment(targetFragment, arguments, null, 0, titleRes, 0); + } + } + + @Override + public void onResume() { + super.onResume(); + setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); + PreferenceScreen screen = getPreferenceScreen(); + + TelecomManager telecomManager = getContext().getSystemService(TelecomManager.class); + + List<PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts(); + + Context context = getActivity(); + for (PhoneAccountHandle handle : accountHandles) { + PhoneAccount account = telecomManager.getPhoneAccount(handle); + if (account != null) { + final boolean isSimAccount = + 0 != (account.getCapabilities() & PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION); + if (isSimAccount) { + screen.addPreference(new AccountPreference(context, handle, account)); + } + } + } + } +} |