From c0b50b7de42d407b50fffb68da37c970413573cc Mon Sep 17 00:00:00 2001 From: Helen Qin Date: Wed, 19 Oct 2022 04:56:28 +0000 Subject: [PATCH] Define all the provider-level info in ProviderData. Test: deployed locally Bug: 247855226 Change-Id: I7dee8e151cbd0c717c9266d223844c671d47c844 --- .../android/credentials/ui/ProviderData.java | 129 +++++++++++++++++- .../CredentialManagerRepo.kt | 72 +++++----- 2 files changed, 158 insertions(+), 43 deletions(-) diff --git a/core/java/android/credentials/ui/ProviderData.java b/core/java/android/credentials/ui/ProviderData.java index 38bd4e57b758d..35e12fa43b286 100644 --- a/core/java/android/credentials/ui/ProviderData.java +++ b/core/java/android/credentials/ui/ProviderData.java @@ -16,8 +16,10 @@ package android.credentials.ui; +import android.annotation.CurrentTimeMillisLong; import android.annotation.NonNull; import android.annotation.Nullable; +import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; @@ -43,29 +45,48 @@ public class ProviderData implements Parcelable { @NonNull private final String mProviderId; @NonNull + private final String mProviderDisplayName; + @NonNull + private final Icon mIcon; + @NonNull private final List mCredentialEntries; @NonNull private final List mActionChips; @Nullable private final Entry mAuthenticationEntry; + private final @CurrentTimeMillisLong long mLastUsedTimeMillis; + public ProviderData( - @NonNull String providerId, - @NonNull List credentialEntries, - @NonNull List actionChips, - @Nullable Entry authenticationEntry) { + @NonNull String providerId, @NonNull String providerDisplayName, + @NonNull Icon icon, @NonNull List credentialEntries, + @NonNull List actionChips, @Nullable Entry authenticationEntry, + @CurrentTimeMillisLong long lastUsedTimeMillis) { mProviderId = providerId; + mProviderDisplayName = providerDisplayName; + mIcon = icon; mCredentialEntries = credentialEntries; mActionChips = actionChips; mAuthenticationEntry = authenticationEntry; + mLastUsedTimeMillis = lastUsedTimeMillis; } - /** Returns the provider package name. */ + /** Returns the unique provider id. */ @NonNull public String getProviderId() { return mProviderId; } + @NonNull + public String getProviderDisplayName() { + return mProviderDisplayName; + } + + @NonNull + public Icon getIcon() { + return mIcon; + } + @NonNull public List getCredentialEntries() { return mCredentialEntries; @@ -81,11 +102,24 @@ public class ProviderData implements Parcelable { return mAuthenticationEntry; } + /** Returns the time when the provider was last used. */ + public @CurrentTimeMillisLong long getLastUsedTimeMillis() { + return mLastUsedTimeMillis; + } + protected ProviderData(@NonNull Parcel in) { String providerId = in.readString8(); mProviderId = providerId; AnnotationValidations.validate(NonNull.class, null, mProviderId); + String providerDisplayName = in.readString8(); + mProviderDisplayName = providerDisplayName; + AnnotationValidations.validate(NonNull.class, null, mProviderDisplayName); + + Icon icon = in.readTypedObject(Icon.CREATOR); + mIcon = icon; + AnnotationValidations.validate(NonNull.class, null, mIcon); + List credentialEntries = new ArrayList<>(); in.readTypedList(credentialEntries, Entry.CREATOR); mCredentialEntries = credentialEntries; @@ -98,14 +132,20 @@ public class ProviderData implements Parcelable { Entry authenticationEntry = in.readTypedObject(Entry.CREATOR); mAuthenticationEntry = authenticationEntry; + + long lastUsedTimeMillis = in.readLong(); + mLastUsedTimeMillis = lastUsedTimeMillis; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString8(mProviderId); + dest.writeString8(mProviderDisplayName); + dest.writeTypedObject(mIcon, flags); dest.writeTypedList(mCredentialEntries); dest.writeTypedList(mActionChips); dest.writeTypedObject(mAuthenticationEntry, flags); + dest.writeLong(mLastUsedTimeMillis); } @Override @@ -124,4 +164,83 @@ public class ProviderData implements Parcelable { return new ProviderData[size]; } }; + + /** + * Builder for {@link ProviderData}. + * + * @hide + */ + public static class Builder { + private @NonNull String mProviderId; + private @NonNull String mProviderDisplayName; + private @NonNull Icon mIcon; + private @NonNull List mCredentialEntries = new ArrayList<>(); + private @NonNull List mActionChips = new ArrayList<>(); + private @Nullable Entry mAuthenticationEntry = null; + private @CurrentTimeMillisLong long mLastUsedTimeMillis = 0L; + + /** Constructor with required properties. */ + public Builder(@NonNull String providerId, @NonNull String providerDisplayName, + @NonNull Icon icon) { + mProviderId = providerId; + mProviderDisplayName = providerDisplayName; + mIcon = icon; + } + + /** Sets the unique provider id. */ + @NonNull + public Builder setProviderId(@NonNull String providerId) { + mProviderId = providerId; + return this; + } + + /** Sets the provider display name to be displayed to the user. */ + @NonNull + public Builder setProviderDisplayName(@NonNull String providerDisplayName) { + mProviderDisplayName = providerDisplayName; + return this; + } + + /** Sets the provider icon to be displayed to the user. */ + @NonNull + public Builder setIcon(@NonNull Icon icon) { + mIcon = icon; + return this; + } + + /** Sets the list of save / get credential entries to be displayed to the user. */ + @NonNull + public Builder setCredentialEntries(@NonNull List credentialEntries) { + mCredentialEntries = credentialEntries; + return this; + } + + /** Sets the list of action chips to be displayed to the user. */ + @NonNull + public Builder setActionChips(@NonNull List actionChips) { + mActionChips = actionChips; + return this; + } + + /** Sets the authentication entry to be displayed to the user. */ + @NonNull + public Builder setAuthenticationEntry(@Nullable Entry authenticationEntry) { + mAuthenticationEntry = authenticationEntry; + return this; + } + + /** Sets the time when the provider was last used. */ + @NonNull + public Builder setLastUsedTimeMillis(@CurrentTimeMillisLong long lastUsedTimeMillis) { + mLastUsedTimeMillis = lastUsedTimeMillis; + return this; + } + + /** Builds a {@link ProviderData}. */ + @NonNull + public ProviderData build() { + return new ProviderData(mProviderId, mProviderDisplayName, mIcon, mCredentialEntries, + mActionChips, mAuthenticationEntry, mLastUsedTimeMillis); + } + } } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index b63f3c958e1a0..ec0c5b708abe0 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -119,46 +119,42 @@ class CredentialManagerRepo( // TODO: below are prototype functionalities. To be removed for productionization. private fun testProviderList(): List { return listOf( - ProviderData( + ProviderData.Builder( "com.google", - listOf( - newEntry(1, "elisa.beckett@gmail.com", "Elisa Backett", - "20 passwords and 7 passkeys saved"), - newEntry(2, "elisa.work@google.com", "Elisa Backett Work", - "20 passwords and 7 passkeys saved"), - ), - listOf( - newEntry(3, "Go to Settings", "", - "20 passwords and 7 passkeys saved"), - newEntry(4, "Switch Account", "", - "20 passwords and 7 passkeys saved"), - ), - null - ), - ProviderData( + "Google Password Manager", + Icon.createWithResource(context, R.drawable.ic_launcher_foreground)) + .setCredentialEntries( + listOf( + newEntry(1, "elisa.beckett@gmail.com", "Elisa Backett", + "20 passwords and 7 passkeys saved"), + newEntry(2, "elisa.work@google.com", "Elisa Backett Work", + "20 passwords and 7 passkeys saved"), + ) + ).setActionChips( + listOf( + newEntry(3, "Go to Settings", "", + "20 passwords and 7 passkeys saved"), + newEntry(4, "Switch Account", "", + "20 passwords and 7 passkeys saved"), + ), + ).build(), + ProviderData.Builder( "com.dashlane", - listOf( - newEntry(5, "elisa.beckett@dashlane.com", "Elisa Backett", - "20 passwords and 7 passkeys saved"), - newEntry(6, "elisa.work@dashlane.com", "Elisa Backett Work", - "20 passwords and 7 passkeys saved"), - ), - listOf( - newEntry(7, "Manage Accounts", "Manage your accounts in the dashlane app", - "20 passwords and 7 passkeys saved"), - ), - null - ), - ProviderData( - "com.lastpass", - listOf( - newEntry(8, "elisa.beckett@lastpass.com", "Elisa Backett", - "20 passwords and 7 passkeys saved"), - ), - listOf(), - null - ) - + "Dashlane", + Icon.createWithResource(context, R.drawable.ic_launcher_foreground)) + .setCredentialEntries( + listOf( + newEntry(1, "elisa.beckett@dashlane.com", "Elisa Backett", + "20 passwords and 7 passkeys saved"), + newEntry(2, "elisa.work@dashlane.com", "Elisa Backett Work", + "20 passwords and 7 passkeys saved"), + ) + ).setActionChips( + listOf( + newEntry(3, "Manage Accounts", "Manage your accounts in the dashlane app", + "20 passwords and 7 passkeys saved"), + ), + ).build(), ) }