1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2014 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.contacts.common.widget; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.annotation.SuppressLint; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.app.AlertDialog; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.app.Dialog; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.app.DialogFragment; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context; 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.DialogInterface; 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Bundle; 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Handler; 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.ResultReceiver; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable; 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.PhoneAccount; 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.PhoneAccountHandle; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.telecom.TelecomManager; 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.text.TextUtils; 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.LayoutInflater; 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View; 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.ViewGroup; 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ArrayAdapter; 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.CheckBox; 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.CompoundButton; 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ImageView; 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.LinearLayout; 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ListAdapter; 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.TextView; 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.R; 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.compat.PhoneAccountCompat; 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.compat.PhoneNumberUtilsCompat; 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.ArrayList; 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.List; 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Dialog that allows the user to select a phone accounts for a given action. Optionally provides 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * the choice to set the phone account as default. 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class SelectPhoneAccountDialogFragment extends DialogFragment { 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String ARG_TITLE_RES_ID = "title_res_id"; 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String ARG_CAN_SET_DEFAULT = "can_set_default"; 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String ARG_ACCOUNT_HANDLES = "account_handles"; 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String ARG_IS_DEFAULT_CHECKED = "is_default_checked"; 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String ARG_LISTENER = "listener"; 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final String ARG_CALL_ID = "call_id"; 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private List<PhoneAccountHandle> mAccountHandles; 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean mIsSelected; 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private boolean mIsDefaultChecked; 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private SelectPhoneAccountListener mListener; 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public SelectPhoneAccountDialogFragment() {} 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Create new fragment instance with default title and no option to set as default. 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param accountHandles The {@code PhoneAccountHandle}s available to select from. 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param listener The listener for the results of the account selection. 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static SelectPhoneAccountDialogFragment newInstance( 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian List<PhoneAccountHandle> accountHandles, 77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian SelectPhoneAccountListener listener, 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable String callId) { 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return newInstance( 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian R.string.select_account_dialog_title, false, accountHandles, listener, callId); 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Create new fragment instance. This method also allows specifying a custom title and "set 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * default" checkbox. 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param titleResId The resource ID for the string to use in the title of the dialog. 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param canSetDefault {@code true} if the dialog should include an option to set the selection 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * as the default. False otherwise. 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param accountHandles The {@code PhoneAccountHandle}s available to select from. 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param listener The listener for the results of the account selection. 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static SelectPhoneAccountDialogFragment newInstance( 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian int titleResId, 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean canSetDefault, 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian List<PhoneAccountHandle> accountHandles, 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian SelectPhoneAccountListener listener, 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable String callId) { 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ArrayList<PhoneAccountHandle> accountHandlesCopy = new ArrayList<>(); 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (accountHandles != null) { 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian accountHandlesCopy.addAll(accountHandles); 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian SelectPhoneAccountDialogFragment fragment = new SelectPhoneAccountDialogFragment(); 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final Bundle args = new Bundle(); 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian args.putInt(ARG_TITLE_RES_ID, titleResId); 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian args.putBoolean(ARG_CAN_SET_DEFAULT, canSetDefault); 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian args.putParcelableArrayList(ARG_ACCOUNT_HANDLES, accountHandlesCopy); 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian args.putParcelable(ARG_LISTENER, listener); 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian args.putString(ARG_CALL_ID, callId); 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian fragment.setArguments(args); 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian fragment.setListener(listener); 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return fragment; 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void setListener(SelectPhoneAccountListener listener) { 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mListener = listener; 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onSaveInstanceState(Bundle outState) { 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super.onSaveInstanceState(outState); 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian outState.putBoolean(ARG_IS_DEFAULT_CHECKED, mIsDefaultChecked); 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public Dialog onCreateDialog(Bundle savedInstanceState) { 127d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian int titleResId = getArguments().getInt(ARG_TITLE_RES_ID); 128d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian boolean canSetDefault = getArguments().getBoolean(ARG_CAN_SET_DEFAULT); 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mAccountHandles = getArguments().getParcelableArrayList(ARG_ACCOUNT_HANDLES); 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mListener = getArguments().getParcelable(ARG_LISTENER); 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (savedInstanceState != null) { 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsDefaultChecked = savedInstanceState.getBoolean(ARG_IS_DEFAULT_CHECKED); 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsSelected = false; 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final DialogInterface.OnClickListener selectionListener = 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new DialogInterface.OnClickListener() { 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onClick(DialogInterface dialog, int which) { 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsSelected = true; 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneAccountHandle selectedAccountHandle = mAccountHandles.get(which); 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Bundle result = new Bundle(); 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian result.putParcelable( 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian SelectPhoneAccountListener.EXTRA_SELECTED_ACCOUNT_HANDLE, selectedAccountHandle); 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian result.putBoolean(SelectPhoneAccountListener.EXTRA_SET_DEFAULT, mIsDefaultChecked); 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian result.putString(SelectPhoneAccountListener.EXTRA_CALL_ID, getCallId()); 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mListener != null) { 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mListener.onReceiveResult(SelectPhoneAccountListener.RESULT_SELECTED, result); 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian }; 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final CompoundButton.OnCheckedChangeListener checkListener = 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new CompoundButton.OnCheckedChangeListener() { 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onCheckedChanged(CompoundButton check, boolean isChecked) { 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mIsDefaultChecked = isChecked; 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian }; 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ListAdapter selectAccountListAdapter = 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian new SelectAccountListAdapter( 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian builder.getContext(), R.layout.select_account_list_item, mAccountHandles); 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian AlertDialog dialog = 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian builder 168d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian .setTitle(titleResId) 169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .setAdapter(selectAccountListAdapter, selectionListener) 170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .create(); 171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 172d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (canSetDefault) { 173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Generate custom checkbox view, lint suppressed since no appropriate parent (is dialog) 174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @SuppressLint("InflateParams") 175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LinearLayout checkboxLayout = 176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian (LinearLayout) 177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LayoutInflater.from(builder.getContext()) 178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian .inflate(R.layout.default_account_checkbox, null); 179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian CheckBox cb = (CheckBox) checkboxLayout.findViewById(R.id.default_account_checkbox_view); 181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian cb.setOnCheckedChangeListener(checkListener); 182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian cb.setChecked(mIsDefaultChecked); 183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian dialog.getListView().addFooterView(checkboxLayout); 185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return dialog; 188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 191d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public void onCancel(DialogInterface dialog) { 192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!mIsSelected && mListener != null) { 193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Bundle result = new Bundle(); 194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian result.putString(SelectPhoneAccountListener.EXTRA_CALL_ID, getCallId()); 195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mListener.onReceiveResult(SelectPhoneAccountListener.RESULT_DISMISSED, result); 196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 197d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian super.onCancel(dialog); 198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable 201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private String getCallId() { 202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return getArguments().getString(ARG_CALL_ID); 203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static class SelectPhoneAccountListener extends ResultReceiver { 206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian static final int RESULT_SELECTED = 1; 208ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian static final int RESULT_DISMISSED = 2; 209ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 210ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian static final String EXTRA_SELECTED_ACCOUNT_HANDLE = "extra_selected_account_handle"; 211ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian static final String EXTRA_SET_DEFAULT = "extra_set_default"; 212ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian static final String EXTRA_CALL_ID = "extra_call_id"; 213ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 214d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian protected SelectPhoneAccountListener() { 215ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super(new Handler()); 216ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 217ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 218ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 219ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian protected void onReceiveResult(int resultCode, Bundle resultData) { 220ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (resultCode == RESULT_SELECTED) { 221ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian onPhoneAccountSelected( 222ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian resultData.getParcelable(EXTRA_SELECTED_ACCOUNT_HANDLE), 223ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian resultData.getBoolean(EXTRA_SET_DEFAULT), 224ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian resultData.getString(EXTRA_CALL_ID)); 225ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else if (resultCode == RESULT_DISMISSED) { 226ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian onDialogDismissed(resultData.getString(EXTRA_CALL_ID)); 227ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 228ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 229ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 230ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onPhoneAccountSelected( 231ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) {} 232ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 233ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public void onDialogDismissed(@Nullable String callId) {} 234ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 235ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 236ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static class SelectAccountListAdapter extends ArrayAdapter<PhoneAccountHandle> { 237ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 238ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private int mResId; 239ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 240d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian SelectAccountListAdapter( 241ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Context context, int resource, List<PhoneAccountHandle> accountHandles) { 242ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian super(context, resource, accountHandles); 243ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mResId = resource; 244ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 245ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 246ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 247ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public View getView(int position, View convertView, ViewGroup parent) { 248ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian LayoutInflater inflater = 249ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 250ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 251ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian View rowView; 252ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian final ViewHolder holder; 253ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 254ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (convertView == null) { 255ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian // Cache views for faster scrolling 256ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian rowView = inflater.inflate(mResId, null); 257ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder = new ViewHolder(); 258ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.labelTextView = (TextView) rowView.findViewById(R.id.label); 259ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.numberTextView = (TextView) rowView.findViewById(R.id.number); 260ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.imageView = (ImageView) rowView.findViewById(R.id.icon); 261ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian rowView.setTag(holder); 262ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 263ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian rowView = convertView; 264ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder = (ViewHolder) rowView.getTag(); 265ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 266ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 267ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneAccountHandle accountHandle = getItem(position); 268ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneAccount account = 269ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian getContext().getSystemService(TelecomManager.class).getPhoneAccount(accountHandle); 270ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (account == null) { 271ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return rowView; 272ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 273ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.labelTextView.setText(account.getLabel()); 274ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (account.getAddress() == null 275ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian || TextUtils.isEmpty(account.getAddress().getSchemeSpecificPart())) { 276ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.numberTextView.setVisibility(View.GONE); 277ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } else { 278ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.numberTextView.setVisibility(View.VISIBLE); 279ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.numberTextView.setText( 280ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneNumberUtilsCompat.createTtsSpannable( 281ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian account.getAddress().getSchemeSpecificPart())); 282ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 283ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian holder.imageView.setImageDrawable( 284ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian PhoneAccountCompat.createIconDrawable(account, getContext())); 285ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return rowView; 286ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 287ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 288ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static final class ViewHolder { 289ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 290ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian TextView labelTextView; 291ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian TextView numberTextView; 292ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian ImageView imageView; 293ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 294ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 295ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 296