Adds tests for iconBit change to credentials API

This adds the icon bit tests to the credentials API so that we can
ensure the API modification is done properly.

Bug: 319723778
Test: These are JUnit Tests
Change-Id: Ieabc0ec4bcd796f45b957317f8e8abd20ad2e3af
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryJavaTest.java
index e85b605..3654984 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryJavaTest.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.credentials.provider.ui;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -44,47 +43,41 @@
 import org.junit.runner.RunWith;
 
 import java.time.Instant;
-
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = 26)
 @SmallTest
 public class CustomCredentialEntryJavaTest {
     private static final CharSequence TITLE = "title";
     private static final CharSequence SUBTITLE = "subtitle";
-
     private static final String TYPE = "custom_type";
     private static final CharSequence TYPE_DISPLAY_NAME = "Password";
     private static final String ENTRY_GROUP_ID = "entryGroupId";
+    private static final boolean DEFAULT_SINGLE_PROVIDER_ICON_BIT = false;
+    private static final boolean SINGLE_PROVIDER_ICON_BIT = true;
     private static final Long LAST_USED_TIME = 10L;
     private static final Icon ICON = Icon.createWithBitmap(Bitmap.createBitmap(
             100, 100, Bitmap.Config.ARGB_8888));
     private static final boolean IS_AUTO_SELECT_ALLOWED = true;
     private final BeginGetCredentialOption mBeginCredentialOption =
             new BeginGetCustomCredentialOption(
-            "id", "custom_type", new Bundle());
-
+                    "id", "custom_type", new Bundle());
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private final Intent mIntent = new Intent();
     private final PendingIntent mPendingIntent =
             PendingIntent.getActivity(mContext, 0, mIntent,
                     PendingIntent.FLAG_IMMUTABLE);
-
     @Test
     public void build_requiredParameters_success() {
         CustomCredentialEntry entry = constructEntryWithRequiredParams();
-
         assertNotNull(entry);
         assertEntryWithRequiredParams(entry);
     }
-
     @Test
     public void build_allParameters_success() {
         CustomCredentialEntry entry = constructEntryWithAllParams();
-
         assertNotNull(entry);
         assertEntryWithAllParams(entry);
     }
-
     @Test
     public void build_nullTitle_throwsNPE() {
         assertThrows("Expected null title to throw NPE",
@@ -93,7 +86,6 @@
                         mContext, TYPE, null, mPendingIntent, mBeginCredentialOption
                 ));
     }
-
     @Test
     public void build_nullContext_throwsNPE() {
         assertThrows("Expected null title to throw NPE",
@@ -102,7 +94,6 @@
                         null, TYPE, TITLE, mPendingIntent, mBeginCredentialOption
                 ).build());
     }
-
     @Test
     public void build_nullPendingIntent_throwsNPE() {
         assertThrows("Expected null pending intent to throw NPE",
@@ -111,7 +102,6 @@
                         mContext, TYPE, TITLE, null, mBeginCredentialOption
                 ).build());
     }
-
     @Test
     public void build_nullBeginOption_throwsNPE() {
         assertThrows("Expected null option to throw NPE",
@@ -120,7 +110,6 @@
                         mContext, TYPE, TITLE, mPendingIntent, null
                 ).build());
     }
-
     @Test
     public void build_emptyTitle_throwsIAE() {
         assertThrows("Expected empty title to throw IAE",
@@ -129,7 +118,6 @@
                         mContext, TYPE, "", mPendingIntent, mBeginCredentialOption
                 ).build());
     }
-
     @Test
     public void build_emptyType_throwsIAE() {
         assertThrows("Expected empty type to throw NPE",
@@ -138,14 +126,23 @@
                         mContext, "", TITLE, mPendingIntent, mBeginCredentialOption
                 ).build());
     }
-
     @Test
     public void build_nullIcon_defaultIconSet() {
         CustomCredentialEntry entry = constructEntryWithRequiredParams();
-
         assertThat(TestUtilsKt.equals(entry.getIcon(),
                 Icon.createWithResource(mContext, R.drawable.ic_other_sign_in))).isTrue();
     }
+    @Test
+    public void builder_setPreferredDefaultIconBit_retrieveSetIconBit() {
+        boolean expectedPreferredDefaultIconBit = SINGLE_PROVIDER_ICON_BIT;
+        CustomCredentialEntry entry = new CustomCredentialEntry.Builder(
+                mContext, TYPE, TITLE, mPendingIntent,
+                mBeginCredentialOption)
+                .setDefaultIconPreferredAsSingleProvider(expectedPreferredDefaultIconBit)
+                .build();
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider())
+                .isEqualTo(expectedPreferredDefaultIconBit);
+    }
 
     @Test
     public void builder_constructDefault_containsOnlySetPropertiesAndDefaultValues() {
@@ -181,41 +178,32 @@
     @SdkSuppress(minSdkVersion = 28)
     public void fromSlice_requiredParams_success() {
         CustomCredentialEntry originalEntry = constructEntryWithRequiredParams();
-
         Slice slice = CustomCredentialEntry.toSlice(originalEntry);
         CustomCredentialEntry entry = CustomCredentialEntry.fromSlice(
                 slice);
-
         assertNotNull(entry);
         assertEntryWithRequiredParamsFromSlice(entry);
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 28)
     public void fromSlice_allParams_success() {
         CustomCredentialEntry originalEntry = constructEntryWithAllParams();
-
         Slice slice = CustomCredentialEntry.toSlice(originalEntry);
         CustomCredentialEntry entry = CustomCredentialEntry.fromSlice(slice);
-
         assertNotNull(entry);
         assertEntryWithAllParamsFromSlice(entry);
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     public void fromCredentialEntry_allParams_success() {
         CustomCredentialEntry originalEntry = constructEntryWithAllParams();
         Slice slice = CustomCredentialEntry.toSlice(originalEntry);
         assertNotNull(slice);
-
         CustomCredentialEntry entry = CustomCredentialEntry.fromCredentialEntry(
                 new CredentialEntry("id", slice));
-
         assertNotNull(entry);
         assertEntryWithAllParamsFromSlice(entry);
     }
-
     private CustomCredentialEntry constructEntryWithRequiredParams() {
         return new CustomCredentialEntry.Builder(
                 mContext,
@@ -225,7 +213,6 @@
                 mBeginCredentialOption
         ).build();
     }
-
     private CustomCredentialEntry constructEntryWithAllParams() {
         return new CustomCredentialEntry.Builder(
                 mContext,
@@ -238,25 +225,27 @@
                 .setAutoSelectAllowed(IS_AUTO_SELECT_ALLOWED)
                 .setTypeDisplayName(TYPE_DISPLAY_NAME)
                 .setEntryGroupId(ENTRY_GROUP_ID)
+                .setDefaultIconPreferredAsSingleProvider(SINGLE_PROVIDER_ICON_BIT)
                 .build();
     }
-
     private void assertEntryWithRequiredParams(CustomCredentialEntry entry) {
         assertThat(TITLE.equals(entry.getTitle()));
         assertThat(TYPE.equals(entry.getType()));
         assertThat(mPendingIntent).isEqualTo(entry.getPendingIntent());
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getEntryGroupId()).isEqualTo(TITLE);
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                DEFAULT_SINGLE_PROVIDER_ICON_BIT);
     }
-
     private void assertEntryWithRequiredParamsFromSlice(CustomCredentialEntry entry) {
         assertThat(TITLE.equals(entry.getTitle()));
         assertThat(TYPE.equals(entry.getType()));
         assertThat(mPendingIntent).isEqualTo(entry.getPendingIntent());
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getEntryGroupId()).isEqualTo(TITLE);
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                DEFAULT_SINGLE_PROVIDER_ICON_BIT);
     }
