blob: 0f87d99f40822bce54603e9016ed04a011c9c888 [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 {
39 /**
40 * Used to list the account info for the given raw contacts list.
41 */
Gary Maiba10be22016-10-12 17:41:15 -070042 private final class RawContactAccountListAdapter extends CursorAdapter {
Gary Maia6c80b32016-09-30 16:34:55 -070043 private final LayoutInflater mInflater;
44 private final Context mContext;
Gary Maiba10be22016-10-12 17:41:15 -070045 private final AccountDisplayInfoFactory mAccountDisplayInfoFactory;
46 private final AccountTypeManager mAccountTypeManager;
47 private final ContactsPreferences mPreferences;
Gary Maia6c80b32016-09-30 16:34:55 -070048
49 public RawContactAccountListAdapter(Context context, Cursor cursor) {
50 super(context, cursor, 0);
51 mContext = context;
52 mInflater = LayoutInflater.from(context);
Gary Maiba10be22016-10-12 17:41:15 -070053 mAccountDisplayInfoFactory = AccountDisplayInfoFactory.forWritableAccounts(context);
54 mAccountTypeManager = AccountTypeManager.getInstance(context);
55 mPreferences = new ContactsPreferences(context);
Gary Maia6c80b32016-09-30 16:34:55 -070056 }
57
58 @Override
59 public void bindView(View view, Context context, Cursor cursor) {
60 final long rawContactId = cursor.getLong(PickRawContactLoader.RAW_CONTACT_ID);
61 final String accountName = cursor.getString(PickRawContactLoader.ACCOUNT_NAME);
62 final String accountType = cursor.getString(PickRawContactLoader.ACCOUNT_TYPE);
63 final String dataSet = cursor.getString(PickRawContactLoader.DATA_SET);
Gary Maiba10be22016-10-12 17:41:15 -070064 final AccountType account = mAccountTypeManager.getAccountType(accountType, dataSet);
Gary Maia6c80b32016-09-30 16:34:55 -070065
Gary Maia6c80b32016-09-30 16:34:55 -070066 final int displayNameColumn =
Gary Maiba10be22016-10-12 17:41:15 -070067 mPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY
Gary Maia6c80b32016-09-30 16:34:55 -070068 ? PickRawContactLoader.DISPLAY_NAME_PRIMARY
69 : PickRawContactLoader.DISPLAY_NAME_ALTERNATIVE;
Gary Maiba10be22016-10-12 17:41:15 -070070
Gary Maia6c80b32016-09-30 16:34:55 -070071 String displayName = cursor.getString(displayNameColumn);
72
Gary Maiba10be22016-10-12 17:41:15 -070073 if (TextUtils.isEmpty(displayName)) {
74 displayName = mContext.getString(R.string.missing_name);
75 }
Gary Maia6c80b32016-09-30 16:34:55 -070076
77 if (!account.areContactsWritable()) {
78 displayName = mContext
79 .getString(R.string.contact_editor_pick_raw_contact_read_only, displayName);
80 view.setAlpha(.38f);
81 } else {
82 view.setAlpha(1f);
83 }
Gary Maiba10be22016-10-12 17:41:15 -070084 final TextView nameView = (TextView) view.findViewById(
85 R.id.display_name);
Gary Maia6c80b32016-09-30 16:34:55 -070086 nameView.setText(displayName);
Gary Maiba10be22016-10-12 17:41:15 -070087
88 final String accountDisplayLabel;
89
90 // Use the same string as editor if it's an editable user profile raw contact.
91 if (mIsUserProfile && account.areContactsWritable()) {
92 final AccountDisplayInfo displayInfo =
93 mAccountDisplayInfoFactory.getAccountDisplayInfo(
94 new AccountWithDataSet(accountName, accountType, dataSet));
95 accountDisplayLabel = EditorUiUtils.getAccountHeaderLabelForMyProfile(mContext,
96 displayInfo);
97 }
98 else if (GoogleAccountType.ACCOUNT_TYPE.equals(accountType)
99 && account.dataSet == null) {
100 // Focus Google accounts have the account name shown
101 accountDisplayLabel = accountName;
102 } else {
103 accountDisplayLabel = account.getDisplayLabel(mContext).toString();
104 }
105 final TextView accountTextView = (TextView) view.findViewById(
106 R.id.account_name);
107 final ImageView accountIconView = (ImageView) view.findViewById(
108 R.id.account_icon);
109 accountTextView.setText(accountDisplayLabel);
Gary Maia6c80b32016-09-30 16:34:55 -0700110 accountIconView.setImageDrawable(account.getDisplayIcon(mContext));
111
112 final ContactPhotoManager.DefaultImageRequest
113 request = new ContactPhotoManager.DefaultImageRequest(
114 displayName, String.valueOf(rawContactId), /* isCircular = */ true);
Gary Maiac704682016-10-11 15:29:41 -0700115 final Uri photoUri = Uri.withAppendedPath(
116 ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
117 RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
Gary Maiba10be22016-10-12 17:41:15 -0700118 final ImageView photoView = (ImageView) view.findViewById(
119 R.id.photo);
Gary Maia6c80b32016-09-30 16:34:55 -0700120 ContactPhotoManager.getInstance(mContext).loadDirectoryPhoto(photoView,
Gary Maiac704682016-10-11 15:29:41 -0700121 photoUri,
Gary Maia6c80b32016-09-30 16:34:55 -0700122 /* darkTheme = */ false,
123 /* isCircular = */ true,
124 request);
125 }
126
127 @Override
128 public View newView(Context context, Cursor cursor, ViewGroup parent) {
129 return mInflater.inflate(R.layout.raw_contact_list_item, parent, false);
130 }
131
132 @Override
133 public long getItemId(int position) {
134 getCursor().moveToPosition(position);
135 return getCursor().getLong(PickRawContactLoader.RAW_CONTACT_ID);
136 }
137 }
138
139 // Cursor holding all raw contact rows for the given Contact.
140 private Cursor mCursor;
141 // Uri for the whole Contact.
142 private Uri mUri;
Gary Maiea2f3572016-10-11 17:30:28 -0700143 private CursorAdapter mAdapter;
Gary Maia6c80b32016-09-30 16:34:55 -0700144 private MaterialPalette mMaterialPalette;
Gary Maiba10be22016-10-12 17:41:15 -0700145 private boolean mIsUserProfile;
Gary Maia6c80b32016-09-30 16:34:55 -0700146
147 public static PickRawContactDialogFragment getInstance(Uri uri, Cursor cursor,
Gary Maiba10be22016-10-12 17:41:15 -0700148 MaterialPalette materialPalette, boolean isUserProfile) {
Gary Maia6c80b32016-09-30 16:34:55 -0700149 final PickRawContactDialogFragment fragment = new PickRawContactDialogFragment();
150 fragment.setUri(uri);
151 fragment.setCursor(cursor);
152 fragment.setMaterialPalette(materialPalette);
Gary Maiba10be22016-10-12 17:41:15 -0700153 fragment.setIsUserProfile(isUserProfile);
Gary Maia6c80b32016-09-30 16:34:55 -0700154 return fragment;
155 }
156
157 @Override
158 public Dialog onCreateDialog(Bundle savedInstanceState) {
159 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
Gary Maiea2f3572016-10-11 17:30:28 -0700160 mAdapter = new RawContactAccountListAdapter(getContext(), mCursor);
Gary Maia6c80b32016-09-30 16:34:55 -0700161 builder.setTitle(R.string.contact_editor_pick_raw_contact_dialog_title);
Gary Maiea2f3572016-10-11 17:30:28 -0700162 builder.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
Gary Maia6c80b32016-09-30 16:34:55 -0700163 @Override
164 public void onClick(DialogInterface dialog, int which) {
Gary Maiea2f3572016-10-11 17:30:28 -0700165 final long rawContactId = mAdapter.getItemId(which);
Gary Maia6c80b32016-09-30 16:34:55 -0700166 final Intent intent = EditorIntents.createEditContactIntentForRawContact(
167 getActivity(), mUri, rawContactId, mMaterialPalette);
168 intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
169 ImplicitIntentsUtil.startActivityInApp(getActivity(), intent);
170 }
171 });
172 builder.setCancelable(true);
173 return builder.create();
174 }
175
176 @Override
177 public void onDismiss(DialogInterface dialog) {
178 super.onDismiss(dialog);
179 mCursor = null;
180 finishActivity();
181 }
182
183 private void setUri(Uri uri) {
184 mUri = uri;
185 }
186
Gary Maiea2f3572016-10-11 17:30:28 -0700187 public void setCursor(Cursor cursor) {
188 if (mAdapter != null) {
189 mAdapter.swapCursor(cursor);
190 }
Gary Maia6c80b32016-09-30 16:34:55 -0700191 mCursor = cursor;
192 }
193
194 private void setMaterialPalette(MaterialPalette materialPalette) {
195 mMaterialPalette = materialPalette;
196 }
197
Gary Maiba10be22016-10-12 17:41:15 -0700198 private void setIsUserProfile(boolean isUserProfile) {
199 mIsUserProfile = isUserProfile;
200 }
201
Gary Maia6c80b32016-09-30 16:34:55 -0700202 private void finishActivity() {
203 if (getActivity() != null && !getActivity().isFinishing()) {
204 getActivity().finish();
205 }
206 }
207}