1238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov/* 2238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 3238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * 4238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * you may not use this file except in compliance with the License. 6238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * You may obtain a copy of the License at 7238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * 8238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * 10238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * See the License for the specific language governing permissions and 14238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * limitations under the License. 15238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov */ 16238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovpackage com.android.contacts.list; 17238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 188c42b52d926475073e188d06c39c432945db781fJay Shraunerimport android.content.Context; 1984cac440813d6c151bf330998451ca1e3f6804b1Dave Santoroimport android.content.CursorLoader; 20ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelsonimport android.content.Intent; 21238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovimport android.database.Cursor; 22ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelsonimport android.provider.ContactsContract.Contacts; 231a57fb2749e5a777067d177184f50dda3fa5c4d7Dmitri Plotnikovimport android.text.TextUtils; 2434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawaimport android.util.Log; 25238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovimport android.view.LayoutInflater; 26238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovimport android.view.View; 27124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawaimport android.view.View.OnClickListener; 28238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovimport android.view.ViewGroup; 298907f66cdb60070f88ea006b8d747ac489ea0d6bDaisuke Miyakawaimport android.view.accessibility.AccessibilityEvent; 30ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelsonimport android.widget.Button; 31fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikovimport android.widget.FrameLayout; 32ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelsonimport android.widget.ListView; 33238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikovimport android.widget.TextView; 34238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 35e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 36a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListAdapter; 37a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ContactListFilter; 380d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.list.ContactListFilterController; 39fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowskiimport com.android.contacts.common.list.ContactListItemView; 40a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.DefaultContactListAdapter; 41a0233a048858f1593ea4924e9c5036f39aedbcddChiao Chengimport com.android.contacts.common.list.ProfileAndContactsLoader; 42e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.editor.ContactEditorFragment; 4330868d4ef831b6ff7b2e7a00027bb0222d93135dChiao Chengimport com.android.contacts.common.util.AccountFilterUtil; 44e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 45238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov/** 46238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * Fragment containing a contact list used for browsing (as compared to 47238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov * picking a contact with one of the PICK intents). 48238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov */ 496e850a046fcea8ba82a793b43944051246d08180Dmitri Plotnikovpublic class DefaultContactBrowseListFragment extends ContactBrowseListFragment { 5034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private static final String TAG = DefaultContactBrowseListFragment.class.getSimpleName(); 5134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa 5234b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private static final int REQUEST_CODE_ACCOUNT_FILTER = 1; 53238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 5436b27c6289a2e28db5dc7554762106d17437ecf3Isaac Katzenelson private TextView mCounterHeaderView; 5517abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov private View mSearchHeaderView; 5634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private View mAccountFilterHeader; 5708c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa private FrameLayout mProfileHeaderContainer; 58ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private View mProfileHeader; 59ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private Button mProfileMessage; 60ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private FrameLayout mMessageContainer; 6136d24d7ede42a252c82c4aa783b2231c5e2eea79Dave Santoro private TextView mProfileTitle; 62f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus private View mSearchProgress; 63f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus private TextView mSearchProgressText; 644b4681dbdedf60c5828ed7a6990097528df635f2Dmitri Plotnikov 65124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa private class FilterHeaderClickListener implements OnClickListener { 66124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa @Override 67124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa public void onClick(View view) { 6834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.startAccountFilterActivityForResult( 69b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus DefaultContactBrowseListFragment.this, 70b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus REQUEST_CODE_ACCOUNT_FILTER, 71b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus getFilter()); 72124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa } 73124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa } 74124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa private OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener(); 75124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa 769716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov public DefaultContactBrowseListFragment() { 779716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov setPhotoLoaderEnabled(true); 781ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov setSectionHeaderDisplayEnabled(true); 795245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(true); 809716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov } 819716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov 8284cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro @Override 838c42b52d926475073e188d06c39c432945db781fJay Shrauner public CursorLoader createCursorLoader(Context context) { 848c42b52d926475073e188d06c39c432945db781fJay Shrauner return new ProfileAndContactsLoader(context); 8584cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 8684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 8792a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov @Override 88238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov protected void onItemClick(int position, long id) { 8986092529f272b7ed2cee24fae397291696b29b80Dmitri Plotnikov viewContact(getAdapter().getContactUri(position)); 90238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 91238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 92238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 93238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov protected ContactListAdapter createListAdapter() { 940b976fc26e8eb09919cd24a4e13370d0ddb5ff38Dmitri Plotnikov DefaultContactListAdapter adapter = new DefaultContactListAdapter(getContext()); 95238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled()); 96fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowski boolean showPhoto = getResources().getBoolean(R.bool.config_browse_list_show_images); 97fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowski adapter.setDisplayPhotos(showPhoto); 98fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowski if (showPhoto) { 99fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowski boolean reverse = getResources().getBoolean(R.bool.config_browse_list_reverse_images); 100fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowski adapter.setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(reverse)); 101fd4df88d03a745728bb1c1df9648e7b5989641b6Paul Sliwowski } 102238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov return adapter; 103238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 104238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 105238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 106238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov protected View inflateView(LayoutInflater inflater, ViewGroup container) { 10734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa return inflater.inflate(R.layout.contact_list_content, null); 108238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 109238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 110238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 111bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov protected void onCreateView(LayoutInflater inflater, ViewGroup container) { 112bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov super.onCreateView(inflater, container); 113fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov 11434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mAccountFilterHeader = getView().findViewById(R.id.account_filter_header_container); 11534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mAccountFilterHeader.setOnClickListener(mFilterHeaderClickListener); 116914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki mCounterHeaderView = (TextView) getView().findViewById(R.id.contacts_count); 117495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan 118ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // Create an empty user profile header and hide it for now (it will be visible if the 119ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // contacts list will have no user profile). 120ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson addEmptyUserProfileHeader(inflater); 121ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson showEmptyUserProfile(false); 122ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 123fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov // Putting the header view inside a container will allow us to make 124fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov // it invisible later. See checkHeaderViewVisibility() 125fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov FrameLayout headerContainer = new FrameLayout(inflater.getContext()); 12617abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov mSearchHeaderView = inflater.inflate(R.layout.search_header, null, false); 12717abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov headerContainer.addView(mSearchHeaderView); 1288db1913dc30cd83ac27e10a4cfda12b4bf08dcfeDmitri Plotnikov getListView().addHeaderView(headerContainer, null, false); 129fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov checkHeaderViewVisibility(); 130f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus 131f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgress = getView().findViewById(R.id.search_progress); 132f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText = (TextView) mSearchHeaderView.findViewById(R.id.totalContactsText); 133fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov } 134fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov 135fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov @Override 1361db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki protected void setSearchMode(boolean flag) { 137fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov super.setSearchMode(flag); 138fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov checkHeaderViewVisibility(); 139f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus if (!flag) showSearchProgress(false); 140f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus } 141f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus 142f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus /** Show or hide the directory-search progress spinner. */ 143f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus private void showSearchProgress(boolean show) { 144f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgress.setVisibility(show ? View.VISIBLE : View.GONE); 145fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov } 146fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov 147fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov private void checkHeaderViewVisibility() { 14817abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov if (mCounterHeaderView != null) { 14917abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov mCounterHeaderView.setVisibility(isSearchMode() ? View.GONE : View.VISIBLE); 15017abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 151914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki updateFilterHeaderView(); 15217abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov 15317abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov // Hide the search header by default. See showCount(). 15417abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov if (mSearchHeaderView != null) { 15517abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov mSearchHeaderView.setVisibility(View.GONE); 156495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan } 157495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan } 158495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan 159495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan @Override 160495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan public void setFilter(ContactListFilter filter) { 161495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan super.setFilter(filter); 162914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki updateFilterHeaderView(); 163914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki } 164914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki 165914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki private void updateFilterHeaderView() { 16634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa if (mAccountFilterHeader == null) { 167a46c12688b3b900fb92922d160a11e82a1d6566aMakoto Onuki return; // Before onCreateView -- just ignore it. 168a46c12688b3b900fb92922d160a11e82a1d6566aMakoto Onuki } 16934b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa final ContactListFilter filter = getFilter(); 170b9225e3753f128c80d9643d04faba5354ca263daDaisuke Miyakawa if (filter != null && !isSearchMode()) { 17134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa final boolean shouldShowHeader = AccountFilterUtil.updateAccountFilterTitleForPeople( 17290f40d0162e4cee5b94bf3203c059e27f6472fabDaisuke Miyakawa mAccountFilterHeader, filter, false); 17334b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mAccountFilterHeader.setVisibility(shouldShowHeader ? View.VISIBLE : View.GONE); 17434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } else { 17534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mAccountFilterHeader.setVisibility(View.GONE); 176238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 177238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 178238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 179238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 180d5061fe322880ee993ea18db331fbc1110ddc538Dmitri Plotnikov protected void showCount(int partitionIndex, Cursor data) { 181fcfbe6a92a8a34b4a6ca784de02287647b903bb2Dmitri Plotnikov if (!isSearchMode() && data != null) { 182fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov int count = data.getCount(); 183f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov if (count != 0) { 1844d4b82bc40b181563d0ccc4e85a9936df66945e6Isaac Katzenelson count -= (mUserProfileExists ? 1: 0); 185f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov String format = getResources().getQuantityText( 186f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov R.plurals.listTotalAllContacts, count).toString(); 18730dff0f18a24d83cbb31d74bc6ab65736795ba81Itzhak Katzenelson // Do not count the user profile in the contacts count 188ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson if (mUserProfileExists) { 1894d4b82bc40b181563d0ccc4e85a9936df66945e6Isaac Katzenelson getAdapter().setContactsCount(String.format(format, count)); 190ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } else { 191ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mCounterHeaderView.setText(String.format(format, count)); 192ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 193f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov } else { 194f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov ContactListFilter filter = getFilter(); 195f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov int filterType = filter != null ? filter.filterType 196f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov : ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS; 197f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov switch (filterType) { 198f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov case ContactListFilter.FILTER_TYPE_ACCOUNT: 19936b27c6289a2e28db5dc7554762106d17437ecf3Isaac Katzenelson mCounterHeaderView.setText(getString( 200f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov R.string.listTotalAllContactsZeroGroup, filter.accountName)); 201f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov break; 202f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov case ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY: 20336b27c6289a2e28db5dc7554762106d17437ecf3Isaac Katzenelson mCounterHeaderView.setText(R.string.listTotalPhoneContactsZero); 204f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov break; 205f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov case ContactListFilter.FILTER_TYPE_STARRED: 20636b27c6289a2e28db5dc7554762106d17437ecf3Isaac Katzenelson mCounterHeaderView.setText(R.string.listTotalAllContactsZeroStarred); 207f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov break; 208f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov case ContactListFilter.FILTER_TYPE_CUSTOM: 20936b27c6289a2e28db5dc7554762106d17437ecf3Isaac Katzenelson mCounterHeaderView.setText(R.string.listTotalAllContactsZeroCustom); 210f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov break; 211f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov default: 21236b27c6289a2e28db5dc7554762106d17437ecf3Isaac Katzenelson mCounterHeaderView.setText(R.string.listTotalAllContactsZero); 213f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov break; 214f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov } 215f35faebc816c9b84b96e11393eb18f9001f411b5Dmitri Plotnikov } 21617abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } else { 21717abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov ContactListAdapter adapter = getAdapter(); 21817abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov if (adapter == null) { 21917abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov return; 22017abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 22117abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov 22217abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov // In search mode we only display the header if there is nothing found 2231a57fb2749e5a777067d177184f50dda3fa5c4d7Dmitri Plotnikov if (TextUtils.isEmpty(getQueryString()) || !adapter.areAllPartitionsEmpty()) { 22417abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov mSearchHeaderView.setVisibility(View.GONE); 225f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus showSearchProgress(false); 22617abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } else { 2278907f66cdb60070f88ea006b8d747ac489ea0d6bDaisuke Miyakawa mSearchHeaderView.setVisibility(View.VISIBLE); 22817abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov if (adapter.isLoading()) { 229f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText.setText(R.string.search_results_searching); 230f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus showSearchProgress(true); 23117abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } else { 232f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText.setText(R.string.listFoundAllContactsZero); 233f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText.sendAccessibilityEvent( 234f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus AccessibilityEvent.TYPE_VIEW_SELECTED); 235f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus showSearchProgress(false); 23617abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 23717abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 238ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson showEmptyUserProfile(false); 239238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 240238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 241ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 242ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson @Override 243ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson protected void setProfileHeader() { 244ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mUserProfileExists = getAdapter().hasProfile(); 245ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson showEmptyUserProfile(!mUserProfileExists && !isSearchMode()); 246ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 247ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 24834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa @Override 24934b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa public void onActivityResult(int requestCode, int resultCode, Intent data) { 25034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa if (requestCode == REQUEST_CODE_ACCOUNT_FILTER) { 25134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa if (getActivity() != null) { 25234b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.handleAccountFilterResult( 25334b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa ContactListFilterController.getInstance(getActivity()), resultCode, data); 25434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } else { 25534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa Log.e(TAG, "getActivity() returns null during Fragment#onActivityResult()"); 25634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } 25734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } 25834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } 25934b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa 260ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private void showEmptyUserProfile(boolean show) { 261ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // Changing visibility of just the mProfileHeader doesn't do anything unless 262ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // you change visibility of its children, hence the call to mCounterHeaderView 263ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // and mProfileTitle 26408c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa mProfileHeaderContainer.setVisibility(show ? View.VISIBLE : View.GONE); 265ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileHeader.setVisibility(show ? View.VISIBLE : View.GONE); 266ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mCounterHeaderView.setVisibility(show ? View.VISIBLE : View.GONE); 267ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileTitle.setVisibility(show ? View.VISIBLE : View.GONE); 268ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mMessageContainer.setVisibility(show ? View.VISIBLE : View.GONE); 269ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileMessage.setVisibility(show ? View.VISIBLE : View.GONE); 270ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 271ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 272ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson /** 273ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * This method creates a pseudo user profile contact. When the returned query doesn't have 274ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * a profile, this methods creates 2 views that are inserted as headers to the listview: 275ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * 1. A header view with the "ME" title and the contacts count. 276ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * 2. A button that prompts the user to create a local profile 277ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson */ 278ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private void addEmptyUserProfileHeader(LayoutInflater inflater) { 279ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 280ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson ListView list = getListView(); 281ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // Put a header with the "ME" name and a view for the number of contacts 28208c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa // The view is embedded in a frame view since you cannot change the visibility of a 28308c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa // view in a ListView without having a parent view. 28408c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa mProfileHeaderContainer = new FrameLayout(inflater.getContext()); 285ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileHeader = inflater.inflate(R.layout.user_profile_header, null, false); 286ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mCounterHeaderView = (TextView) mProfileHeader.findViewById(R.id.contacts_count); 28736d24d7ede42a252c82c4aa783b2231c5e2eea79Dave Santoro mProfileTitle = (TextView) mProfileHeader.findViewById(R.id.profile_title); 28808c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa mProfileHeaderContainer.addView(mProfileHeader); 28908c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa list.addHeaderView(mProfileHeaderContainer, null, false); 290ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 291ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // Add a selectable view with a message inviting the user to create a local profile 292ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mMessageContainer = new FrameLayout(inflater.getContext()); 293ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileMessage = (Button)inflater.inflate(R.layout.user_profile_button, null, false); 294ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mMessageContainer.addView(mProfileMessage); 295ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson list.addHeaderView(mMessageContainer, null, true); 296ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 297ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileMessage.setOnClickListener(new View.OnClickListener() { 298ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson public void onClick(View v) { 299ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 300ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, true); 301ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson startActivity(intent); 302ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 303ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson }); 304ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 305238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov} 306