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
1743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipackage com.android.settings.accounts;
18a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
19a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.accounts.Account;
20a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.accounts.AccountManager;
21a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.accounts.OnAccountsUpdateListener;
2213b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunneimport android.app.ActionBar;
23a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.app.Activity;
24a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.content.ContentResolver;
25a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.content.Intent;
26a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.content.SyncAdapterType;
27a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.content.SyncInfo;
28a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.content.SyncStatusInfo;
29a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.graphics.drawable.Drawable;
30a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.os.Bundle;
31a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.preference.Preference;
3243c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasaniimport android.preference.PreferenceActivity;
33a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.preference.PreferenceScreen;
34a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.util.Log;
3513b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunneimport android.view.Gravity;
36a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.view.LayoutInflater;
37ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasaniimport android.view.Menu;
38ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasaniimport android.view.MenuInflater;
39ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasaniimport android.view.MenuItem;
40a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.view.View;
41a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.view.ViewGroup;
4213b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunneimport android.widget.CompoundButton;
4313b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunneimport android.widget.Switch;
44a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport android.widget.TextView;
45a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
46b10e52fcf139bc6f4c18033f387527ab30815ccbJeff Sharkeyimport com.android.settings.AccountPreference;
47b10e52fcf139bc6f4c18033f387527ab30815ccbJeff Sharkeyimport com.android.settings.DialogCreatable;
48b10e52fcf139bc6f4c18033f387527ab30815ccbJeff Sharkeyimport com.android.settings.R;
49b10e52fcf139bc6f4c18033f387527ab30815ccbJeff Sharkey
50a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport java.util.ArrayList;
51a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawaimport java.util.HashSet;
52a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
5343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasanipublic class ManageAccountsSettings extends AccountPreferenceBase
5443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        implements OnAccountsUpdateListener, DialogCreatable {
5543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
56ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    private static final int MENU_ADD_ACCOUNT = Menu.FIRST;
57ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
5843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private static final int REQUEST_SHOW_SYNC_SETTINGS = 1;
5943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
60a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private String[] mAuthorities;
61a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private TextView mErrorInfoView;
62a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
63a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    private SettingsDialogFragment mDialogFragment;
6413b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne    private Switch mAutoSyncSwitch;
65a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
66a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
67a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public void onCreate(Bundle icicle) {
68a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        super.onCreate(icicle);
69ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
7043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        addPreferencesFromResource(R.xml.manage_accounts_settings);
71ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        setHasOptionsMenu(true);
72a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
73a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
74a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
75855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani    public void onStart() {
76855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani        super.onStart();
776b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        Activity activity = getActivity();
786b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true);
796b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
806b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani                ActionBar.DISPLAY_SHOW_CUSTOM);
816b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        activity.getActionBar().setCustomView(mAutoSyncSwitch, new ActionBar.LayoutParams(
826b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani                ActionBar.LayoutParams.WRAP_CONTENT,
836b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani                ActionBar.LayoutParams.WRAP_CONTENT,
846b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani                Gravity.CENTER_VERTICAL | Gravity.RIGHT));
85855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani    }
86855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani
87855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani    @Override
88a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public View onCreateView(LayoutInflater inflater, ViewGroup container,
89a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            Bundle savedInstanceState) {
90a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        final View view = inflater.inflate(R.layout.manage_accounts_screen, container, false);
91a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        return view;
92a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
93a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
94a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
95a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
96a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        super.onActivityCreated(savedInstanceState);
97a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
98a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        final Activity activity = getActivity();
99a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        final View view = getView();
100a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
101a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mErrorInfoView = (TextView)view.findViewById(R.id.sync_settings_error_info);
102a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mErrorInfoView.setVisibility(View.GONE);
103a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
10413b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        mAutoSyncSwitch = new Switch(activity);
10513b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne
10613b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        // TODO Where to put the switch in tablet multipane layout?
10713b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        final int padding = activity.getResources().getDimensionPixelSize(
10813b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne                R.dimen.action_bar_switch_padding);
10913b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        mAutoSyncSwitch.setPadding(0, 0, padding, 0);
11013b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        mAutoSyncSwitch.setChecked(ContentResolver.getMasterSyncAutomatically());
11113b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        mAutoSyncSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
11213b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne            @Override
11313b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
11413b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne                ContentResolver.setMasterSyncAutomatically(isChecked);
11513b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne                onSyncStateUpdated();
11613b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne            }
11713b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        });
11813b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne
119a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
120a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
12143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        updateAuthDescriptions();
122a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
123a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
124a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
125855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani    public void onStop() {
126855d216dd4abcf1d7f597f8cae21a44d49607eecAmith Yamasani        super.onStop();
1276b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        final Activity activity = getActivity();
1286b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        AccountManager.get(activity).removeOnAccountsUpdatedListener(this);
1296b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        activity.getActionBar().setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM);
1306b7cf2577623e061439ce7050f885a92167c2304Amith Yamasani        activity.getActionBar().setCustomView(null);
131a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
132a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
133a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
134a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
135b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        if (preference instanceof AccountPreference) {
13643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani            startAccountSettings((AccountPreference) preference);
137a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        } else {
138a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            return false;
139a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
140a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        return true;
141a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
142a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
14343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    private void startAccountSettings(AccountPreference acctPref) {
14443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        Bundle args = new Bundle();
14543c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount());
14643c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani        ((PreferenceActivity) getActivity()).startPreferencePanel(
14743c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                AccountSyncSettings.class.getCanonicalName(), args,
14843c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                R.string.account_sync_settings_title, acctPref.getAccount().name,
14943c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani                this, REQUEST_SHOW_SYNC_SETTINGS);
15043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    }
15143c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani
152a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
15343c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    public void showDialog(int dialogId) {
154a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        if (mDialogFragment != null) {
155a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            Log.e(TAG, "Old dialog fragment not null!");
156a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
157a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mDialogFragment = new SettingsDialogFragment(this, dialogId);
158a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
159a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
160a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
161ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    @Override
162ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
163b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        MenuItem addAccountItem = menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_account_label);
164b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        addAccountItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM
165ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani                | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
166ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    }
167ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
168ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    @Override
169ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    public boolean onOptionsItemSelected(MenuItem item) {
170b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        final int itemId = item.getItemId();
171b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        if (itemId == MENU_ADD_ACCOUNT) {
17272aa19d1a541b01e9cc7bebd0650f5d2b5f58d58Amith Yamasani            onAddAccountClicked();
17372aa19d1a541b01e9cc7bebd0650f5d2b5f58d58Amith Yamasani            return true;
17472aa19d1a541b01e9cc7bebd0650f5d2b5f58d58Amith Yamasani        } else {
17572aa19d1a541b01e9cc7bebd0650f5d2b5f58d58Amith Yamasani            return super.onOptionsItemSelected(item);
17672aa19d1a541b01e9cc7bebd0650f5d2b5f58d58Amith Yamasani        }
177ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    }
178ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani
179cd8e5246f1d538384dae87b8d2867ba3e44a6981Gilles Debunne    @Override
18043c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onSyncStateUpdated() {
181c948b16e732d0cb5868acfc7fa8d09e3fa083f3cAmith Yamasani        // Catch any delayed delivery of update messages
182c948b16e732d0cb5868acfc7fa8d09e3fa083f3cAmith Yamasani        if (getActivity() == null) return;
183a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        // Set background connection state
18413b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne        if (mAutoSyncSwitch != null) {
18513b7d8aa456d451ade4b926e91c5119d43eab489Gilles Debunne            mAutoSyncSwitch.setChecked(ContentResolver.getMasterSyncAutomatically());
186b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        }
187a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
188a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        // iterate over all the preferences, setting the state properly for each
189a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        SyncInfo currentSync = ContentResolver.getCurrentSync();
190a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
191a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        boolean anySyncFailed = false; // true if sync on any account failed
192a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
193a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        // only track userfacing sync adapters when deciding if account is synced or not
194a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        final SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypes();
195a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        HashSet<String> userFacing = new HashSet<String>();
196a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        for (int k = 0, n = syncAdapters.length; k < n; k++) {
197a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            final SyncAdapterType sa = syncAdapters[k];
198a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            if (sa.isUserVisible()) {
199a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                userFacing.add(sa.authority);
200a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            }
201a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
202b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        for (int i = 0, count = getPreferenceScreen().getPreferenceCount(); i < count; i++) {
203b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne            Preference pref = getPreferenceScreen().getPreference(i);
204a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            if (! (pref instanceof AccountPreference)) {
205a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                continue;
206a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            }
207a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
208a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            AccountPreference accountPref = (AccountPreference) pref;
209a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            Account account = accountPref.getAccount();
210a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            int syncCount = 0;
211a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            boolean syncIsFailing = false;
212a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            final ArrayList<String> authorities = accountPref.getAuthorities();
213a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            if (authorities != null) {
214a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                for (String authority : authorities) {
215a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    SyncStatusInfo status = ContentResolver.getSyncStatus(account, authority);
216a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    boolean syncEnabled = ContentResolver.getSyncAutomatically(account, authority)
217b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne                            && ContentResolver.getMasterSyncAutomatically()
218a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                            && (ContentResolver.getIsSyncable(account, authority) > 0);
219a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    boolean authorityIsPending = ContentResolver.isSyncPending(account, authority);
220a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    boolean activelySyncing = currentSync != null
221a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                            && currentSync.authority.equals(authority)
222a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                            && new Account(currentSync.account.name, currentSync.account.type)
223a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                                    .equals(account);
224a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    boolean lastSyncFailed = status != null
225a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                            && syncEnabled
226a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                            && status.lastFailureTime != 0
227a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                            && status.getLastFailureMesgAsInt(0)
228a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                               != ContentResolver.SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
229a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    if (lastSyncFailed && !activelySyncing && !authorityIsPending) {
230a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                        syncIsFailing = true;
231a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                        anySyncFailed = true;
232a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    }
233a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    syncCount += syncEnabled && userFacing.contains(authority) ? 1 : 0;
234a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                }
235a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            } else {
236a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                if (Log.isLoggable(TAG, Log.VERBOSE)) {
237a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    Log.v(TAG, "no syncadapters found for " + account);
238a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                }
239a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            }
240a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            int syncStatus = AccountPreference.SYNC_DISABLED;
241a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            if (syncIsFailing) {
242a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                syncStatus = AccountPreference.SYNC_ERROR;
243a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            } else if (syncCount == 0) {
244a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                syncStatus = AccountPreference.SYNC_DISABLED;
245a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            } else if (syncCount > 0) {
246a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                syncStatus = AccountPreference.SYNC_ENABLED;
247a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            }
248a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            accountPref.setSyncStatus(syncStatus);
249a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
250a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
251a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        mErrorInfoView.setVisibility(anySyncFailed ? View.VISIBLE : View.GONE);
252a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
253a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
254a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    @Override
255a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    public void onAccountsUpdated(Account[] accounts) {
2566ef6f183e4d8be0828d1a969178a6e315d8a0ea7Amith Yamasani        if (getActivity() == null) return;
257b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        getPreferenceScreen().removeAll();
258a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        for (int i = 0, n = accounts.length; i < n; i++) {
259a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            final Account account = accounts[i];
260a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            final ArrayList<String> auths = getAuthoritiesForAccountType(account.type);
261a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
262a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            boolean showAccount = true;
263a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            if (mAuthorities != null && auths != null) {
264a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                showAccount = false;
265a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                for (String requestedAuthority : mAuthorities) {
266a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    if (auths.contains(requestedAuthority)) {
267a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                        showAccount = true;
268a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                        break;
269a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                    }
270a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                }
271a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            }
272a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
273a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            if (showAccount) {
274a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                final Drawable icon = getDrawableForType(account.type);
275a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                final AccountPreference preference =
276a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa                        new AccountPreference(getActivity(), account, icon, auths);
277b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne                getPreferenceScreen().addPreference(preference);
278a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            }
279a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
280a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        onSyncStateUpdated();
281a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
282a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
283cd8e5246f1d538384dae87b8d2867ba3e44a6981Gilles Debunne    @Override
28443c697854c7e373fbc1dae8b7a5259a32de346b4Amith Yamasani    protected void onAuthDescriptionsUpdated() {
285a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        // Update account icons for all account preference items
286b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
287b59e068d29ec5b4da51b8206f679b9542ae211c8Gilles Debunne            AccountPreference pref = (AccountPreference) getPreferenceScreen().getPreference(i);
288a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            pref.setProviderIcon(getDrawableForType(pref.getAccount().type));
289a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa            pref.setSummary(getLabelForType(pref.getAccount().type));
290a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa        }
291a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
292a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa
293ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani    public void onAddAccountClicked() {
294ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");
295ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        intent.putExtra(AUTHORITIES_FILTER_KEY, mAuthorities);
296ea07165ef26b57dde4b45eee24200cdfaa5945e7Amith Yamasani        startActivity(intent);
297a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa    }
298a2633d0232adefd2767484add759a46906e00bccDaisuke Miyakawa}
299