JoinContactListFragment.java revision 5245ea63b4cca18ee504b27abd534fc13d33dea9
16e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/* 26e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 36e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * 46e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 56e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * you may not use this file except in compliance with the License. 66e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * You may obtain a copy of the License at 76e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * 86e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 96e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * 106e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 116e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 126e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * See the License for the specific language governing permissions and 146e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov * limitations under the License. 156e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */ 166e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikovpackage com.android.contacts.list; 176e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 18e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikovimport com.android.contacts.ContactsSearchManager; 19caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport com.android.contacts.R; 206e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 21e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.app.Activity; 22e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikovimport android.app.LoaderManager.LoaderCallbacks; 23e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.content.ContentUris; 243c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.CursorLoader; 25e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikovimport android.content.Intent; 263c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.Loader; 27e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.database.Cursor; 28e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.os.Bundle; 29e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 30caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.LayoutInflater; 31caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.View; 3259fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport android.view.ViewGroup; 33e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.widget.TextView; 346e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 356e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/** 3659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov * Fragment for the Join Contact list. 376e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */ 38e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovpublic class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> { 39e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 40e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov private static final int DISPLAY_NAME_LOADER = -2; 41e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 42e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov private OnContactPickerActionListener mListener; 43e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov private long mTargetContactId; 44e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov private boolean mAllContactsListShown = false; 45e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 46e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov private LoaderCallbacks<Cursor> mLoaderCallbacks = new LoaderCallbacks<Cursor>() { 47e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov 48e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov @Override 49e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov public Loader<Cursor> onCreateLoader(int id, Bundle args) { 50e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov switch (id) { 51e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov case DISPLAY_NAME_LOADER: { 52e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov // Loader for the display name of the target contact 53e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov return new CursorLoader(getActivity(), 54e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId), 55e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov new String[] { Contacts.DISPLAY_NAME }, null, null, null); 56e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 57e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov case JoinContactListAdapter.PARTITION_ALL_CONTACTS: { 58e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov JoinContactLoader loader = new JoinContactLoader(getActivity()); 59e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 60e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov if (adapter != null) { 61e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov adapter.configureLoader(loader, 0); 62e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 63e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov return loader; 64e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 65e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 66e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov throw new IllegalArgumentException("No loader for ID=" + id); 67e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 68e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov 69e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov @Override 70e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 71e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov switch (loader.getId()) { 72e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov case DISPLAY_NAME_LOADER: { 73e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov if (data != null && data.moveToFirst()) { 74e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov showTargetContactName(data.getString(0)); 75e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 76e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov break; 77e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 78e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov case JoinContactListAdapter.PARTITION_ALL_CONTACTS: { 795245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(mAllContactsListShown); 80e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov 81e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 82e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov Cursor suggestionsCursor = ((JoinContactLoader)loader).getSuggestionsCursor(); 83e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov adapter.setSuggestionsCursor(suggestionsCursor); 84e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, data); 85e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov break; 86e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 87e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 88e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 89e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov }; 90e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov 91e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public JoinContactListFragment() { 92e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov setPhotoLoaderEnabled(true); 93e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov setSectionHeaderDisplayEnabled(true); 945245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(false); 95b22ca30163f5f99f07b906c20fd1a798541448a5Dmitri Plotnikov setQuickContactEnabled(false); 96e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 97e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 98e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public void setOnContactPickerActionListener(OnContactPickerActionListener listener) { 99e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov mListener = listener; 100e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 101e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 102e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov @Override 103fec29c7320c6c45aff69dbd6ec0edb267fb402f4Daniel Lehmann protected void startLoading() { 1044e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov configureAdapter(); 1054e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov 106e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks); 107e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov getLoaderManager().initLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS, 108e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov null, mLoaderCallbacks); 109e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 110e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 111e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov private void showTargetContactName(String displayName) { 112e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov Activity activity = getActivity(); 113e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov TextView blurbView = (TextView)activity.findViewById(R.id.join_contact_blurb); 114e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov String blurb = activity.getString(R.string.blurbJoinContactDataWith, displayName); 115e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov blurbView.setText(blurb); 116e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 117e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 118e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public void setTargetContactId(long targetContactId) { 119e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov mTargetContactId = targetContactId; 120e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 121e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 122e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov @Override 123e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public JoinContactListAdapter createListAdapter() { 124e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov return new JoinContactListAdapter(getActivity()); 125e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 1266e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 1276e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov @Override 128e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov protected void configureAdapter() { 129e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov super.configureAdapter(); 130e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 131e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov adapter.setAllContactsListShown(mAllContactsListShown); 132e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov adapter.setTargetContactId(mTargetContactId); 1336e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov } 1346e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 1356e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov @Override 13659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov protected View inflateView(LayoutInflater inflater, ViewGroup container) { 13759fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov return inflater.inflate(R.layout.contacts_list_content_join, null); 1386e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov } 139caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov 140caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov @Override 14159fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov protected void onItemClick(int position, long id) { 142e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 143e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov int partition = adapter.getPartitionForPosition(position); 144e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov if (partition == JoinContactListAdapter.PARTITION_SHOW_ALL_CONTACTS) { 145e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov mAllContactsListShown = true; 146e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov configureAdapter(); 147e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov getLoaderManager().restartLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS, 148e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov null, mLoaderCallbacks); 149e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } else { 150e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov mListener.onPickContactAction(adapter.getContactUri(position)); 151e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 152caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov } 153e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov 154e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov @Override 155e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov public void startSearch(String initialQuery) { 156e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov ContactsRequest request = new ContactsRequest(); 157e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov request.setActionCode(ContactsRequest.ACTION_PICK_CONTACT); 1581c5c8e23849ac3babb2bdec65ec63c190a5c40dfDmitri Plotnikov request.setDirectorySearchEnabled(false); 159e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov ContactsSearchManager.startSearchForResult(getActivity(), initialQuery, 160e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov ACTIVITY_REQUEST_CODE_PICKER, request); 161e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov } 162e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov 163e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov @Override 164e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov public void onPickerResult(Intent data) { 165e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov mListener.onPickContactAction(data.getData()); 166e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov } 1676e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov} 168