AccountFilterActivity.java revision b7ae952816e330e4e1f7e148df1b6dbb52f28f5a
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.contacts.list;
18
19import com.android.contacts.ContactsActivity;
20import com.android.contacts.ContactsSearchManager;
21import com.android.contacts.R;
22import com.android.contacts.activities.PeopleActivity;
23import com.android.contacts.model.AccountType;
24import com.android.contacts.model.AccountTypeManager;
25
26import android.accounts.Account;
27import android.app.ActionBar;
28import android.app.Activity;
29import android.content.Context;
30import android.content.Intent;
31import android.graphics.drawable.Drawable;
32import android.os.Bundle;
33import android.view.LayoutInflater;
34import android.view.MenuItem;
35import android.view.View;
36import android.view.ViewGroup;
37import android.widget.AdapterView;
38import android.widget.AdapterView.OnItemClickListener;
39import android.widget.BaseAdapter;
40import android.widget.ListView;
41
42import java.util.ArrayList;
43import java.util.List;
44
45/**
46 * Shows a list of all available accounts, letting the user select under which account to view
47 * contacts.
48 */
49public class AccountFilterActivity extends ContactsActivity
50        implements AdapterView.OnItemClickListener {
51
52    private static final String TAG = AccountFilterActivity.class.getSimpleName();
53
54    public static final String KEY_EXTRA_CONTACT_LIST_FILTER = "contactListFilter";
55
56    private ListView mListView;
57
58    private List<ContactListFilter> mFilters = new ArrayList<ContactListFilter>();
59
60    @Override
61    protected void onCreate(Bundle icicle) {
62        super.onCreate(icicle);
63        setContentView(R.layout.contact_list_filter);
64
65        mListView = (ListView) findViewById(com.android.internal.R.id.list);
66        mListView.setOnItemClickListener(new OnItemClickListener() {
67            @Override
68            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
69                finishAndSetResult(mFilters.get(position));
70            }
71        });
72
73        ActionBar actionBar =  getActionBar();
74        if (actionBar != null) {
75            actionBar.setDisplayHomeAsUpEnabled(true);
76        }
77
78        loadAccountFilters();
79    }
80
81    private void loadAccountFilters() {
82        ArrayList<ContactListFilter> accountFilters = new ArrayList<ContactListFilter>();
83        final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
84        ArrayList<Account> accounts = accountTypes.getAccounts(false);
85        for (Account account : accounts) {
86            AccountType accountType = accountTypes.getAccountType(account.type);
87            Drawable icon = accountType != null ? accountType.getDisplayIcon(this) : null;
88            accountFilters.add(ContactListFilter.createAccountFilter(account.type, account.name,
89                    icon, account.name));
90        }
91        int count = accountFilters.size();
92
93        if (count >= 1) {
94            // If we only have one account, don't show it as "account", instead show it as "all"
95            mFilters.add(ContactListFilter.createFilterWithType(
96                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
97            if (count > 1) {
98                mFilters.addAll(accountFilters);
99                mFilters.add(ContactListFilter.createFilterWithType(
100                    ContactListFilter.FILTER_TYPE_CUSTOM));
101            }
102        }
103
104        mListView.setAdapter(new FilterListAdapter(this));
105    }
106
107    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
108        finishAndSetResult(mFilters.get(position));
109    }
110
111    private void finishAndSetResult(ContactListFilter filter) {
112        final Intent intent = new Intent();
113        intent.putExtra(KEY_EXTRA_CONTACT_LIST_FILTER, filter);
114        setResult(Activity.RESULT_OK, intent);
115        finish();
116    }
117
118    @Override
119    public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData,
120            boolean globalSearch) {
121        if (globalSearch) {
122            super.startSearch(initialQuery, selectInitialQuery, appSearchData, globalSearch);
123        } else {
124            ContactsSearchManager.startSearch(this, initialQuery);
125        }
126    }
127
128    private class FilterListAdapter extends BaseAdapter {
129        private LayoutInflater mLayoutInflater;
130
131        public FilterListAdapter(Context context) {
132            mLayoutInflater = (LayoutInflater) context.getSystemService
133                    (Context.LAYOUT_INFLATER_SERVICE);
134        }
135
136        @Override
137        public int getCount() {
138            return mFilters.size();
139        }
140
141        @Override
142        public long getItemId(int position) {
143            return position;
144        }
145
146        @Override
147        public ContactListFilter getItem(int position) {
148            return mFilters.get(position);
149        }
150
151        public View getView(int position, View convertView, ViewGroup parent) {
152            ContactListFilterView view;
153            if (convertView != null) {
154                view = (ContactListFilterView) convertView;
155            } else {
156                view = (ContactListFilterView) mLayoutInflater.inflate(
157                        R.layout.filter_spinner_item, parent, false);
158            }
159            view.setSingleAccount(mFilters.size() == 1);
160            ContactListFilter filter = mFilters.get(position);
161            view.setContactListFilter(filter);
162            view.bindView(true);
163            return view;
164        }
165    }
166
167    @Override
168    public boolean onOptionsItemSelected(MenuItem item) {
169        switch (item.getItemId()) {
170            case android.R.id.home:
171                Intent intent = new Intent(this, PeopleActivity.class);
172                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
173                startActivity(intent);
174                finish();
175                return true;
176            default:
177                break;
178        }
179        return super.onOptionsItemSelected(item);
180    }
181}
182