-
     private void assertEntryWithAllParams(CustomCredentialEntry entry) {
         assertThat(TITLE.equals(entry.getTitle()));
         assertThat(TYPE.equals(entry.getType()));
@@ -270,8 +259,9 @@
         assertThat(mBeginCredentialOption).isEqualTo(entry.getBeginGetCredentialOption());
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getEntryGroupId()).isEqualTo(ENTRY_GROUP_ID);
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                SINGLE_PROVIDER_ICON_BIT);
     }
-
     private void assertEntryWithAllParamsFromSlice(CustomCredentialEntry entry) {
         assertThat(TITLE.equals(entry.getTitle()));
         assertThat(TYPE.equals(entry.getType()));
@@ -284,5 +274,7 @@
         assertThat(mBeginCredentialOption.getType()).isEqualTo(entry.getType());
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getEntryGroupId()).isEqualTo(ENTRY_GROUP_ID);
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                SINGLE_PROVIDER_ICON_BIT);
     }
 }
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryTest.kt
index 0ce4aac..c9f7331 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryTest.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/CustomCredentialEntryTest.kt
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 package androidx.credentials.provider.ui
-
 import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
@@ -40,7 +39,6 @@
 import org.junit.Assert.assertThrows
 import org.junit.Test
 import org.junit.runner.RunWith
-
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = 26)
 @SmallTest
@@ -53,27 +51,21 @@
     @SdkSuppress(minSdkVersion = 28)
     fun constructor_requiredParams_success() {
         val entry = constructEntryWithRequiredParams()
-
         assertNotNull(entry)
         assertEntryWithRequiredParams(entry)
     }
-
     @Test
     fun constructor_allParams_success() {
         val entry = constructEntryWithAllParams()
-
         assertNotNull(entry)
         assertEntryWithAllParams(entry)
     }
-
     @Test
     fun constructor_allParameters_success() {
         val entry: CustomCredentialEntry = constructEntryWithAllParams()
-
         assertNotNull(entry)
         assertEntryWithAllParams(entry)
     }
-
     @Test
     fun constructor_emptyTitle_throwsIAE() {
         assertThrows(
@@ -87,7 +79,6 @@
             )
         }
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 28)
     fun constructor_emptyType_throwsIAE() {
@@ -101,12 +92,10 @@
             )
         }
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 23)
     fun constructor_nullIcon_defaultIconSet() {
         val entry = constructEntryWithRequiredParams()
-
         assertThat(
             equals(
                 entry.icon,
@@ -114,6 +103,30 @@
             )
         ).isTrue()
     }
+    @Test
+    fun constructor_setPreferredDefaultIconBit_retrieveSetPreferredDefaultIconBit() {
+        val expectedPreferredDefaultIconBit = SINGLE_PROVIDER_ICON_BIT
+        val entry = CustomCredentialEntry(
+            mContext,
+            TITLE,
+            mPendingIntent,
+            BEGIN_OPTION,
+            isDefaultIconPreferredAsSingleProvider = SINGLE_PROVIDER_ICON_BIT
+        )
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider)
+            .isEqualTo(expectedPreferredDefaultIconBit)
+    }
+    @Test
+    fun constructor_preferredIconBitNotProvided_retrieveDefaultPreferredIconBit() {
+        val entry = CustomCredentialEntry(
+            mContext,
+            TITLE,
+            mPendingIntent,
+            BEGIN_OPTION,
+        )
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
+    }
 
     @Test
     fun constructor_emptyEntryGroupId_defaultEntryGroupIdSet() {
@@ -173,6 +186,16 @@
         assertThat(entry.isAutoSelectAllowed).isFalse()
         assertThat(entry.affiliatedDomain).isNull()
         assertThat(entry.entryGroupId).isEqualTo(TITLE)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
+    }
+    @Test
+    fun builder_setNonEmpyDeduplicationId_retrieveSetDeduplicationId() {
+        val expectedIconBit = SINGLE_PROVIDER_ICON_BIT
+        val entry = CustomCredentialEntry.Builder(
+            mContext, TYPE, TITLE, mPendingIntent, BEGIN_OPTION)
+            .setDefaultIconPreferredAsSingleProvider(SINGLE_PROVIDER_ICON_BIT).build()
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(expectedIconBit)
     }
 
     @Test
@@ -202,51 +225,42 @@
     @SdkSuppress(minSdkVersion = 28)
     fun fromSlice_requiredParams_success() {
         val originalEntry = constructEntryWithRequiredParams()
-
         val slice = CustomCredentialEntry.toSlice(
             originalEntry)
         assertNotNull(slice)
         val entry = fromSlice(slice!!)
-
         assertNotNull(entry)
         if (entry != null) {
             assertEntryWithRequiredParamsFromSlice(entry)
         }
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 28)
     fun fromSlice_allParams_success() {
         val originalEntry = constructEntryWithAllParams()
-
         val slice = CustomCredentialEntry.toSlice(
-        originalEntry)
+            originalEntry)
         assertNotNull(slice)
         val entry = fromSlice(slice!!)
-
         assertNotNull(entry)
         if (entry != null) {
             assertEntryWithAllParamsFromSlice(entry)
         }
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     fun fromCredentialEntry_allParams_success() {
         val originalEntry = constructEntryWithAllParams()
         val slice = toSlice(originalEntry)
-
         assertNotNull(slice)
         val entry = slice?.let { CredentialEntry("id", it) }?.let {
             fromCredentialEntry(
                 it
             )
         }
-
         assertNotNull(entry)
         assertEntryWithAllParamsFromSlice(entry!!)
     }
