Move ManageAccountsSettings into Settings.

- Add activity-alias for the Activity.
- Copy the Activity from AccountsAndSyncSettings.
- Fragmentize ManageAccountsSettings.
- Remove dependency toward AccountPreferenceBase, which is
  used in AccountsAndSyncSettings widely.
- Add missing implementation derived from AccountPrefernceBase.
- Copy dependent drawables.
- Copy dependent xmls
- Copy AccountPrefernce.java.
- Copy strings, adding CHAR LIMIT.
- Remove the logic which remove the preference when its destination
  Activity is missing. We already have the destination as
  Fragment, and it never disappear.

Change-Id: Id41c63d7064aebeaae31bcd84bf4fd20a5636dfe
This commit is contained in:
Daisuke Miyakawa
2010-09-15 20:09:12 -07:00
parent 4f169ba1aa
commit a2633d0232
26 changed files with 756 additions and 6 deletions

View File

@@ -830,6 +830,17 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity-alias
android:name="ManageAccountsSettings"
android:label="@string/sync_settings"
android:targetActivity="Settings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.settings.SYNC_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity-alias>
<receiver android:name=".widget.SettingsAppWidgetProvider" android:label="@string/gadget_title"> <receiver android:name=".widget.SettingsAppWidgetProvider" android:label="@string/gadget_title">
<intent-filter> <intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/res/drawable/status_icon_background.xml
**
** Copyright 2007, 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.
*/
-->
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/ic_list_sync_anim0" android:duration="150" />
<item android:drawable="@drawable/ic_list_sync_anim1" android:duration="150" />
<item android:drawable="@drawable/ic_list_sync_anim2" android:duration="150" />
<item android:drawable="@drawable/ic_list_sync_anim3" android:duration="150" />
</animation-list>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingLeft="16dip"
android:paddingRight="?android:attr/scrollbarSize">
<ImageView
android:id="@+id/providerIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="5dip"
android:layout_gravity="center" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:layout_weight="1">
<TextView android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView android:id="@+android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignLeft="@android:id/title"
android:textAppearance="?android:attr/textAppearanceSmall"
android:maxLines="2" />
</RelativeLayout>
<ImageView
android:id="@+id/syncStatusIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginRight="7dip"
android:layout_gravity="center" />
</LinearLayout>

View File

@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/layout/list_content.xml
**
** Copyright 2006, 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.
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:drawSelectorOnTop="false"
android:scrollbarAlwaysDrawVerticalTrack="true"
/>
<TextView android:id="@+id/sync_settings_error_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sync_is_failing" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@android:drawable/bottom_bar">
<View
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"/>
<Button android:id="@+id/add_account_button"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_marginTop="5dip"
android:text="@string/add_account_label" />
<View
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>

View File

