1495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan/*
2495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * Copyright (C) 2011 The Android Open Source Project
3495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan *
4495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * Licensed under the Apache License, Version 2.0 (the "License");
5495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * you may not use this file except in compliance with the License.
6495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * You may obtain a copy of the License at
7495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan *
8495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan *      http://www.apache.org/licenses/LICENSE-2.0
9495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan *
10495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * Unless required by applicable law or agreed to in writing, software
11495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * distributed under the License is distributed on an "AS IS" BASIS,
12495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * See the License for the specific language governing permissions and
14495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * limitations under the License.
15495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan */
16495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
17495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanpackage com.android.contacts.list;
18495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
19495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport com.android.contacts.ContactsActivity;
20495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport com.android.contacts.R;
21495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport com.android.contacts.model.AccountType;
22495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport com.android.contacts.model.AccountTypeManager;
232b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoroimport com.android.contacts.model.AccountWithDataSet;
24b5e4419f4ba06d630331669a08613936889f34dfMakoto Onukiimport com.google.android.collect.Lists;
25495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
26495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.app.ActionBar;
27495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.app.Activity;
28b5e4419f4ba06d630331669a08613936889f34dfMakoto Onukiimport android.app.LoaderManager.LoaderCallbacks;
29b5e4419f4ba06d630331669a08613936889f34dfMakoto Onukiimport android.content.AsyncTaskLoader;
30495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.content.Context;
31495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.content.Intent;
32b5e4419f4ba06d630331669a08613936889f34dfMakoto Onukiimport android.content.Loader;
33495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.graphics.drawable.Drawable;
34495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.os.Bundle;
35b5e4419f4ba06d630331669a08613936889f34dfMakoto Onukiimport android.util.Log;
36495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.view.LayoutInflater;
37495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.view.MenuItem;
38495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.view.View;
39495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.view.ViewGroup;
40495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.widget.AdapterView;
41495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.widget.BaseAdapter;
42495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport android.widget.ListView;
43495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
44495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport java.util.ArrayList;
45495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanimport java.util.List;
46495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
47495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan/**
48495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * Shows a list of all available accounts, letting the user select under which account to view
49495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan * contacts.
50495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan */
51495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuanpublic class AccountFilterActivity extends ContactsActivity
52495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        implements AdapterView.OnItemClickListener {
53495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
54495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    private static final String TAG = AccountFilterActivity.class.getSimpleName();
55495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
568f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa    private static final int SUBACTIVITY_CUSTOMIZE_FILTER = 0;
578f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa
58495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
59495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
60b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    private static final int FILTER_LOADER_ID = 0;
61b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
62495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    private ListView mListView;
63495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
64495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    @Override
65495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    protected void onCreate(Bundle icicle) {
66495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        super.onCreate(icicle);
67495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        setContentView(R.layout.contact_list_filter);
68495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
69495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        mListView = (ListView) findViewById(com.android.internal.R.id.list);
708f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        mListView.setOnItemClickListener(this);
71495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
728f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        ActionBar actionBar = getActionBar();
73495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        if (actionBar != null) {
74495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            actionBar.setDisplayHomeAsUpEnabled(true);
75495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
76495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
77b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        getLoaderManager().initLoader(FILTER_LOADER_ID, null, new MyLoaderCallbacks());
78495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    }
79495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
80b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    private static class FilterLoader extends AsyncTaskLoader<List<ContactListFilter>> {
81b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        private Context mContext;
82b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
83b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        public FilterLoader(Context context) {
84b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            super(context);
85b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            mContext = context;
86b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
87b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
88b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
89b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        public List<ContactListFilter> loadInBackground() {
90b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            return loadAccountFilters(mContext);
91b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
92b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
93b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
94b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        protected void onStartLoading() {
95b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            forceLoad();
96b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
97b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
98b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
99b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        protected void onStopLoading() {
100b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            cancelLoad();
101b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
102b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
103b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
104b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        protected void onReset() {
105b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            onStopLoading();
106b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
107b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    }
108b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
109b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    private static List<ContactListFilter> loadAccountFilters(Context context) {
110b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        final ArrayList<ContactListFilter> result = Lists.newArrayList();
111b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList();
112b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(context);
1132b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro        List<AccountWithDataSet> accounts = accountTypes.getAccounts(false);
1142b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro        for (AccountWithDataSet account : accounts) {
1152b3f3c54d3beb017b2f59f19e9ce0ecc3e039dbcDave Santoro            AccountType accountType = accountTypes.getAccountType(account.type, account.dataSet);
1163ae114e72617f2faea281d82f7f4ee026d8c5674Makoto Onuki            if (accountType.isExtension() && !account.hasData(context)) {
117b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                // Hide extensions with no raw_contacts.
118b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                continue;
119b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            }
120b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            Drawable icon = accountType != null ? accountType.getDisplayIcon(context) : null;
1210647bdb63b41a968f6c07d1a1e600f5a0208d043Daisuke Miyakawa            accountFilters.add(ContactListFilter.createAccountFilter(
1220647bdb63b41a968f6c07d1a1e600f5a0208d043Daisuke Miyakawa                    account.type, account.name, account.dataSet, icon));
123495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
124495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
125b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        // Always show "All", even when there's no accounts.  (We may have local contacts)
126b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        result.add(ContactListFilter.createFilterWithType(
127b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
128b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
129b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        final int count = accountFilters.size();
130495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        if (count >= 1) {
13152760a1350ff6621b1d02560d59e8995958f1fd4Daisuke Miyakawa            // If we only have one account, don't show it as "account", instead show it as "all"
132495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            if (count > 1) {
133b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                result.addAll(accountFilters);
134495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
135b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            result.add(ContactListFilter.createFilterWithType(
13652760a1350ff6621b1d02560d59e8995958f1fd4Daisuke Miyakawa                    ContactListFilter.FILTER_TYPE_CUSTOM));
137495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
138b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        return result;
139b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    }
140b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
141b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    private class MyLoaderCallbacks implements LoaderCallbacks<List<ContactListFilter>> {
142b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
143b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        public Loader<List<ContactListFilter>> onCreateLoader(int id, Bundle args) {
144b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            return new FilterLoader(AccountFilterActivity.this);
145b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
146495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
147b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
148b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        public void onLoadFinished(
149b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                Loader<List<ContactListFilter>> loader, List<ContactListFilter> data) {
150b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            if (data == null) { // Just in case...
151b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                Log.e(TAG, "Failed to load filters");
152b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki                return;
153b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            }
154b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            mListView.setAdapter(new FilterListAdapter(AccountFilterActivity.this, data));
155b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
156b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki
157b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        @Override
158b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        public void onLoaderReset(Loader<List<ContactListFilter>> loader) {
159b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        }
160495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    }
161495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
1628f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa    @Override
163495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
164b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        final ContactListFilter filter = (ContactListFilter) view.getTag();
165b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        if (filter == null) return; // Just in case
1668f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
1678f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            final Intent intent = new Intent(this,
1688f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                    CustomContactListFilterActivity.class);
1698f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            startActivityForResult(intent, SUBACTIVITY_CUSTOMIZE_FILTER);
1708f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        } else {
1718f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            final Intent intent = new Intent();
1728f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
1738f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            setResult(Activity.RESULT_OK, intent);
1748f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            finish();
1758f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        }
176495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    }
177495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
1788f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa    @Override
1798f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
1808f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        if (resultCode != Activity.RESULT_OK) {
1818f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            return;
1828f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        }
1838f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa
1848f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        switch (requestCode) {
1858f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            case SUBACTIVITY_CUSTOMIZE_FILTER: {
1868f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                final Intent intent = new Intent();
1878f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                ContactListFilter filter = ContactListFilter.createFilterWithType(
1888f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                        ContactListFilter.FILTER_TYPE_CUSTOM);
1898f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
1908f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                setResult(Activity.RESULT_OK, intent);
1918f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                finish();
1928f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                break;
1938f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa            }
1948f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa        }
195495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    }
196495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
197b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki    private static class FilterListAdapter extends BaseAdapter {
198b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        private final List<ContactListFilter> mFilters;
199b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        private final LayoutInflater mLayoutInflater;
200495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
201b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki        public FilterListAdapter(Context context, List<ContactListFilter> filters) {
202495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            mLayoutInflater = (LayoutInflater) context.getSystemService
203495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                    (Context.LAYOUT_INFLATER_SERVICE);
204b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            mFilters = filters;
205495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
206495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
207495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        @Override
208495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        public int getCount() {
209495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            return mFilters.size();
210495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
211495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
212495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        @Override
213495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        public long getItemId(int position) {
214495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            return position;
215495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
216495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
217495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        @Override
218495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        public ContactListFilter getItem(int position) {
219495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            return mFilters.get(position);
220495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
221495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
222495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        public View getView(int position, View convertView, ViewGroup parent) {
223b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            final ContactListFilterView view;
224495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            if (convertView != null) {
225495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                view = (ContactListFilterView) convertView;
226495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            } else {
227495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                view = (ContactListFilterView) mLayoutInflater.inflate(
2288f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                        R.layout.contact_list_filter_item, parent, false);
229495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            }
230495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            view.setSingleAccount(mFilters.size() == 1);
231b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            final ContactListFilter filter = mFilters.get(position);
232495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            view.setContactListFilter(filter);
233495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            view.bindView(true);
234b5e4419f4ba06d630331669a08613936889f34dfMakoto Onuki            view.setTag(filter);
235495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            return view;
236495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
237495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    }
238495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan
239495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    @Override
240495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    public boolean onOptionsItemSelected(MenuItem item) {
241495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        switch (item.getItemId()) {
242495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            case android.R.id.home:
2438f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                // We have two logical "up" Activities: People and Phone.
2448f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                // Instead of having one static "up" direction, behave like back as an
2458f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                // exceptional case.
2468f59c2b18b73df6af3c808802620839f0a6a61d4Daisuke Miyakawa                onBackPressed();
247495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                return true;
248495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan            default:
249495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan                break;
250495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        }
251495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan        return super.onOptionsItemSelected(item);
252495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan    }
253495db43f0a08bd71ba28a42f89b80d38af15afecKatherine Kuan}
254