-
     private fun constructEntryWithRequiredParams(): CustomCredentialEntry {
         return CustomCredentialEntry(
             mContext,
@@ -255,7 +269,6 @@
             BEGIN_OPTION
         )
     }
-
     private fun constructEntryWithAllParams(): CustomCredentialEntry {
         return CustomCredentialEntry(
             mContext,
@@ -267,10 +280,10 @@
             Instant.ofEpochMilli(LAST_USED_TIME),
             ICON,
             IS_AUTO_SELECT_ALLOWED,
-            ENTRY_GROUP_ID
+            ENTRY_GROUP_ID,
+            SINGLE_PROVIDER_ICON_BIT
         )
     }
-
     private fun assertEntryWithAllParams(entry: CustomCredentialEntry) {
         assertThat(TITLE == entry.title)
         assertThat(TYPE == entry.type)
@@ -280,9 +293,9 @@
         assertThat(Instant.ofEpochMilli(LAST_USED_TIME)).isEqualTo(entry.lastUsedTime)
         assertThat(IS_AUTO_SELECT_ALLOWED).isEqualTo(entry.isAutoSelectAllowed)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(SINGLE_PROVIDER_ICON_BIT)
         assertThat(ENTRY_GROUP_ID).isEqualTo(entry.entryGroupId)
     }
-
     private fun assertEntryWithAllParamsFromSlice(entry: CustomCredentialEntry) {
         assertThat(TITLE == entry.title)
         assertThat(TYPE == entry.type)
@@ -293,24 +306,26 @@
         assertThat(IS_AUTO_SELECT_ALLOWED).isEqualTo(entry.isAutoSelectAllowed)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
         assertThat(BEGIN_OPTION.type).isEqualTo(entry.type)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(SINGLE_PROVIDER_ICON_BIT)
         assertThat(ENTRY_GROUP_ID).isEqualTo(entry.entryGroupId)
     }
-
     private fun assertEntryWithRequiredParams(entry: CustomCredentialEntry) {
         assertThat(TITLE == entry.title)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
         assertThat(BEGIN_OPTION.type).isEqualTo(entry.type)
         assertThat(BEGIN_OPTION).isEqualTo(entry.beginGetCredentialOption)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
         assertThat(entry.entryGroupId).isEqualTo(TITLE)
     }
-
     private fun assertEntryWithRequiredParamsFromSlice(entry: CustomCredentialEntry) {
         assertThat(TITLE == entry.title)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
         assertThat(BEGIN_OPTION.type).isEqualTo(entry.type)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
         assertThat(entry.entryGroupId).isEqualTo(TITLE)
     }
-
     companion object {
         private val TITLE: CharSequence = "title"
         private val BEGIN_OPTION: BeginGetCredentialOption = BeginGetCustomCredentialOption(
@@ -325,6 +340,8 @@
             )
         )
         private const val IS_AUTO_SELECT_ALLOWED = true
+        private const val DEFAULT_SINGLE_PROVIDER_ICON_BIT = false
+        private const val SINGLE_PROVIDER_ICON_BIT = true
         private const val ENTRY_GROUP_ID = "entryGroupId"
     }
 }
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryJavaTest.java
index 750bd11..9b24056 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryJavaTest.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.credentials.provider.ui;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -45,7 +44,6 @@
 
 import java.time.Instant;
 import java.util.HashSet;
-
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = 26)
 @SmallTest
@@ -53,43 +51,35 @@
     private static final CharSequence USERNAME = "title";
     private static final CharSequence DISPLAYNAME = "subtitle";
     private static final CharSequence TYPE_DISPLAY_NAME = "Password";
-
     private static final String AFFILIATED_DOMAIN = "affiliation-name";
-
     private static final Long LAST_USED_TIME = 10L;
-
+    private static final boolean DEFAULT_SINGLE_PROVIDER_ICON_BIT = false;
+    private static final boolean SINGLE_PROVIDER_ICON_BIT = true;
     private static final boolean IS_AUTO_SELECT_ALLOWED = true;
-
     private static final Icon ICON = Icon.createWithBitmap(Bitmap.createBitmap(
             100, 100, Bitmap.Config.ARGB_8888));
     private final BeginGetPasswordOption mBeginGetPasswordOption = new BeginGetPasswordOption(
             new HashSet<>(),
             Bundle.EMPTY, "id");
-
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private final Intent mIntent = new Intent();
     private final PendingIntent mPendingIntent =
             PendingIntent.getActivity(mContext, 0, mIntent,
                     PendingIntent.FLAG_IMMUTABLE);
-
     @Test
     public void build_requiredParams_success() {
         PasswordCredentialEntry entry = constructEntryWithRequiredParamsOnly();
-
         assertNotNull(entry);
         assertThat(entry.getType()).isEqualTo(PasswordCredential.TYPE_PASSWORD_CREDENTIAL);
         assertEntryWithRequiredParamsOnly(entry, false);
     }
-
     @Test
     public void build_allParams_success() {
         PasswordCredentialEntry entry = constructEntryWithAllParams();
-
         assertNotNull(entry);
         assertThat(entry.getType()).isEqualTo(PasswordCredential.TYPE_PASSWORD_CREDENTIAL);
         assertEntryWithAllParams(entry);
     }
-
     @Test
     public void build_nullContext_throwsNPE() {
         assertThrows("Expected null context to throw NPE",
@@ -98,7 +88,6 @@
                         null, USERNAME, mPendingIntent, mBeginGetPasswordOption
                 ).build());
     }
-
     @Test
     public void build_nullUsername_throwsNPE() {
         assertThrows("Expected null username to throw NPE",
@@ -107,7 +96,6 @@
                         mContext, null, mPendingIntent, mBeginGetPasswordOption
                 ).build());
     }
-
     @Test
     public void build_nullPendingIntent_throwsNPE() {
         assertThrows("Expected null pending intent to throw NPE",
@@ -116,7 +104,6 @@
                         mContext, USERNAME, null, mBeginGetPasswordOption
                 ).build());
     }
-
     @Test
     public void build_nullBeginOption_throwsNPE() {
         assertThrows("Expected null option to throw NPE",
@@ -125,7 +112,6 @@
                         mContext, USERNAME, mPendingIntent, null
                 ).build());
     }
-
     @Test
     public void build_emptyUsername_throwsIAE() {
         assertThrows("Expected empty username to throw IllegalArgumentException",
@@ -133,45 +119,35 @@
                 () -> new PasswordCredentialEntry.Builder(
                         mContext, "", mPendingIntent, mBeginGetPasswordOption).build());
     }
