blob: da2b468da63a8855f7127a324fb1362fdf9c0a38 [file] [log] [blame]
/*
* Copyright (C) 2014 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.contacts.widget;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.android.contacts.R;
import com.android.contacts.compat.PhoneAccountCompat;
import com.android.contacts.compat.PhoneNumberUtilsCompat;
import java.util.ArrayList;
import java.util.List;
/**
* Dialog that allows the user to select a phone accounts for a given action. Optionally provides
* the choice to set the phone account as default.
*/
public class SelectPhoneAccountDialogFragment extends DialogFragment {
private static final String ARG_TITLE_RES_ID = "title_res_id";
private static final String ARG_CAN_SET_DEFAULT = "can_set_default";
private static final String ARG_ACCOUNT_HANDLES = "account_handles";
private static final String ARG_IS_DEFAULT_CHECKED = "is_default_checked";
private static final String ARG_LISTENER = "listener";
private int mTitleResId;
private boolean mCanSetDefault;
private List<PhoneAccountHandle> mAccountHandles;
private boolean mIsSelected;
private boolean mIsDefaultChecked;
private TelecomManager mTelecomManager;
private SelectPhoneAccountListener mListener;
/**
* Create new fragment instance with default title and no option to set as default.
*
* @param accountHandles The {@code PhoneAccountHandle}s available to select from.
* @param listener The listener for the results of the account selection.
*/
public static SelectPhoneAccountDialogFragment newInstance(
List<PhoneAccountHandle> accountHandles, SelectPhoneAccountListener listener) {
return newInstance(R.string.select_account_dialog_title, false,
accountHandles, listener);
}
/**
* Create new fragment instance.
* This method also allows specifying a custom title and "set default" checkbox.
*
* @param titleResId The resource ID for the string to use in the title of the dialog.
* @param canSetDefault {@code true} if the dialog should include an option to set the selection
* as the default. False otherwise.
* @param accountHandles The {@code PhoneAccountHandle}s available to select from.
* @param listener The listener for the results of the account selection.
*/
public static SelectPhoneAccountDialogFragment newInstance(int titleResId,
boolean canSetDefault, List<PhoneAccountHandle> accountHandles,
SelectPhoneAccountListener listener) {
ArrayList<PhoneAccountHandle> accountHandlesCopy = new ArrayList<PhoneAccountHandle>();
if (accountHandles != null) {
accountHandlesCopy.addAll(accountHandles);
}
SelectPhoneAccountDialogFragment fragment = new SelectPhoneAccountDialogFragment();
final Bundle args = new Bundle();
args.putInt(ARG_TITLE_RES_ID, titleResId);
args.putBoolean(ARG_CAN_SET_DEFAULT, canSetDefault);
args.putParcelableArrayList(ARG_ACCOUNT_HANDLES, accountHandlesCopy);
args.putParcelable(ARG_LISTENER, listener);
fragment.setArguments(args);
fragment.setListener(listener);
return fragment;
}
public SelectPhoneAccountDialogFragment() {
}
public void setListener(SelectPhoneAccountListener listener) {
mListener = listener;
}
public static class SelectPhoneAccountListener extends ResultReceiver {
static final int RESULT_SELECTED = 1;
static final int RESULT_DISMISSED = 2;
static final String EXTRA_SELECTED_ACCOUNT_HANDLE = "extra_selected_account_handle";
static final String EXTRA_SET_DEFAULT = "extra_set_default";
public SelectPhoneAccountListener() {
super(new Handler());
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == RESULT_SELECTED) {
onPhoneAccountSelected(
(PhoneAccountHandle) resultData.getParcelable(
EXTRA_SELECTED_ACCOUNT_HANDLE),
resultData.getBoolean(EXTRA_SET_DEFAULT));
} else if (resultCode == RESULT_DISMISSED) {
onDialogDismissed();
}
}
public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
boolean setDefault) {}
public void onDialogDismissed() {}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(ARG_IS_DEFAULT_CHECKED, mIsDefaultChecked);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mTitleResId = getArguments().getInt(ARG_TITLE_RES_ID);
mCanSetDefault = getArguments().getBoolean(ARG_CAN_SET_DEFAULT);
mAccountHandles = getArguments().getParcelableArrayList(ARG_ACCOUNT_HANDLES);
mListener = getArguments().getParcelable(ARG_LISTENER);
if (savedInstanceState != null) {
mIsDefaultChecked = savedInstanceState.getBoolean(ARG_IS_DEFAULT_CHECKED);
}
mIsSelected = false;
mTelecomManager =
(TelecomManager) getActivity().getSystemService(Context.TELECOM_SERVICE);
final DialogInterface.OnClickListener selectionListener =
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mIsSelected = true;
PhoneAccountHandle selectedAccountHandle = mAccountHandles.get(which);
final Bundle result = new Bundle();
result.putParcelable(SelectPhoneAccountListener.EXTRA_SELECTED_ACCOUNT_HANDLE,
selectedAccountHandle);
result.putBoolean(SelectPhoneAccountListener.EXTRA_SET_DEFAULT,
mIsDefaultChecked);
if (mListener != null) {
mListener.onReceiveResult(SelectPhoneAccountListener.RESULT_SELECTED, result);
}
}
};
final CompoundButton.OnCheckedChangeListener checkListener =
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton check, boolean isChecked) {
mIsDefaultChecked = isChecked;
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
ListAdapter selectAccountListAdapter = new SelectAccountListAdapter(
builder.getContext(),
R.layout.select_account_list_item,
mAccountHandles);
AlertDialog dialog = builder.setTitle(mTitleResId)
.setAdapter(selectAccountListAdapter, selectionListener)
.create();
if (mCanSetDefault) {
// Generate custom checkbox view
LinearLayout checkboxLayout = (LinearLayout) getActivity()
.getLayoutInflater()
.inflate(R.layout.default_account_checkbox, null);
CheckBox cb =
(CheckBox) checkboxLayout.findViewById(R.id.default_account_checkbox_view);
cb.setOnCheckedChangeListener(checkListener);
cb.setChecked(mIsDefaultChecked);
dialog.getListView().addFooterView(checkboxLayout);
}
return dialog;
}
private class SelectAccountListAdapter extends ArrayAdapter<PhoneAccountHandle> {
private int mResId;
public SelectAccountListAdapter(
Context context, int resource, List<PhoneAccountHandle> accountHandles) {
super(context, resource, accountHandles);
mResId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)
getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView;
final ViewHolder holder;
if (convertView == null) {
// Cache views for faster scrolling
rowView = inflater.inflate(mResId, null);
holder = new ViewHolder();
holder.labelTextView = (TextView) rowView.findViewById(R.id.label);
holder.numberTextView = (TextView) rowView.findViewById(R.id.number);
holder.imageView = (ImageView) rowView.findViewById(R.id.icon);
rowView.setTag(holder);
}
else {
rowView = convertView;
holder = (ViewHolder) rowView.getTag();
}
PhoneAccountHandle accountHandle = getItem(position);
PhoneAccount account = mTelecomManager.getPhoneAccount(accountHandle);
if (account == null) {
return rowView;
}
holder.labelTextView.setText(account.getLabel());
if (account.getAddress() == null ||
TextUtils.isEmpty(account.getAddress().getSchemeSpecificPart())) {
holder.numberTextView.setVisibility(View.GONE);
} else {
holder.numberTextView.setVisibility(View.VISIBLE);
holder.numberTextView.setText(
PhoneNumberUtilsCompat.createTtsSpannable(
account.getAddress().getSchemeSpecificPart()));
}
holder.imageView.setImageDrawable(PhoneAccountCompat.createIconDrawable(account,
getContext()));
return rowView;
}
private class ViewHolder {
TextView labelTextView;
TextView numberTextView;
ImageView imageView;
}
}
@Override
public void onStop() {
if (!mIsSelected && mListener != null) {
mListener.onReceiveResult(SelectPhoneAccountListener.RESULT_DISMISSED, null);
}
super.onStop();
}
}