1 /*
2  * Copyright (C) 2019 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.service.autofill;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Size;
21 import android.app.slice.Slice;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.widget.inline.InlinePresentationSpec;
25 
26 import com.android.internal.util.DataClass;
27 
28 import java.util.List;
29 
30 /**
31  * Wrapper class holding a {@link Slice} and an {@link InlinePresentationSpec} for rendering UI
32  * for an Inline Suggestion.
33  */
34 @DataClass(
35         genToString = true,
36         genHiddenConstDefs = true,
37         genEqualsHashCode = true)
38 public final class InlinePresentation implements Parcelable {
39 
40 
41     /**
42      * Represents the UI content and the action for the inline suggestion.
43      *
44      * <p>The Slice should be constructed using the Content builder provided in the androidx
45      * autofill library e.g. {@code androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder}
46      * and then converted to a Slice with
47      * {@code androidx.autofill.inline.UiVersions.Content#getSlice()}.</p>
48      */
49     private final @NonNull Slice mSlice;
50 
51     /**
52      * Specifies the UI specification for the inline suggestion.
53      */
54     private final @NonNull InlinePresentationSpec mInlinePresentationSpec;
55 
56     /**
57      * Indicates whether the UI should be pinned, hence non-scrollable and non-filterable, in the
58      * host. However, it's eventually up to the host whether the UI is pinned or not.
59      *
60      * <p> Also a {@link Dataset} with a pinned inline presentation will not be replaced by the
61      * new data set returned from authentication intent. See
62      * {@link Dataset.Builder#setAuthentication(android.content.IntentSender)} for more information.
63      */
64     private final boolean mPinned;
65 
66     /**
67      * Returns the autofill hints set in the slice.
68      *
69      * @hide
70      */
71     @NonNull
72     @Size(min = 0)
getAutofillHints()73     public String[] getAutofillHints() {
74         List<String> hints = mSlice.getHints();
75         return hints.toArray(new String[hints.size()]);
76     }
77 
78     /**
79      * Creates a presentation for the inline suggestion tooltip
80      *
81      * @param slice Represents the UI content and the action for the inline suggestion tooltip.
82      * @param spec Specifies the UI specification for the inline suggestion tooltip.
83      * @return An {@link InlinePresentation} for the inline suggestion tooltip
84      */
85     @NonNull
createTooltipPresentation(@onNull Slice slice, @NonNull InlinePresentationSpec spec)86     public static InlinePresentation createTooltipPresentation(@NonNull Slice slice,
87             @NonNull InlinePresentationSpec spec) {
88         return new InlinePresentation(slice, spec, /* pinned */ false);
89 
90     }
91 
92 
93 
94     // Code below generated by codegen v1.0.22.
95     //
96     // DO NOT MODIFY!
97     // CHECKSTYLE:OFF Generated code
98     //
99     // To regenerate run:
100     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/autofill/InlinePresentation.java
101     //
102     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
103     //   Settings > Editor > Code Style > Formatter Control
104     //@formatter:off
105 
106 
107     /**
108      * Creates a new InlinePresentation.
109      *
110      * @param slice
111      *   Represents the UI content and the action for the inline suggestion.
112      *
113      *   <p>The Slice should be constructed using the Content builder provided in the androidx
114      *   autofill library e.g. {@code androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder}
115      *   and then converted to a Slice with
116      *   {@code androidx.autofill.inline.UiVersions.Content#getSlice()}.</p>
117      * @param inlinePresentationSpec
118      *   Specifies the UI specification for the inline suggestion.
119      * @param pinned
120      *   Indicates whether the UI should be pinned, hence non-scrollable and non-filterable, in the
121      *   host. However, it's eventually up to the host whether the UI is pinned or not.
122      *
123      *   <p> Also a {@link Dataset} with a pinned inline presentation will not be replaced by the
124      *   new data set returned from authentication intent. See
125      *   {@link Dataset.Builder#setAuthentication(android.content.IntentSender)} for more information.
126      */
127     @DataClass.Generated.Member
InlinePresentation( @onNull Slice slice, @NonNull InlinePresentationSpec inlinePresentationSpec, boolean pinned)128     public InlinePresentation(
129             @NonNull Slice slice,
130             @NonNull InlinePresentationSpec inlinePresentationSpec,
131             boolean pinned) {
132         this.mSlice = slice;
133         com.android.internal.util.AnnotationValidations.validate(
134                 NonNull.class, null, mSlice);
135         this.mInlinePresentationSpec = inlinePresentationSpec;
136         com.android.internal.util.AnnotationValidations.validate(
137                 NonNull.class, null, mInlinePresentationSpec);
138         this.mPinned = pinned;
139 
140         // onConstructed(); // You can define this method to get a callback
141     }
142 
143     /**
144      * Represents the UI content and the action for the inline suggestion.
145      *
146      * <p>The Slice should be constructed using the Content builder provided in the androidx
147      * autofill library e.g. {@code androidx.autofill.inline.v1.InlineSuggestionUi.Content.Builder}
148      * and then converted to a Slice with
149      * {@code androidx.autofill.inline.UiVersions.Content#getSlice()}.</p>
150      */
151     @DataClass.Generated.Member
getSlice()152     public @NonNull Slice getSlice() {
153         return mSlice;
154     }
155 
156     /**
157      * Specifies the UI specification for the inline suggestion.
158      */
159     @DataClass.Generated.Member
getInlinePresentationSpec()160     public @NonNull InlinePresentationSpec getInlinePresentationSpec() {
161         return mInlinePresentationSpec;
162     }
163 
164     /**
165      * Indicates whether the UI should be pinned, hence non-scrollable and non-filterable, in the
166      * host. However, it's eventually up to the host whether the UI is pinned or not.
167      *
168      * <p> Also a {@link Dataset} with a pinned inline presentation will not be replaced by the
169      * new data set returned from authentication intent. See
170      * {@link Dataset.Builder#setAuthentication(android.content.IntentSender)} for more information.
171      */
172     @DataClass.Generated.Member
isPinned()173     public boolean isPinned() {
174         return mPinned;
175     }
176 
177     @Override
178     @DataClass.Generated.Member
toString()179     public String toString() {
180         // You can override field toString logic by defining methods like:
181         // String fieldNameToString() { ... }
182 
183         return "InlinePresentation { " +
184                 "slice = " + mSlice + ", " +
185                 "inlinePresentationSpec = " + mInlinePresentationSpec + ", " +
186                 "pinned = " + mPinned +
187         " }";
188     }
189 
190     @Override
191     @DataClass.Generated.Member
equals(@ndroid.annotation.Nullable Object o)192     public boolean equals(@android.annotation.Nullable Object o) {
193         // You can override field equality logic by defining either of the methods like:
194         // boolean fieldNameEquals(InlinePresentation other) { ... }
195         // boolean fieldNameEquals(FieldType otherValue) { ... }
196 
197         if (this == o) return true;
198         if (o == null || getClass() != o.getClass()) return false;
199         @SuppressWarnings("unchecked")
200         InlinePresentation that = (InlinePresentation) o;
201         //noinspection PointlessBooleanExpression
202         return true
203                 && java.util.Objects.equals(mSlice, that.mSlice)
204                 && java.util.Objects.equals(mInlinePresentationSpec, that.mInlinePresentationSpec)
205                 && mPinned == that.mPinned;
206     }
207 
208     @Override
209     @DataClass.Generated.Member
hashCode()210     public int hashCode() {
211         // You can override field hashCode logic by defining methods like:
212         // int fieldNameHashCode() { ... }
213 
214         int _hash = 1;
215         _hash = 31 * _hash + java.util.Objects.hashCode(mSlice);
216         _hash = 31 * _hash + java.util.Objects.hashCode(mInlinePresentationSpec);
217         _hash = 31 * _hash + Boolean.hashCode(mPinned);
218         return _hash;
219     }
220 
221     @Override
222     @DataClass.Generated.Member
writeToParcel(@onNull Parcel dest, int flags)223     public void writeToParcel(@NonNull Parcel dest, int flags) {
224         // You can override field parcelling by defining methods like:
225         // void parcelFieldName(Parcel dest, int flags) { ... }
226 
227         byte flg = 0;
228         if (mPinned) flg |= 0x4;
229         dest.writeByte(flg);
230         dest.writeTypedObject(mSlice, flags);
231         dest.writeTypedObject(mInlinePresentationSpec, flags);
232     }
233 
234     @Override
235     @DataClass.Generated.Member
describeContents()236     public int describeContents() { return 0; }
237 
238     /** @hide */
239     @SuppressWarnings({"unchecked", "RedundantCast"})
240     @DataClass.Generated.Member
InlinePresentation(@onNull Parcel in)241     /* package-private */ InlinePresentation(@NonNull Parcel in) {
242         // You can override field unparcelling by defining methods like:
243         // static FieldType unparcelFieldName(Parcel in) { ... }
244 
245         byte flg = in.readByte();
246         boolean pinned = (flg & 0x4) != 0;
247         Slice slice = (Slice) in.readTypedObject(Slice.CREATOR);
248         InlinePresentationSpec inlinePresentationSpec = (InlinePresentationSpec) in.readTypedObject(InlinePresentationSpec.CREATOR);
249 
250         this.mSlice = slice;
251         com.android.internal.util.AnnotationValidations.validate(
252                 NonNull.class, null, mSlice);
253         this.mInlinePresentationSpec = inlinePresentationSpec;
254         com.android.internal.util.AnnotationValidations.validate(
255                 NonNull.class, null, mInlinePresentationSpec);
256         this.mPinned = pinned;
257 
258         // onConstructed(); // You can define this method to get a callback
259     }
260 
261     @DataClass.Generated.Member
262     public static final @NonNull Parcelable.Creator<InlinePresentation> CREATOR
263             = new Parcelable.Creator<InlinePresentation>() {
264         @Override
265         public InlinePresentation[] newArray(int size) {
266             return new InlinePresentation[size];
267         }
268 
269         @Override
270         public InlinePresentation createFromParcel(@NonNull Parcel in) {
271             return new InlinePresentation(in);
272         }
273     };
274 
275     @DataClass.Generated(
276             time = 1615968415006L,
277             codegenVersion = "1.0.22",
278             sourceFile = "frameworks/base/core/java/android/service/autofill/InlinePresentation.java",
279             inputSignatures = "private final @android.annotation.NonNull android.app.slice.Slice mSlice\nprivate final @android.annotation.NonNull android.widget.inline.InlinePresentationSpec mInlinePresentationSpec\nprivate final  boolean mPinned\npublic @android.annotation.NonNull @android.annotation.Size java.lang.String[] getAutofillHints()\npublic static @android.annotation.NonNull android.service.autofill.InlinePresentation createTooltipPresentation(android.app.slice.Slice,android.widget.inline.InlinePresentationSpec)\nclass InlinePresentation extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstDefs=true, genEqualsHashCode=true)")
280     @Deprecated
__metadata()281     private void __metadata() {}
282 
283 
284     //@formatter:on
285     // End of generated code
286 
287 }
288