-
     @Test
     public void build_nullIcon_defaultIconSet() {
         PasswordCredentialEntry entry = new PasswordCredentialEntry
                 .Builder(mContext, USERNAME, mPendingIntent, mBeginGetPasswordOption).build();
-
         assertThat(TestUtilsKt.equals(entry.getIcon(),
                 Icon.createWithResource(mContext, R.drawable.ic_password))).isTrue();
     }
-
     @Test
     public void build_nullTypeDisplayName_defaultDisplayNameSet() {
         PasswordCredentialEntry entry = new PasswordCredentialEntry.Builder(
-                        mContext, USERNAME, mPendingIntent, mBeginGetPasswordOption).build();
-
+                mContext, USERNAME, mPendingIntent, mBeginGetPasswordOption).build();
         assertThat(entry.getTypeDisplayName()).isEqualTo(
                 mContext.getString(
                         R.string.android_credentials_TYPE_PASSWORD_CREDENTIAL)
         );
     }
-
     @Test
     public void build_isAutoSelectAllowedDefault_false() {
         PasswordCredentialEntry entry = constructEntryWithRequiredParamsOnly();
-
         assertFalse(entry.isAutoSelectAllowed());
     }
-
     @Test
     public void constructor_defaultAffiliatedDomain() {
         PasswordCredentialEntry entry = constructEntryWithRequiredParamsOnly();
-
         assertThat(entry.getAffiliatedDomain()).isNull();
     }
-
     @Test
     public void constructor_nonEmptyAffiliatedDomainSet_nonEmptyAffiliatedDomainRetrieved() {
         String expectedAffiliatedDomain = "non-empty";
-
         PasswordCredentialEntry entryWithAffiliatedDomain = new PasswordCredentialEntry(
                 mContext,
                 USERNAME,
@@ -181,84 +157,80 @@
                 Instant.ofEpochMilli(LAST_USED_TIME),
                 ICON,
                 false,
-                expectedAffiliatedDomain
+                expectedAffiliatedDomain,
+                false
         );
-
         assertThat(entryWithAffiliatedDomain.getAffiliatedDomain())
                 .isEqualTo(expectedAffiliatedDomain);
     }
-
     @Test
     public void builder_constructDefault_containsOnlyDefaultValuesForSettableParameters() {
         PasswordCredentialEntry entry = new PasswordCredentialEntry.Builder(mContext, USERNAME,
                 mPendingIntent, mBeginGetPasswordOption).build();
-
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getDisplayName()).isNull();
         assertThat(entry.getLastUsedTime()).isNull();
         assertThat(entry.isAutoSelectAllowed()).isFalse();
         assertThat(entry.getEntryGroupId()).isEqualTo(USERNAME);
     }
-
     @Test
     public void builder_setAffiliatedDomainNull_retrieveNullAffiliatedDomain() {
         PasswordCredentialEntry entry = new PasswordCredentialEntry.Builder(mContext, USERNAME,
                 mPendingIntent, mBeginGetPasswordOption).setAffiliatedDomain(null).build();
-
         assertThat(entry.getAffiliatedDomain()).isNull();
     }
-
     @Test
     public void builder_setAffiliatedDomainNonNull_retrieveNonNullAffiliatedDomain() {
         String expectedAffiliatedDomain = "affiliated-domain";
-
         PasswordCredentialEntry entry = new PasswordCredentialEntry.Builder(
                 mContext,
                 USERNAME,
                 mPendingIntent,
                 mBeginGetPasswordOption
         ).setAffiliatedDomain(expectedAffiliatedDomain).build();
-
         assertThat(entry.getAffiliatedDomain()).isEqualTo(expectedAffiliatedDomain);
     }
-
+    @Test
+    public void builder_setPreferredDefaultIconBit_retrieveSetIconBit() {
+        boolean expectedPreferredDefaultIconBit = SINGLE_PROVIDER_ICON_BIT;
+        PasswordCredentialEntry entry = new PasswordCredentialEntry.Builder(
+                mContext,
+                USERNAME,
+                mPendingIntent,
+                mBeginGetPasswordOption
+        ).setDefaultIconPreferredAsSingleProvider(expectedPreferredDefaultIconBit)
+                .build();
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider())
+                .isEqualTo(expectedPreferredDefaultIconBit);
+    }
     @Test
     @SdkSuppress(minSdkVersion = 28)
     public void fromSlice_requiredParams_success() {
         PasswordCredentialEntry originalEntry = constructEntryWithRequiredParamsOnly();
-
         PasswordCredentialEntry entry = PasswordCredentialEntry.fromSlice(
                 PasswordCredentialEntry.toSlice(originalEntry));
-
         assertNotNull(entry);
         assertEntryWithRequiredParamsOnly(entry, true);
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 28)
     public void fromSlice_allParams_success() {
         PasswordCredentialEntry originalEntry = constructEntryWithAllParams();
-
         PasswordCredentialEntry entry = PasswordCredentialEntry.fromSlice(
                 PasswordCredentialEntry.toSlice(originalEntry));
-
         assertNotNull(entry);
         assertEntryWithAllParams(entry);
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     public void fromCredentialEntry_allParams_success() {
         PasswordCredentialEntry originalEntry = constructEntryWithAllParams();
-
         PasswordCredentialEntry entry = PasswordCredentialEntry.fromCredentialEntry(
                 new CredentialEntry("id",
                         PasswordCredentialEntry.toSlice(originalEntry)));
-
         assertNotNull(entry);
         assertEntryWithAllParams(entry);
     }
-
     private PasswordCredentialEntry constructEntryWithRequiredParamsOnly() {
         return new PasswordCredentialEntry.Builder(
                 mContext,
@@ -266,7 +238,6 @@
                 mPendingIntent,
                 mBeginGetPasswordOption).build();
     }
-
     private PasswordCredentialEntry constructEntryWithAllParams() {
         return new PasswordCredentialEntry.Builder(
                 mContext,
@@ -278,18 +249,19 @@
                 .setIcon(ICON)
                 .setAutoSelectAllowed(IS_AUTO_SELECT_ALLOWED)
                 .setAffiliatedDomain(AFFILIATED_DOMAIN)
+                .setDefaultIconPreferredAsSingleProvider(SINGLE_PROVIDER_ICON_BIT)
                 .build();
     }
-
     private void assertEntryWithRequiredParamsOnly(PasswordCredentialEntry entry,
             Boolean assertOptionIdOnly) {
         assertThat(USERNAME.equals(entry.getUsername()));
         assertThat(mPendingIntent).isEqualTo(entry.getPendingIntent());
         assertThat(mBeginGetPasswordOption.getType()).isEqualTo(entry.getType());
         assertThat(entry.getAffiliatedDomain()).isNull();
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                DEFAULT_SINGLE_PROVIDER_ICON_BIT);
         assertThat(entry.getEntryGroupId()).isEqualTo(USERNAME);
     }
-
     private void assertEntryWithAllParams(PasswordCredentialEntry entry) {
         assertThat(USERNAME.equals(entry.getUsername()));
         assertThat(DISPLAYNAME.equals(entry.getDisplayName()));
@@ -300,6 +272,8 @@
         assertThat(mPendingIntent).isEqualTo(entry.getPendingIntent());
         assertThat(mBeginGetPasswordOption.getType()).isEqualTo(entry.getType());
         assertThat(entry.getAffiliatedDomain()).isEqualTo(AFFILIATED_DOMAIN);
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                SINGLE_PROVIDER_ICON_BIT);
         assertThat(entry.getEntryGroupId()).isEqualTo(USERNAME);
     }
 }
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryTest.kt
index 53eef77..96fd725 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryTest.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PasswordCredentialEntryTest.kt
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 package androidx.credentials.provider.ui
-
 import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
