1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.credentials.ui;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.TestApi;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 
25 import com.android.internal.util.AnnotationValidations;
26 
27 import java.util.ArrayList;
28 import java.util.List;
29 
30 /**
31  * Per-provider metadata and entries for the get-credential flow.
32  *
33  * @hide
34  */
35 @TestApi
36 public final class GetCredentialProviderData extends ProviderData implements Parcelable {
37     @NonNull
38     private final List<Entry> mCredentialEntries;
39     @NonNull
40     private final List<Entry> mActionChips;
41     @NonNull
42     private final List<AuthenticationEntry> mAuthenticationEntries;
43     @Nullable
44     private final Entry mRemoteEntry;
45 
GetCredentialProviderData( @onNull String providerFlattenedComponentName, @NonNull List<Entry> credentialEntries, @NonNull List<Entry> actionChips, @NonNull List<AuthenticationEntry> authenticationEntries, @Nullable Entry remoteEntry)46     public GetCredentialProviderData(
47             @NonNull String providerFlattenedComponentName, @NonNull List<Entry> credentialEntries,
48             @NonNull List<Entry> actionChips,
49             @NonNull List<AuthenticationEntry> authenticationEntries,
50             @Nullable Entry remoteEntry) {
51         super(providerFlattenedComponentName);
52         mCredentialEntries = new ArrayList<>(credentialEntries);
53         mActionChips = new ArrayList<>(actionChips);
54         mAuthenticationEntries = new ArrayList<>(authenticationEntries);
55         mRemoteEntry = remoteEntry;
56     }
57 
58     @NonNull
getCredentialEntries()59     public List<Entry> getCredentialEntries() {
60         return mCredentialEntries;
61     }
62 
63     @NonNull
getActionChips()64     public List<Entry> getActionChips() {
65         return mActionChips;
66     }
67 
68     @NonNull
getAuthenticationEntries()69     public List<AuthenticationEntry> getAuthenticationEntries() {
70         return mAuthenticationEntries;
71     }
72 
73     @Nullable
getRemoteEntry()74     public Entry getRemoteEntry() {
75         return mRemoteEntry;
76     }
77 
GetCredentialProviderData(@onNull Parcel in)78     private GetCredentialProviderData(@NonNull Parcel in) {
79         super(in);
80 
81         List<Entry> credentialEntries = new ArrayList<>();
82         in.readTypedList(credentialEntries, Entry.CREATOR);
83         mCredentialEntries = credentialEntries;
84         AnnotationValidations.validate(NonNull.class, null, mCredentialEntries);
85 
86         List<Entry> actionChips  = new ArrayList<>();
87         in.readTypedList(actionChips, Entry.CREATOR);
88         mActionChips = actionChips;
89         AnnotationValidations.validate(NonNull.class, null, mActionChips);
90 
91         List<AuthenticationEntry> authenticationEntries  = new ArrayList<>();
92         in.readTypedList(authenticationEntries, AuthenticationEntry.CREATOR);
93         mAuthenticationEntries = authenticationEntries;
94         AnnotationValidations.validate(NonNull.class, null, mAuthenticationEntries);
95 
96         Entry remoteEntry = in.readTypedObject(Entry.CREATOR);
97         mRemoteEntry = remoteEntry;
98     }
99 
100     @Override
writeToParcel(@onNull Parcel dest, int flags)101     public void writeToParcel(@NonNull Parcel dest, int flags) {
102         super.writeToParcel(dest, flags);
103         dest.writeTypedList(mCredentialEntries);
104         dest.writeTypedList(mActionChips);
105         dest.writeTypedList(mAuthenticationEntries);
106         dest.writeTypedObject(mRemoteEntry, flags);
107     }
108 
109     @Override
describeContents()110     public int describeContents() {
111         return 0;
112     }
113 
114     public static final @NonNull Creator<GetCredentialProviderData> CREATOR =
115             new Creator<GetCredentialProviderData>() {
116         @Override
117         public GetCredentialProviderData createFromParcel(@NonNull Parcel in) {
118             return new GetCredentialProviderData(in);
119         }
120 
121         @Override
122         public GetCredentialProviderData[] newArray(int size) {
123             return new GetCredentialProviderData[size];
124         }
125     };
126 
127     /**
128      * Builder for {@link GetCredentialProviderData}.
129      *
130      * @hide
131      */
132     @TestApi
133     public static final class Builder {
134         @NonNull private String mProviderFlattenedComponentName;
135         @NonNull private List<Entry> mCredentialEntries = new ArrayList<>();
136         @NonNull private List<Entry> mActionChips = new ArrayList<>();
137         @NonNull private List<AuthenticationEntry> mAuthenticationEntries = new ArrayList<>();
138         @Nullable private Entry mRemoteEntry = null;
139 
140         /** Constructor with required properties. */
Builder(@onNull String providerFlattenedComponentName)141         public Builder(@NonNull String providerFlattenedComponentName) {
142             mProviderFlattenedComponentName = providerFlattenedComponentName;
143         }
144 
145         /** Sets the list of save / get credential entries to be displayed to the user. */
146         @NonNull
setCredentialEntries(@onNull List<Entry> credentialEntries)147         public Builder setCredentialEntries(@NonNull List<Entry> credentialEntries) {
148             mCredentialEntries = credentialEntries;
149             return this;
150         }
151 
152         /** Sets the list of action chips to be displayed to the user. */
153         @NonNull
setActionChips(@onNull List<Entry> actionChips)154         public Builder setActionChips(@NonNull List<Entry> actionChips) {
155             mActionChips = actionChips;
156             return this;
157         }
158 
159         /** Sets the authentication entry to be displayed to the user. */
160         @NonNull
setAuthenticationEntries( @onNull List<AuthenticationEntry> authenticationEntry)161         public Builder setAuthenticationEntries(
162                 @NonNull List<AuthenticationEntry> authenticationEntry) {
163             mAuthenticationEntries = authenticationEntry;
164             return this;
165         }
166 
167         /** Sets the remote entry to be displayed to the user. */
168         @NonNull
setRemoteEntry(@ullable Entry remoteEntry)169         public Builder setRemoteEntry(@Nullable Entry remoteEntry) {
170             mRemoteEntry = remoteEntry;
171             return this;
172         }
173 
174         /** Builds a {@link GetCredentialProviderData}. */
175         @NonNull
build()176         public GetCredentialProviderData build() {
177             return new GetCredentialProviderData(mProviderFlattenedComponentName,
178                     mCredentialEntries, mActionChips, mAuthenticationEntries, mRemoteEntry);
179         }
180     }
181 }
182