diff options
author | Amith Yamasani <yamasani@google.com> | 2012-06-06 20:23:08 -0700 |
---|---|---|
committer | Amith Yamasani <yamasani@google.com> | 2012-06-06 20:55:40 -0700 |
commit | 86708a8a6da3d2da4547750ce67a89744a2878a1 (patch) | |
tree | 119df8c219af6692a73b134717cb4bd32cb4dc0f /src | |
parent | 6a5e0252ce383654e304ffd0bca09ced0cadc0a3 (diff) | |
download | packages_apps_settings-86708a8a6da3d2da4547750ce67a89744a2878a1.zip packages_apps_settings-86708a8a6da3d2da4547750ce67a89744a2878a1.tar.gz packages_apps_settings-86708a8a6da3d2da4547750ce67a89744a2878a1.tar.bz2 |
Add back a SYNC_SETTINGS screen
Revive the old Accounts&Sync screen as a dialog with the auto-sync
checkbox and a list of accounts. This will be launched when Apps
request a SYNC_SETTINGS page for controlling account and master sync.
Auto-sync data checkbox will also continue to exist in Data Usage.
Minor fixes to account list and account update monitoring.
Bug: 6614013
Bug: 6622995
Bug: 6610247
Change-Id: I35c0919a29c6bc7e5edf64f2734a3ef4f5ae5e7a
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/settings/AccountPreference.java | 34 | ||||
-rw-r--r-- | src/com/android/settings/Settings.java | 13 | ||||
-rw-r--r-- | src/com/android/settings/accounts/ManageAccountsSettings.java | 20 | ||||
-rw-r--r-- | src/com/android/settings/accounts/SyncSettings.java | 174 | ||||
-rw-r--r-- | src/com/android/settings/accounts/SyncSettingsActivity.java | 34 |
5 files changed, 254 insertions, 21 deletions
diff --git a/src/com/android/settings/AccountPreference.java b/src/com/android/settings/AccountPreference.java index e7919dd..2cc013c 100644 --- a/src/com/android/settings/AccountPreference.java +++ b/src/com/android/settings/AccountPreference.java @@ -39,16 +39,24 @@ public class AccountPreference extends Preference { private int mStatus; private Account mAccount; private ArrayList<String> mAuthorities; + private ImageView mSyncStatusIcon; + private boolean mShowTypeIcon; public AccountPreference(Context context, Account account, Drawable icon, - ArrayList<String> authorities) { + ArrayList<String> authorities, boolean showTypeIcon) { super(context); mAccount = account; mAuthorities = authorities; + mShowTypeIcon = showTypeIcon; + if (showTypeIcon) { + setIcon(icon); + } else { + setIcon(getSyncStatusIcon(SYNC_DISABLED)); + } setTitle(mAccount.name); setSummary(""); setPersistent(false); - setSyncStatus(SYNC_DISABLED); + setSyncStatus(SYNC_DISABLED, false); } public Account getAccount() { @@ -62,16 +70,22 @@ public class AccountPreference extends Preference { @Override protected void onBindView(View view) { super.onBindView(view); - setSummary(getSyncStatusMessage(mStatus)); - ImageView iconView = (ImageView) view.findViewById(android.R.id.icon); - iconView.setImageResource(getSyncStatusIcon(mStatus)); - iconView.setContentDescription(getSyncContentDescription(mStatus)); + if (!mShowTypeIcon) { + mSyncStatusIcon = (ImageView) view.findViewById(android.R.id.icon); + mSyncStatusIcon.setImageResource(getSyncStatusIcon(mStatus)); + mSyncStatusIcon.setContentDescription(getSyncContentDescription(mStatus)); + } } - public void setSyncStatus(int status) { + public void setSyncStatus(int status, boolean updateSummary) { mStatus = status; - setIcon(getSyncStatusIcon(status)); - setSummary(getSyncStatusMessage(status)); + if (!mShowTypeIcon && mSyncStatusIcon != null) { + mSyncStatusIcon.setImageResource(getSyncStatusIcon(status)); + mSyncStatusIcon.setContentDescription(getSyncContentDescription(mStatus)); + } + if (updateSummary) { + setSummary(getSyncStatusMessage(status)); + } } private int getSyncStatusMessage(int status) { @@ -109,7 +123,7 @@ public class AccountPreference extends Preference { res = R.drawable.ic_sync_red_holo; break; case SYNC_IN_PROGRESS: - res = R.drawable.ic_sync_grey_holo; + res = R.drawable.ic_sync_green_holo; break; default: res = R.drawable.ic_sync_red_holo; diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 353bc3a..50019a3 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -112,6 +112,7 @@ public class Settings extends PreferenceActivity private AuthenticatorHelper mAuthenticatorHelper; private Header mLastHeader; + private boolean mListeningToAccountUpdates; @Override protected void onCreate(Bundle savedInstanceState) { @@ -187,7 +188,6 @@ public class Settings extends PreferenceActivity ListAdapter listAdapter = getListAdapter(); if (listAdapter instanceof HeaderAdapter) { ((HeaderAdapter) listAdapter).resume(); - AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true); } } @@ -198,6 +198,13 @@ public class Settings extends PreferenceActivity ListAdapter listAdapter = getListAdapter(); if (listAdapter instanceof HeaderAdapter) { ((HeaderAdapter) listAdapter).pause(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mListeningToAccountUpdates) { AccountManager.get(this).removeOnAccountsUpdatedListener(this); } } @@ -462,6 +469,10 @@ public class Settings extends PreferenceActivity for (Header header : accountHeaders) { target.add(headerIndex++, header); } + if (!mListeningToAccountUpdates) { + AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true); + mListeningToAccountUpdates = true; + } return headerIndex; } diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java index 85cf025..bb1ebdd 100644 --- a/src/com/android/settings/accounts/ManageAccountsSettings.java +++ b/src/com/android/settings/accounts/ManageAccountsSettings.java @@ -166,8 +166,8 @@ public class ManageAccountsSettings extends AccountPreferenceBase public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); boolean syncActive = ContentResolver.getCurrentSync() != null; - menu.findItem(MENU_SYNC_NOW_ID).setVisible(!syncActive); - menu.findItem(MENU_SYNC_CANCEL_ID).setVisible(syncActive); + menu.findItem(MENU_SYNC_NOW_ID).setVisible(!syncActive && mFirstAccount != null); + menu.findItem(MENU_SYNC_CANCEL_ID).setVisible(syncActive && mFirstAccount != null); } @Override @@ -274,16 +274,16 @@ public class ManageAccountsSettings extends AccountPreferenceBase } } if (syncIsFailing) { - accountPref.setSyncStatus(AccountPreference.SYNC_ERROR); + accountPref.setSyncStatus(AccountPreference.SYNC_ERROR, true); } else if (syncCount == 0) { - accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED); + accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED, true); } else if (syncCount > 0) { if (syncingNow) { - accountPref.setSyncStatus(AccountPreference.SYNC_IN_PROGRESS); + accountPref.setSyncStatus(AccountPreference.SYNC_IN_PROGRESS, true); } else { - accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED); + accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED, true); if (lastSuccessTime > 0) { - accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED); + accountPref.setSyncStatus(AccountPreference.SYNC_ENABLED, false); date.setTime(lastSuccessTime); final String timeString = formatSyncDate(date); accountPref.setSummary(getResources().getString( @@ -291,7 +291,7 @@ public class ManageAccountsSettings extends AccountPreferenceBase } } } else { - accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED); + accountPref.setSyncStatus(AccountPreference.SYNC_DISABLED, true); } } @@ -324,14 +324,14 @@ public class ManageAccountsSettings extends AccountPreferenceBase if (showAccount) { final Drawable icon = getDrawableForType(account.type); final AccountPreference preference = - new AccountPreference(getActivity(), account, icon, auths); + new AccountPreference(getActivity(), account, icon, auths, false); getPreferenceScreen().addPreference(preference); if (mFirstAccount == null) { mFirstAccount = account; } } } - if (mAccountType != null) { + if (mAccountType != null && mFirstAccount != null) { addAuthenticatorSettings(); } onSyncStateUpdated(); diff --git a/src/com/android/settings/accounts/SyncSettings.java b/src/com/android/settings/accounts/SyncSettings.java new file mode 100644 index 0000000..20c296a --- /dev/null +++ b/src/com/android/settings/accounts/SyncSettings.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.accounts; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.OnAccountsUpdateListener; +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceScreen; +import android.util.Log; + +import com.android.settings.AccountPreference; +import com.android.settings.DialogCreatable; +import com.android.settings.R; + +import java.util.ArrayList; + +public class SyncSettings extends AccountPreferenceBase + implements OnAccountsUpdateListener, DialogCreatable { + + private static final String KEY_SYNC_SWITCH = "sync_switch"; + + private String[] mAuthorities; + + private SettingsDialogFragment mDialogFragment; + private CheckBoxPreference mAutoSyncPreference; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + addPreferencesFromResource(R.xml.sync_settings); + mAutoSyncPreference = + (CheckBoxPreference) getPreferenceScreen().findPreference(KEY_SYNC_SWITCH); + mAutoSyncPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + ContentResolver.setMasterSyncAutomatically((Boolean) newValue); + return true; + } + }); + + setHasOptionsMenu(true); + } + + @Override + public void onStart() { + super.onStart(); + Activity activity = getActivity(); + AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + final Activity activity = getActivity(); + mAutoSyncPreference.setChecked(ContentResolver.getMasterSyncAutomatically()); + mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY); + + updateAuthDescriptions(); + } + + @Override + public void onStop() { + super.onStop(); + final Activity activity = getActivity(); + AccountManager.get(activity).removeOnAccountsUpdatedListener(this); + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) { + if (preference instanceof AccountPreference) { + startAccountSettings((AccountPreference) preference); + } else { + return false; + } + return true; + } + + private void startAccountSettings(AccountPreference acctPref) { + Intent intent = new Intent("android.settings.ACCOUNT_SYNC_SETTINGS"); + intent.putExtra(AccountSyncSettings.ACCOUNT_KEY, acctPref.getAccount()); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + finish(); + } + + @Override + public void showDialog(int dialogId) { + if (mDialogFragment != null) { + Log.e(TAG, "Old dialog fragment not null!"); + } + mDialogFragment = new SettingsDialogFragment(this, dialogId); + mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId)); + } + + private void removeAccountPreferences() { + PreferenceScreen parent = getPreferenceScreen(); + for (int i = 0; i < parent.getPreferenceCount(); ) { + if (parent.getPreference(i) instanceof AccountPreference) { + parent.removePreference(parent.getPreference(i)); + } else { + i++; + } + } + } + + @Override + public void onAccountsUpdated(Account[] accounts) { + if (getActivity() == null) return; + + removeAccountPreferences(); + for (int i = 0, n = accounts.length; i < n; i++) { + final Account account = accounts[i]; + final ArrayList<String> auths = getAuthoritiesForAccountType(account.type); + + boolean showAccount = true; + if (mAuthorities != null && auths != null) { + showAccount = false; + for (String requestedAuthority : mAuthorities) { + if (auths.contains(requestedAuthority)) { + showAccount = true; + break; + } + } + } + + if (showAccount) { + final Drawable icon = getDrawableForType(account.type); + final AccountPreference preference = + new AccountPreference(getActivity(), account, icon, auths, true); + getPreferenceScreen().addPreference(preference); + preference.setSummary(getLabelForType(account.type)); + } + } + onSyncStateUpdated(); + } + + @Override + protected void onAuthDescriptionsUpdated() { + // Update account icons for all account preference items + for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { + Preference pref = getPreferenceScreen().getPreference(i); + if (pref instanceof AccountPreference) { + AccountPreference accPref = (AccountPreference) + getPreferenceScreen().getPreference(i); + accPref.setIcon(getDrawableForType(accPref.getAccount().type)); + accPref.setSummary(getLabelForType(accPref.getAccount().type)); + } + } + } +} diff --git a/src/com/android/settings/accounts/SyncSettingsActivity.java b/src/com/android/settings/accounts/SyncSettingsActivity.java new file mode 100644 index 0000000..ed0089e --- /dev/null +++ b/src/com/android/settings/accounts/SyncSettingsActivity.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.accounts; + +import android.content.Intent; +import android.preference.PreferenceActivity; + +/** + * Launcher activity for the SyncSettings fragment. + * + */ +public class SyncSettingsActivity extends PreferenceActivity { + @Override + public Intent getIntent() { + Intent modIntent = new Intent(super.getIntent()); + modIntent.putExtra(EXTRA_SHOW_FRAGMENT, SyncSettings.class.getName()); + modIntent.putExtra(EXTRA_NO_HEADERS, true); + return modIntent; + } +}
\ No newline at end of file |