@@ -39,7 +38,6 @@
 import org.junit.Assert.assertThrows
 import org.junit.Test
 import org.junit.runner.RunWith
-
 @RunWith(AndroidJUnit4::class)
 @SdkSuppress(minSdkVersion = 26)
 @SmallTest
@@ -50,26 +48,22 @@
         mContext, 0, mIntent,
         PendingIntent.FLAG_IMMUTABLE
     )
-
     @Test
     fun constructor_requiredParams_success() {
         val entry = constructEntryWithRequiredParamsOnly()
-
         assertNotNull(entry)
         assertThat(entry.type).isEqualTo(PasswordCredential.TYPE_PASSWORD_CREDENTIAL)
         assertEntryWithRequiredParamsOnly(entry)
     }
-
     @Test
     fun constructor_allParams_success() {
         val entry = constructEntryWithAllParams()
-
         assertNotNull(entry)
         assertThat(entry.type).isEqualTo(PasswordCredential.TYPE_PASSWORD_CREDENTIAL)
         assertEntryWithAllParams(entry)
     }
-
     @Test
+    @Suppress("DEPRECATION")
     fun constructor_emptyUsername_throwsIAE() {
         assertThrows(
             "Expected empty username to throw IllegalArgumentException",
@@ -80,12 +74,10 @@
             )
         }
     }
-
     @Test
     fun constructor_nullIcon_defaultIconSet() {
         val entry = PasswordCredentialEntry.Builder(
             mContext, USERNAME, mPendingIntent, BEGIN_OPTION).build()
-
         assertThat(
             equals(
                 entry.icon,
@@ -93,39 +85,32 @@
             )
         ).isTrue()
     }
-
     @Test
+    @Suppress("DEPRECATION")
     fun constructor_nullTypeDisplayName_defaultDisplayNameSet() {
         val entry = PasswordCredentialEntry(
             mContext, USERNAME, mPendingIntent, BEGIN_OPTION)
-
         assertThat(entry.typeDisplayName).isEqualTo(
             mContext.getString(
                 R.string.android_credentials_TYPE_PASSWORD_CREDENTIAL
             )
         )
     }
-
     @Test
     fun constructor_isAutoSelectAllowedDefault_false() {
         val entry = constructEntryWithRequiredParamsOnly()
         val entry1 = constructEntryWithAllParams()
-
         assertFalse(entry.isAutoSelectAllowed)
         assertFalse(entry1.isAutoSelectAllowed)
     }
-
     @Test
     fun constructor_defaultAffiliatedDomain() {
         val defaultEntry = constructEntryWithRequiredParamsOnly()
-
         assertThat(defaultEntry.affiliatedDomain).isNull()
     }
-
     @Test
     fun constructor_nonEmptyAffiliatedDomainSet_nonEmptyAffiliatedDomainRetrieved() {
         val expectedAffiliatedDomain = "non-empty"
-
         val entryWithAffiliationType = PasswordCredentialEntry(
             mContext,
             USERNAME,
@@ -136,9 +121,35 @@
             ICON,
             affiliatedDomain = expectedAffiliatedDomain
         )
-
         assertThat(entryWithAffiliationType.affiliatedDomain).isEqualTo(expectedAffiliatedDomain)
     }
+    @Test
+    fun constructor_setPreferredDefaultIconBit_retrieveSetPreferredDefaultIconBit() {
+        val expectedPreferredDefaultIconBit = SINGLE_PROVIDER_ICON_BIT
+        val entry = PasswordCredentialEntry(
+            mContext,
+            USERNAME,
+            mPendingIntent,
+            BEGIN_OPTION,
+            DISPLAYNAME,
+            LAST_USED_TIME,
+            ICON,
+            isDefaultIconPreferredAsSingleProvider = expectedPreferredDefaultIconBit
+        )
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider)
+            .isEqualTo(expectedPreferredDefaultIconBit)
+    }
+    @Test
+    fun constructor_preferredIconBitNotProvided_retrieveDefaultPreferredIconBit() {
+        val entry = PasswordCredentialEntry(
+            mContext,
+            USERNAME,
+            mPendingIntent,
+            BEGIN_OPTION
+        )
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
+    }
 
     @Test
     fun constructor_allRequiredParamsUsed_defaultUsernameEntryGroupIdRetrieved() {
@@ -146,7 +157,6 @@
 
         assertThat(entry.entryGroupId).isEqualTo(USERNAME)
     }
