• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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  */
16 package com.android.contacts.list;
17 
18 import android.app.Activity;
19 import android.app.LoaderManager.LoaderCallbacks;
20 import android.content.ContentUris;
21 import android.content.CursorLoader;
22 import android.content.Intent;
23 import android.content.Loader;
24 import android.database.Cursor;
25 import android.net.Uri;
26 import android.os.Bundle;
27 import android.provider.ContactsContract.Contacts;
28 import android.text.TextUtils;
29 import android.view.LayoutInflater;
30 import android.view.View;
31 import android.view.ViewGroup;
32 import android.widget.TextView;
33 
34 import com.android.contacts.R;
35 import com.android.contacts.list.JoinContactLoader.JoinContactLoaderResult;
36 import com.android.contacts.logging.ListEvent;
37 
38 /**
39  * Fragment for the Join Contact list.
40  */
41 public class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
42 
43     private static final int DISPLAY_NAME_LOADER = -2;
44 
45     private static final String KEY_TARGET_CONTACT_ID = "targetContactId";
46 
47     private OnContactPickerActionListener mListener;
48     private long mTargetContactId;
49 
50     private final LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() {
51 
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: {
83                     if (data != null) {
84                         final Cursor suggestionsCursor =
85                                 ((JoinContactLoaderResult) data).suggestionCursor;
86                         onContactListLoaded(suggestionsCursor, data);
87                         maybeLogListEvent();
88                     }
89                     break;
90                 }
91             }
92         }
93 
94         @Override
95         public void onLoaderReset(Loader<Cursor> loader) {
96         }
97     };
98 
JoinContactListFragment()99     public JoinContactListFragment() {
100         setPhotoLoaderEnabled(true);
101         setSectionHeaderDisplayEnabled(true);
102         setVisibleScrollbarEnabled(false);
103         setQuickContactEnabled(false);
104         setListType(ListEvent.ListType.PICK_JOIN);
105         setLogListEvents(true);
106     }
107 
setOnContactPickerActionListener(OnContactPickerActionListener listener)108     public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
109         mListener = listener;
110     }
111 
112     @Override
startLoading()113     protected void startLoading() {
114         configureAdapter();
115 
116         getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks);
117 
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,
121                 null, mLoaderCallbacks);
122     }
123 
onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor)124     private void onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor) {
125         JoinContactListAdapter adapter = getAdapter();
126         adapter.setSuggestionsCursor(suggestionsCursor);
127         setVisibleScrollbarEnabled(true);
128         onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, allContactsCursor);
129     }
130 
showTargetContactName(String displayName)131     private void showTargetContactName(String displayName) {
132         Activity activity = getActivity();
133         TextView blurbView = (TextView) activity.findViewById(R.id.join_contact_blurb);
134         final String name = !TextUtils.isEmpty(displayName) ? displayName
135             : activity.getString(R.string.missing_name);
136         String blurb = activity.getString(R.string.blurbJoinContactDataWith, name);
137         blurbView.setText(blurb);
138     }
139 
setTargetContactId(long targetContactId)140     public void setTargetContactId(long targetContactId) {
141         mTargetContactId = targetContactId;
142     }
143 
144     @Override
createListAdapter()145     public JoinContactListAdapter createListAdapter() {
146         JoinContactListAdapter adapter = new JoinContactListAdapter(getActivity());
147         adapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(false /* opposite */));
148         return adapter;
149     }
150 
151     @Override
configureAdapter()152     protected void configureAdapter() {
153         super.configureAdapter();
154         JoinContactListAdapter adapter = getAdapter();
155         adapter.setTargetContactId(mTargetContactId);
156     }
157 
158     @Override
inflateView(LayoutInflater inflater, ViewGroup container)159     protected View inflateView(LayoutInflater inflater, ViewGroup container) {
160         return inflater.inflate(R.layout.join_contact_picker_list_content, null);
161     }
162 
163     @Override
onItemClick(int position, long id)164     protected void onItemClick(int position, long id) {
165         final Uri contactUri = getAdapter().getContactUri(position);
166         if (contactUri != null) mListener.onPickContactAction(contactUri);
167     }
168 
169     @Override
onPickerResult(Intent data)170     public void onPickerResult(Intent data) {
171         final Uri contactUri = data.getData();
172         if (contactUri != null) mListener.onPickContactAction(contactUri);
173     }
174 
175     @Override
onSaveInstanceState(Bundle outState)176     public void onSaveInstanceState(Bundle outState) {
177         super.onSaveInstanceState(outState);
178         outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId);
179     }
180 
181     @Override
restoreSavedState(Bundle savedState)182     public void restoreSavedState(Bundle savedState) {
183         super.restoreSavedState(savedState);
184         if (savedState != null) {
185             mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID);
186         }
187     }
188 
189     @Override
setQueryString(String queryString, boolean delaySelection)190     public void setQueryString(String queryString, boolean delaySelection) {
191         super.setQueryString(queryString, delaySelection);
192 
193         setSearchMode(!TextUtils.isEmpty(queryString));
194     }
195 }
196