blob: d827eb5b4ce81a56fc7adffa1fa1403e16c8c370 [file] [log] [blame]
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -07001/*
2 * Copyright (C) 2010 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 */
16package com.android.contacts.list;
17
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070018import android.app.Activity;
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070019import android.app.LoaderManager.LoaderCallbacks;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070020import android.content.ContentUris;
Jeff Hamilton3c462912010-05-15 02:20:01 -050021import android.content.CursorLoader;
Dmitri Plotnikove8a95172010-06-23 16:18:10 -070022import android.content.Intent;
Jeff Hamilton3c462912010-05-15 02:20:01 -050023import android.content.Loader;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070024import android.database.Cursor;
Daniel Lehmann097b10b2012-04-24 17:04:40 -070025import android.net.Uri;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070026import android.os.Bundle;
27import android.provider.ContactsContract.Contacts;
Daisuke Miyakawaecd392b2011-10-12 12:27:16 -070028import android.text.TextUtils;
Dmitri Plotnikovcaf498b2010-04-23 14:58:08 -070029import android.view.LayoutInflater;
30import android.view.View;
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -070031import android.view.ViewGroup;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070032import android.widget.TextView;
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -070033
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070034import com.android.contacts.R;
Chiao Cheng821a6572012-12-04 17:42:52 -080035import com.android.contacts.common.list.ContactEntryListFragment;
Paul Sliwowskifd4df882013-09-10 22:07:24 -070036import com.android.contacts.common.list.ContactListItemView;
Walter Jang6158b812016-07-19 15:59:51 -070037import com.android.contacts.common.logging.ListEvent;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070038import com.android.contacts.list.JoinContactLoader.JoinContactLoaderResult;
39
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -070040/**
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -070041 * Fragment for the Join Contact list.
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -070042 */
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070043public class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
44
Dmitri Plotnikove8a95172010-06-23 16:18:10 -070045 private static final int DISPLAY_NAME_LOADER = -2;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070046
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -070047 private static final String KEY_TARGET_CONTACT_ID = "targetContactId";
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -080048
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070049 private OnContactPickerActionListener mListener;
50 private long mTargetContactId;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070051
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -070052 private final LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() {
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070053
54 @Override
55 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
56 switch (id) {
57 case DISPLAY_NAME_LOADER: {
58 // Loader for the display name of the target contact
59 return new CursorLoader(getActivity(),
60 ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId),
61 new String[] { Contacts.DISPLAY_NAME }, null, null, null);
62 }
63 case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
64 JoinContactLoader loader = new JoinContactLoader(getActivity());
65 JoinContactListAdapter adapter = getAdapter();
66 if (adapter != null) {
67 adapter.configureLoader(loader, 0);
68 }
69 return loader;
70 }
71 }
72 throw new IllegalArgumentException("No loader for ID=" + id);
73 }
74
75 @Override
76 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
77 switch (loader.getId()) {
78 case DISPLAY_NAME_LOADER: {
79 if (data != null && data.moveToFirst()) {
80 showTargetContactName(data.getString(0));
81 }
82 break;
83 }
84 case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
Jay Shrauner74b5d6c2014-11-13 12:34:20 -080085 if (data != null) {
86 final Cursor suggestionsCursor =
87 ((JoinContactLoaderResult) data).suggestionCursor;
88 onContactListLoaded(suggestionsCursor, data);
Walter Jang6158b812016-07-19 15:59:51 -070089 maybeLogListEvent();
Jay Shrauner74b5d6c2014-11-13 12:34:20 -080090 }
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070091 break;
92 }
93 }
94 }
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -080095
Makoto Onuki14ca8622012-04-25 16:10:26 -070096 @Override
Dianne Hackborn4ef95cc2010-12-16 00:44:33 -080097 public void onLoaderReset(Loader<Cursor> loader) {
98 }
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070099 };
100
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700101 public JoinContactListFragment() {
102 setPhotoLoaderEnabled(true);
103 setSectionHeaderDisplayEnabled(true);
Dmitri Plotnikov5245ea62010-12-10 15:03:13 -0800104 setVisibleScrollbarEnabled(false);
Dmitri Plotnikovb22ca302010-12-08 19:28:25 -0800105 setQuickContactEnabled(false);
Walter Jang6158b812016-07-19 15:59:51 -0700106 setListType(ListEvent.ListType.PICK_JOIN);
107 setLogListEvents(true);
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700108 }
109
110 public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
111 mListener = listener;
112 }
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700113
114 @Override
Daniel Lehmannfec29c72010-08-02 19:01:31 -0700115 protected void startLoading() {
Dmitri Plotnikov4e0ce3f2010-08-10 15:19:28 -0700116 configureAdapter();
117
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -0700118 getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
Daisuke Miyakawaecd392b2011-10-12 12:27:16 -0700119
120 // When this method is called, Uri to be used may be changed. We should use restartLoader()
121 // to load the parameter again.
122 getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -0700123 null, mLoaderCallbacks);
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700124 }
125
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700126 private void onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor) {
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800127 JoinContactListAdapter adapter = getAdapter();
128 adapter.setSuggestionsCursor(suggestionsCursor);
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700129 setVisibleScrollbarEnabled(true);
130 onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, allContactsCursor);
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800131 }
132
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -0700133 private void showTargetContactName(String displayName) {
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700134 Activity activity = getActivity();
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700135 TextView blurbView = (TextView) activity.findViewById(R.id.join_contact_blurb);
Jay Shrauner76c1a512014-11-26 10:13:29 -0800136 final String name = !TextUtils.isEmpty(displayName) ? displayName
137 : activity.getString(R.string.missing_name);
138 String blurb = activity.getString(R.string.blurbJoinContactDataWith, name);
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700139 blurbView.setText(blurb);
140 }
141
142 public void setTargetContactId(long targetContactId) {
143 mTargetContactId = targetContactId;
144 }
145
146 @Override
147 public JoinContactListAdapter createListAdapter() {
Paul Sliwowskifd4df882013-09-10 22:07:24 -0700148 JoinContactListAdapter adapter = new JoinContactListAdapter(getActivity());
Sean Midford85405d02016-11-09 20:00:56 -0800149 adapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(false /* opposite */));
Paul Sliwowskifd4df882013-09-10 22:07:24 -0700150 return adapter;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700151 }
152
153 @Override
154 protected void configureAdapter() {
155 super.configureAdapter();
156 JoinContactListAdapter adapter = getAdapter();
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700157 adapter.setTargetContactId(mTargetContactId);
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700158 }
159
160 @Override
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -0700161 protected View inflateView(LayoutInflater inflater, ViewGroup container) {
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800162 return inflater.inflate(R.layout.join_contact_picker_list_content, null);
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700163 }
Dmitri Plotnikovcaf498b2010-04-23 14:58:08 -0700164
165 @Override
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -0700166 protected void onItemClick(int position, long id) {
Daniel Lehmann097b10b2012-04-24 17:04:40 -0700167 final Uri contactUri = getAdapter().getContactUri(position);
168 if (contactUri != null) mListener.onPickContactAction(contactUri);
Dmitri Plotnikovcaf498b2010-04-23 14:58:08 -0700169 }
Dmitri Plotnikove8a95172010-06-23 16:18:10 -0700170
171 @Override
Dmitri Plotnikove8a95172010-06-23 16:18:10 -0700172 public void onPickerResult(Intent data) {
Daniel Lehmann097b10b2012-04-24 17:04:40 -0700173 final Uri contactUri = data.getData();
174 if (contactUri != null) mListener.onPickContactAction(contactUri);
Dmitri Plotnikove8a95172010-06-23 16:18:10 -0700175 }
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800176
177 @Override
178 public void onSaveInstanceState(Bundle outState) {
179 super.onSaveInstanceState(outState);
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700180 outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId);
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800181 }
182
183 @Override
184 public void restoreSavedState(Bundle savedState) {
185 super.restoreSavedState(savedState);
186 if (savedState != null) {
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700187 mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID);
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800188 }
189 }
Daisuke Miyakawaecd392b2011-10-12 12:27:16 -0700190
191 @Override
192 public void setQueryString(String queryString, boolean delaySelection) {
193 super.setQueryString(queryString, delaySelection);
194
195 setSearchMode(!TextUtils.isEmpty(queryString));
196 }
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700197}