-
     @Test
     fun builder_constructDefault_containsOnlySetPropertiesAndDefaultValues() {
         val entry = PasswordCredentialEntry.Builder(
@@ -170,7 +180,6 @@
         assertThat(entry.affiliatedDomain).isNull()
         assertThat(entry.entryGroupId).isEqualTo(USERNAME)
     }
-
     @Test
     fun builder_setAffiliatedDomainNull_retrieveNullAffiliatedDomain() {
         val entry = PasswordCredentialEntry.Builder(
@@ -179,10 +188,8 @@
             mPendingIntent,
             BEGIN_OPTION
         ).setAffiliatedDomain(null).build()
-
         assertThat(entry.affiliatedDomain).isNull()
     }
-
     @Test
     fun builder_setAffiliatedDomainNonNull_retrieveNonNullAffiliatedDomain() {
         val expectedAffiliatedDomain = "name"
@@ -192,45 +199,37 @@
             mPendingIntent,
             BEGIN_OPTION
         ).setAffiliatedDomain(expectedAffiliatedDomain).build()
-
         assertThat(entry.affiliatedDomain).isEqualTo(expectedAffiliatedDomain)
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     fun fromSlice_success() {
         val originalEntry = constructEntryWithAllParams()
         val slice = PasswordCredentialEntry.toSlice(originalEntry)
         assertNotNull(slice)
-
         val entry = fromSlice(slice!!)
-
         assertNotNull(entry)
         entry?.let {
             assertEntryWithAllParams(entry)
         }
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     fun fromCredentialEntry_success() {
         val originalEntry = constructEntryWithAllParams()
         val slice = PasswordCredentialEntry.toSlice(originalEntry)
-
         assertNotNull(slice)
-
         val entry = slice?.let { CredentialEntry("id", it) }?.let {
             PasswordCredentialEntry.fromCredentialEntry(
                 it
             )
         }
-
         assertNotNull(entry)
         entry?.let {
             assertEntryWithAllParams(entry)
         }
     }
-
+    @Suppress("DEPRECATION")
     private fun constructEntryWithRequiredParamsOnly(): PasswordCredentialEntry {
         return PasswordCredentialEntry(
             mContext,
@@ -239,7 +238,6 @@
             BEGIN_OPTION
         )
     }
-
     private fun constructEntryWithAllParams(): PasswordCredentialEntry {
         return PasswordCredentialEntry(
             mContext,
@@ -250,17 +248,18 @@
             LAST_USED_TIME,
             ICON,
             IS_AUTO_SELECT_ALLOWED,
-            AFFILIATED_DOMAIN
+            AFFILIATED_DOMAIN,
+            SINGLE_PROVIDER_ICON_BIT
         )
     }
-
     private fun assertEntryWithRequiredParamsOnly(entry: PasswordCredentialEntry) {
         assertThat(USERNAME == entry.username)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
         assertThat(entry.affiliatedDomain).isNull()
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
         assertThat(entry.entryGroupId).isEqualTo(USERNAME)
     }
-
     private fun assertEntryWithAllParams(entry: PasswordCredentialEntry) {
         assertThat(USERNAME == entry.username)
         assertThat(DISPLAYNAME == entry.displayName)
@@ -274,9 +273,9 @@
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
         assertThat(entry.isAutoSelectAllowed).isEqualTo(IS_AUTO_SELECT_ALLOWED)
         assertThat(entry.affiliatedDomain).isEqualTo(AFFILIATED_DOMAIN)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(SINGLE_PROVIDER_ICON_BIT)
         assertThat(entry.entryGroupId).isEqualTo(USERNAME)
     }
-
     companion object {
         private val USERNAME: CharSequence = "title"
         private val DISPLAYNAME: CharSequence = "subtitle"
@@ -292,5 +291,7 @@
         )
         private val IS_AUTO_SELECT_ALLOWED = false
         private val AFFILIATED_DOMAIN = "affiliation-name"
+        private const val DEFAULT_SINGLE_PROVIDER_ICON_BIT = false
+        private const val SINGLE_PROVIDER_ICON_BIT = true
     }
 }
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryJavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryJavaTest.java
index d150ae4..cc50aad 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryJavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryJavaTest.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package androidx.credentials.provider.ui;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -43,7 +42,6 @@
 import org.junit.runner.RunWith;
 
 import java.time.Instant;
-
 @RunWith(AndroidJUnit4.class)
 @SdkSuppress(minSdkVersion = 26)
 @SmallTest
@@ -52,145 +50,118 @@
     private static final CharSequence DISPLAYNAME = "subtitle";
     private static final CharSequence TYPE_DISPLAY_NAME = "Password";
     private static final Long LAST_USED_TIME = 10L;
-    private static final Icon ICON = Icon.createWithBitmap(Bitmap.createBitmap(
-            100, 100, Bitmap.Config.ARGB_8888));
+    private static final boolean DEFAULT_SINGLE_PROVIDER_ICON_BIT = false;
+    private static final boolean SINGLE_PROVIDER_ICON_BIT = true;
+    private static final Icon ICON = Icon.createWithBitmap(
+            Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888));
     private static final boolean IS_AUTO_SELECT_ALLOWED = true;
     private final BeginGetPublicKeyCredentialOption mBeginOption =
-            new BeginGetPublicKeyCredentialOption(
-                    new Bundle(), "id", "{\"key1\":{\"key2\":{\"key3\":\"value3\"}}}");
-
+            new BeginGetPublicKeyCredentialOption(new Bundle(), "id",
+                    "{\"key1\":{\"key2\":{\"key3\":\"value3\"}}}");
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private final Intent mIntent = new Intent();
-    private final PendingIntent mPendingIntent =
-            PendingIntent.getActivity(mContext, 0, mIntent,
-                    PendingIntent.FLAG_IMMUTABLE);
-
+    private final PendingIntent mPendingIntent = PendingIntent.getActivity(mContext, 0, mIntent,
+            PendingIntent.FLAG_IMMUTABLE);
     @Test
     public void build_requiredParamsOnly_success() {
         PublicKeyCredentialEntry entry = constructWithRequiredParamsOnly();
-
         assertNotNull(entry);
         assertThat(entry.getType()).isEqualTo(PublicKeyCredential.TYPE_PUBLIC_KEY_CREDENTIAL);
         assertEntryWithRequiredParams(entry);
     }
-
     @Test
     public void build_allParams_success() {
         PublicKeyCredentialEntry entry = constructWithAllParams();
-
         assertNotNull(entry);
         assertThat(entry.getType()).isEqualTo(PublicKeyCredential.TYPE_PUBLIC_KEY_CREDENTIAL);
         assertEntryWithAllParams(entry);
     }
-
     @Test
     public void build_withNullUsername_throwsNPE() {
-        assertThrows("Expected null username to throw NPE",
-                NullPointerException.class,
-                () -> new PublicKeyCredentialEntry.Builder(
-                        mContext, null, mPendingIntent, mBeginOption
-                ).build());
+        assertThrows("Expected null username to throw NPE", NullPointerException.class,
+                () -> new PublicKeyCredentialEntry.Builder(mContext, null, mPendingIntent,
+                        mBeginOption).build());
     }