@@ -2700,4 +2700,38 @@ found in the list of installed applications.</string>
<!-- Do not translate. This is a stub which will be removed soon. --> <!-- Do not translate. This is a stub which will be removed soon. -->
<string name="time_zone_auto_stub" translatable="false">Select Time Zone</string> <string name="time_zone_auto_stub" translatable="false">Select Time Zone</string>
<!-- Message when sync is currently failing [CHAR LIMIT=100] -->
<string name="sync_is_failing">Sync is currently experiencing problems. It will be back shortly.</string>
<!-- Button label to add an account [CHAR LIMIT=20] -->
<string name="add_account_label">Add account</string>
<!-- Header title for those settings relating to general syncing.
[CHAR LIMIT=30] -->
<string name="header_general_sync_settings">General sync settings</string>
<!-- Data synchronization settings screen, title of setting that controls whether background data should be used [CHAR LIMIT=30] -->
<string name="background_data">Background data</string>
<!-- Data synchronization settings screen, summary of setting that controls whether background data should be used [CHAR LIMIT=60] -->
<string name="background_data_summary">Applications can sync, send, and receive data at any time</string>
<!-- Data synchronization settings screen, title of dialog that confirms the user's unchecking of background data [CHAR LIMIT=20] -->
<string name="background_data_dialog_title">Attention</string>
<!-- Data synchronization settings screen, message of dialog that confirms the user's unchecking of background data [CHAR LIMIT=200] -->
<string name="background_data_dialog_message">Disabling background data extends battery life and lowers data use. Some applications may still use the background data connection.</string>
<!-- Data synchronization settings screen, setting option name
[CHAR LIMIT=30] -->
<string name="sync_automatically">Auto-sync</string>
<!-- Data synchronization settings screen, setting option summary text when check box is selected [CHAR LIMIT=60] -->
<string name="sync_automatically_summary">Applications sync data automatically</string>
<!-- Header title for list of accounts on Accounts & Synchronization settings [CHAR LIMIT=30] -->
<string name="header_manage_accounts">Manage accounts</string>
<!-- Sync status messages on Accounts & Synchronization settings --><skip/>
<!-- Sync status shown when sync is enabled [CHAR LIMIT=20] -->
<string name="sync_enabled">Sync is ON</string>
<!-- Sync status shown when sync is disabled [CHAR LIMIT=20] -->
<string name="sync_disabled">Sync is OFF</string>
<!-- Sync status shown when last sync resulted in an error [CHAR LIMIT=20] -->
<string name="sync_error">Sync error</string>
</resources> </resources>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/header_general_sync_settings" />
<CheckBoxPreference android:key="backgroundDataCheckBox"
android:persistent="false"
android:title="@string/background_data"
android:summary="@string/background_data_summary"/>
<CheckBoxPreference android:key="syncAutomaticallyCheckBox"
android:persistent="false"
android:dependency="backgroundDataCheckBox"
android:title="@string/sync_automatically"
android:summary="@string/sync_automatically_summary"/>
<PreferenceCategory android:key="manageAccountsCategory"
android:title="@string/header_manage_accounts" />
</PreferenceScreen>

View File

@@ -93,10 +93,10 @@
preference. --> preference. -->
<com.android.settings.IconPreferenceScreen <com.android.settings.IconPreferenceScreen
android:fragment="com.android.settings.ManageAccountsSettings"
settings:icon="@drawable/ic_settings_sync" settings:icon="@drawable/ic_settings_sync"
android:title="@string/sync_settings" android:title="@string/sync_settings"
android:key="sync_settings"> android:key="sync_settings">
<intent android:action="android.settings.SYNC_SETTINGS" />
</com.android.settings.IconPreferenceScreen> </com.android.settings.IconPreferenceScreen>
<!-- Privacy --> <!-- Privacy -->

View File

@@ -0,0 +1,142 @@
/*
* 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;
import java.util.ArrayList;
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.preference.Preference;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
/**
* AccountPreference is used to display a username, status and provider icon for an account on
* the device.
*/
public class AccountPreference extends Preference {
private static final String TAG = "AccountPreference";
public static final int SYNC_ENABLED = 0; // all know sync adapters are enabled and OK
public static final int SYNC_DISABLED = 1; // no sync adapters are enabled
public static final int SYNC_ERROR = 2; // one or more sync adapters have a problem
private int mStatus;
private Account mAccount;
private ArrayList<String> mAuthorities;
private Drawable mProviderIcon;
private ImageView mSyncStatusIcon;
private ImageView mProviderIconView;
public AccountPreference(Context context, Account account, Drawable icon,
ArrayList<String> authorities) {
super(context);
mAccount = account;
mAuthorities = authorities;
mProviderIcon = icon;
setLayoutResource(R.layout.account_preference);
setTitle(mAccount.name);
setSummary("");
// Add account info to the intent for AccountSyncSettings
Intent intent = new Intent("android.settings.ACCOUNT_SYNC_SETTINGS");
intent.putExtra("account", mAccount);
setIntent(intent);
setPersistent(false);
setSyncStatus(SYNC_DISABLED);
}
public Account getAccount() {
return mAccount;
}
public ArrayList<String> getAuthorities() {
return mAuthorities;
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
setSummary(getSyncStatusMessage(mStatus));
mProviderIconView = (ImageView) view.findViewById(R.id.providerIcon);
mProviderIconView.setImageDrawable(mProviderIcon);
mSyncStatusIcon = (ImageView) view.findViewById(R.id.syncStatusIcon);
mSyncStatusIcon.setImageResource(getSyncStatusIcon(mStatus));
}
public void setProviderIcon(Drawable icon) {
mProviderIcon = icon;
if (mProviderIconView != null) {
mProviderIconView.setImageDrawable(icon);
}
}
public void setSyncStatus(int status) {
mStatus = status;
if (mSyncStatusIcon != null) {
mSyncStatusIcon.setImageResource(getSyncStatusIcon(status));
}
setSummary(getSyncStatusMessage(status));
}
private int getSyncStatusMessage(int status) {
int res;
switch (status) {
case SYNC_ENABLED:
res = R.string.sync_enabled;
break;
case SYNC_DISABLED:
res = R.string.sync_disabled;
break;
case SYNC_ERROR:
res = R.string.sync_error;
break;
default:
res = R.string.sync_error;
Log.e(TAG, "Unknown sync status: " + status);
}
return res;
}
private int getSyncStatusIcon(int status) {
int res;
switch (status) {
case SYNC_ENABLED:
res = R.drawable.ic_sync_green;
break;
case SYNC_DISABLED:
res = R.drawable.ic_sync_grey;
break;
case SYNC_ERROR:
res = R.drawable.ic_sync_red;
break;
default:
res = R.drawable.ic_sync_red;
Log.e(TAG, "Unknown sync status: " + status);
}
return res;
}
@Override
public int compareTo(Preference other) {
if (!(other instanceof AccountPreference)) {
// Put other preference types above us
return 1;
}
return mAccount.name.compareTo(((AccountPreference) other).mAccount.name);
}
}

