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.DirectoryListLoader; 3230868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder; 3330868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener; 34e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 35732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov/** 36416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * Fragment for the contact list used for browsing contacts (as compared to 37416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov * picking a contact with one of the PICK or SHORTCUT intents). 38732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov */ 39413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikovpublic class ContactPickerFragment extends ContactEntryListFragment<ContactEntryListAdapter> 408a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov implements OnShortcutIntentCreatedListener { 41732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 4286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private static final String KEY_EDIT_MODE = "editMode"; 4386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private static final String KEY_CREATE_CONTACT_ENABLED = "createContactEnabled"; 4486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private static final String KEY_SHORTCUT_REQUESTED = "shortcutRequested"; 4586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 46416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov private OnContactPickerActionListener mListener; 47732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov private boolean mCreateContactEnabled; 4886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov private boolean mEditMode; 498a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov private boolean mShortcutRequested; 50732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 51d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov public ContactPickerFragment() { 52d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov setPhotoLoaderEnabled(true); 53d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov setSectionHeaderDisplayEnabled(true); 545245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(true); 5584b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov setQuickContactEnabled(false); 564d174aad97cd382f810e3bf1a7f1f4f4772be118Dmitri Plotnikov setDirectorySearchMode(DirectoryListLoader.SEARCH_MODE_CONTACT_SHORTCUT); 57d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov } 58d621f71428a7fd1aa15bd101423c9a690b44ea07Dmitri Plotnikov 59416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov public void setOnContactPickerActionListener(OnContactPickerActionListener listener) { 60732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov mListener = listener; 61732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 62732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 638a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov public boolean isCreateContactEnabled() { 648a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov return mCreateContactEnabled; 658a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov } 668a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 67b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov public void setCreateContactEnabled(boolean flag) { 68b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov this.mCreateContactEnabled = flag; 69b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 70b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 7186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public boolean isEditMode() { 7286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov return mEditMode; 7386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 7486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 7586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void setEditMode(boolean flag) { 7686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mEditMode = flag; 7786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 7886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 798a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov public void setShortcutRequested(boolean flag) { 808a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov mShortcutRequested = flag; 81b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 82b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 83b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov @Override 8486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void onSaveInstanceState(Bundle outState) { 8586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov super.onSaveInstanceState(outState); 8686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov outState.putBoolean(KEY_EDIT_MODE, mEditMode); 8786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov outState.putBoolean(KEY_CREATE_CONTACT_ENABLED, mCreateContactEnabled); 8886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov outState.putBoolean(KEY_SHORTCUT_REQUESTED, mShortcutRequested); 8986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 9086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 9186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov @Override 9286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void restoreSavedState(Bundle savedState) { 9386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov super.restoreSavedState(savedState); 9486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 9586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov if (savedState == null) { 9686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov return; 9786092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 9886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 9986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mEditMode = savedState.getBoolean(KEY_EDIT_MODE); 10086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mCreateContactEnabled = savedState.getBoolean(KEY_CREATE_CONTACT_ENABLED); 10186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov mShortcutRequested = savedState.getBoolean(KEY_SHORTCUT_REQUESTED); 10286092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 10386092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 10486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov @Override 105bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov protected void onCreateView(LayoutInflater inflater, ViewGroup container) { 106bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov super.onCreateView(inflater, container); 107bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell if (mCreateContactEnabled && isLegacyCompatibilityMode()) { 108bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell // Since we are using the legacy adapter setShowCreateContact(true) isn't supported. 109bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell // So we need to add an ugly header above the list. 110b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov getListView().addHeaderView(inflater.inflate(R.layout.create_new_contact, null, false)); 111b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 112b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 113b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 114732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov @Override 115b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 1169e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang if (position == 0 && mCreateContactEnabled && mListener != null) { 117b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov mListener.onCreateNewContactAction(); 118b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } else { 119b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov super.onItemClick(parent, view, position, id); 120b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 121b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov } 122b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 123b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov @Override 124732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov protected void onItemClick(int position, long id) { 125d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov Uri uri; 126d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov if (isLegacyCompatibilityMode()) { 127d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov uri = ((LegacyContactListAdapter)getAdapter()).getPersonUri(position); 128416b569901ce4c577c1f76c3f29496d1adab29e1Dmitri Plotnikov } else { 129d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov uri = ((ContactListAdapter)getAdapter()).getContactUri(position); 130d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 131b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell if (uri == null) { 132b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell return; 133b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell } 13486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov if (mEditMode) { 13586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov editContact(uri); 13686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } else if (mShortcutRequested) { 137d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov ShortcutIntentBuilder builder = new ShortcutIntentBuilder(getActivity(), this); 138d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov builder.createContactShortcutIntent(uri); 139d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } else { 14086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov pickContact(uri); 141732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 142732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 143732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 14486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void createNewContact() { 1459e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang if (mListener != null) { 1469e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang mListener.onCreateNewContactAction(); 1479e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang } 14886092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 14986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 15086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void editContact(Uri contactUri) { 1519e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang if (mListener != null) { 1529e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang mListener.onEditContactAction(contactUri); 1539e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang } 15486092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 15586092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 15686092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov public void pickContact(Uri uri) { 1579e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang if (mListener != null) { 1589e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang mListener.onPickContactAction(uri); 1599e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang } 16086092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov } 16186092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov 162732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov @Override 163413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov protected ContactEntryListAdapter createListAdapter() { 1641ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov if (!isLegacyCompatibilityMode()) { 165bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell HeaderEntryContactListAdapter adapter 166bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell = new HeaderEntryContactListAdapter(getActivity()); 167be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan adapter.setFilter(ContactListFilter.createFilterWithType( 168be18de05d6f6a107c552e369bce58f51c946fde7Katherine Kuan ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS)); 169413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setSectionHeaderDisplayEnabled(true); 170413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setDisplayPhotos(true); 171413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setQuickContactEnabled(false); 172bbd220183e9bc6d0b056af3c68fa4a31f5b747f2Brian Attwell adapter.setShowCreateContact(mCreateContactEnabled); 173413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov return adapter; 174413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov } else { 175413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov LegacyContactListAdapter adapter = new LegacyContactListAdapter(getActivity()); 176413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setSectionHeaderDisplayEnabled(false); 177413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov adapter.setDisplayPhotos(false); 178413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov return adapter; 179413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov } 180413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov } 181b6c7c6f8feddc476f84e28289fe9491327db1788Dmitri Plotnikov 182413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov @Override 183413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov protected void configureAdapter() { 184413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov super.configureAdapter(); 185d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 186413772711054c9fca8bf0c22bc81f613c883ae7eDmitri Plotnikov ContactEntryListAdapter adapter = getAdapter(); 187e44b043f8a49c0974bd2f705f98ac3277aaf1b67Dmitri Plotnikov 18868e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov // If "Create new contact" is shown, don't display the empty list UI 18968e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov adapter.setEmptyListEnabled(!isCreateContactEnabled()); 190732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 191732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov 192732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov @Override 193732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov protected View inflateView(LayoutInflater inflater, ViewGroup container) { 19484b3cc7fd565ff911ac46a763fdc2f5740a18001Dmitri Plotnikov return inflater.inflate(R.layout.contact_picker_content, null); 195732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov } 1968a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov 19768e32a3e3248a36f90e43e4f970ebe0196e74e43Dmitri Plotnikov @Override 1988a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov public void onShortcutIntentCreated(Uri uri, Intent shortcutIntent) { 1999e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang if (mListener != null) { 2009e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang mListener.onShortcutIntentCreated(shortcutIntent); 2019e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang } 2028a7831944232fd01740492b39bc67d746213b82bDmitri Plotnikov } 203d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov 204d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov @Override 205e8a9517483cfa0c4d521b834d872a8cb05482badDmitri Plotnikov public void onPickerResult(Intent data) { 2069e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang if (mListener != null) { 2079e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang mListener.onPickContactAction(data.getData()); 2089e2306198e2c0819cf852b61cb0dbaef63af1c91Walter Jang } 209d3758b00601ce3ff8c4336b45cc1249806e52c13Dmitri Plotnikov } 210732f65236e7f804941e84757c077a84eb11eab16Dmitri Plotnikov} 211