-
     @Test
     public void build_withNullBeginOption_throwsNPE() {
-        assertThrows("Expected null option to throw NPE",
-                NullPointerException.class,
-                () -> new PublicKeyCredentialEntry.Builder(
-                        mContext, USERNAME, mPendingIntent, null
-                ).build());
+        assertThrows("Expected null option to throw NPE", NullPointerException.class,
+                () -> new PublicKeyCredentialEntry.Builder(mContext, USERNAME, mPendingIntent,
+                        null).build());
     }
-
     @Test
     public void build_withNullPendingIntent_throwsNPE() {
-        assertThrows("Expected null pending intent to throw NPE",
-                NullPointerException.class,
-                () -> new PublicKeyCredentialEntry.Builder(
-                        mContext, USERNAME, null, mBeginOption
-                ).build());
+        assertThrows("Expected null pending intent to throw NPE", NullPointerException.class,
+                () -> new PublicKeyCredentialEntry.Builder(mContext, USERNAME, null,
+                        mBeginOption).build());
     }
-
     @Test
     public void build_withEmptyUsername_throwsIAE() {
         assertThrows("Expected empty username to throw IllegalArgumentException",
                 IllegalArgumentException.class,
-                () -> new PublicKeyCredentialEntry.Builder(
-                        mContext, "", mPendingIntent, mBeginOption).build());
+                () -> new PublicKeyCredentialEntry.Builder(mContext, "", mPendingIntent,
+                        mBeginOption).build());
     }
-
     @Test
     public void build_withNullIcon_defaultIconSet() {
-        PublicKeyCredentialEntry entry = new PublicKeyCredentialEntry
-                .Builder(
-                mContext, USERNAME, mPendingIntent, mBeginOption).build();
-
+        PublicKeyCredentialEntry entry = new PublicKeyCredentialEntry.Builder(mContext, USERNAME,
+                mPendingIntent, mBeginOption).build();
         assertThat(TestUtilsKt.equals(entry.getIcon(),
                 Icon.createWithResource(mContext, R.drawable.ic_passkey))).isTrue();
     }
-
     @Test
     public void build_nullTypeDisplayName_defaultDisplayNameSet() {
-        PublicKeyCredentialEntry entry = new PublicKeyCredentialEntry.Builder(
-                        mContext, USERNAME, mPendingIntent, mBeginOption).build();
-
+        PublicKeyCredentialEntry entry = new PublicKeyCredentialEntry.Builder(mContext, USERNAME,
+                mPendingIntent, mBeginOption).build();
         assertThat(entry.getTypeDisplayName()).isEqualTo(
-                mContext.getString(
-                        R.string.androidx_credentials_TYPE_PUBLIC_KEY_CREDENTIAL)
-        );
+                mContext.getString(R.string.androidx_credentials_TYPE_PUBLIC_KEY_CREDENTIAL));
     }
-
+    @Test
+    public void builder_setPreferredDefaultIconBit_retrieveSetIconBit() {
+        boolean expectedPreferredDefaultIconBit = SINGLE_PROVIDER_ICON_BIT;
+        PublicKeyCredentialEntry entry = new PublicKeyCredentialEntry.Builder(mContext, USERNAME,
+                mPendingIntent, mBeginOption).setDefaultIconPreferredAsSingleProvider(
+                expectedPreferredDefaultIconBit).build();
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                expectedPreferredDefaultIconBit);
+    }
     @Test
     @SdkSuppress(minSdkVersion = 28)
     public void fromSlice_success() {
-        PublicKeyCredentialEntry originalEntry = constructWithAllParams();
-
+        PublicKeyCredentialEntry originalEntry = constructWithRequiredParamsOnly();
         PublicKeyCredentialEntry entry = PublicKeyCredentialEntry.fromSlice(
                 PublicKeyCredentialEntry.toSlice(originalEntry));
-
         assertNotNull(entry);
         assertEntryWithRequiredParams(entry);
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     public void fromCredentialEntry_success() {
         PublicKeyCredentialEntry originalEntry = constructWithAllParams();
         Slice slice = PublicKeyCredentialEntry.toSlice(originalEntry);
         assertNotNull(slice);
-
         PublicKeyCredentialEntry entry = PublicKeyCredentialEntry.fromCredentialEntry(
                 new android.service.credentials.CredentialEntry("id", slice));
-
         assertNotNull(entry);
-        assertEntryWithRequiredParams(entry);
+        assertEntryWithAllParams(entry);
     }
-
     private PublicKeyCredentialEntry constructWithRequiredParamsOnly() {
-        return new PublicKeyCredentialEntry.Builder(
-                mContext,
-                USERNAME,
-                mPendingIntent,
-                mBeginOption
-        ).build();
+        return new PublicKeyCredentialEntry.Builder(mContext, USERNAME, mPendingIntent,
+                mBeginOption).build();
     }
-
     private PublicKeyCredentialEntry constructWithAllParams() {
-        return new PublicKeyCredentialEntry.Builder(
-                mContext, USERNAME, mPendingIntent, mBeginOption)
-                .setAutoSelectAllowed(IS_AUTO_SELECT_ALLOWED)
-                .setDisplayName(DISPLAYNAME)
-                .setLastUsedTime(Instant.ofEpochMilli(LAST_USED_TIME))
-                .setIcon(ICON)
-                .build();
+        return new PublicKeyCredentialEntry.Builder(mContext, USERNAME, mPendingIntent,
+                mBeginOption).setAutoSelectAllowed(IS_AUTO_SELECT_ALLOWED).setDisplayName(
+                DISPLAYNAME).setLastUsedTime(Instant.ofEpochMilli(LAST_USED_TIME)).setIcon(
+                ICON).setDefaultIconPreferredAsSingleProvider(SINGLE_PROVIDER_ICON_BIT).build();
     }
-
     private void assertEntryWithRequiredParams(PublicKeyCredentialEntry entry) {
         assertThat(USERNAME.equals(entry.getUsername()));
         assertThat(mPendingIntent).isEqualTo(entry.getPendingIntent());
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                DEFAULT_SINGLE_PROVIDER_ICON_BIT);
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getEntryGroupId()).isEqualTo(USERNAME);
     }
-
     private void assertEntryWithAllParams(PublicKeyCredentialEntry entry) {
         assertThat(USERNAME.equals(entry.getUsername()));
         assertThat(DISPLAYNAME.equals(entry.getDisplayName()));
@@ -199,6 +170,8 @@
         assertThat(Instant.ofEpochMilli(LAST_USED_TIME)).isEqualTo(entry.getLastUsedTime());
         assertThat(IS_AUTO_SELECT_ALLOWED).isEqualTo(entry.isAutoSelectAllowed());
         assertThat(mPendingIntent).isEqualTo(entry.getPendingIntent());
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider()).isEqualTo(
+                SINGLE_PROVIDER_ICON_BIT);
         assertThat(entry.getAffiliatedDomain()).isNull();
         assertThat(entry.getEntryGroupId()).isEqualTo(USERNAME);
     }
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryTest.kt
index c09a0e4..07df803 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryTest.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/ui/PublicKeyCredentialEntryTest.kt
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 package androidx.credentials.provider.ui
-
 import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
