Merge "Obeying Settings.EXTRA_AUTHORITIES extra for SYNC_SETTINGS" into lmp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
dc3193ca63
@@ -17,15 +17,10 @@
|
||||
|
||||
package com.android.settings.accounts;
|
||||
|
||||
import com.google.android.collect.Maps;
|
||||
|
||||
import android.accounts.AuthenticatorDescription;
|
||||
import android.app.Activity;
|
||||
import android.app.ActivityManagerNative;
|
||||
import android.app.IActivityManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.SyncAdapterType;
|
||||
import android.content.SyncStatusObserver;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
@@ -45,7 +40,6 @@ import com.android.settings.Utils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
|
||||
class AccountPreferenceBase extends SettingsPreferenceFragment
|
||||
implements AuthenticatorHelper.OnAccountsUpdateListener {
|
||||
@@ -59,7 +53,6 @@ class AccountPreferenceBase extends SettingsPreferenceFragment
|
||||
|
||||
private UserManager mUm;
|
||||
private Object mStatusChangeListenerHandle;
|
||||
private HashMap<String, ArrayList<String>> mAccountTypeToAuthorities = null;
|
||||
protected AuthenticatorHelper mAuthenticatorHelper;
|
||||
protected UserHandle mUserHandle;
|
||||
|
||||
@@ -136,25 +129,7 @@ class AccountPreferenceBase extends SettingsPreferenceFragment
|
||||
};
|
||||
|
||||
public ArrayList<String> getAuthoritiesForAccountType(String type) {
|
||||
if (mAccountTypeToAuthorities == null) {
|
||||
mAccountTypeToAuthorities = Maps.newHashMap();
|
||||
SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
|
||||
mUserHandle.getIdentifier());
|
||||
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 (Log.isLoggable(TAG, Log.VERBOSE)) {
|
||||
Log.d(TAG, "added authority " + sa.authority + " to accountType "
|
||||
+ sa.accountType);
|
||||
}
|
||||
authorities.add(sa.authority);
|
||||
}
|
||||
}
|
||||
return mAccountTypeToAuthorities.get(type);
|
||||
return mAuthenticatorHelper.getAuthoritiesForAccountType(type);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -57,6 +57,7 @@ import java.util.List;
|
||||
|
||||
import static android.content.Intent.EXTRA_USER;
|
||||
import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
|
||||
import static android.provider.Settings.EXTRA_AUTHORITIES;
|
||||
|
||||
/**
|
||||
* Settings screen for the account types on the device.
|
||||
@@ -83,6 +84,8 @@ public class AccountSettings extends SettingsPreferenceFragment
|
||||
private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver
|
||||
= new ManagedProfileBroadcastReceiver();
|
||||
private Preference mProfileNotAvailablePreference;
|
||||
private String[] mAuthorities;
|
||||
private int mAuthoritiesCount = 0;
|
||||
|
||||
/**
|
||||
* Holds data related to the accounts belonging to one profile.
|
||||
@@ -114,7 +117,10 @@ public class AccountSettings extends SettingsPreferenceFragment
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mUm = (UserManager) getSystemService(Context.USER_SERVICE);
|
||||
mProfileNotAvailablePreference = new Preference(getActivity());
|
||||
mAuthorities = getActivity().getIntent().getStringArrayExtra(EXTRA_AUTHORITIES);
|
||||
if (mAuthorities != null) {
|
||||
mAuthoritiesCount = mAuthorities.length;
|
||||
}
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
|
||||
@@ -190,6 +196,7 @@ public class AccountSettings extends SettingsPreferenceFragment
|
||||
if (preference == profileData.addAccountPreference) {
|
||||
Intent intent = new Intent(ADD_ACCOUNT_ACTION);
|
||||
intent.putExtra(EXTRA_USER, profileData.userInfo.getUserHandle());
|
||||
intent.putExtra(EXTRA_AUTHORITIES, mAuthorities);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
@@ -353,6 +360,21 @@ public class AccountSettings extends SettingsPreferenceFragment
|
||||
|
||||
for (int i = 0; i < accountTypes.length; i++) {
|
||||
final String accountType = accountTypes[i];
|
||||
if (mAuthoritiesCount > 0) {
|
||||
// Skip showing any account that does not have any of the requested authorities
|
||||
final ArrayList<String> authoritiesForType = helper.getAuthoritiesForAccountType(
|
||||
accountType);
|
||||
boolean show = false;
|
||||
for (int j = 0; j < mAuthoritiesCount; j++) {
|
||||
if (authoritiesForType.contains(mAuthorities[j])) {
|
||||
show = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!show) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
final CharSequence label = helper.getLabelForType(getActivity(), accountType);
|
||||
if (label == null) {
|
||||
continue;
|
||||
|
@@ -16,13 +16,17 @@
|
||||
|
||||
package com.android.settings.accounts;
|
||||
|
||||
import com.google.android.collect.Maps;
|
||||
|
||||
import android.accounts.Account;
|
||||
import android.accounts.AccountManager;
|
||||
import android.accounts.AuthenticatorDescription;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SyncAdapterType;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -52,6 +56,7 @@ final public class AuthenticatorHelper extends BroadcastReceiver {
|
||||
private AuthenticatorDescription[] mAuthDescs;
|
||||
private ArrayList<String> mEnabledAccountTypes = new ArrayList<String>();
|
||||
private Map<String, Drawable> mAccTypeIconCache = new HashMap<String, Drawable>();
|
||||
private HashMap<String, ArrayList<String>> mAccountTypeToAuthorities = Maps.newHashMap();
|
||||
|
||||
private final UserHandle mUserHandle;
|
||||
private final UserManager mUm;
|
||||
@@ -69,7 +74,8 @@ final public class AuthenticatorHelper extends BroadcastReceiver {
|
||||
mUm = userManager;
|
||||
mUserHandle = userHandle;
|
||||
mListener = listener;
|
||||
// This guarantees that the helper is ready to use once constructed
|
||||
// This guarantees that the helper is ready to use once constructed: the account types and
|
||||
// authorities are initialized
|
||||
onAccountsUpdated(null);
|
||||
}
|
||||
|
||||
@@ -187,6 +193,7 @@ final public class AuthenticatorHelper extends BroadcastReceiver {
|
||||
if (mListeningToAccountUpdates) {
|
||||
mListener.onAccountsUpdate(mUserHandle);
|
||||
}
|
||||
buildAccountTypeToAuthoritiesMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -215,4 +222,27 @@ final public class AuthenticatorHelper extends BroadcastReceiver {
|
||||
mListeningToAccountUpdates = false;
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<String> getAuthoritiesForAccountType(String type) {
|
||||
return mAccountTypeToAuthorities.get(type);
|
||||
}
|
||||
|
||||
private void buildAccountTypeToAuthoritiesMap() {
|
||||
mAccountTypeToAuthorities.clear();
|
||||
SyncAdapterType[] syncAdapters = ContentResolver.getSyncAdapterTypesAsUser(
|
||||
mUserHandle.getIdentifier());
|
||||
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 (Log.isLoggable(TAG, Log.VERBOSE)) {
|
||||
Log.d(TAG, "Added authority " + sa.authority + " to accountType "
|
||||
+ sa.accountType);
|
||||
}
|
||||
authorities.add(sa.authority);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user