1732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/* 2732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 3732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * 4732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * you may not use this file except in compliance with the License. 6732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * You may obtain a copy of the License at 7732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * 8732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * 10732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * See the License for the specific language governing permissions and 14732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov * limitations under the License. 15732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */ 16732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovpackage com.android.contacts.list; 17732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 188a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikovimport android.content.Intent; 198a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikovimport android.net.Uri; 2086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikovimport android.os.Bundle; 21732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.view.LayoutInflater; 22732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.view.View; 23732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikovimport android.view.ViewGroup; 24b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikovimport android.widget.AdapterView; 25732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 26e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 27a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactEntryListAdapter; 28821a657d618285c04cbb3c440f1777a08381f868Chiao Chengimport com.android.contacts.common.list.ContactEntryListFragment; 29a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListAdapter; 30a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter; 31a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DefaultContactListAdapter; 32a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DirectoryListLoader; 3330868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder; 3430868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener; 35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 36732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/** 37416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * Fragment for the contact list used for browsing contacts (as compared to 38416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * picking a contact with one of the PICK or SHORTCUT intents). 39732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */ 40413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikovpublic class ContactPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter> 418a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov implements OnShortcutIntentCreatedListener { 42732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 4386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private static final String KEY_EDIT_MODE = "editMode"; 4486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled"; 4586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private static final String KEY_SHORTCUT_REQUESTED = "shortcutRequested"; 4686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 47416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov private OnContactPickerActionListener mListener; 48732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov private boolean mCreateContactEnabled; 4986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private boolean mEditMode; 508a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov private boolean mShortcutRequested; 51732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 52d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov public ContactPickerFragment() { 53d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov setPhotoLoaderEnabled(true); 54d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov setSectionHeaderDisplayEnabled(true); 555245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(true); 5684b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov setQuickContactEnabled(false); 574d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_CONTACT_SHORTCUT); 58d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov } 59d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov 60416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov public void setOnContactPickerActionListener(OnContactPickerActionListener listener) { 61732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov mListener = listener; 62732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 63732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 648a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov public boolean isCreateContactEnabled() { 658a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov return mCreateContactEnabled; 668a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov } 678a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 68b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov public void setCreateContactEnabled(boolean flag) { 69b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov this.mCreateContactEnabled = flag; 70b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 71b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 7286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public boolean isEditMode() { 7386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov return mEditMode; 7486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 7586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 7686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void setEditMode(boolean flag) { 7786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mEditMode = flag; 7886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 7986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 808a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov public void setShortcutRequested(boolean flag) { 818a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov mShortcutRequested = flag; 82b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 83b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 84b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov @Override 8586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void onSaveInstanceState(Bundle outState) { 8686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov super.onSaveInstanceState(outState); 8786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov outState.putBoolean(KEY_EDIT_MODE, mEditMode); 8886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled); 8986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov outState.putBoolean(KEY_SHORTCUT_REQUESTED, mShortcutRequested); 9086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 9186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 9286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov @Override 9386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void restoreSavedState(Bundle savedState) { 9486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov super.restoreSavedState(savedState); 9586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 9686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov if (savedState == null) { 9786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov return; 9886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 9986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 10086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mEditMode = savedState.getBoolean(KEY_EDIT_MODE); 10186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED); 10286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mShortcutRequested = savedState.getBoolean(KEY_SHORTCUT_REQUESTED); 10386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 10486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 10586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov @Override 106bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov protected void onCreateView(LayoutInflater inflater, ViewGroup container) { 107bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov super.onCreateView(inflater, container); 108b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov if (mCreateContactEnabled) { 109b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov getListView().addHeaderView(inflater.inflate(R.layout.create_new_contact, null, false)); 110b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 111b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 112b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 113732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov @Override 114b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 11586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov if (position == 0 && mCreateContactEnabled) { 116b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov mListener.onCreateNewContactAction(); 117b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } else { 118b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov super.onItemClick(parent, view, position, id); 119b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 120b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 121b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 122b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov @Override 123732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov protected void onItemClick(int position, long id) { 124d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov Uri uri; 125d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov if (isLegacyCompatibilityMode()) { 126d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position); 127416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov } else { 128d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov uri = ((ContactListAdapter)getAdapter()).getContactUri(position); 129d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 13086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov if (mEditMode) { 13186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov editContact(uri); 13286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } else if (mShortcutRequested) { 133d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this); 134d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov builder.createContactShortcutIntent(uri); 135d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } else { 13686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov pickContact(uri); 137732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 138732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 139732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 14086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void createNewContact() { 14186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mListener.onCreateNewContactAction(); 14286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 14386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 14486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void editContact(Uri contactUri) { 14586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mListener.onEditContactAction(contactUri); 14686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 14786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 14886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void pickContact(Uri uri) { 14986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mListener.onPickContactAction(uri); 15086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 15186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 152732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov @Override 153413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov protected ContactEntryListAdapter createListAdapter() { 1541ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (!isLegacyCompatibilityMode()) { 15558be7ed2428ba22400cc342f5e07e8ff99e91380Dmitri Plotnikov DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity()); 156be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan adapter.setFilter(ContactListFilter.createFilterWithType( 157be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS)); 158413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setSectionHeaderDisplayEnabled(true); 159413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setDisplayPhotos(true); 160413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setQuickContactEnabled(false); 161413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov return adapter; 162413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov } else { 163413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov LegacyContactListAdapter adapter = new LegacyContactListAdapter(getActivity()); 164413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setSectionHeaderDisplayEnabled(false); 165413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setDisplayPhotos(false); 166413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov return adapter; 167413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov } 168413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov } 169b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 170413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov @Override 171413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov protected void configureAdapter() { 172413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov super.configureAdapter(); 173d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 174413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov ContactEntryListAdapter adapter = getAdapter(); 175e44b043f8a49c0974bd2f705f98ac3277aaf1b67Dmitri Plotnikov 17668e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov // If "Create new contact" is shown, don't display the empty list UI 17768e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov adapter.setEmptyListEnabled(!isCreateContactEnabled()); 178732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 179732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 180732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov @Override 181732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov protected View inflateView(LayoutInflater inflater, ViewGroup container) { 18284b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov return inflater.inflate(R.layout.contact_picker_content, null); 183732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 1848a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 18568e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov @Override 1868a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) { 1878a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov mListener.onShortcutIntentCreated(shortcutIntent); 1888a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov } 189d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 190d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov @Override 191e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov public void onPickerResult(Intent data) { 192e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov mListener.onPickContactAction(data.getData()); 193d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 194732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov} 195