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; 21b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwellimport android.net.Uri; 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 5417abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov private View mSearchHeaderView; 5534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa private View mAccountFilterHeader; 5608c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa private FrameLayout mProfileHeaderContainer; 57ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private View mProfileHeader; 58ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private Button mProfileMessage; 5936d24d7ede42a252c82c4aa783b2231c5e2eea79Dave Santoro private TextView mProfileTitle; 60f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus private View mSearchProgress; 61f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus private TextView mSearchProgressText; 624b4681dbdedf60c5828ed7a6990097528df635f2Dmitri Plotnikov 63124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa private class FilterHeaderClickListener implements OnClickListener { 64124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa @Override 65124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa public void onClick(View view) { 6634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.startAccountFilterActivityForResult( 67b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus DefaultContactBrowseListFragment.this, 68b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus REQUEST_CODE_ACCOUNT_FILTER, 69b6553457d0c3e84eefa0a853090b680090a7b2f9Josh Gargus getFilter()); 70124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa } 71124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa } 72124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa private OnClickListener mFilterHeaderClickListener = new FilterHeaderClickListener(); 73124e5cbea97366d4db1fa5ffe59efedd5913adedDaisuke Miyakawa 749716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov public DefaultContactBrowseListFragment() { 759716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov setPhotoLoaderEnabled(true); 768a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwell // Don't use a QuickContactBadge. Just use a regular ImageView. Using a QuickContactBadge 778a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwell // inside the ListView prevents us from using MODE_FULLY_EXPANDED and messes up ripples. 788a6f4ade05e5a8a89d91078ef9c22944450ac8baBrian Attwell setQuickContactEnabled(false); 791ce1e7cf261994e46e6fe85ed4d445241ad55f16Dmitri Plotnikov setSectionHeaderDisplayEnabled(true); 805245ea63b4cca18ee504b27abd534fc13d33dea9Dmitri Plotnikov setVisibleScrollbarEnabled(true); 819716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov } 829716d05319f62719019496ee7a97488c2ab9a9a8Dmitri Plotnikov 8384cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro @Override 848c42b52d926475073e188d06c39c432945db781fJay Shrauner public CursorLoader createCursorLoader(Context context) { 858c42b52d926475073e188d06c39c432945db781fJay Shrauner return new ProfileAndContactsLoader(context); 8684cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro } 8784cac440813d6c151bf330998451ca1e3f6804b1Dave Santoro 8892a6fdf1b07b8f1447560174e24455fd46aee7cdDmitri Plotnikov @Override 89238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov protected void onItemClick(int position, long id) { 90b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell final Uri uri = getAdapter().getContactUri(position); 91b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell if (uri == null) { 92b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell return; 93b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell } 94b831b14466d640fe260ba2e752c88c7fcd62a14bBrian Attwell viewContact(uri); 95238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 96238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 97238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 98238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov protected ContactListAdapter createListAdapter() { 990b976fc26e8eb09919cd24a4e13370d0ddb5ff38Dmitri Plotnikov DefaultContactListAdapter adapter = new DefaultContactListAdapter(getContext()); 100238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled()); 101dff843a3b4c84cc38384a576638270c6c80bc5c8Brian Attwell adapter.setDisplayPhotos(true); 102dff843a3b4c84cc38384a576638270c6c80bc5c8Brian Attwell adapter.setPhotoPosition( 103dff843a3b4c84cc38384a576638270c6c80bc5c8Brian Attwell ContactListItemView.getDefaultPhotoPosition(/* opposite = */ false)); 104238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov return adapter; 105238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 106238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 107238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 108238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov protected View inflateView(LayoutInflater inflater, ViewGroup container) { 10934b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa return inflater.inflate(R.layout.contact_list_content, null); 110238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 111238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov 112238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov @Override 113bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov protected void onCreateView(LayoutInflater inflater, ViewGroup container) { 114bba62ac4a2d519be8e4896261d14b168fa49fbdfDmitri Plotnikov super.onCreateView(inflater, container); 115fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov 11634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mAccountFilterHeader = getView().findViewById(R.id.account_filter_header_container); 11734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa mAccountFilterHeader.setOnClickListener(mFilterHeaderClickListener); 118495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan 119ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // Create an empty user profile header and hide it for now (it will be visible if the 120ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // contacts list will have no user profile). 121ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson addEmptyUserProfileHeader(inflater); 122ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson showEmptyUserProfile(false); 123ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 124fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov // Putting the header view inside a container will allow us to make 125fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov // it invisible later. See checkHeaderViewVisibility() 126fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov FrameLayout headerContainer = new FrameLayout(inflater.getContext()); 12717abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov mSearchHeaderView = inflater.inflate(R.layout.search_header, null, false); 12817abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov headerContainer.addView(mSearchHeaderView); 1298db1913dc30cd83ac27e10a4cfda12b4bf08dcfeDmitri Plotnikov getListView().addHeaderView(headerContainer, null, false); 130fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov checkHeaderViewVisibility(); 131f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus 132f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgress = getView().findViewById(R.id.search_progress); 133f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText = (TextView) mSearchHeaderView.findViewById(R.id.totalContactsText); 134fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov } 135fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov 136fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov @Override 1371db00f68b34f6cf7e9d19fedb559cf12f8c05e9cMakoto Onuki protected void setSearchMode(boolean flag) { 138fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov super.setSearchMode(flag); 139fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov checkHeaderViewVisibility(); 140f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus if (!flag) showSearchProgress(false); 141f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus } 142f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus 143f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus /** Show or hide the directory-search progress spinner. */ 144f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus private void showSearchProgress(boolean show) { 145e599bf0b2e77167e6b3bcce5db69102d65bebb9dAndrew Lee if (mSearchProgress != null) { 146e599bf0b2e77167e6b3bcce5db69102d65bebb9dAndrew Lee mSearchProgress.setVisibility(show ? View.VISIBLE : View.GONE); 147e599bf0b2e77167e6b3bcce5db69102d65bebb9dAndrew Lee } 148fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov } 149fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov 150fe3f79046be7012349fe9cac0fa89c00945ce737Dmitri Plotnikov private void checkHeaderViewVisibility() { 151914e8a18c41cfea1df45a57da12194351c64764cMakoto Onuki updateFilterHeaderView(); 15217abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov 153e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee // Hide the search header by default. 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 180e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee protected void setProfileHeader() { 181e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee mUserProfileExists = getAdapter().hasProfile(); 182e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee showEmptyUserProfile(!mUserProfileExists && !isSearchMode()); 183e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee 184e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee if (isSearchMode()) { 18517abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov ContactListAdapter adapter = getAdapter(); 18617abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov if (adapter == null) { 18717abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov return; 18817abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 18917abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov 19017abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov // In search mode we only display the header if there is nothing found 1911a57fb2749e5a777067d177184f50dda3fa5c4d7Dmitri Plotnikov if (TextUtils.isEmpty(getQueryString()) || !adapter.areAllPartitionsEmpty()) { 19217abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov mSearchHeaderView.setVisibility(View.GONE); 193f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus showSearchProgress(false); 19417abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } else { 1958907f66cdb60070f88ea006b8d747ac489ea0d6bDaisuke Miyakawa mSearchHeaderView.setVisibility(View.VISIBLE); 19617abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov if (adapter.isLoading()) { 197f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText.setText(R.string.search_results_searching); 198f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus showSearchProgress(true); 19917abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } else { 200f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText.setText(R.string.listFoundAllContactsZero); 201f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus mSearchProgressText.sendAccessibilityEvent( 202f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus AccessibilityEvent.TYPE_VIEW_SELECTED); 203f4aaa475a8e005a93f7e2dfae8c09e68f129a48bJosh Gargus showSearchProgress(false); 20417abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 20517abbae56d5f18f22fdf975ef279d5a32cd15e97Dmitri Plotnikov } 206ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson showEmptyUserProfile(false); 207238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 208238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov } 209ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 210ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson @Override 21134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa public void onActivityResult(int requestCode, int resultCode, Intent data) { 21234b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa if (requestCode == REQUEST_CODE_ACCOUNT_FILTER) { 21334b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa if (getActivity() != null) { 21434b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa AccountFilterUtil.handleAccountFilterResult( 21534b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa ContactListFilterController.getInstance(getActivity()), resultCode, data); 21634b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } else { 21734b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa Log.e(TAG, "getActivity() returns null during Fragment#onActivityResult()"); 21834b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } 21934b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } 22034b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa } 22134b901ca7781cf7fdd4f6275ef98ae73c95749c2Daisuke Miyakawa 222ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private void showEmptyUserProfile(boolean show) { 223ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // Changing visibility of just the mProfileHeader doesn't do anything unless 224ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // you change visibility of its children, hence the call to mCounterHeaderView 225ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson // and mProfileTitle 22608c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa mProfileHeaderContainer.setVisibility(show ? View.VISIBLE : View.GONE); 227ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileHeader.setVisibility(show ? View.VISIBLE : View.GONE); 228ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileTitle.setVisibility(show ? View.VISIBLE : View.GONE); 229ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileMessage.setVisibility(show ? View.VISIBLE : View.GONE); 230ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 231ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 232ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson /** 233ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * This method creates a pseudo user profile contact. When the returned query doesn't have 234ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * a profile, this methods creates 2 views that are inserted as headers to the listview: 235ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * 1. A header view with the "ME" title and the contacts count. 236ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson * 2. A button that prompts the user to create a local profile 237ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson */ 238ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson private void addEmptyUserProfileHeader(LayoutInflater inflater) { 239ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson ListView list = getListView(); 240e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee // Add a header with the "ME" name. The view is embedded in a frame view since you cannot 241e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee // change the visibility of a view in a ListView without having a parent view. 242ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileHeader = inflater.inflate(R.layout.user_profile_header, null, false); 24336d24d7ede42a252c82c4aa783b2231c5e2eea79Dave Santoro mProfileTitle = (TextView) mProfileHeader.findViewById(R.id.profile_title); 244e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee mProfileHeaderContainer = new FrameLayout(inflater.getContext()); 24508c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa mProfileHeaderContainer.addView(mProfileHeader); 24608c87460331cbab92e94d96b704bd8f713a65202Daisuke Miyakawa list.addHeaderView(mProfileHeaderContainer, null, false); 247ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson 248e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee // Add a button with a message inviting the user to create a local profile 249e15828e840217d1f0035c826c45f16b1129e9f2fAndrew Lee mProfileMessage = (Button) mProfileHeader.findViewById(R.id.user_profile_button); 250ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson mProfileMessage.setOnClickListener(new View.OnClickListener() { 251ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson public void onClick(View v) { 252ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson Intent intent = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI); 253ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson intent.putExtra(ContactEditorFragment.INTENT_EXTRA_NEW_LOCAL_PROFILE, true); 254ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson startActivity(intent); 255ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 256ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson }); 257ead19c5eafee0ffb43b02a4ae75ac5244ad3f853Isaac Katzenelson } 258238d9847d8f2ace658fb7337c8847a2088ddc9d1Dmitri Plotnikov} 259