1/*
2 * Copyright (C) 2012 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.common.util;
18
19import android.app.Activity;
20import android.app.Fragment;
21import android.content.Context;
22import android.content.Intent;
23import android.util.Log;
24import android.view.View;
25import android.widget.TextView;
26
27import com.android.contacts.common.R;
28import com.android.contacts.common.list.AccountFilterActivity;
29import com.android.contacts.common.list.ContactListFilter;
30import com.android.contacts.common.list.ContactListFilterController;
31
32/**
33 * Utility class for account filter manipulation.
34 */
35public class AccountFilterUtil {
36    private static final String TAG = AccountFilterUtil.class.getSimpleName();
37
38    /**
39     * Find TextView with the id "account_filter_header" and set correct text for the account
40     * filter header.
41     *
42     * @param filterContainer View containing TextView with id "account_filter_header"
43     * @return true when header text is set in the call. You may use this for conditionally
44     * showing or hiding this entire view.
45     */
46    public static boolean updateAccountFilterTitleForPeople(View filterContainer,
47            ContactListFilter filter, boolean showTitleForAllAccounts) {
48        return updateAccountFilterTitle(filterContainer, filter, showTitleForAllAccounts, false);
49    }
50
51    /**
52     * Similar to {@link #updateAccountFilterTitleForPeople(View, ContactListFilter, boolean,
53     * boolean)}, but for Phone UI.
54     */
55    public static boolean updateAccountFilterTitleForPhone(View filterContainer,
56            ContactListFilter filter, boolean showTitleForAllAccounts) {
57        return updateAccountFilterTitle(
58                filterContainer, filter, showTitleForAllAccounts, true);
59    }
60
61    private static boolean updateAccountFilterTitle(View filterContainer,
62            ContactListFilter filter, boolean showTitleForAllAccounts,
63            boolean forPhone) {
64        final Context context = filterContainer.getContext();
65        final TextView headerTextView = (TextView)
66                filterContainer.findViewById(R.id.account_filter_header);
67
68        boolean textWasSet = false;
69        if (filter != null) {
70            if (forPhone) {
71                if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
72                    if (showTitleForAllAccounts) {
73                        headerTextView.setText(R.string.list_filter_phones);
74                        textWasSet = true;
75                    }
76                } else if (filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
77                    headerTextView.setText(context.getString(
78                            R.string.listAllContactsInAccount, filter.accountName));
79                    textWasSet = true;
80                } else if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
81                    headerTextView.setText(R.string.listCustomView);
82                    textWasSet = true;
83                } else {
84                    Log.w(TAG, "Filter type \"" + filter.filterType + "\" isn't expected.");
85                }
86            } else {
87                if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
88                    if (showTitleForAllAccounts) {
89                        headerTextView.setText(R.string.list_filter_all_accounts);
90                        textWasSet = true;
91                    }
92                } else if (filter.filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
93                    headerTextView.setText(context.getString(
94                            R.string.listAllContactsInAccount, filter.accountName));
95                    textWasSet = true;
96                } else if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
97                    headerTextView.setText(R.string.listCustomView);
98                    textWasSet = true;
99                } else if (filter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
100                    headerTextView.setText(R.string.listSingleContact);
101                    textWasSet = true;
102                } else {
103                    Log.w(TAG, "Filter type \"" + filter.filterType + "\" isn't expected.");
104                }
105            }
106        } else {
107            Log.w(TAG, "Filter is null.");
108        }
109        return textWasSet;
110    }
111
112    /**
113     * Launches account filter setting Activity using
114     * {@link Activity#startActivityForResult(Intent, int)}.
115     *
116     * @param activity
117     * @param requestCode requestCode for {@link Activity#startActivityForResult(Intent, int)}
118     * @param currentFilter currently-selected filter, so that it can be displayed as activated.
119     */
120    public static void startAccountFilterActivityForResult(
121            Activity activity, int requestCode, ContactListFilter currentFilter) {
122        final Intent intent = new Intent(activity, AccountFilterActivity.class);
123        intent.putExtra(AccountFilterActivity.KEY_EXTRA_CURRENT_FILTER, currentFilter);
124        activity.startActivityForResult(intent, requestCode);
125    }
126
127    /**
128     * Very similar to
129     * {@link #startAccountFilterActivityForResult(Activity, int, ContactListFilter)}
130     * but uses Fragment instead.
131     */
132    public static void startAccountFilterActivityForResult(
133            Fragment fragment, int requestCode, ContactListFilter currentFilter) {
134        final Activity activity = fragment.getActivity();
135        if (activity != null) {
136            final Intent intent = new Intent(activity, AccountFilterActivity.class);
137            intent.putExtra(AccountFilterActivity.KEY_EXTRA_CURRENT_FILTER, currentFilter);
138            fragment.startActivityForResult(intent, requestCode);
139        } else {
140            Log.w(TAG, "getActivity() returned null. Ignored");
141        }
142    }
143
144    /**
145     * Useful method to handle onActivityResult() for
146     * {@link #startAccountFilterActivityForResult(Activity, int)} or
147     * {@link #startAccountFilterActivityForResult(Fragment, int)}.
148     *
149     * This will update filter via a given ContactListFilterController.
150     */
151    public static void handleAccountFilterResult(
152            ContactListFilterController filterController, int resultCode, Intent data) {
153        if (resultCode == Activity.RESULT_OK) {
154            final ContactListFilter filter = (ContactListFilter)
155                    data.getParcelableExtra(AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER);
156            if (filter == null) {
157                return;
158            }
159            if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
160                filterController.selectCustomFilter();
161            } else {
162                filterController.setContactListFilter(filter, true);
163            }
164        }
165    }
166}
167