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 18caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport com.android.contacts.R; 196e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 20e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.app.Activity; 21e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikovimport android.app.LoaderManager.LoaderCallbacks; 22e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.content.ContentUris; 233c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.CursorLoader; 24e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikovimport android.content.Intent; 253c46291ef057eaf7b7f8ca5971e59bebe734a660Jeff Hamiltonimport android.content.Loader; 26e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.database.Cursor; 27e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.os.Bundle; 28e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.provider.ContactsContract.Contacts; 29caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.LayoutInflater; 30caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikovimport android.view.View; 3159fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikovimport android.view.ViewGroup; 32e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovimport android.widget.TextView; 336e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 346e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov/** 3559fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov * Fragment for the Join Contact list. 366e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov */ 37e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikovpublic class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> { 38e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 39e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov private static final int DISPLAY_NAME_LOADER = -2; 40e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 41a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa private static final String KEY_TARGET_CONTACT_ID = "targetContactId"; 42d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov 43e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov private OnContactPickerActionListener mListener; 44e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov private long mTargetContactId; 45e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 46a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa private final 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: { 79a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa Cursor suggestionsCursor = ((JoinContactLoader) loader).getSuggestionsCursor(); 80d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov onContactListLoaded(suggestionsCursor, data); 81e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov break; 82e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 83e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 84e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov } 85d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov 864ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn public void onLoaderReset(Loader<Cursor> loader) { 874ef95cc3329b4ad9fa450e4090efaad9935d493fDianne Hackborn } 88e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov }; 89e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov 90e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public JoinContactListFragment() { 91e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov setPhotoLoaderEnabled(true); 92e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov setSectionHeaderDisplayEnabled(true); 935245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(false); 94b22ca30163f5f99f07b906c20fd1a798541448a5Dmitri Plotnikov setQuickContactEnabled(false); 95e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 96e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 97e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public void setOnContactPickerActionListener(OnContactPickerActionListener listener) { 98e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov mListener = listener; 99e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 100e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 101e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov @Override 102fec29c7320c6c45aff69dbd6ec0edb267fb402f4Daniel Lehmann protected void startLoading() { 1034e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov configureAdapter(); 1044e0ce3fb44125453e0ad723d7e3d3e89ad639e01Dmitri Plotnikov 105e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov getLoaderManager().initLoader(DISPLAY_NAME_LOADER, null, mLoaderCallbacks); 106e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov getLoaderManager().initLoader(JoinContactListAdapter.PARTITION_ALL_CONTACTS, 107e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov null, mLoaderCallbacks); 108e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 109e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 110a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa private void onContactListLoaded(Cursor suggestionsCursor, Cursor allContactsCursor) { 111d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 112d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov adapter.setSuggestionsCursor(suggestionsCursor); 113a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa setVisibleScrollbarEnabled(true); 114a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa onPartitionLoaded(JoinContactListAdapter.PARTITION_ALL_CONTACTS, allContactsCursor); 115d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov } 116d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov 117e2bbe1db7e21e5c1ade79dd2dc74216f82b65e01Dmitri Plotnikov private void showTargetContactName(String displayName) { 118e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov Activity activity = getActivity(); 119a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa TextView blurbView = (TextView) activity.findViewById(R.id.join_contact_blurb); 120e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov String blurb = activity.getString(R.string.blurbJoinContactDataWith, displayName); 121e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov blurbView.setText(blurb); 122e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 123e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 124e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public void setTargetContactId(long targetContactId) { 125e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov mTargetContactId = targetContactId; 126e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 127e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov 128e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov @Override 129e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov public JoinContactListAdapter createListAdapter() { 130e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov return new JoinContactListAdapter(getActivity()); 131e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov } 1326e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 1336e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov @Override 134e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov protected void configureAdapter() { 135e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov super.configureAdapter(); 136e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 137e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov adapter.setTargetContactId(mTargetContactId); 1386e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov } 1396e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov 1406e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov @Override 14159fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov protected View inflateView(LayoutInflater inflater, ViewGroup container) { 142d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov return inflater.inflate(R.layout.join_contact_picker_list_content, null); 1436e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov } 144caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov 145caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov @Override 14659fb48e7e6a37f26901ad5a4996947dcd25a73d9Dmitri Plotnikov protected void onItemClick(int position, long id) { 147e4d32d92b10c1c1ce89c7a3ee4111a030e6afcf9Dmitri Plotnikov JoinContactListAdapter adapter = getAdapter(); 148e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov int partition = adapter.getPartitionForPosition(position); 149a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa mListener.onPickContactAction(adapter.getContactUri(position)); 150caf498bd71e2ab4b6771cfa17453dd827041f238Dmitri Plotnikov } 151e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov 152e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov @Override 153e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov public void onPickerResult(Intent data) { 154e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov mListener.onPickContactAction(data.getData()); 155e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov } 156d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov 157d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov @Override 158d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov public void onSaveInstanceState(Bundle outState) { 159d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov super.onSaveInstanceState(outState); 160a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa outState.putLong(KEY_TARGET_CONTACT_ID, mTargetContactId); 161d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov } 162d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov 163d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov @Override 164d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov public void restoreSavedState(Bundle savedState) { 165d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov super.restoreSavedState(savedState); 166d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov if (savedState != null) { 167a8729cdf778f9ca927b06afde685f7ac6b8c917fDaisuke Miyakawa mTargetContactId = savedState.getLong(KEY_TARGET_CONTACT_ID); 168d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov } 169d8f84e076b762f063ae498c297d6f02574099dd2Dmitri Plotnikov } 1706e2009d58fdcf098cab033729d4a3b2444c2181cDmitri Plotnikov} 171