1d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng/*
2d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Copyright (C) 2010 The Android Open Source Project
3d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng *
4d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * you may not use this file except in compliance with the License.
6d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * You may obtain a copy of the License at
7d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng *
8d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng *
10d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Unless required by applicable law or agreed to in writing, software
11d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * See the License for the specific language governing permissions and
14d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * limitations under the License.
15d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng */
16d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
17d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengpackage com.android.contacts.common.list;
18d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
19d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.content.SharedPreferences;
20d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.graphics.drawable.Drawable;
21d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.net.Uri;
22d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.os.Parcel;
23d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.os.Parcelable;
24d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.provider.ContactsContract.RawContacts;
25d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengimport android.text.TextUtils;
26d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
27d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng/**
28d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng * Contact list filter parameters.
29d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng */
30d6bba124836ec2f528b329759e38fda6297fec49Chiao Chengpublic final class ContactListFilter implements Comparable<ContactListFilter>, Parcelable {
31d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
32d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_DEFAULT = -1;
33d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_ALL_ACCOUNTS = -2;
34d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_CUSTOM = -3;
35d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_STARRED = -4;
36d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY = -5;
37d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_SINGLE_CONTACT = -6;
38d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
39d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final int FILTER_TYPE_ACCOUNT = 0;
40d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
41d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    /**
42d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * Obsolete filter which had been used in Honeycomb. This may be stored in
43d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * {@link SharedPreferences}, but should be replaced with ALL filter when it is found.
44d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     *
45d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * TODO: "group" filter and relevant variables are all obsolete. Remove them.
46d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     */
47d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private static final int FILTER_TYPE_GROUP = 1;
48d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
49d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private static final String KEY_FILTER_TYPE = "filter.type";
50d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private static final String KEY_ACCOUNT_NAME = "filter.accountName";
51d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private static final String KEY_ACCOUNT_TYPE = "filter.accountType";
52d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private static final String KEY_DATA_SET = "filter.dataSet";
53d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
54d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public final int filterType;
55d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public final String accountType;
56d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public final String accountName;
57d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public final String dataSet;
58d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public final Drawable icon;
59d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private String mId;
60d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
61d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public ContactListFilter(int filterType, String accountType, String accountName, String dataSet,
62d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            Drawable icon) {
63d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        this.filterType = filterType;
64d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        this.accountType = accountType;
65d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        this.accountName = accountName;
66d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        this.dataSet = dataSet;
67d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        this.icon = icon;
68d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
69d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
70d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static ContactListFilter createFilterWithType(int filterType) {
71d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return new ContactListFilter(filterType, null, null, null, null);
72d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
73d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
74d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static ContactListFilter createAccountFilter(String accountType, String accountName,
75d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            String dataSet, Drawable icon) {
76d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return new ContactListFilter(ContactListFilter.FILTER_TYPE_ACCOUNT, accountType,
77d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                accountName, dataSet, icon);
78d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
79d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
80d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    /**
81d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * Returns true if this filter is based on data and may become invalid over time.
82d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     */
83d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public boolean isValidationRequired() {
84d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return filterType == FILTER_TYPE_ACCOUNT;
85d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
86d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
87d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    @Override
88d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public String toString() {
89d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        switch (filterType) {
90d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_DEFAULT:
91d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "default";
92d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_ALL_ACCOUNTS:
93d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "all_accounts";
94d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_CUSTOM:
95d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "custom";
96d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_STARRED:
97d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "starred";
98d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY:
99d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "with_phones";
100d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_SINGLE_CONTACT:
101d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "single";
102d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_ACCOUNT:
103d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "account: " + accountType + (dataSet != null ? "/" + dataSet : "")
104d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                        + " " + accountName;
105d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
106d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return super.toString();
107d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
108d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
109d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    @Override
110d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public int compareTo(ContactListFilter another) {
111d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        int res = accountName.compareTo(another.accountName);
112d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (res != 0) {
113d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return res;
114d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
115d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
116d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        res = accountType.compareTo(another.accountType);
117d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (res != 0) {
118d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return res;
119d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
120d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
121d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return filterType - another.filterType;
122d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
123d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
124d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    @Override
125d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public int hashCode() {
126d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        int code = filterType;
127d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (accountType != null) {
128d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            code = code * 31 + accountType.hashCode();
129d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            code = code * 31 + accountName.hashCode();
130d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
131d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (dataSet != null) {
132d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            code = code * 31 + dataSet.hashCode();
133d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
134d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return code;
135d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
136d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
137d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    @Override
138d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public boolean equals(Object other) {
139d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (this == other) {
140d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return true;
141d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
142d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
143d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (!(other instanceof ContactListFilter)) {
144d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return false;
145d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
146d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
147d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        ContactListFilter otherFilter = (ContactListFilter) other;
148d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filterType != otherFilter.filterType
149d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                || !TextUtils.equals(accountName, otherFilter.accountName)
150d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                || !TextUtils.equals(accountType, otherFilter.accountType)
151d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                || !TextUtils.equals(dataSet, otherFilter.dataSet)) {
152d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return false;
153d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
154d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
155d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return true;
156d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
157d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
158d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    /**
159d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * Store the given {@link ContactListFilter} to preferences. If the requested filter is
160d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * of type {@link #FILTER_TYPE_SINGLE_CONTACT} then do not save it to preferences because
161d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * it is a temporary state.
162d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     */
163d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static void storeToPreferences(SharedPreferences prefs, ContactListFilter filter) {
164d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filter != null && filter.filterType == FILTER_TYPE_SINGLE_CONTACT) {
165d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return;
166d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
167d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        prefs.edit()
168d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            .putInt(KEY_FILTER_TYPE, filter == null ? FILTER_TYPE_DEFAULT : filter.filterType)
169d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            .putString(KEY_ACCOUNT_NAME, filter == null ? null : filter.accountName)
170d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            .putString(KEY_ACCOUNT_TYPE, filter == null ? null : filter.accountType)
171d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            .putString(KEY_DATA_SET, filter == null ? null : filter.dataSet)
172d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            .apply();
173d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
174d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
175d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    /**
176d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * Try to obtain ContactListFilter object saved in SharedPreference.
177d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * If there's no info there, return ALL filter instead.
178d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     */
179d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static ContactListFilter restoreDefaultPreferences(SharedPreferences prefs) {
180d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        ContactListFilter filter = restoreFromPreferences(prefs);
181d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filter == null) {
182d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            filter = ContactListFilter.createFilterWithType(FILTER_TYPE_ALL_ACCOUNTS);
183d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
184d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        // "Group" filter is obsolete and thus is not exposed anymore. The "single contact mode"
185d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        // should also not be stored in preferences anymore since it is a temporary state.
186d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filter.filterType == FILTER_TYPE_GROUP ||
187d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                filter.filterType == FILTER_TYPE_SINGLE_CONTACT) {
188d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            filter = ContactListFilter.createFilterWithType(FILTER_TYPE_ALL_ACCOUNTS);
189d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
190d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return filter;
191d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
192d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
193d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    private static ContactListFilter restoreFromPreferences(SharedPreferences prefs) {
194d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        int filterType = prefs.getInt(KEY_FILTER_TYPE, FILTER_TYPE_DEFAULT);
195d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filterType == FILTER_TYPE_DEFAULT) {
196d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return null;
197d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
198d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
199d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        String accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
200d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        String accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
201d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        String dataSet = prefs.getString(KEY_DATA_SET, null);
202d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return new ContactListFilter(filterType, accountType, accountName, dataSet, null);
203d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
204d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
205d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
206d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    @Override
207d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public void writeToParcel(Parcel dest, int flags) {
208d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        dest.writeInt(filterType);
209d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        dest.writeString(accountName);
210d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        dest.writeString(accountType);
211d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        dest.writeString(dataSet);
212d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
213d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
214d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final Parcelable.Creator<ContactListFilter> CREATOR =
215d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            new Parcelable.Creator<ContactListFilter>() {
216d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        @Override
217d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        public ContactListFilter createFromParcel(Parcel source) {
218d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            int filterType = source.readInt();
219d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            String accountName = source.readString();
220d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            String accountType = source.readString();
221d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            String dataSet = source.readString();
222d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return new ContactListFilter(filterType, accountType, accountName, dataSet, null);
223d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
224d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
225d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        @Override
226d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        public ContactListFilter[] newArray(int size) {
227d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            return new ContactListFilter[size];
228d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
229d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    };
230d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
231d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    @Override
232d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public int describeContents() {
233d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return 0;
234d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
235d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
236d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    /**
237d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * Returns a string that can be used as a stable persistent identifier for this filter.
238d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     */
239d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public String getId() {
240d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (mId == null) {
241d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            StringBuilder sb = new StringBuilder();
242d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            sb.append(filterType);
243d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            if (accountType != null) {
244d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                sb.append('-').append(accountType);
245d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            }
246d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            if (dataSet != null) {
247d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                sb.append('/').append(dataSet);
248d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            }
249d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            if (accountName != null) {
250d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                sb.append('-').append(accountName.replace('-', '_'));
251d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            }
252d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            mId = sb.toString();
253d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
254d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return mId;
255d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
256d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
257d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    /**
258d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * Adds the account query parameters to the given {@code uriBuilder}.
259d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     *
260d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     * @throws IllegalStateException if the filter type is not {@link #FILTER_TYPE_ACCOUNT}.
261d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng     */
262d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public Uri.Builder addAccountQueryParameterToUrl(Uri.Builder uriBuilder) {
263d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filterType != FILTER_TYPE_ACCOUNT) {
264d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            throw new IllegalStateException("filterType must be FILTER_TYPE_ACCOUNT");
265d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
266d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        uriBuilder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
267d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        uriBuilder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
268d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (!TextUtils.isEmpty(dataSet)) {
269d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            uriBuilder.appendQueryParameter(RawContacts.DATA_SET, dataSet);
270d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
271d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return uriBuilder;
272d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
273d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
274d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public String toDebugString() {
275d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        final StringBuilder builder = new StringBuilder();
276d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        builder.append("[filter type: " + filterType + " (" + filterTypeToString(filterType) + ")");
277d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        if (filterType == FILTER_TYPE_ACCOUNT) {
278d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            builder.append(", accountType: " + accountType)
279d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                    .append(", accountName: " + accountName)
280d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                    .append(", dataSet: " + dataSet);
281d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
282d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        builder.append(", icon: " + icon + "]");
283d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        return builder.toString();
284d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
285d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng
286d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    public static final String filterTypeToString(int filterType) {
287d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        switch (filterType) {
288d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_DEFAULT:
289d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_DEFAULT";
290d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_ALL_ACCOUNTS:
291d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_ALL_ACCOUNTS";
292d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_CUSTOM:
293d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_CUSTOM";
294d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_STARRED:
295d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_STARRED";
296d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY:
297d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY";
298d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_SINGLE_CONTACT:
299d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_SINGLE_CONTACT";
300d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            case FILTER_TYPE_ACCOUNT:
301d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "FILTER_TYPE_ACCOUNT";
302d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng            default:
303d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng                return "(unknown)";
304d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng        }
305d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng    }
306d6bba124836ec2f528b329759e38fda6297fec49Chiao Cheng}
307