blob: 623d038babce383ab17063689d492b96f5f17f2a [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;
9import android.content.Intent;
10import android.database.Cursor;
11import android.net.Uri;
12import android.os.Bundle;
Gary Maiac704682016-10-11 15:29:41 -070013import android.provider.ContactsContract.RawContacts;
Gary Maiba10be22016-10-12 17:41:15 -070014import android.text.TextUtils;
Gary Maia6c80b32016-09-30 16:34:55 -070015import android.view.LayoutInflater;
16import android.view.View;
17import android.view.ViewGroup;
18import android.widget.CursorAdapter;
19import android.widget.ImageView;
20import android.widget.TextView;
21
22import com.android.contacts.R;
23import com.android.contacts.common.ContactPhotoManager;
24import com.android.contacts.common.model.AccountTypeManager;
Gary Maiba10be22016-10-12 17:41:15 -070025import com.android.contacts.common.model.account.AccountDisplayInfo;
26import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
Gary Maia6c80b32016-09-30 16:34:55 -070027import com.android.contacts.common.model.account.AccountType;
Gary Maiba10be22016-10-12 17:41:15 -070028import com.android.contacts.common.model.account.AccountWithDataSet;
29import com.android.contacts.common.model.account.GoogleAccountType;
Gary Maia6c80b32016-09-30 16:34:55 -070030import com.android.contacts.common.preference.ContactsPreferences;
31import com.android.contacts.common.util.ImplicitIntentsUtil;
32import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
33
34/**
35 * Dialog containing the raw contacts that make up a contact. On selection the editor is loaded
36 * for the chosen raw contact.
37 */
38public class PickRawContactDialogFragment extends DialogFragment {
Gary Mai445a7c62016-10-17 14:30:11 -070039 private static final String ARGS_URI = "uri";
40 private static final String ARGS_MATERIAL_PALETTE = "materialPalette";
41 private static final String ARGS_IS_USER_PROFILE = "isUserProfile";
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;
145 // Uri for the whole Contact.
146 private Uri mUri;
Gary Maiea2f3572016-10-11 17:30:28 -0700147 private CursorAdapter mAdapter;
Gary Maia6c80b32016-09-30 16:34:55 -0700148 private MaterialPalette mMaterialPalette;
Gary Maiba10be22016-10-12 17:41:15 -0700149 private boolean mIsUserProfile;
Gary Maia6c80b32016-09-30 16:34:55 -0700150
151 public static PickRawContactDialogFragment getInstance(Uri uri, Cursor cursor,
Gary Maiba10be22016-10-12 17:41:15 -0700152 MaterialPalette materialPalette, boolean isUserProfile) {
Gary Maia6c80b32016-09-30 16:34:55 -0700153 final PickRawContactDialogFragment fragment = new PickRawContactDialogFragment();
Gary Mai445a7c62016-10-17 14:30:11 -0700154 final Bundle args = new Bundle();
155 args.putParcelable(ARGS_URI, uri);
156 args.putParcelable(ARGS_MATERIAL_PALETTE, materialPalette);
157 args.putBoolean(ARGS_IS_USER_PROFILE, isUserProfile);
158 fragment.setArguments(args);
Gary Maia6c80b32016-09-30 16:34:55 -0700159 fragment.setCursor(cursor);
Gary Maia6c80b32016-09-30 16:34:55 -0700160 return fragment;
161 }
162
163 @Override
164 public Dialog onCreateDialog(Bundle savedInstanceState) {
165 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
Gary Maiea2f3572016-10-11 17:30:28 -0700166 mAdapter = new RawContactAccountListAdapter(getContext(), mCursor);
Gary Maia6c80b32016-09-30 16:34:55 -0700167 builder.setTitle(R.string.contact_editor_pick_raw_contact_dialog_title);
Gary Maiea2f3572016-10-11 17:30:28 -0700168 builder.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
Gary Maia6c80b32016-09-30 16:34:55 -0700169 @Override
170 public void onClick(DialogInterface dialog, int which) {
Gary Maiea2f3572016-10-11 17:30:28 -0700171 final long rawContactId = mAdapter.getItemId(which);
Gary Maia6c80b32016-09-30 16:34:55 -0700172 final Intent intent = EditorIntents.createEditContactIntentForRawContact(
173 getActivity(), mUri, rawContactId, mMaterialPalette);
174 intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
175 ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
176 }
177 });
178 builder.setCancelable(true);
179 return builder.create();
180 }
181
182 @Override
183 public void onDismiss(DialogInterface dialog) {
184 super.onDismiss(dialog);
185 mCursor = null;
186 finishActivity();
187 }
188
Gary Mai445a7c62016-10-17 14:30:11 -0700189 @Override
190 public void onCreate(Bundle savedInstanceState) {
191 super.onCreate(savedInstanceState);
192
193 final Bundle args = getArguments();
194 if (args != null) {
195 mUri = args.getParcelable(ARGS_URI);
196 mMaterialPalette = args.getParcelable(ARGS_MATERIAL_PALETTE);
197 mIsUserProfile = args.getBoolean(ARGS_IS_USER_PROFILE);
198 }
Gary Maia6c80b32016-09-30 16:34:55 -0700199 }
200
Gary Maiea2f3572016-10-11 17:30:28 -0700201 public void setCursor(Cursor cursor) {
202 if (mAdapter != null) {
203 mAdapter.swapCursor(cursor);
204 }
Gary Maia6c80b32016-09-30 16:34:55 -0700205 mCursor = cursor;
206 }
207
Gary Maia6c80b32016-09-30 16:34:55 -0700208 private void finishActivity() {
209 if (getActivity() != null && !getActivity().isFinishing()) {
210 getActivity().finish();
211 }
212 }
213}