Merge "Obeying Settings.EXTRA_AUTHORITIES extra for SYNC_SETTINGS" into lmp-dev
diff --git a/src/com/android/settings/accounts/AccountPreferenceBase.java b/src/com/android/settings/accounts/AccountPreferenceBase.java
index 28da591..bb60871 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 java.util.ArrayList;
 import java.util.Date;
-import java.util.HashMap;
 
 class AccountPreferenceBase extends SettingsPreferenceFragment
         implements AuthenticatorHelper.OnAccountsUpdateListener {
@@ -59,7 +53,6 @@
 
     private UserManager mUm;
     private Object mStatusChangeListenerHandle;
-    private HashMap<String, ArrayList<String>> mAccountTypeToAuthorities = null;
     protected AuthenticatorHelper mAuthenticatorHelper;
     protected UserHandle mUserHandle;
 
@@ -136,25 +129,7 @@
     };
 
     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);
     }
 
     /**
diff --git a/src/com/android/settings/accounts/AccountSettings.java b/src/com/android/settings/accounts/AccountSettings.java
index 9bcef13..f057cbf 100644
--- a/src/com/android/settings/accounts/AccountSettings.java
+++ b/src/com/android/settings/accounts/AccountSettings.java
@@ -57,6 +57,7 @@
 
 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 @@
     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 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 @@
             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 @@
 
         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;
diff --git a/src/com/android/settings/accounts/AuthenticatorHelper.java b/src/com/android/settings/accounts/AuthenticatorHelper.java
index 069d1e8..6cebf5f 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 @@
     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 @@
         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 @@
         if (mListeningToAccountUpdates) {
             mListener.onAccountsUpdate(mUserHandle);
         }
+        buildAccountTypeToAuthoritiesMap();
     }
 
     @Override
@@ -215,4 +222,27 @@
             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);
+        }
+    }
 }