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