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