Merge "Display a list of account types as account setting summary"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 711d720..c1f40af 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8318,9 +8318,6 @@
     <!-- Summary of memory screen [CHAR LIMIT=NONE] -->
     <string name="memory_summary">Avg <xliff:g id="used_memory" example="1.7GB">%1$s</xliff:g> of <xliff:g id="total_memory" example="2GB">%2$s</xliff:g> memory used</string>
 
-    <!-- Summary of Users & accounts setting screen [CHAR LIMIT=NONE] -->
-    <string name="users_and_accounts_summary">Current user: <xliff:g id="user_name" example="Jason">%1$s</xliff:g></string>
-
     <!-- Summary of User settings [CHAR LIMIT=NONE] -->
     <string name="users_summary">Signed in as <xliff:g id="user_name" example="Jason">%1$s</xliff:g></string>
 
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index fe967b8..65a5ff0 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -19,16 +19,16 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.pm.UserInfo;
 import android.os.UserHandle;
-import android.os.UserManager;
 import android.provider.SearchIndexableResource;
+import android.text.BidiFormatter;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.accounts.AuthenticatorHelper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import java.util.ArrayList;
@@ -84,10 +84,27 @@
         @Override
         public void setListening(boolean listening) {
             if (listening) {
-                UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
-                        UserHandle.myUserId());
-                mSummaryLoader.setSummary(this,
-                        mContext.getString(R.string.users_and_accounts_summary, info.name));
+                final AuthenticatorHelper authHelper = new AuthenticatorHelper(mContext,
+                        UserHandle.of(UserHandle.myUserId()), null /* OnAccountsUpdateListener */);
+                final String[] types = authHelper.getEnabledAccountTypes();
+
+                final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
+
+                CharSequence summary = null;
+
+                // Show up to 3 account types
+                final int size = Math.min(3, types.length);
+
+                for (int i = 0; i < size; i++) {
+                    final CharSequence label = authHelper.getLabelForType(mContext, types[i]);
+                    if (summary == null) {
+                        summary = bidiFormatter.unicodeWrap(label);
+                    } else {
+                        summary = mContext.getString(R.string.join_many_items_middle, summary,
+                                bidiFormatter.unicodeWrap(label));
+                    }
+                }
+                mSummaryLoader.setSummary(this, summary);
             }
         }
     }
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
index dff82aa..aeffd20 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
@@ -15,42 +15,40 @@
  */
 package com.android.settings.accounts;
 
-import android.app.Activity;
-import android.content.pm.UserInfo;
-import android.os.UserManager;
-import android.provider.SearchIndexableResource;
+import static com.android.settings.accounts.AccountDashboardFragmentTest
+        .ShadowAuthenticationHelper.LABELS;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 
-import com.android.settings.R;
+import android.app.Activity;
+import android.content.Context;
+import android.os.UserHandle;
+import android.provider.SearchIndexableResource;
+import android.text.TextUtils;
+
 import com.android.settings.TestConfig;
 import com.android.settings.dashboard.SummaryLoader;
+import com.android.settingslib.accounts.AuthenticatorHelper;
 import com.android.settingslib.drawer.CategoryKey;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.List;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
 @RunWith(RobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class AccountDashboardFragmentTest {
 
-    private static final String METADATA_CATEGORY = "com.android.settings.category";
-    private static final String METADATA_ACCOUNT_TYPE = "com.android.settings.ia.account";
-
-    @Mock
-    private UserManager mUserManager;
     private AccountDashboardFragment mFragment;
 
     @Before
@@ -65,21 +63,18 @@
     }
 
     @Test
-    public void updateSummary_shouldDisplaySignedInUser() {
-        final Activity activity = mock(Activity.class);
+    @Config(shadows = {
+            ShadowAuthenticationHelper.class
+    })
+    public void updateSummary_shouldDisplayUpTo3AccountTypes() {
         final SummaryLoader loader = mock(SummaryLoader.class);
-        final UserInfo userInfo = new UserInfo();
-        userInfo.name = "test_name";
-
-        when(activity.getSystemService(UserManager.class)).thenReturn(mUserManager);
-        when(mUserManager.getUserInfo(anyInt())).thenReturn(userInfo);
+        final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
 
         final SummaryLoader.SummaryProvider provider = mFragment.SUMMARY_PROVIDER_FACTORY
                 .createSummaryProvider(activity, loader);
         provider.setListening(true);
 
-        verify(activity).getString(R.string.users_and_accounts_summary,
-                userInfo.name);
+        verify(loader).setSummary(provider, LABELS[0] + ", " + LABELS[1] + ", " + LABELS[2]);
     }
 
     @Test
@@ -92,4 +87,36 @@
         assertThat(indexRes).isNotNull();
         assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId());
     }
+
+    @Implements(AuthenticatorHelper.class)
+    public static class ShadowAuthenticationHelper {
+
+        static final String[] TYPES = new String[] {"type1", "type2", "type3", "type4"};
+        static final String[] LABELS = new String[] {"LABEL1", "LABEL2",
+                "LABEL3", "LABEL4"};
+
+        public void __constructor__(Context context, UserHandle userHandle,
+                AuthenticatorHelper.OnAccountsUpdateListener listener) {
+
+        }
+
+        @Implementation
+        public String[] getEnabledAccountTypes() {
+            return TYPES;
+        }
+
+        @Implementation
+        public CharSequence getLabelForType(Context context, final String accountType) {
+            if (TextUtils.equals(accountType, TYPES[0])) {
+                return LABELS[0];
+            } else if (TextUtils.equals(accountType, TYPES[1])) {
+                return LABELS[1];
+            } else if (TextUtils.equals(accountType, TYPES[2])) {
+                return LABELS[2];
+            } else if (TextUtils.equals(accountType, TYPES[3])) {
+                return LABELS[3];
+            }
+            return "no_label";
+        }
+    }
 }