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