blob: 998f593c71fe1d8ed60515e79f9c2470f97d7cc8 [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;
35import com.android.contacts.list.JoinContactLoader.JoinContactLoaderResult;
Gary Mai0a49afa2016-12-05 15:53:58 -080036import com.android.contacts.logging.ListEvent;
Chiao Chenge0b2f1e2012-06-12 13:07:56 -070037
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -070038/**
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -070039 * Fragment for the Join Contact list.
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -070040 */
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070041public class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
42
Dmitri Plotnikove8a95172010-06-23 16:18:10 -070043 private static final int DISPLAY_NAME_LOADER = -2;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070044
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -070045 private static final String KEY_TARGET_CONTACT_ID = "targetContactId";
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -080046
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070047 private OnContactPickerActionListener mListener;
48 private long mTargetContactId;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070049
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -070050 private final LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() {
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070051
52 @Override
53 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
54 switch (id) {
55 case DISPLAY_NAME_LOADER: {
56 // Loader for the display name of the target contact
57 return new CursorLoader(getActivity(),
58 ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId),
59 new String[] { Contacts.DISPLAY_NAME }, null, null, null);
60 }
61 case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
62 JoinContactLoader loader = new JoinContactLoader(getActivity());
63 JoinContactListAdapter adapter = getAdapter();
64 if (adapter != null) {
65 adapter.configureLoader(loader, 0);
66 }
67 return loader;
68 }
69 }
70 throw new IllegalArgumentException("No loader for ID=" + id);
71 }
72
73 @Override
74 public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
75 switch (loader.getId()) {
76 case DISPLAY_NAME_LOADER: {
77 if (data != null && data.moveToFirst()) {
78 showTargetContactName(data.getString(0));
79 }
80 break;
81 }
82 case JoinContactListAdapter.PARTITION_ALL_CONTACTS: {
Jay Shrauner74b5d6c2014-11-13 12:34:20 -080083 if (data != null) {
84 final Cursor suggestionsCursor =
85 ((JoinContactLoaderResult) data).suggestionCursor;
86 onContactListLoaded(suggestionsCursor, data);
Walter Jang6158b812016-07-19 15:59:51 -070087 maybeLogListEvent();
Jay Shrauner74b5d6c2014-11-13 12:34:20 -080088 }
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070089 break;
90 }
91 }
92 }
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -080093
Makoto Onuki14ca8622012-04-25 16:10:26 -070094 @Override
Dianne Hackborn4ef95cc2010-12-16 00:44:33 -080095 public void onLoaderReset(Loader<Cursor> loader) {
96 }
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -070097 };
98
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -070099 public JoinContactListFragment() {
100 setPhotoLoaderEnabled(true);
101 setSectionHeaderDisplayEnabled(true);
Dmitri Plotnikov5245ea62010-12-10 15:03:13 -0800102 setVisibleScrollbarEnabled(false);
Dmitri Plotnikovb22ca302010-12-08 19:28:25 -0800103 setQuickContactEnabled(false);
Walter Jang6158b812016-07-19 15:59:51 -0700104 setListType(ListEvent.ListType.PICK_JOIN);
105 setLogListEvents(true);
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700106 }
107
108 public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
109 mListener = listener;
110 }
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700111
112 @Override
Daniel Lehmannfec29c72010-08-02 19:01:31 -0700113 protected void startLoading() {
Dmitri Plotnikov4e0ce3f2010-08-10 15:19:28 -0700114 configureAdapter();
115
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -0700116 getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
Daisuke Miyakawaecd392b2011-10-12 12:27:16 -0700117
118 // When this method is called, Uri to be used may be changed. We should use restartLoader()
119 // to load the parameter again.
120 getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS,
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -0700121 null, mLoaderCallbacks);
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700122 }
123
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700124 private void onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor) {
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800125 JoinContactListAdapter adapter = getAdapter();
126 adapter.setSuggestionsCursor(suggestionsCursor);
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700127 setVisibleScrollbarEnabled(true);
128 onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, allContactsCursor);
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800129 }
130
Dmitri Plotnikove2bbe1d2010-07-12 18:29:21 -0700131 private void showTargetContactName(String displayName) {
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700132 Activity activity = getActivity();
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700133 TextView blurbView = (TextView) activity.findViewById(R.id.join_contact_blurb);
Jay Shrauner76c1a512014-11-26 10:13:29 -0800134 final String name = !TextUtils.isEmpty(displayName) ? displayName
135 : activity.getString(R.string.missing_name);
136 String blurb = activity.getString(R.string.blurbJoinContactDataWith, name);
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700137 blurbView.setText(blurb);
138 }
139
140 public void setTargetContactId(long targetContactId) {
141 mTargetContactId = targetContactId;
142 }
143
144 @Override
145 public JoinContactListAdapter createListAdapter() {
Paul Sliwowskifd4df882013-09-10 22:07:24 -0700146 JoinContactListAdapter adapter = new JoinContactListAdapter(getActivity());
Sean Midford85405d02016-11-09 20:00:56 -0800147 adapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(false /* opposite */));
Paul Sliwowskifd4df882013-09-10 22:07:24 -0700148 return adapter;
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700149 }
150
151 @Override
152 protected void configureAdapter() {
153 super.configureAdapter();
154 JoinContactListAdapter adapter = getAdapter();
Dmitri Plotnikove4d32d92010-05-10 19:06:22 -0700155 adapter.setTargetContactId(mTargetContactId);
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700156 }
157
158 @Override
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -0700159 protected View inflateView(LayoutInflater inflater, ViewGroup container) {
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800160 return inflater.inflate(R.layout.join_contact_picker_list_content, null);
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700161 }
Dmitri Plotnikovcaf498b2010-04-23 14:58:08 -0700162
163 @Override
Dmitri Plotnikov59fb48e2010-04-26 17:09:19 -0700164 protected void onItemClick(int position, long id) {
Daniel Lehmann097b10b2012-04-24 17:04:40 -0700165 final Uri contactUri = getAdapter().getContactUri(position);
166 if (contactUri != null) mListener.onPickContactAction(contactUri);
Dmitri Plotnikovcaf498b2010-04-23 14:58:08 -0700167 }
Dmitri Plotnikove8a95172010-06-23 16:18:10 -0700168
169 @Override
Dmitri Plotnikove8a95172010-06-23 16:18:10 -0700170 public void onPickerResult(Intent data) {
Daniel Lehmann097b10b2012-04-24 17:04:40 -0700171 final Uri contactUri = data.getData();
172 if (contactUri != null) mListener.onPickContactAction(contactUri);
Dmitri Plotnikove8a95172010-06-23 16:18:10 -0700173 }
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800174
175 @Override
176 public void onSaveInstanceState(Bundle outState) {
177 super.onSaveInstanceState(outState);
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700178 outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId);
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800179 }
180
181 @Override
182 public void restoreSavedState(Bundle savedState) {
183 super.restoreSavedState(savedState);
184 if (savedState != null) {
Daisuke Miyakawaa8729cd2011-10-12 12:27:16 -0700185 mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID);
Dmitri Plotnikovd8f84e02011-01-23 18:03:14 -0800186 }
187 }
Daisuke Miyakawaecd392b2011-10-12 12:27:16 -0700188
189 @Override
190 public void setQueryString(String queryString, boolean delaySelection) {
191 super.setQueryString(queryString, delaySelection);
192
193 setSearchMode(!TextUtils.isEmpty(queryString));
194 }
Dmitri Plotnikov6e2009d2010-04-22 16:03:53 -0700195}