@@ -41,7 +40,6 @@
 import org.junit.Assert.assertThrows
 import org.junit.Test
 import org.junit.runner.RunWith
-
 @SdkSuppress(minSdkVersion = 26)
 @RunWith(AndroidJUnit4::class)
 @SmallTest
@@ -52,16 +50,13 @@
         mContext, 0, mIntent,
         PendingIntent.FLAG_IMMUTABLE
     )
-
     @Test
     fun constructor_requiredParamsOnly_success() {
         val entry = constructWithRequiredParamsOnly()
-
         assertNotNull(entry)
         assertThat(entry.type).isEqualTo(PublicKeyCredential.TYPE_PUBLIC_KEY_CREDENTIAL)
         assertEntryWithRequiredParams(entry)
     }
-
     @Test
     fun constructor_allParams_success() {
         val entry = constructWithAllParams()
@@ -69,7 +64,6 @@
         assertThat(entry.type).isEqualTo(PublicKeyCredential.TYPE_PUBLIC_KEY_CREDENTIAL)
         assertEntryWithAllParams(entry)
     }
-
     @Test
     fun constructor_emptyUsername_throwsIAE() {
         assertThrows(
@@ -81,13 +75,11 @@
             )
         }
     }
-
     @Test
     fun constructor_nullIcon_defaultIconSet() {
         val entry = PublicKeyCredentialEntry(
             mContext, USERNAME, mPendingIntent, BEGIN_OPTION
         )
-
         assertThat(
             equals(
                 entry.icon,
@@ -95,7 +87,6 @@
             )
         ).isTrue()
     }
-
     @Test
     fun constructor_nullTypeDisplayName_defaultDisplayNameSet() {
         val entry = PublicKeyCredentialEntry(
@@ -108,6 +99,34 @@
         )
     }
     @Test
+    fun constructor_setPreferredDefaultIconBit_retrieveSetPreferredDefaultIconBit() {
+        val expectedPreferredDefaultIconBit = SINGLE_PROVIDER_ICON_BIT
+        val entry = PublicKeyCredentialEntry(
+            mContext,
+            USERNAME,
+            mPendingIntent,
+            BEGIN_OPTION,
+            DISPLAYNAME,
+            Instant.ofEpochMilli(LAST_USED_TIME),
+            ICON,
+            IS_AUTO_SELECT_ALLOWED,
+            isDefaultIconPreferredAsSingleProvider = expectedPreferredDefaultIconBit
+        )
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider)
+            .isEqualTo(expectedPreferredDefaultIconBit)
+    }
+    @Test
+    fun constructor_preferredIconBitNotProvided_retrieveDefaultPreferredIconBit() {
+        val entry = PublicKeyCredentialEntry(
+            mContext,
+            USERNAME,
+            mPendingIntent,
+            BEGIN_OPTION
+        )
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
+    }
+    @Test
     fun constructor_allRequiredParamsUsed_defaultUsernameEntryGroupIdRetrieved() {
         val entry = constructWithAllParams()
 
@@ -143,28 +162,22 @@
     fun fromSlice_success() {
         val originalEntry = constructWithAllParams()
         val slice = PublicKeyCredentialEntry.toSlice(originalEntry)
-
         assertNotNull(slice)
         val entry = fromSlice(slice!!)
-
         assertNotNull(entry)
         entry?.let {
-            assertEntryWithRequiredParams(entry)
+            assertEntryWithAllParams(entry)
         }
     }
-
     @Test
     @SdkSuppress(minSdkVersion = 34)
     fun fromCredentialEntry_success() {
         val originalEntry = constructWithAllParams()
-
         val entry = toSlice(originalEntry)?.let { CredentialEntry("id", it) }
             ?.let { fromCredentialEntry(it) }
-
         Assert.assertNotNull(entry)
-        assertEntryWithRequiredParams(entry!!)
+        assertEntryWithAllParams(entry!!)
     }
-
     private fun constructWithRequiredParamsOnly(): PublicKeyCredentialEntry {
         return PublicKeyCredentialEntry(
             mContext,
@@ -173,7 +186,6 @@
             BEGIN_OPTION
         )
     }
-
     private fun constructWithAllParams(): PublicKeyCredentialEntry {
         return PublicKeyCredentialEntry(
             mContext,
@@ -183,17 +195,18 @@
             DISPLAYNAME,
             Instant.ofEpochMilli(LAST_USED_TIME),
             ICON,
-            IS_AUTO_SELECT_ALLOWED
+            IS_AUTO_SELECT_ALLOWED,
+            SINGLE_PROVIDER_ICON_BIT
         )
     }
-
     private fun assertEntryWithRequiredParams(entry: PublicKeyCredentialEntry) {
         assertThat(USERNAME == entry.username)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(
+            DEFAULT_SINGLE_PROVIDER_ICON_BIT)
         assertThat(entry.affiliatedDomain).isNull()
         assertThat(entry.entryGroupId).isEqualTo(USERNAME)
     }
-
     private fun assertEntryWithAllParams(entry: PublicKeyCredentialEntry) {
         assertThat(USERNAME == entry.username)
         assertThat(DISPLAYNAME == entry.displayName)
@@ -202,6 +215,7 @@
         assertThat(Instant.ofEpochMilli(LAST_USED_TIME)).isEqualTo(entry.lastUsedTime)
         assertThat(IS_AUTO_SELECT_ALLOWED).isEqualTo(entry.isAutoSelectAllowed)
         assertThat(mPendingIntent).isEqualTo(entry.pendingIntent)
+        assertThat(entry.isDefaultIconPreferredAsSingleProvider).isEqualTo(SINGLE_PROVIDER_ICON_BIT)
         assertThat(entry.affiliatedDomain).isNull()
         assertThat(entry.entryGroupId).isEqualTo(USERNAME)
     }
@@ -217,5 +231,7 @@
         private val ICON = Icon.createWithBitmap(Bitmap.createBitmap(
             100, 100, Bitmap.Config.ARGB_8888))
         private const val IS_AUTO_SELECT_ALLOWED = true
+        private const val DEFAULT_SINGLE_PROVIDER_ICON_BIT = false
+        private const val SINGLE_PROVIDER_ICON_BIT = true
     }
 }