1a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa/*
2a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * Copyright (C) 2008 The Android Open Source Project
3a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa *
4a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License");
5a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * you may not use this file except in compliance with the License.
6a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * You may obtain a copy of the License at
7a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa *
8a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa *      http://www.apache.org/licenses/LICENSE-2.0
9a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa *
10a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * Unless required by applicable law or agreed to in writing, software
11a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS,
12a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * See the License for the specific language governing permissions and
14a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * limitations under the License.
15a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa */
16a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
17a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawapackage com.android.settings;
18a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
19a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport java.util.ArrayList;
20a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
21a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.accounts.Account;
22a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.content.Context;
23a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.graphics.drawable.Drawable;
24a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.preference.Preference;
25a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.util.Log;
26a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.view.View;
27a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.widget.ImageView;
28a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
29a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa/**
30a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * AccountPreference is used to display a username, status and provider icon for an account on
31a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa * the device.
32a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa */
33a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawapublic class AccountPreference extends Preference {
34a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private static final String TAG = "AccountPreference";
35a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public static final int SYNC_ENABLED = 0; // all know sync adapters are enabled and OK
36a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public static final int SYNC_DISABLED = 1; // no sync adapters are enabled
37a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public static final int SYNC_ERROR = 2; // one or more sync adapters have a problem
38d1ab82807aae63926b35f66080a1f7a75c00b95bAmith Yamasani    public static final int SYNC_IN_PROGRESS = 3; // currently syncing
39a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private int mStatus;
40a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private Account mAccount;
41a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private ArrayList<String> mAuthorities;
4286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private ImageView mSyncStatusIcon;
4386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    private boolean mShowTypeIcon;
44a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
45a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public AccountPreference(Context context, Account account, Drawable icon,
4686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            ArrayList<String> authorities, boolean showTypeIcon) {
47a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        super(context);
48a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mAccount = account;
49a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mAuthorities = authorities;
5086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        mShowTypeIcon = showTypeIcon;
5186708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (showTypeIcon) {
5286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            setIcon(icon);
5386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        } else {
5486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            setIcon(getSyncStatusIcon(SYNC_DISABLED));
5586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
56a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        setTitle(mAccount.name);
57a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        setSummary("");
58a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        setPersistent(false);
5986708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        setSyncStatus(SYNC_DISABLED, false);
60a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
61a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
62a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public Account getAccount() {
63a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        return mAccount;
64a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
65a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
66a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public ArrayList<String> getAuthorities() {
67a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        return mAuthorities;
68a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
69a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
70a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
71a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    protected void onBindView(View view) {
72a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        super.onBindView(view);
7386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (!mShowTypeIcon) {
7486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            mSyncStatusIcon = (ImageView) view.findViewById(android.R.id.icon);
7586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            mSyncStatusIcon.setImageResource(getSyncStatusIcon(mStatus));
7686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            mSyncStatusIcon.setContentDescription(getSyncContentDescription(mStatus));
7786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
78a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
79a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
8086708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani    public void setSyncStatus(int status, boolean updateSummary) {
81a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mStatus = status;
8286708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (!mShowTypeIcon && mSyncStatusIcon != null) {
8386708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            mSyncStatusIcon.setImageResource(getSyncStatusIcon(status));
8486708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            mSyncStatusIcon.setContentDescription(getSyncContentDescription(mStatus));
8586708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
8686708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        if (updateSummary) {
8786708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani            setSummary(getSyncStatusMessage(status));
8886708a8a6da3d2da4547750ce67a89744a2878a1Amith Yamasani        }
89a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
90a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
91a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private int getSyncStatusMessage(int status) {
92a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        int res;
93a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        switch (status) {
94a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            case SYNC_ENABLED:
95a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                res = R.string.sync_enabled;
96a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                break;
97a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            case SYNC_DISABLED:
98a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                res = R.string.sync_disabled;
99a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                break;
100a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            case SYNC_ERROR:
101a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                res = R.string.sync_error;
102a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                break;
103d1ab82807aae63926b35f66080a1f7a75c00b95bAmith Yamasani            case SYNC_IN_PROGRESS:
104d1ab82807aae63926b35f66080a1f7a75c00b95bAmith Yamasani                res = R.string.sync_in_progress;
105d1ab82807aae63926b35f66080a1f7a75c00b95bAmith Yamasani                break;
106a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            default:
107a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                res = R.string.sync_error;
108a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                Log.e(TAG, "Unknown sync status: " + status);
109a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
110a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        return res;
111a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
112a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
113a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private int getSyncStatusIcon(int status) {
114a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        int res;
115a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        switch (status) {
116a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            case SYNC_ENABLED:
1172d499533b70072a914542b84e9cc8bdb8aca78d8Jason Monk            case SYNC_IN_PROGRESS:
1182d499533b70072a914542b84e9cc8bdb8aca78d8Jason Monk                res = R.drawable.ic_settings_sync;
119a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                break;
120a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            case SYNC_DISABLED:
1217a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                res = R.drawable.ic_sync_grey_holo;
122a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                break;
123a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            case SYNC_ERROR:
1247a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                res = R.drawable.ic_sync_red_holo;
125a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                break;
126a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            default:
1277a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7dJeff Sharkey                res = R.drawable.ic_sync_red_holo;
128a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                Log.e(TAG, "Unknown sync status: " + status);
129a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
130a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        return res;
131a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
132a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
1330ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov    private String getSyncContentDescription(int status) {
1340ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov        switch (status) {
1350ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov            case SYNC_ENABLED:
1360ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov                return getContext().getString(R.string.accessibility_sync_enabled);
1370ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov            case SYNC_DISABLED:
1380ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov                return getContext().getString(R.string.accessibility_sync_disabled);
1390ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov            case SYNC_ERROR:
1400ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov                return getContext().getString(R.string.accessibility_sync_error);
141a14cfda8fc8c68471ac2926dff9d8bc9f943a892Alexandra Gherghina            case SYNC_IN_PROGRESS:
142a14cfda8fc8c68471ac2926dff9d8bc9f943a892Alexandra Gherghina                return getContext().getString(R.string.accessibility_sync_in_progress);
1430ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov            default:
1440ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov                Log.e(TAG, "Unknown sync status: " + status);
1450ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov                return getContext().getString(R.string.accessibility_sync_error);
1460ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov        }
1470ceb6ad890a341a9edda7b000aea0725c61380d4Svetoslav Ganov    }
148a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa}
149