SelectPhoneAccountDialogFragment.java revision 941090ea5f2cd169038bd9f6c2811d6bc12db6a5
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.contacts.common.widget;
18
19import android.telecom.PhoneAccount;
20import android.telecom.PhoneAccountHandle;
21import android.app.AlertDialog;
22import android.app.Dialog;
23import android.app.DialogFragment;
24import android.app.FragmentManager;
25import android.content.Context;
26import android.content.DialogInterface;
27import android.os.Bundle;
28import android.telecom.TelecomManager;
29import android.telephony.PhoneNumberUtils;
30import android.text.TextUtils;
31import android.view.LayoutInflater;
32import android.view.View;
33import android.view.ViewGroup;
34import android.widget.ArrayAdapter;
35import android.widget.CheckBox;
36import android.widget.CompoundButton;
37import android.widget.ImageView;
38import android.widget.LinearLayout;
39import android.widget.ListAdapter;
40import android.widget.TextView;
41
42import com.android.contacts.common.R;
43
44import java.util.List;
45
46/**
47 * Dialog that allows the user to select a phone accounts for a given action. Optionally provides
48 * the choice to set the phone account as default.
49 */
50public class SelectPhoneAccountDialogFragment extends DialogFragment {
51    private int mTitleResId;
52    private boolean mCanSetDefault;
53    private List<PhoneAccountHandle> mAccountHandles;
54    private boolean mIsSelected;
55    private boolean mIsDefaultChecked;
56    private TelecomManager mTelecomManager;
57    private SelectPhoneAccountListener mListener;
58
59    /**
60     * Shows the account selection dialog.
61     * This is the preferred way to show this dialog.
62     *
63     * @param fragmentManager The fragment manager.
64     * @param accountHandles The {@code PhoneAccountHandle}s available to select from.
65     * @param listener The listener for the results of the account selection.
66     */
67    public static void showAccountDialog(FragmentManager fragmentManager,
68            List<PhoneAccountHandle> accountHandles, SelectPhoneAccountListener listener) {
69        showAccountDialog(fragmentManager, R.string.select_account_dialog_title, false,
70                accountHandles, listener);
71    }
72
73    /**
74     * Shows the account selection dialog.
75     * This is the preferred way to show this dialog.
76     * This method also allows specifying a custom title and "set default" checkbox.
77     *
78     * @param fragmentManager The fragment manager.
79     * @param titleResId The resource ID for the string to use in the title of the dialog.
80     * @param canSetDefault {@code true} if the dialog should include an option to set the selection
81     * as the default. False otherwise.
82     * @param accountHandles The {@code PhoneAccountHandle}s available to select from.
83     * @param listener The listener for the results of the account selection.
84     */
85    public static void showAccountDialog(FragmentManager fragmentManager, int titleResId,
86            boolean canSetDefault, List<PhoneAccountHandle> accountHandles,
87            SelectPhoneAccountListener listener) {
88        SelectPhoneAccountDialogFragment fragment =
89                new SelectPhoneAccountDialogFragment(
90                        titleResId, canSetDefault, accountHandles, listener);
91        fragment.show(fragmentManager, "selectAccount");
92    }
93
94    public SelectPhoneAccountDialogFragment(int titleResId, boolean canSetDefault,
95            List<PhoneAccountHandle> accountHandles, SelectPhoneAccountListener listener) {
96        super();
97        mTitleResId = titleResId;
98        mCanSetDefault = canSetDefault;
99        mAccountHandles = accountHandles;
100        mListener = listener;
101    }
102
103    public interface SelectPhoneAccountListener {
104        void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle, boolean setDefault);
105        void onDialogDismissed();
106    }
107
108    @Override
109    public Dialog onCreateDialog(Bundle savedInstanceState) {
110        mIsSelected = false;
111        mIsDefaultChecked = false;
112        mTelecomManager =
113                (TelecomManager) getActivity().getSystemService(Context.TELECOM_SERVICE);
114
115        final DialogInterface.OnClickListener selectionListener =
116                new DialogInterface.OnClickListener() {
117            @Override
118            public void onClick(DialogInterface dialog, int which) {
119                mIsSelected = true;
120                PhoneAccountHandle selectedAccountHandle = mAccountHandles.get(which);
121                mListener.onPhoneAccountSelected(selectedAccountHandle, mIsDefaultChecked);
122            }
123        };
124
125        final CompoundButton.OnCheckedChangeListener checkListener =
126                new CompoundButton.OnCheckedChangeListener() {
127            @Override
128            public void onCheckedChanged(CompoundButton check, boolean isChecked) {
129                mIsDefaultChecked = isChecked;
130            }
131        };
132
133        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
134        ListAdapter selectAccountListAdapter = new SelectAccountListAdapter(
135                builder.getContext(),
136                R.layout.select_account_list_item,
137                mAccountHandles);
138
139        AlertDialog dialog = builder.setTitle(mTitleResId)
140                .setAdapter(selectAccountListAdapter, selectionListener)
141                .create();
142
143        if (mCanSetDefault) {
144            // Generate custom checkbox view
145            LinearLayout checkboxLayout = (LinearLayout) getActivity()
146                    .getLayoutInflater()
147                    .inflate(R.layout.default_account_checkbox, null);
148
149            CheckBox cb =
150                    (CheckBox) checkboxLayout.findViewById(R.id.default_account_checkbox_view);
151            cb.setOnCheckedChangeListener(checkListener);
152
153            dialog.getListView().addFooterView(checkboxLayout);
154        }
155
156        return dialog;
157    }
158
159    private class SelectAccountListAdapter extends ArrayAdapter<PhoneAccountHandle> {
160        private int mResId;
161
162        public SelectAccountListAdapter(
163                Context context, int resource, List<PhoneAccountHandle> accountHandles) {
164            super(context, resource, accountHandles);
165            mResId = resource;
166        }
167
168        @Override
169        public View getView(int position, View convertView, ViewGroup parent) {
170            LayoutInflater inflater = (LayoutInflater)
171                    getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
172
173            View rowView;
174            final ViewHolder holder;
175
176            if (convertView == null) {
177                // Cache views for faster scrolling
178                rowView = inflater.inflate(mResId, null);
179                holder = new ViewHolder();
180                holder.labelTextView = (TextView) rowView.findViewById(R.id.label);
181                holder.numberTextView = (TextView) rowView.findViewById(R.id.number);
182                holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
183                rowView.setTag(holder);
184            }
185            else {
186                rowView = convertView;
187                holder = (ViewHolder) rowView.getTag();
188            }
189
190            PhoneAccountHandle accountHandle = getItem(position);
191            PhoneAccount account = mTelecomManager.getPhoneAccount(accountHandle);
192            holder.labelTextView.setText(account.getLabel());
193            if (account.getAddress() == null ||
194                    TextUtils.isEmpty(account.getAddress().getSchemeSpecificPart())) {
195                holder.numberTextView.setVisibility(View.GONE);
196            } else {
197                holder.numberTextView.setVisibility(View.VISIBLE);
198                holder.numberTextView.setText(
199                        PhoneNumberUtils.getPhoneTtsSpannable(
200                                account.getAddress().getSchemeSpecificPart()));
201            }
202            holder.imageView.setImageDrawable(account.createIconDrawable(getContext()));
203            return rowView;
204        }
205
206        private class ViewHolder {
207            TextView labelTextView;
208            TextView numberTextView;
209            ImageView imageView;
210        }
211    }
212
213    @Override
214    public void onPause() {
215        if (!mIsSelected) {
216            mListener.onDialogDismissed();
217        }
218        super.onPause();
219    }
220}
221