blob: d94160c2b40ca595ac9a9b6ccb9355c47b1735a5 [file] [log] [blame]
Svet Ganov013efe12017-04-13 21:56:16 -07001/*
2 * Copyright (C) 2017 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
17package android.service.autofill;
18
19import android.annotation.IntDef;
20import android.annotation.NonNull;
21import android.annotation.Nullable;
Svet Ganov013efe12017-04-13 21:56:16 -070022import android.os.Bundle;
Svet Ganov013efe12017-04-13 21:56:16 -070023import android.os.Parcel;
24import android.os.Parcelable;
Felipe Leme2ef19c12017-06-05 11:32:32 -070025import android.view.View;
Adam Hebc67f2e2019-11-13 14:34:56 -080026import android.view.inputmethod.InlineSuggestionsRequest;
Philip P. Moltmann121e5262017-04-25 13:33:41 -070027
Eugene Susla3b2fe612019-08-06 18:47:14 -070028import com.android.internal.util.DataClass;
Svet Ganov013efe12017-04-13 21:56:16 -070029import com.android.internal.util.Preconditions;
30
31import java.lang.annotation.Retention;
32import java.lang.annotation.RetentionPolicy;
Philip P. Moltmann121e5262017-04-25 13:33:41 -070033import java.util.ArrayList;
Jeff Sharkey000ce802017-04-29 13:13:27 -060034import java.util.List;
Svet Ganov013efe12017-04-13 21:56:16 -070035
36/**
Felipe Leme2ef19c12017-06-05 11:32:32 -070037 * This class represents a request to an autofill service
Svet Ganov013efe12017-04-13 21:56:16 -070038 * to interpret the screen and provide information to the system which views are
39 * interesting for saving and what are the possible ways to fill the inputs on
40 * the screen if applicable.
41 *
Felipe Lemea012d7e2017-09-06 15:19:11 -070042 * @see AutofillService#onFillRequest(FillRequest, android.os.CancellationSignal, FillCallback)
Svet Ganov013efe12017-04-13 21:56:16 -070043 */
Eugene Susla3b2fe612019-08-06 18:47:14 -070044@DataClass(
45 genToString = true,
46 genHiddenConstructor = true,
47 genHiddenConstDefs = true)
Svet Ganov013efe12017-04-13 21:56:16 -070048public final class FillRequest implements Parcelable {
Felipe Leme2ef19c12017-06-05 11:32:32 -070049
Svet Ganov013efe12017-04-13 21:56:16 -070050 /**
51 * Indicates autofill was explicitly requested by the user.
Felipe Leme2ef19c12017-06-05 11:32:32 -070052 *
53 * <p>Users typically make an explicit request to autofill a screen in two situations:
54 * <ul>
55 * <li>The app disabled autofill (using {@link View#setImportantForAutofill(int)}.
56 * <li>The service could not figure out how to autofill a screen (but the user knows the
57 * service has data for that app).
58 * </ul>
59 *
60 * <p>This flag is particularly useful for the second case. For example, the service could offer
61 * a complex UI where the user can map which screen views belong to each user data, or it could
62 * offer a simpler UI where the user picks the data for just the view used to trigger the
63 * request (that would be the view whose
64 * {@link android.app.assist.AssistStructure.ViewNode#isFocused()} method returns {@code true}).
65 *
66 * <p>An explicit autofill request is triggered when the
67 * {@link android.view.autofill.AutofillManager#requestAutofill(View)} or
68 * {@link android.view.autofill.AutofillManager#requestAutofill(View, int, android.graphics.Rect)}
Jeff Sharkey67f9d502017-08-05 13:49:13 -060069 * is called. For example, standard {@link android.widget.TextView} views show an
70 * {@code AUTOFILL} option in the overflow menu that triggers such request.
Svet Ganov013efe12017-04-13 21:56:16 -070071 */
Eugene Susla3b2fe612019-08-06 18:47:14 -070072 public static final @RequestFlags int FLAG_MANUAL_REQUEST = 0x1;
Svet Ganov013efe12017-04-13 21:56:16 -070073
Felipe Lemeeacd74d2018-08-02 10:36:34 -070074 /**
75 * Indicates this request was made using
76 * <a href="AutofillService.html#CompatibilityMode">compatibility mode</a>.
77 */
Eugene Susla3b2fe612019-08-06 18:47:14 -070078 public static final @RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST = 0x2;
Felipe Lemeeacd74d2018-08-02 10:36:34 -070079
Adam Heef0fe2082019-10-25 11:58:15 -070080 /**
81 * Indicates the request came from a password field.
82 *
83 * (TODO: b/141703197) Temporary fix for augmented autofill showing passwords.
84 *
85 * @hide
86 */
87 public static final @RequestFlags int FLAG_PASSWORD_INPUT_TYPE = 0x4;
88
Svet Ganov013efe12017-04-13 21:56:16 -070089 /** @hide */
Philip P. Moltmannc7619632017-04-25 11:57:37 -070090 public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE;
91
Svet Ganov013efe12017-04-13 21:56:16 -070092 /**
Felipe Leme2ef19c12017-06-05 11:32:32 -070093 * Gets the unique id of this request.
Svet Ganov013efe12017-04-13 21:56:16 -070094 */
Eugene Susla3b2fe612019-08-06 18:47:14 -070095 private final int mId;
96
97 /**
98 * Gets the contexts associated with each previous fill request.
99 *
100 * <p><b>Note:</b> Starting on Android {@link android.os.Build.VERSION_CODES#Q}, it could also
101 * include contexts from requests whose {@link SaveInfo} had the
102 * {@link SaveInfo#FLAG_DELAY_SAVE} flag.
103 */
104 private final @NonNull List<FillContext> mFillContexts;
105
106 /**
107 * Gets the latest client state bundle set by the service in a
108 * {@link FillResponse.Builder#setClientState(Bundle) fill response}.
109 *
110 * <p><b>Note:</b> Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state
111 * bundles set by {@link FillResponse.Builder#setClientState(Bundle)} were considered. On
112 * Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of
113 * an authenticated request through the
114 * {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are
115 * also considered (and take precedence when set).
116 *
117 * @return The client state.
118 */
119 private final @Nullable Bundle mClientState;
Svet Ganov013efe12017-04-13 21:56:16 -0700120
121 /**
Felipe Leme2ef19c12017-06-05 11:32:32 -0700122 * Gets the flags associated with this request.
Svet Ganov013efe12017-04-13 21:56:16 -0700123 *
Felipe Lemea7de4022019-02-19 17:16:45 -0800124 * @return any combination of {@link #FLAG_MANUAL_REQUEST} and
125 * {@link #FLAG_COMPATIBILITY_MODE_REQUEST}.
Svet Ganov013efe12017-04-13 21:56:16 -0700126 */
Eugene Susla3b2fe612019-08-06 18:47:14 -0700127 private final @RequestFlags int mFlags;
128
Adam Hebc67f2e2019-11-13 14:34:56 -0800129 /**
Adam He045c0202020-04-17 15:20:01 -0700130 * Gets the {@link InlineSuggestionsRequest} associated
Adam Hebc67f2e2019-11-13 14:34:56 -0800131 * with this request.
132 *
Adam He045c0202020-04-17 15:20:01 -0700133 * <p>Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if
134 * currently inline suggestions are supported and can be displayed. If the Autofill service
135 * wants to show inline suggestions, they may return {@link Dataset} with valid
136 * {@link InlinePresentation}.</p>
137 *
138 * <p>The Autofill Service must set supportsInlineSuggestions in its XML to enable support
139 * for inline suggestions.</p>
Adam Hebc67f2e2019-11-13 14:34:56 -0800140 *
141 * @return the suggestionspec
142 */
143 private final @Nullable InlineSuggestionsRequest mInlineSuggestionsRequest;
144
Eugene Susla3b2fe612019-08-06 18:47:14 -0700145 private void onConstructed() {
146 Preconditions.checkCollectionElementsNotNull(mFillContexts, "contexts");
147 }
148
149
150
Adam He045c0202020-04-17 15:20:01 -0700151 // Code below generated by codegen v1.0.15.
Eugene Susla3b2fe612019-08-06 18:47:14 -0700152 //
153 // DO NOT MODIFY!
Adam Hebc67f2e2019-11-13 14:34:56 -0800154 // CHECKSTYLE:OFF Generated code
Eugene Susla3b2fe612019-08-06 18:47:14 -0700155 //
156 // To regenerate run:
157 // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/autofill/FillRequest.java
158 //
Adam Hebc67f2e2019-11-13 14:34:56 -0800159 // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
160 // Settings > Editor > Code Style > Formatter Control
161 //@formatter:off
162
Eugene Susla3b2fe612019-08-06 18:47:14 -0700163
164 /** @hide */
165 @IntDef(flag = true, prefix = "FLAG_", value = {
166 FLAG_MANUAL_REQUEST,
Adam Heef0fe2082019-10-25 11:58:15 -0700167 FLAG_COMPATIBILITY_MODE_REQUEST,
168 FLAG_PASSWORD_INPUT_TYPE
Eugene Susla3b2fe612019-08-06 18:47:14 -0700169 })
170 @Retention(RetentionPolicy.SOURCE)
171 @DataClass.Generated.Member
172 public @interface RequestFlags {}
173
174 /** @hide */
175 @DataClass.Generated.Member
176 public static String requestFlagsToString(@RequestFlags int value) {
177 return com.android.internal.util.BitUtils.flagsToString(
178 value, FillRequest::singleRequestFlagsToString);
179 }
180
181 @DataClass.Generated.Member
182 static String singleRequestFlagsToString(@RequestFlags int value) {
183 switch (value) {
184 case FLAG_MANUAL_REQUEST:
185 return "FLAG_MANUAL_REQUEST";
186 case FLAG_COMPATIBILITY_MODE_REQUEST:
187 return "FLAG_COMPATIBILITY_MODE_REQUEST";
Adam Heef0fe2082019-10-25 11:58:15 -0700188 case FLAG_PASSWORD_INPUT_TYPE:
189 return "FLAG_PASSWORD_INPUT_TYPE";
Eugene Susla3b2fe612019-08-06 18:47:14 -0700190 default: return Integer.toHexString(value);
191 }
192 }
193
194 /**
195 * Creates a new FillRequest.
196 *
197 * @param id
198 * Gets the unique id of this request.
199 * @param fillContexts
200 * Gets the contexts associated with each previous fill request.
201 *
202 * <p><b>Note:</b> Starting on Android {@link android.os.Build.VERSION_CODES#Q}, it could also
203 * include contexts from requests whose {@link SaveInfo} had the
204 * {@link SaveInfo#FLAG_DELAY_SAVE} flag.
205 * @param clientState
206 * Gets the latest client state bundle set by the service in a
207 * {@link FillResponse.Builder#setClientState(Bundle) fill response}.
208 *
209 * <p><b>Note:</b> Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state
210 * bundles set by {@link FillResponse.Builder#setClientState(Bundle)} were considered. On
211 * Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of
212 * an authenticated request through the
213 * {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are
214 * also considered (and take precedence when set).
215 * @param flags
216 * Gets the flags associated with this request.
217 *
218 * @return any combination of {@link #FLAG_MANUAL_REQUEST} and
219 * {@link #FLAG_COMPATIBILITY_MODE_REQUEST}.
Adam Hebc67f2e2019-11-13 14:34:56 -0800220 * @param inlineSuggestionsRequest
Adam He045c0202020-04-17 15:20:01 -0700221 * Gets the {@link InlineSuggestionsRequest} associated
Adam Hebc67f2e2019-11-13 14:34:56 -0800222 * with this request.
223 *
Adam He045c0202020-04-17 15:20:01 -0700224 * <p>Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if
225 * currently inline suggestions are supported and can be displayed. If the Autofill service
226 * wants to show inline suggestions, they may return {@link Dataset} with valid
227 * {@link InlinePresentation}.</p>
228 *
229 * <p>The Autofill Service must set supportsInlineSuggestions in its XML to enable support
230 * for inline suggestions.</p>
Eugene Susla3b2fe612019-08-06 18:47:14 -0700231 * @hide
232 */
233 @DataClass.Generated.Member
234 public FillRequest(
235 int id,
236 @NonNull List<FillContext> fillContexts,
237 @Nullable Bundle clientState,
Adam Hebc67f2e2019-11-13 14:34:56 -0800238 @RequestFlags int flags,
239 @Nullable InlineSuggestionsRequest inlineSuggestionsRequest) {
Eugene Susla3b2fe612019-08-06 18:47:14 -0700240 this.mId = id;
241 this.mFillContexts = fillContexts;
242 com.android.internal.util.AnnotationValidations.validate(
243 NonNull.class, null, mFillContexts);
244 this.mClientState = clientState;
245 this.mFlags = flags;
246
247 Preconditions.checkFlagsArgument(
248 mFlags,
249 FLAG_MANUAL_REQUEST
Adam Heef0fe2082019-10-25 11:58:15 -0700250 | FLAG_COMPATIBILITY_MODE_REQUEST
251 | FLAG_PASSWORD_INPUT_TYPE);
Adam Hebc67f2e2019-11-13 14:34:56 -0800252 this.mInlineSuggestionsRequest = inlineSuggestionsRequest;
Eugene Susla3b2fe612019-08-06 18:47:14 -0700253
254 onConstructed();
255 }
256
257 /**
258 * Gets the unique id of this request.
259 */
260 @DataClass.Generated.Member
261 public int getId() {
262 return mId;
Svet Ganov013efe12017-04-13 21:56:16 -0700263 }
264
265 /**
Felipe Leme2ef19c12017-06-05 11:32:32 -0700266 * Gets the contexts associated with each previous fill request.
Felipe Lemec7ee7af2018-08-27 12:36:16 -0700267 *
268 * <p><b>Note:</b> Starting on Android {@link android.os.Build.VERSION_CODES#Q}, it could also
269 * include contexts from requests whose {@link SaveInfo} had the
270 * {@link SaveInfo#FLAG_DELAY_SAVE} flag.
Svet Ganov013efe12017-04-13 21:56:16 -0700271 */
Eugene Susla3b2fe612019-08-06 18:47:14 -0700272 @DataClass.Generated.Member
Jeff Sharkey000ce802017-04-29 13:13:27 -0600273 public @NonNull List<FillContext> getFillContexts() {
Eugene Susla3b2fe612019-08-06 18:47:14 -0700274 return mFillContexts;
Felipe Lemea012d7e2017-09-06 15:19:11 -0700275 }
276
Svet Ganov013efe12017-04-13 21:56:16 -0700277 /**
Felipe Lemed37f53e2017-12-07 10:41:10 -0800278 * Gets the latest client state bundle set by the service in a
279 * {@link FillResponse.Builder#setClientState(Bundle) fill response}.
Felipe Leme2ef19c12017-06-05 11:32:32 -0700280 *
Felipe Lemed37f53e2017-12-07 10:41:10 -0800281 * <p><b>Note:</b> Prior to Android {@link android.os.Build.VERSION_CODES#P}, only client state
282 * bundles set by {@link FillResponse.Builder#setClientState(Bundle)} were considered. On
283 * Android {@link android.os.Build.VERSION_CODES#P} and higher, bundles set in the result of
284 * an authenticated request through the
285 * {@link android.view.autofill.AutofillManager#EXTRA_CLIENT_STATE} extra are
286 * also considered (and take precedence when set).
Svet Ganov013efe12017-04-13 21:56:16 -0700287 *
288 * @return The client state.
289 */
Eugene Susla3b2fe612019-08-06 18:47:14 -0700290 @DataClass.Generated.Member
Svet Ganov013efe12017-04-13 21:56:16 -0700291 public @Nullable Bundle getClientState() {
292 return mClientState;
293 }
294
Eugene Susla3b2fe612019-08-06 18:47:14 -0700295 /**
296 * Gets the flags associated with this request.
297 *
298 * @return any combination of {@link #FLAG_MANUAL_REQUEST} and
299 * {@link #FLAG_COMPATIBILITY_MODE_REQUEST}.
300 */
301 @DataClass.Generated.Member
302 public @RequestFlags int getFlags() {
303 return mFlags;
Svet Ganov013efe12017-04-13 21:56:16 -0700304 }
305
Adam Hebc67f2e2019-11-13 14:34:56 -0800306 /**
Adam He045c0202020-04-17 15:20:01 -0700307 * Gets the {@link InlineSuggestionsRequest} associated
Adam Hebc67f2e2019-11-13 14:34:56 -0800308 * with this request.
309 *
Adam He045c0202020-04-17 15:20:01 -0700310 * <p>Autofill Framework will send a {@code @non-null} {@link InlineSuggestionsRequest} if
311 * currently inline suggestions are supported and can be displayed. If the Autofill service
312 * wants to show inline suggestions, they may return {@link Dataset} with valid
313 * {@link InlinePresentation}.</p>
314 *
315 * <p>The Autofill Service must set supportsInlineSuggestions in its XML to enable support
316 * for inline suggestions.</p>
Adam Hebc67f2e2019-11-13 14:34:56 -0800317 *
318 * @return the suggestionspec
319 */
320 @DataClass.Generated.Member
321 public @Nullable InlineSuggestionsRequest getInlineSuggestionsRequest() {
322 return mInlineSuggestionsRequest;
323 }
324
Svet Ganov013efe12017-04-13 21:56:16 -0700325 @Override
Eugene Susla3b2fe612019-08-06 18:47:14 -0700326 @DataClass.Generated.Member
327 public String toString() {
328 // You can override field toString logic by defining methods like:
329 // String fieldNameToString() { ... }
330
331 return "FillRequest { " +
332 "id = " + mId + ", " +
333 "fillContexts = " + mFillContexts + ", " +
334 "clientState = " + mClientState + ", " +
Adam Hebc67f2e2019-11-13 14:34:56 -0800335 "flags = " + requestFlagsToString(mFlags) + ", " +
336 "inlineSuggestionsRequest = " + mInlineSuggestionsRequest +
Eugene Susla3b2fe612019-08-06 18:47:14 -0700337 " }";
Svet Ganov013efe12017-04-13 21:56:16 -0700338 }
339
Eugene Susla3b2fe612019-08-06 18:47:14 -0700340 @Override
341 @DataClass.Generated.Member
Adam Hebc67f2e2019-11-13 14:34:56 -0800342 public void writeToParcel(@NonNull Parcel dest, int flags) {
Eugene Susla3b2fe612019-08-06 18:47:14 -0700343 // You can override field parcelling by defining methods like:
344 // void parcelFieldName(Parcel dest, int flags) { ... }
Svet Ganov013efe12017-04-13 21:56:16 -0700345
Eugene Susla3b2fe612019-08-06 18:47:14 -0700346 byte flg = 0;
347 if (mClientState != null) flg |= 0x4;
Adam Hebc67f2e2019-11-13 14:34:56 -0800348 if (mInlineSuggestionsRequest != null) flg |= 0x10;
Eugene Susla3b2fe612019-08-06 18:47:14 -0700349 dest.writeByte(flg);
350 dest.writeInt(mId);
351 dest.writeParcelableList(mFillContexts, flags);
352 if (mClientState != null) dest.writeBundle(mClientState);
353 dest.writeInt(mFlags);
Adam Hebc67f2e2019-11-13 14:34:56 -0800354 if (mInlineSuggestionsRequest != null) dest.writeTypedObject(mInlineSuggestionsRequest, flags);
Eugene Susla3b2fe612019-08-06 18:47:14 -0700355 }
356
357 @Override
358 @DataClass.Generated.Member
359 public int describeContents() { return 0; }
360
Adam Hebc67f2e2019-11-13 14:34:56 -0800361 /** @hide */
362 @SuppressWarnings({"unchecked", "RedundantCast"})
363 @DataClass.Generated.Member
364 /* package-private */ FillRequest(@NonNull Parcel in) {
365 // You can override field unparcelling by defining methods like:
366 // static FieldType unparcelFieldName(Parcel in) { ... }
367
368 byte flg = in.readByte();
369 int id = in.readInt();
370 List<FillContext> fillContexts = new ArrayList<>();
371 in.readParcelableList(fillContexts, FillContext.class.getClassLoader());
372 Bundle clientState = (flg & 0x4) == 0 ? null : in.readBundle();
373 int flags = in.readInt();
374 InlineSuggestionsRequest inlineSuggestionsRequest = (flg & 0x10) == 0 ? null : (InlineSuggestionsRequest) in.readTypedObject(InlineSuggestionsRequest.CREATOR);
375
376 this.mId = id;
377 this.mFillContexts = fillContexts;
378 com.android.internal.util.AnnotationValidations.validate(
379 NonNull.class, null, mFillContexts);
380 this.mClientState = clientState;
381 this.mFlags = flags;
382
383 Preconditions.checkFlagsArgument(
384 mFlags,
385 FLAG_MANUAL_REQUEST
Adam Heef0fe2082019-10-25 11:58:15 -0700386 | FLAG_COMPATIBILITY_MODE_REQUEST
387 | FLAG_PASSWORD_INPUT_TYPE);
Adam Hebc67f2e2019-11-13 14:34:56 -0800388 this.mInlineSuggestionsRequest = inlineSuggestionsRequest;
389
390 onConstructed();
391 }
392
Eugene Susla3b2fe612019-08-06 18:47:14 -0700393 @DataClass.Generated.Member
394 public static final @NonNull Parcelable.Creator<FillRequest> CREATOR
395 = new Parcelable.Creator<FillRequest>() {
Svet Ganov013efe12017-04-13 21:56:16 -0700396 @Override
397 public FillRequest[] newArray(int size) {
398 return new FillRequest[size];
399 }
Eugene Susla3b2fe612019-08-06 18:47:14 -0700400
401 @Override
Adam Hebc67f2e2019-11-13 14:34:56 -0800402 public FillRequest createFromParcel(@NonNull Parcel in) {
403 return new FillRequest(in);
Eugene Susla3b2fe612019-08-06 18:47:14 -0700404 }
Svet Ganov013efe12017-04-13 21:56:16 -0700405 };
Eugene Susla3b2fe612019-08-06 18:47:14 -0700406
407 @DataClass.Generated(
Adam He045c0202020-04-17 15:20:01 -0700408 time = 1588119440090L,
409 codegenVersion = "1.0.15",
Eugene Susla3b2fe612019-08-06 18:47:14 -0700410 sourceFile = "frameworks/base/core/java/android/service/autofill/FillRequest.java",
Adam Heef0fe2082019-10-25 11:58:15 -0700411 inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)")
Eugene Susla3b2fe612019-08-06 18:47:14 -0700412 @Deprecated
413 private void __metadata() {}
414
Adam Hebc67f2e2019-11-13 14:34:56 -0800415
416 //@formatter:on
417 // End of generated code
418
Svet Ganov013efe12017-04-13 21:56:16 -0700419}