110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian/* 210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Copyright (C) 2017 The Android Open Source Project 310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * 410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * you may not use this file except in compliance with the License. 610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * You may obtain a copy of the License at 710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * 810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * 1010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Unless required by applicable law or agreed to in writing, software 1110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 1210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * See the License for the specific language governing permissions and 1410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * limitations under the License 1510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */ 1610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 1710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianpackage com.android.dialer.app.settings; 1810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 1910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.app.Fragment; 2010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.content.Context; 2110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.graphics.drawable.Icon; 2210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.os.Bundle; 2310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.Preference; 2410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.PreferenceActivity; 2510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.PreferenceFragment; 2610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.preference.PreferenceScreen; 2710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.support.annotation.VisibleForTesting; 2810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.telecom.PhoneAccount; 2910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.telecom.PhoneAccountHandle; 3010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport android.telecom.TelecomManager; 3110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianimport java.util.List; 3210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 3310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian/** 3410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * Preference screen that lists SIM phone accounts to select from, and forwards the selected account 3510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * to {@link #PARAM_TARGET_FRAGMENT}. Can only be used in a {@link PreferenceActivity} 3610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */ 3710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanianpublic class PhoneAccountSelectionFragment extends PreferenceFragment { 3810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 3910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian /** The {@link PreferenceFragment} to launch after the account is selected. */ 4010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public static final String PARAM_TARGET_FRAGMENT = "target_fragment"; 4110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 4210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian /** 4310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * The arguments bundle to pass to the {@link #PARAM_TARGET_FRAGMENT} 4410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * 4510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * @see Fragment#getArguments() 4610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */ 4710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public static final String PARAM_ARGUMENTS = "arguments"; 4810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 4910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian /** 5010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * The key to insert the selected {@link PhoneAccountHandle} to bundle in {@link #PARAM_ARGUMENTS} 5110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */ 5210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public static final String PARAM_PHONE_ACCOUNT_HANDLE_KEY = "phone_account_handle_key"; 5310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 5410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian /** 5510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * The title of the {@link #PARAM_TARGET_FRAGMENT} once it is launched with {@link 5610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian * PreferenceActivity#startWithFragment(String, Bundle, Fragment, int)}, as a string resource ID. 5710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian */ 5810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public static final String PARAM_TARGET_TITLE_RES = "target_title_res"; 5910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 6010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian private String targetFragment; 6110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian private Bundle arguments; 6210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian private String phoneAccountHandleKey; 6310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian private int titleRes; 6410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 6510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian @Override 6610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public void onCreate(Bundle savedInstanceState) { 6710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian super.onCreate(savedInstanceState); 6810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian targetFragment = getArguments().getString(PARAM_TARGET_FRAGMENT); 6910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian arguments = new Bundle(); 7010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian arguments.putAll(getArguments().getBundle(PARAM_ARGUMENTS)); 7110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian phoneAccountHandleKey = getArguments().getString(PARAM_PHONE_ACCOUNT_HANDLE_KEY); 7210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian titleRes = getArguments().getInt(PARAM_TARGET_TITLE_RES, 0); 7310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 7410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 7510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian final class AccountPreference extends Preference { 7610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian private final PhoneAccountHandle phoneAccountHandle; 7710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 7810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public AccountPreference( 7910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian Context context, PhoneAccountHandle phoneAccountHandle, PhoneAccount phoneAccount) { 8010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian super(context); 8110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian this.phoneAccountHandle = phoneAccountHandle; 8210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian setTitle(phoneAccount.getLabel()); 8310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian setSummary(phoneAccount.getShortDescription()); 8410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian Icon icon = phoneAccount.getIcon(); 8510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian if (icon != null) { 8610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian setIcon(icon.loadDrawable(context)); 8710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 8810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 8910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 9010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian @VisibleForTesting 9110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian void click() { 9210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian onClick(); 9310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 9410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 9510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian @Override 9610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian protected void onClick() { 9710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian super.onClick(); 9810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian PreferenceActivity preferenceActivity = (PreferenceActivity) getActivity(); 9910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian arguments.putParcelable(phoneAccountHandleKey, phoneAccountHandle); 10010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian preferenceActivity.startWithFragment(targetFragment, arguments, null, 0, titleRes, 0); 10110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 10210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 10310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 10410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian @Override 10510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian public void onResume() { 10610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian super.onResume(); 10710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); 10810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian PreferenceScreen screen = getPreferenceScreen(); 10910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 11010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian TelecomManager telecomManager = getContext().getSystemService(TelecomManager.class); 11110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 11210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian List<PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts(); 11310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 11410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian Context context = getActivity(); 11510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian for (PhoneAccountHandle handle : accountHandles) { 11610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian PhoneAccount account = telecomManager.getPhoneAccount(handle); 11710b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian if (account != null) { 11810b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian final boolean isSimAccount = 11910b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian 0 != (account.getCapabilities() & PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION); 12010b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian if (isSimAccount) { 12110b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian screen.addPreference(new AccountPreference(context, handle, account)); 12210b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 12310b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 12410b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 12510b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian } 12610b34a5ebf12e97ecba0caf3c8e30b476b038a96Eric Erfanian} 127