blob: dd079a25ab4be7f0c33ce1add9ff8be2c8c0662f [file] [log] [blame]
Gary Maia6c80b32016-09-30 16:34:55 -07001package com.android.contacts.editor;
2
3import android.app.AlertDialog;
4import android.app.Dialog;
5import android.app.DialogFragment;
Gary Maiac704682016-10-11 15:29:41 -07006import android.content.ContentUris;
Gary Maia6c80b32016-09-30 16:34:55 -07007import android.content.Context;
8import android.content.DialogInterface;
Gary Maia6c80b32016-09-30 16:34:55 -07009import android.database.Cursor;
10import android.net.Uri;
11import android.os.Bundle;
Gary Maiac704682016-10-11 15:29:41 -070012import android.provider.ContactsContract.RawContacts;
Gary Maiba10be22016-10-12 17:41:15 -070013import android.text.TextUtils;
Gary Maia6c80b32016-09-30 16:34:55 -070014import android.view.LayoutInflater;
15import android.view.View;
16import android.view.ViewGroup;
17import android.widget.CursorAdapter;
18import android.widget.ImageView;
19import android.widget.TextView;
20
21import com.android.contacts.R;
22import com.android.contacts.common.ContactPhotoManager;
23import com.android.contacts.common.model.AccountTypeManager;
Gary Maiba10be22016-10-12 17:41:15 -070024import com.android.contacts.common.model.account.AccountDisplayInfo;
25import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
Gary Maia6c80b32016-09-30 16:34:55 -070026import com.android.contacts.common.model.account.AccountType;
Gary Maiba10be22016-10-12 17:41:15 -070027import com.android.contacts.common.model.account.AccountWithDataSet;
28import com.android.contacts.common.model.account.GoogleAccountType;
Gary Maia6c80b32016-09-30 16:34:55 -070029import com.android.contacts.common.preference.ContactsPreferences;
Gary Maia6c80b32016-09-30 16:34:55 -070030
31/**
Gary Mai5336e6e2016-10-23 14:17:03 -070032 * Should only be started from an activity that implements {@link PickRawContactListener}.
Gary Maia6c80b32016-09-30 16:34:55 -070033 * Dialog containing the raw contacts that make up a contact. On selection the editor is loaded
34 * for the chosen raw contact.
35 */
36public class PickRawContactDialogFragment extends DialogFragment {
Gary Mai445a7c62016-10-17 14:30:11 -070037 private static final String ARGS_IS_USER_PROFILE = "isUserProfile";
38
Gary Mai5336e6e2016-10-23 14:17:03 -070039 public interface PickRawContactListener {
40 void onPickRawContact(long rawContactId);
41 }
42
Gary Maia6c80b32016-09-30 16:34:55 -070043 /**
44 * Used to list the account info for the given raw contacts list.
45 */
Gary Maiba10be22016-10-12 17:41:15 -070046 private final class RawContactAccountListAdapter extends CursorAdapter {
Gary Maia6c80b32016-09-30 16:34:55 -070047 private final LayoutInflater mInflater;
48 private final Context mContext;
Gary Maiba10be22016-10-12 17:41:15 -070049 private final AccountDisplayInfoFactory mAccountDisplayInfoFactory;
50 private final AccountTypeManager mAccountTypeManager;
51 private final ContactsPreferences mPreferences;
Gary Maia6c80b32016-09-30 16:34:55 -070052
53 public RawContactAccountListAdapter(Context context, Cursor cursor) {
54 super(context, cursor, 0);
55 mContext = context;
56 mInflater = LayoutInflater.from(context);
Gary Maiba10be22016-10-12 17:41:15 -070057 mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(context);
58 mAccountTypeManager = AccountTypeManager.getInstance(context);
59 mPreferences = new ContactsPreferences(context);
Gary Maia6c80b32016-09-30 16:34:55 -070060 }
61
62 @Override
63 public void bindView(View view, Context context, Cursor cursor) {
64 final long rawContactId = cursor.getLong(PickRawContactLoader.RAW_CONTACT_ID);
65 final String accountName = cursor.getString(PickRawContactLoader.ACCOUNT_NAME);
66 final String accountType = cursor.getString(PickRawContactLoader.ACCOUNT_TYPE);
67 final String dataSet = cursor.getString(PickRawContactLoader.DATA_SET);
Gary Maiba10be22016-10-12 17:41:15 -070068 final AccountType account = mAccountTypeManager.getAccountType(accountType, dataSet);
Gary Maia6c80b32016-09-30 16:34:55 -070069
Gary Maia6c80b32016-09-30 16:34:55 -070070 final int displayNameColumn =
Gary Maiba10be22016-10-12 17:41:15 -070071 mPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
Gary Maia6c80b32016-09-30 16:34:55 -070072 ? PickRawContactLoader.DISPLAY_NAME_PRIMARY
73 : PickRawContactLoader.DISPLAY_NAME_ALTERNATIVE;
Gary Maiba10be22016-10-12 17:41:15 -070074
Gary Maia6c80b32016-09-30 16:34:55 -070075 String displayName = cursor.getString(displayNameColumn);
76
Gary Maiba10be22016-10-12 17:41:15 -070077 if (TextUtils.isEmpty(displayName)) {
78 displayName = mContext.getString(R.string.missing_name);
79 }
Gary Maia6c80b32016-09-30 16:34:55 -070080
81 if (!account.areContactsWritable()) {
82 displayName = mContext
83 .getString(R.string.contact_editor_pick_raw_contact_read_only, displayName);
84 view.setAlpha(.38f);
85 } else {
86 view.setAlpha(1f);
87 }
Gary Maiba10be22016-10-12 17:41:15 -070088 final TextView nameView = (TextView) view.findViewById(
89 R.id.display_name);
Gary Maia6c80b32016-09-30 16:34:55 -070090 nameView.setText(displayName);
Gary Maiba10be22016-10-12 17:41:15 -070091
92 final String accountDisplayLabel;
93
94 // Use the same string as editor if it's an editable user profile raw contact.
95 if (mIsUserProfile && account.areContactsWritable()) {
96 final AccountDisplayInfo displayInfo =
97 mAccountDisplayInfoFactory.getAccountDisplayInfo(
98 new AccountWithDataSet(accountName, accountType, dataSet));
99 accountDisplayLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(mContext,
100 displayInfo);
101 }
102 else if (GoogleAccountType.ACCOUNT_TYPE.equals(accountType)
103 && account.dataSet == null) {
104 // Focus Google accounts have the account name shown
105 accountDisplayLabel = accountName;
106 } else {
107 accountDisplayLabel = account.getDisplayLabel(mContext).toString();
108 }
109 final TextView accountTextView = (TextView) view.findViewById(
110 R.id.account_name);
111 final ImageView accountIconView = (ImageView) view.findViewById(
112 R.id.account_icon);
113 accountTextView.setText(accountDisplayLabel);
Gary Maia6c80b32016-09-30 16:34:55 -0700114 accountIconView.setImageDrawable(account.getDisplayIcon(mContext));
115
116 final ContactPhotoManager.DefaultImageRequest
117 request = new ContactPhotoManager.DefaultImageRequest(
118 displayName, String.valueOf(rawContactId), /* isCircular = */ true);
Gary Maiac704682016-10-11 15:29:41 -0700119 final Uri photoUri = Uri.withAppendedPath(
120 ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
121 RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
Gary Maiba10be22016-10-12 17:41:15 -0700122 final ImageView photoView = (ImageView) view.findViewById(
123 R.id.photo);
Gary Maia6c80b32016-09-30 16:34:55 -0700124 ContactPhotoManager.getInstance(mContext).loadDirectoryPhoto(photoView,
Gary Maiac704682016-10-11 15:29:41 -0700125 photoUri,
Gary Maia6c80b32016-09-30 16:34:55 -0700126 /* darkTheme = */ false,
127 /* isCircular = */ true,
128 request);
129 }
130
131 @Override
132 public View newView(Context context, Cursor cursor, ViewGroup parent) {
133 return mInflater.inflate(R.layout.raw_contact_list_item, parent, false);
134 }
135
136 @Override
137 public long getItemId(int position) {
138 getCursor().moveToPosition(position);
139 return getCursor().getLong(PickRawContactLoader.RAW_CONTACT_ID);
140 }
141 }
142
143 // Cursor holding all raw contact rows for the given Contact.
144 private Cursor mCursor;
Gary Maiea2f3572016-10-11 17:30:28 -0700145 private CursorAdapter mAdapter;
Gary Maiba10be22016-10-12 17:41:15 -0700146 private boolean mIsUserProfile;
Gary Maia6c80b32016-09-30 16:34:55 -0700147
Gary Mai5336e6e2016-10-23 14:17:03 -0700148 public static PickRawContactDialogFragment getInstance(Cursor cursor, boolean isUserProfile) {
Gary Maia6c80b32016-09-30 16:34:55 -0700149 final PickRawContactDialogFragment fragment = new PickRawContactDialogFragment();
Gary Mai445a7c62016-10-17 14:30:11 -0700150 final Bundle args = new Bundle();
Gary Mai445a7c62016-10-17 14:30:11 -0700151 args.putBoolean(ARGS_IS_USER_PROFILE, isUserProfile);
152 fragment.setArguments(args);
Gary Maia6c80b32016-09-30 16:34:55 -0700153 fragment.setCursor(cursor);
Gary Maia6c80b32016-09-30 16:34:55 -0700154 return fragment;
155 }
156
157 @Override
158 public Dialog onCreateDialog(Bundle savedInstanceState) {
Gary Mai5336e6e2016-10-23 14:17:03 -0700159 if (!(getActivity() instanceof PickRawContactListener)) {
160 throw new IllegalArgumentException(
161 "Host activity doesn't implement PickRawContactListener");
162 }
Gary Maia6c80b32016-09-30 16:34:55 -0700163 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
Gary Maiea2f3572016-10-11 17:30:28 -0700164 mAdapter = new RawContactAccountListAdapter(getContext(), mCursor);
Gary Maia6c80b32016-09-30 16:34:55 -0700165 builder.setTitle(R.string.contact_editor_pick_raw_contact_dialog_title);
Gary Maiea2f3572016-10-11 17:30:28 -0700166 builder.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
Gary Maia6c80b32016-09-30 16:34:55 -0700167 @Override
168 public void onClick(DialogInterface dialog, int which) {
Gary Maiea2f3572016-10-11 17:30:28 -0700169 final long rawContactId = mAdapter.getItemId(which);
Gary Mai5336e6e2016-10-23 14:17:03 -0700170 ((PickRawContactListener) getActivity()).onPickRawContact(rawContactId);
Gary Maia6c80b32016-09-30 16:34:55 -0700171 }
172 });
173 builder.setCancelable(true);
174 return builder.create();
175 }
176
177 @Override
178 public void onDismiss(DialogInterface dialog) {
179 super.onDismiss(dialog);
180 mCursor = null;
181 finishActivity();
182 }
183
Gary Mai445a7c62016-10-17 14:30:11 -0700184 @Override
185 public void onCreate(Bundle savedInstanceState) {
186 super.onCreate(savedInstanceState);
187
188 final Bundle args = getArguments();
189 if (args != null) {
Gary Mai445a7c62016-10-17 14:30:11 -0700190 mIsUserProfile = args.getBoolean(ARGS_IS_USER_PROFILE);
191 }
Gary Maia6c80b32016-09-30 16:34:55 -0700192 }
193
Gary Maiea2f3572016-10-11 17:30:28 -0700194 public void setCursor(Cursor cursor) {
195 if (mAdapter != null) {
196 mAdapter.swapCursor(cursor);
197 }
Gary Maia6c80b32016-09-30 16:34:55 -0700198 mCursor = cursor;
199 }
200
Gary Maia6c80b32016-09-30 16:34:55 -0700201 private void finishActivity() {
202 if (getActivity() != null && !getActivity().isFinishing()) {
203 getActivity().finish();
204 }
205 }
206}