View File

@@ -0,0 +1,373 @@
/*
* 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;
import com.google.android.collect.Maps;
import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AuthenticatorDescription;
import android.accounts.OnAccountsUpdateListener;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SyncAdapterType;
import android.content.SyncInfo;
import android.content.SyncStatusInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class ManageAccountsSettings extends PreferenceFragment
implements View.OnClickListener, OnAccountsUpdateListener, DialogCreatable {
private static final String TAG = ManageAccountsSettings.class.getSimpleName();
private static final String AUTHORITIES_FILTER_KEY = "authorities";
private static final boolean LDEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final String AUTO_SYNC_CHECKBOX_KEY = "syncAutomaticallyCheckBox";
private static final String MANAGE_ACCOUNTS_CATEGORY_KEY = "manageAccountsCategory";
private static final String BACKGROUND_DATA_CHECKBOX_KEY = "backgroundDataCheckBox";
private static final int DIALOG_DISABLE_BACKGROUND_DATA = 1;
private CheckBoxPreference mBackgroundDataCheckBox;
private PreferenceCategory mManageAccountsCategory;
private String[] mAuthorities;
private TextView mErrorInfoView;
private Button mAddAccountButton;
private CheckBoxPreference mAutoSyncCheckbox;
private SettingsDialogFragment mDialogFragment;
private AuthenticatorDescription[] mAuthDescs;
private Map<String, AuthenticatorDescription> mTypeToAuthDescription
= new HashMap<String, AuthenticatorDescription>();
private HashMap<String, ArrayList<String>> mAccountTypeToAuthorities = null;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.manage_accounts_screen, container, false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Activity activity = getActivity();
addPreferencesFromResource(R.xml.manage_accounts_settings);
final View view = getView();
mErrorInfoView = (TextView)view.findViewById(R.id.sync_settings_error_info);
mErrorInfoView.setVisibility(View.GONE);
mErrorInfoView.setCompoundDrawablesWithIntrinsicBounds(
activity.getResources().getDrawable(R.drawable.ic_list_syncerror),
null, null, null);
mBackgroundDataCheckBox = (CheckBoxPreference) findPreference(BACKGROUND_DATA_CHECKBOX_KEY);
mAutoSyncCheckbox = (CheckBoxPreference) findPreference(AUTO_SYNC_CHECKBOX_KEY);
mManageAccountsCategory = (PreferenceCategory)findPreference(MANAGE_ACCOUNTS_CATEGORY_KEY);
mAuthorities = activity.getIntent().getStringArrayExtra(AUTHORITIES_FILTER_KEY);
mAddAccountButton = (Button)view.findViewById(R.id.add_account_button);
mAddAccountButton.setOnClickListener(this);
AccountManager.get(activity).addOnAccountsUpdatedListener(this, null, true);
updateAuthDescriptions(activity);
}
@Override
public void onDestroy() {
AccountManager.get(getActivity()).removeOnAccountsUpdatedListener(this);
super.onDestroy();
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferences, Preference preference) {
if (preference == mBackgroundDataCheckBox) {
final ConnectivityManager connManager = (ConnectivityManager)
getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
final boolean oldBackgroundDataSetting = connManager.getBackgroundDataSetting();
final boolean backgroundDataSetting = mBackgroundDataCheckBox.isChecked();
if (oldBackgroundDataSetting != backgroundDataSetting) {
if (backgroundDataSetting) {
setBackgroundDataInt(true);
onSyncStateUpdated();
} else {
// This will get unchecked only if the user hits "Ok"
mBackgroundDataCheckBox.setChecked(true);
showDialog(DIALOG_DISABLE_BACKGROUND_DATA);
}
}
} else if (preference == mAutoSyncCheckbox) {
ContentResolver.setMasterSyncAutomatically(mAutoSyncCheckbox.isChecked());
onSyncStateUpdated();
} else {
return false;
}
return true;
}
@Override
public Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DISABLE_BACKGROUND_DATA:
final CheckBoxPreference pref =
(CheckBoxPreference) findPreference(BACKGROUND_DATA_CHECKBOX_KEY);
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.background_data_dialog_title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setMessage(R.string.background_data_dialog_message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
setBackgroundDataInt(false);
pref.setChecked(false);
onSyncStateUpdated();
}
})
.setNegativeButton(android.R.string.cancel, null)
.create();
}
return null;
}
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 setBackgroundDataInt(boolean enabled) {
final ConnectivityManager connManager = (ConnectivityManager)
getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
connManager.setBackgroundDataSetting(enabled);
}
private void onSyncStateUpdated() {
// Set background connection state
final ConnectivityManager connManager = (ConnectivityManager)
getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
final boolean backgroundDataSetting = connManager.getBackgroundDataSetting();
mBackgroundDataCheckBox.setChecked(backgroundDataSetting);
boolean masterSyncAutomatically = ContentResolver.getMasterSyncAutomatically();
mAutoSyncCheckbox.setChecked(masterSyncAutomatically);
// iterate over all the preferences, setting the state properly for each
SyncInfo currentSync = ContentResolver.getCurrentSync();
boolean anySyncFailed = false; // true if sync on any account failed
// only track userfacing sync adapters when deciding if account is synced or not
final SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypes();
HashSet<String> userFacing = new HashSet<String>();
for (int k = 0, n = syncAdapters.length; k < n; k++) {
final SyncAdapterType sa = syncAdapters[k];
if (sa.isUserVisible()) {
userFacing.add(sa.authority);
}
}
for (int i = 0, count = mManageAccountsCategory.getPreferenceCount(); i < count; i++) {
Preference pref = mManageAccountsCategory.getPreference(i);
if (! (pref instanceof AccountPreference)) {
continue;
}
AccountPreference accountPref = (AccountPreference) pref;
Account account = accountPref.getAccount();
int syncCount = 0;
boolean syncIsFailing = false;
final ArrayList<String> authorities = accountPref.getAuthorities();
if (authorities != null) {
for (String authority : authorities) {
SyncStatusInfo status = ContentResolver.getSyncStatus(account, authority);
boolean syncEnabled = ContentResolver.getSyncAutomatically(account, authority)
&& masterSyncAutomatically
&& backgroundDataSetting
&& (ContentResolver.getIsSyncable(account, authority) > 0);
boolean authorityIsPending = ContentResolver.isSyncPending(account, authority);
boolean activelySyncing = currentSync != null
&& currentSync.authority.equals(authority)
&& new Account(currentSync.account.name, currentSync.account.type)
.equals(account);
boolean lastSyncFailed = status != null
&& syncEnabled
&& status.lastFailureTime != 0
&& status.getLastFailureMesgAsInt(0)
!= ContentResolver.SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS;
if (lastSyncFailed && !activelySyncing && !authorityIsPending) {
syncIsFailing = true;
anySyncFailed = true;
}
syncCount += syncEnabled && userFacing.contains(authority) ? 1 : 0;
}
} else {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "no syncadapters found for " + account);
}
}
int syncStatus = AccountPreference.SYNC_DISABLED;
if (syncIsFailing) {
syncStatus = AccountPreference.SYNC_ERROR;
} else if (syncCount == 0) {
syncStatus = AccountPreference.SYNC_DISABLED;
} else if (syncCount > 0) {
syncStatus = AccountPreference.SYNC_ENABLED;
}
accountPref.setSyncStatus(syncStatus);
}
mErrorInfoView.setVisibility(anySyncFailed ? View.VISIBLE : View.GONE);
}
@Override
public void onAccountsUpdated(Account[] accounts) {
mManageAccountsCategory.removeAll();
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);
mManageAccountsCategory.addPreference(preference);
}
}
onSyncStateUpdated();
}
private void onAuthDescriptionsUpdated() {
// Update account icons for all account preference items
for (int i = 0; i < mManageAccountsCategory.getPreferenceCount(); i++) {
AccountPreference pref = (AccountPreference) mManageAccountsCategory.getPreference(i);
pref.setProviderIcon(getDrawableForType(pref.getAccount().type));
pref.setSummary(getLabelForType(pref.getAccount().type));
}
}
public void onClick(View v) {
if (v == mAddAccountButton) {
Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");
intent.putExtra(AUTHORITIES_FILTER_KEY, mAuthorities);
startActivity(intent);
}
}
/* The logic below is copied from AcountPrefernceBase */
private Drawable getDrawableForType(final String accountType) {
Drawable icon = null;
if (mTypeToAuthDescription.containsKey(accountType)) {
try {
AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
Context authContext = getActivity().createPackageContext(desc.packageName, 0);
icon = authContext.getResources().getDrawable(desc.iconId);
} catch (PackageManager.NameNotFoundException e) {
// TODO: place holder icon for missing account icons?
Log.w(TAG, "No icon for account type " + accountType);
}
}
return icon;
}
private CharSequence getLabelForType(final String accountType) {
CharSequence label = null;
if (mTypeToAuthDescription.containsKey(accountType)) {
try {
AuthenticatorDescription desc = mTypeToAuthDescription.get(accountType);
Context authContext = getActivity().createPackageContext(desc.packageName, 0);
label = authContext.getResources().getText(desc.labelId);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "No label for account type " + ", type " + accountType);
}
}
return label;
}
private ArrayList<String> getAuthoritiesForAccountType(String type) {
if (mAccountTypeToAuthorities == null) {
mAccountTypeToAuthorities = Maps.newHashMap();
SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypes();
for (int i = 0, n = syncAdapters.length; i < n; i++) {
final SyncAdapterType sa = syncAdapters[i];
ArrayList<String> authorities = mAccountTypeToAuthorities.get(sa.accountType);
if (authorities == null) {
authorities = new ArrayList<String>();
mAccountTypeToAuthorities.put(sa.accountType, authorities);
}
if (LDEBUG) {
Log.d(TAG, "added authority " + sa.authority + " to accountType "
+ sa.accountType);
}
authorities.add(sa.authority);
}
}
return mAccountTypeToAuthorities.get(type);
}
private void updateAuthDescriptions(Context context) {
mAuthDescs = AccountManager.get(context).getAuthenticatorTypes();
for (int i = 0; i < mAuthDescs.length; i++) {
mTypeToAuthDescription.put(mAuthDescs[i].type, mAuthDescs[i]);
}
onAuthDescriptionsUpdated();
}
}

View File

@@ -235,8 +235,6 @@ public class Settings extends Activity
private void updatePreferenceList() { private void updatePreferenceList() {
final Activity activity = getActivity(); final Activity activity = getActivity();
PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT); PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
Utils.updatePreferenceToSpecificActivityOrRemove(activity, parent,
KEY_SYNC_SETTINGS, 0);
Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS); Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false
&& dockSettings != null) { && dockSettings != null) {

View File

@@ -16,14 +16,12 @@
package com.android.settings; package com.android.settings;
import java.util.List;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.Resources.NotFoundException; import android.content.res.Resources.NotFoundException;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@@ -33,6 +31,9 @@ import android.preference.Preference;
import android.preference.PreferenceGroup; import android.preference.PreferenceGroup;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import java.util.List;
public class Utils { public class Utils {