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