diff --git a/res/values/strings.xml b/res/values/strings.xml
index b1435c9..ad11706 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9218,6 +9218,8 @@
     <!-- Confirmation message displayed when the user taps Clear app, to ensure they want to remove
          the instant app from the device. -->
     <string name="clear_instant_app_confirmation">Do you want to remove this instant app?</string>
+    <!-- Label for button that allows user to launch the instant app. -->
+    <string name="launch_instant_app">Open</string>
 
     <!-- Title of games app storage screen [CHAR LIMIT=30] -->
     <string name="game_storage_settings">Games</string>
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index 0a4c343..9702102 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -22,6 +22,7 @@
 import android.os.UserHandle;
 import android.provider.SearchIndexableResource;
 import android.text.BidiFormatter;
+import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
@@ -94,17 +95,21 @@
                 if (types == null || types.length == 0) {
                     summary = mContext.getString(R.string.account_dashboard_default_summary);
                 } else {
-                    // Show up to 3 account types
-                    final int size = Math.min(3, types.length);
+                    // Show up to 3 account types, ignore any null value
+                    int accountToAdd = Math.min(3, types.length);
 
-                    for (int i = 0; i < size; i++) {
+                    for (int i = 0; i < types.length && accountToAdd > 0; i++) {
                         final CharSequence label = authHelper.getLabelForType(mContext, types[i]);
+                        if (TextUtils.isEmpty(label)) {
+                            continue;
+                        }
                         if (summary == null) {
                             summary = bidiFormatter.unicodeWrap(label);
                         } else {
                             summary = mContext.getString(R.string.join_many_items_middle, summary,
                                     bidiFormatter.unicodeWrap(label));
                         }
+                        accountToAdd--;
                     }
                 }
                 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 9371019..3ed9717 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
@@ -17,6 +17,9 @@
 
 import static com.android.settings.accounts.AccountDashboardFragmentTest
         .ShadowAuthenticationHelper.LABELS;
+import static com.android.settings.accounts.AccountDashboardFragmentTest
+        .ShadowAuthenticationHelper.TYPES;
+
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -75,7 +78,6 @@
             ShadowAuthenticationHelper.class
     })
     public void updateSummary_hasAccount_shouldDisplayUpTo3AccountTypes() {
-        ShadowAuthenticationHelper.setHasAccount(true);
         final SummaryLoader loader = mock(SummaryLoader.class);
         final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
 
@@ -91,7 +93,7 @@
             ShadowAuthenticationHelper.class
     })
     public void updateSummary_noAccount_shouldDisplayDefaultSummary() {
-        ShadowAuthenticationHelper.setHasAccount(false);
+        ShadowAuthenticationHelper.setEnabledAccount(null);
         final SummaryLoader loader = mock(SummaryLoader.class);
         final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
 
@@ -104,6 +106,24 @@
     }
 
     @Test
+    @Config(shadows = {
+        ShadowAuthenticationHelper.class
+    })
+    public void updateSummary_noAccountTypeLabel_shouldNotDisplayNullEntry() {
+        final SummaryLoader loader = mock(SummaryLoader.class);
+        final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
+        final String[] enabledAccounts = {TYPES[0], "unlabled_account_type", TYPES[1]};
+        ShadowAuthenticationHelper.setEnabledAccount(enabledAccounts);
+
+        final SummaryLoader.SummaryProvider provider = mFragment.SUMMARY_PROVIDER_FACTORY
+            .createSummaryProvider(activity, loader);
+        provider.setListening(true);
+
+        // should only show the 2 accounts with labels
+        verify(loader).setSummary(provider, LABELS[0] + ", " + LABELS[1]);
+    }
+
+    @Test
     public void testSearchIndexProvider_shouldIndexResource() {
         final List<SearchIndexableResource> indexRes =
                 AccountDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
@@ -118,26 +138,25 @@
     public static class ShadowAuthenticationHelper {
 
         static final String[] TYPES = new String[] {"type1", "type2", "type3", "type4"};
-        static final String[] LABELS = new String[] {"LABEL1", "LABEL2",
-                "LABEL3", "LABEL4"};
-        private static boolean sHasAccount = true;
+        static final String[] LABELS = new String[] {"LABEL1", "LABEL2", "LABEL3", "LABEL4"};
+        private static String[] sEnabledAccount = TYPES;
 
         public void __constructor__(Context context, UserHandle userHandle,
                 AuthenticatorHelper.OnAccountsUpdateListener listener) {
         }
 
-        public static void setHasAccount(boolean hasAccount) {
-            sHasAccount = hasAccount;
+        public static void setEnabledAccount(String[] enabledAccount) {
+            sEnabledAccount = enabledAccount;
         }
 
         @Resetter
         public static void reset() {
-            sHasAccount = true;
+            sEnabledAccount = TYPES;
         }
 
         @Implementation
         public String[] getEnabledAccountTypes() {
-            return sHasAccount ? TYPES : null;
+            return sEnabledAccount;
         }
 
         @Implementation
@@ -151,7 +170,7 @@
             } else if (TextUtils.equals(accountType, TYPES[3])) {
                 return LABELS[3];
             }
-            return "no_label";
+            return null;
         }
     }
 }
