From af0d9540c26ee1cf79606dc524dbfd70342d2b06 Mon Sep 17 00:00:00 2001 From: Alexandra Gherghina Date: Wed, 3 Sep 2014 14:17:35 +0100 Subject: [PATCH] Obeying Settings.EXTRA_AUTHORITIES extra for SYNC_SETTINGS Bug: 17188306 Change-Id: I00481c6c4f346b6f4037554296735f4323cbbcfb --- .../accounts/AccountPreferenceBase.java | 27 +--------------- .../settings/accounts/AccountSettings.java | 24 +++++++++++++- .../accounts/AuthenticatorHelper.java | 32 ++++++++++++++++++- 3 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/com/android/settings/accounts/AccountPreferenceBase.java b/src/com/android/settings/accounts/AccountPreferenceBase.java index 28da5918e70..bb6087146f4 100644 --- a/src/com/android/settings/accounts/AccountPreferenceBase.java +++ b/src/com/android/settings/accounts/AccountPreferenceBase.java @@ -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> mAccountTypeToAuthorities = null; protected AuthenticatorHelper mAuthenticatorHelper; protected UserHandle mUserHandle; @@ -136,25 +129,7 @@ class AccountPreferenceBase extends SettingsPreferenceFragment }; public ArrayList 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 authorities = mAccountTypeToAuthorities.get(sa.accountType); - if (authorities == null) { - authorities = new ArrayList(); - 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); } /** diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java index 9bcef13ff20..f057cbff853 100644 --- a/src/com/android/settings/accounts/AccountSettings.java +++ b/src/com/android/settings/accounts/AccountSettings.java @@ -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 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; diff --git a/src/com/android/settings/accounts/AuthenticatorHelper.java b/src/com/android/settings/accounts/AuthenticatorHelper.java index 7ea2f12f076..51ece2bfe0e 100644 --- a/src/com/android/settings/accounts/AuthenticatorHelper.java +++ b/src/com/android/settings/accounts/AuthenticatorHelper.java @@ -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 mEnabledAccountTypes = new ArrayList(); private Map mAccTypeIconCache = new HashMap(); + private HashMap> 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 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 authorities = mAccountTypeToAuthorities.get(sa.accountType); + if (authorities == null) { + authorities = new ArrayList(); + 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); + } + } }