1 /*
2  * Copyright (C) 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.adservices.ondevicepersonalization;
18 
19 import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
20 import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
21 import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
22 
23 import android.annotation.FlaggedApi;
24 import android.annotation.IntDef;
25 import android.annotation.IntRange;
26 import android.annotation.NonNull;
27 import android.annotation.Nullable;
28 import android.net.NetworkCapabilities;
29 import android.os.Parcelable;
30 import android.telephony.TelephonyManager;
31 
32 import com.android.adservices.ondevicepersonalization.flags.Flags;
33 import com.android.ondevicepersonalization.internal.util.AnnotationValidations;
34 import com.android.ondevicepersonalization.internal.util.DataClass;
35 
36 import java.lang.annotation.Retention;
37 import java.lang.annotation.RetentionPolicy;
38 import java.time.Duration;
39 import java.util.Collections;
40 import java.util.Map;
41 
42 /**
43  * User data provided by the platform to an {@link IsolatedService}.
44  *
45  */
46 // This class should be updated with the Kotlin mirror
47 // {@link com.android.ondevicepersonalization.services.policyengine.data.UserData}.
48 @FlaggedApi(Flags.FLAG_ON_DEVICE_PERSONALIZATION_APIS_ENABLED)
49 @DataClass(genHiddenBuilder = true, genEqualsHashCode = true, genConstDefs = false)
50 public final class UserData implements Parcelable {
51     /**
52      * The device timezone +/- offset from UTC.
53      *
54      * @hide
55      */
56     int mTimezoneUtcOffsetMins = 0;
57 
58     /** @hide **/
59     @IntDef(prefix = {"ORIENTATION_"}, value = {
60             ORIENTATION_UNDEFINED,
61             ORIENTATION_PORTRAIT,
62             ORIENTATION_LANDSCAPE
63     })
64     @Retention(RetentionPolicy.SOURCE)
65     public @interface Orientation {
66     }
67 
68     /**
69      * The device orientation. The value can be one of the constants ORIENTATION_UNDEFINED,
70      * ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE defined in
71      * {@link android.content.res.Configuration}.
72      */
73     @Orientation int mOrientation = 0;
74 
75     /** The available space on device in bytes. */
76     @IntRange(from = 0) long mAvailableStorageBytes = 0;
77 
78     /** Battery percentage. */
79     @IntRange(from = 0, to = 100) int mBatteryPercentage = 0;
80 
81     /** The Service Provider Name (SPN) returned by {@link TelephonyManager#getSimOperatorName()} */
82     @NonNull String mCarrier = "";
83 
84     /** @hide **/
85     @IntDef({
86             TelephonyManager.NETWORK_TYPE_UNKNOWN,
87             TelephonyManager.NETWORK_TYPE_GPRS,
88             TelephonyManager.NETWORK_TYPE_EDGE,
89             TelephonyManager.NETWORK_TYPE_UMTS,
90             TelephonyManager.NETWORK_TYPE_CDMA,
91             TelephonyManager.NETWORK_TYPE_EVDO_0,
92             TelephonyManager.NETWORK_TYPE_EVDO_A,
93             TelephonyManager.NETWORK_TYPE_1xRTT,
94             TelephonyManager.NETWORK_TYPE_HSDPA,
95             TelephonyManager.NETWORK_TYPE_HSUPA,
96             TelephonyManager.NETWORK_TYPE_HSPA,
97             TelephonyManager.NETWORK_TYPE_EVDO_B,
98             TelephonyManager.NETWORK_TYPE_LTE,
99             TelephonyManager.NETWORK_TYPE_EHRPD,
100             TelephonyManager.NETWORK_TYPE_HSPAP,
101             TelephonyManager.NETWORK_TYPE_GSM,
102             TelephonyManager.NETWORK_TYPE_TD_SCDMA,
103             TelephonyManager.NETWORK_TYPE_IWLAN,
104 
105             //TODO: In order for @SystemApi methods to use this class, there cannot be any
106             // public hidden members.  This network type is marked as hidden because it is not a
107             // true network type and we are looking to remove it completely from the available list
108             // of network types.
109             //TelephonyManager.NETWORK_TYPE_LTE_CA,
110 
111             TelephonyManager.NETWORK_TYPE_NR,
112     })
113     @Retention(RetentionPolicy.SOURCE)
114     public @interface NetworkType {
115     }
116 
117     /**
118      * A filtered subset of the Network capabilities of the device that contains upstream
119      * and downstream speeds, and whether the network is metered.
120      * This is an instance of {@link NetworkCapabilities} that contains the capability
121      * {@link android.net.NetworkCapabilities#NET_CAPABILITY_NOT_METERED} if the network is not
122      * metered, and {@link NetworkCapabilities#getLinkDownstreamBandwidthKbps()} and
123      * {@link NetworkCapabilities#getLinkUpstreamBandwidthKbps()} return the downstream and
124      * upstream connection speeds. All other methods of this {@link NetworkCapabilities} object
125      * return empty or default values.
126      */
127     @Nullable NetworkCapabilities mNetworkCapabilities = null;
128 
129     /**
130      * Data network type. This is the value of
131      * {@link android.telephony.TelephonyManager#getDataNetworkType()}.
132      */
133     @NetworkType int mDataNetworkType = 0;
134 
135     /** A map from package name to app information for installed and uninstalled apps. */
136     @DataClass.PluralOf("appInfo")
137     @NonNull Map<String, AppInfo> mAppInfos = Collections.emptyMap();
138 
139     /** The device timezone +/- offset from UTC. */
getTimezoneUtcOffset()140     @NonNull public Duration getTimezoneUtcOffset() {
141         return Duration.ofMinutes(mTimezoneUtcOffsetMins);
142     }
143 
144 
145 
146     // Code below generated by codegen v1.0.23.
147     //
148     // DO NOT MODIFY!
149     // CHECKSTYLE:OFF Generated code
150     //
151     // To regenerate run:
152     // $ codegen $ANDROID_BUILD_TOP/packages/modules/OnDevicePersonalization/framework/java/android/adservices/ondevicepersonalization/UserData.java
153     //
154     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
155     //   Settings > Editor > Code Style > Formatter Control
156     //@formatter:off
157 
158 
159     @DataClass.Generated.Member
UserData( int timezoneUtcOffsetMins, @Orientation int orientation, @IntRange(from = 0) long availableStorageBytes, @IntRange(from = 0, to = 100) int batteryPercentage, @NonNull String carrier, @Nullable NetworkCapabilities networkCapabilities, @NetworkType int dataNetworkType, @NonNull Map<String,AppInfo> appInfos)160     /* package-private */ UserData(
161             int timezoneUtcOffsetMins,
162             @Orientation int orientation,
163             @IntRange(from = 0) long availableStorageBytes,
164             @IntRange(from = 0, to = 100) int batteryPercentage,
165             @NonNull String carrier,
166             @Nullable NetworkCapabilities networkCapabilities,
167             @NetworkType int dataNetworkType,
168             @NonNull Map<String,AppInfo> appInfos) {
169         this.mTimezoneUtcOffsetMins = timezoneUtcOffsetMins;
170         this.mOrientation = orientation;
171         AnnotationValidations.validate(
172                 Orientation.class, null, mOrientation);
173         this.mAvailableStorageBytes = availableStorageBytes;
174         AnnotationValidations.validate(
175                 IntRange.class, null, mAvailableStorageBytes,
176                 "from", 0);
177         this.mBatteryPercentage = batteryPercentage;
178         AnnotationValidations.validate(
179                 IntRange.class, null, mBatteryPercentage,
180                 "from", 0,
181                 "to", 100);
182         this.mCarrier = carrier;
183         AnnotationValidations.validate(
184                 NonNull.class, null, mCarrier);
185         this.mNetworkCapabilities = networkCapabilities;
186         this.mDataNetworkType = dataNetworkType;
187         AnnotationValidations.validate(
188                 NetworkType.class, null, mDataNetworkType);
189         this.mAppInfos = appInfos;
190         AnnotationValidations.validate(
191                 NonNull.class, null, mAppInfos);
192 
193         // onConstructed(); // You can define this method to get a callback
194     }
195 
196     /**
197      * The device timezone +/- offset from UTC.
198      *
199      * @hide
200      */
201     @DataClass.Generated.Member
getTimezoneUtcOffsetMins()202     public int getTimezoneUtcOffsetMins() {
203         return mTimezoneUtcOffsetMins;
204     }
205 
206     /**
207      * The device orientation. The value can be one of the constants ORIENTATION_UNDEFINED,
208      * ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE defined in
209      * {@link android.content.res.Configuration}.
210      */
211     @DataClass.Generated.Member
getOrientation()212     public @Orientation int getOrientation() {
213         return mOrientation;
214     }
215 
216     /**
217      * The available space on device in bytes.
218      */
219     @DataClass.Generated.Member
getAvailableStorageBytes()220     public @IntRange(from = 0) long getAvailableStorageBytes() {
221         return mAvailableStorageBytes;
222     }
223 
224     /**
225      * Battery percentage.
226      */
227     @DataClass.Generated.Member
getBatteryPercentage()228     public @IntRange(from = 0, to = 100) int getBatteryPercentage() {
229         return mBatteryPercentage;
230     }
231 
232     /**
233      * The Service Provider Name (SPN) returned by {@link TelephonyManager#getSimOperatorName()}
234      */
235     @DataClass.Generated.Member
getCarrier()236     public @NonNull String getCarrier() {
237         return mCarrier;
238     }
239 
240     /**
241      * A filtered subset of the Network capabilities of the device that contains upstream
242      * and downstream speeds, and whether the network is metered.
243      * This is an instance of {@link NetworkCapabilities} that contains the capability
244      * {@link android.net.NetworkCapabilities#NET_CAPABILITY_NOT_METERED} if the network is not
245      * metered, and {@link NetworkCapabilities#getLinkDownstreamBandwidthKbps()} and
246      * {@link NetworkCapabilities#getLinkUpstreamBandwidthKbps()} return the downstream and
247      * upstream connection speeds. All other methods of this {@link NetworkCapabilities} object
248      * return empty or default values.
249      */
250     @DataClass.Generated.Member
getNetworkCapabilities()251     public @Nullable NetworkCapabilities getNetworkCapabilities() {
252         return mNetworkCapabilities;
253     }
254 
255     /**
256      * Data network type. This is the value of
257      * {@link android.telephony.TelephonyManager#getDataNetworkType()}.
258      */
259     @DataClass.Generated.Member
getDataNetworkType()260     public @NetworkType int getDataNetworkType() {
261         return mDataNetworkType;
262     }
263 
264     /**
265      * A map from package name to app information for installed and uninstalled apps.
266      */
267     @DataClass.Generated.Member
getAppInfos()268     public @NonNull Map<String,AppInfo> getAppInfos() {
269         return mAppInfos;
270     }
271 
272     @Override
273     @DataClass.Generated.Member
equals(@ullable Object o)274     public boolean equals(@Nullable Object o) {
275         // You can override field equality logic by defining either of the methods like:
276         // boolean fieldNameEquals(UserData other) { ... }
277         // boolean fieldNameEquals(FieldType otherValue) { ... }
278 
279         if (this == o) return true;
280         if (o == null || getClass() != o.getClass()) return false;
281         @SuppressWarnings("unchecked")
282         UserData that = (UserData) o;
283         //noinspection PointlessBooleanExpression
284         return true
285                 && mTimezoneUtcOffsetMins == that.mTimezoneUtcOffsetMins
286                 && mOrientation == that.mOrientation
287                 && mAvailableStorageBytes == that.mAvailableStorageBytes
288                 && mBatteryPercentage == that.mBatteryPercentage
289                 && java.util.Objects.equals(mCarrier, that.mCarrier)
290                 && java.util.Objects.equals(mNetworkCapabilities, that.mNetworkCapabilities)
291                 && mDataNetworkType == that.mDataNetworkType
292                 && java.util.Objects.equals(mAppInfos, that.mAppInfos);
293     }
294 
295     @Override
296     @DataClass.Generated.Member
hashCode()297     public int hashCode() {
298         // You can override field hashCode logic by defining methods like:
299         // int fieldNameHashCode() { ... }
300 
301         int _hash = 1;
302         _hash = 31 * _hash + mTimezoneUtcOffsetMins;
303         _hash = 31 * _hash + mOrientation;
304         _hash = 31 * _hash + Long.hashCode(mAvailableStorageBytes);
305         _hash = 31 * _hash + mBatteryPercentage;
306         _hash = 31 * _hash + java.util.Objects.hashCode(mCarrier);
307         _hash = 31 * _hash + java.util.Objects.hashCode(mNetworkCapabilities);
308         _hash = 31 * _hash + mDataNetworkType;
309         _hash = 31 * _hash + java.util.Objects.hashCode(mAppInfos);
310         return _hash;
311     }
312 
313     @Override
314     @DataClass.Generated.Member
writeToParcel(@onNull android.os.Parcel dest, int flags)315     public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
316         // You can override field parcelling by defining methods like:
317         // void parcelFieldName(Parcel dest, int flags) { ... }
318 
319         int flg = 0;
320         if (mNetworkCapabilities != null) flg |= 0x20;
321         dest.writeInt(flg);
322         dest.writeInt(mTimezoneUtcOffsetMins);
323         dest.writeInt(mOrientation);
324         dest.writeLong(mAvailableStorageBytes);
325         dest.writeInt(mBatteryPercentage);
326         dest.writeString(mCarrier);
327         if (mNetworkCapabilities != null) dest.writeTypedObject(mNetworkCapabilities, flags);
328         dest.writeInt(mDataNetworkType);
329         dest.writeMap(mAppInfos);
330     }
331 
332     @Override
333     @DataClass.Generated.Member
describeContents()334     public int describeContents() { return 0; }
335 
336     /** @hide */
337     @SuppressWarnings({"unchecked", "RedundantCast"})
338     @DataClass.Generated.Member
UserData(@onNull android.os.Parcel in)339     /* package-private */ UserData(@NonNull android.os.Parcel in) {
340         // You can override field unparcelling by defining methods like:
341         // static FieldType unparcelFieldName(Parcel in) { ... }
342 
343         int flg = in.readInt();
344         int timezoneUtcOffsetMins = in.readInt();
345         int orientation = in.readInt();
346         long availableStorageBytes = in.readLong();
347         int batteryPercentage = in.readInt();
348         String carrier = in.readString();
349         NetworkCapabilities networkCapabilities = (flg & 0x20) == 0 ? null : (NetworkCapabilities) in.readTypedObject(NetworkCapabilities.CREATOR);
350         int dataNetworkType = in.readInt();
351         Map<String,AppInfo> appInfos = new java.util.LinkedHashMap<>();
352         in.readMap(appInfos, AppInfo.class.getClassLoader());
353 
354         this.mTimezoneUtcOffsetMins = timezoneUtcOffsetMins;
355         this.mOrientation = orientation;
356         AnnotationValidations.validate(
357                 Orientation.class, null, mOrientation);
358         this.mAvailableStorageBytes = availableStorageBytes;
359         AnnotationValidations.validate(
360                 IntRange.class, null, mAvailableStorageBytes,
361                 "from", 0);
362         this.mBatteryPercentage = batteryPercentage;
363         AnnotationValidations.validate(
364                 IntRange.class, null, mBatteryPercentage,
365                 "from", 0,
366                 "to", 100);
367         this.mCarrier = carrier;
368         AnnotationValidations.validate(
369                 NonNull.class, null, mCarrier);
370         this.mNetworkCapabilities = networkCapabilities;
371         this.mDataNetworkType = dataNetworkType;
372         AnnotationValidations.validate(
373                 NetworkType.class, null, mDataNetworkType);
374         this.mAppInfos = appInfos;
375         AnnotationValidations.validate(
376                 NonNull.class, null, mAppInfos);
377 
378         // onConstructed(); // You can define this method to get a callback
379     }
380 
381     @DataClass.Generated.Member
382     public static final @NonNull Parcelable.Creator<UserData> CREATOR
383             = new Parcelable.Creator<UserData>() {
384         @Override
385         public UserData[] newArray(int size) {
386             return new UserData[size];
387         }
388 
389         @Override
390         public UserData createFromParcel(@NonNull android.os.Parcel in) {
391             return new UserData(in);
392         }
393     };
394 
395     /**
396      * A builder for {@link UserData}
397      * @hide
398      */
399     @SuppressWarnings("WeakerAccess")
400     @DataClass.Generated.Member
401     public static final class Builder {
402 
403         private int mTimezoneUtcOffsetMins;
404         private @Orientation int mOrientation;
405         private @IntRange(from = 0) long mAvailableStorageBytes;
406         private @IntRange(from = 0, to = 100) int mBatteryPercentage;
407         private @NonNull String mCarrier;
408         private @Nullable NetworkCapabilities mNetworkCapabilities;
409         private @NetworkType int mDataNetworkType;
410         private @NonNull Map<String,AppInfo> mAppInfos;
411 
412         private long mBuilderFieldsSet = 0L;
413 
Builder()414         public Builder() {
415         }
416 
417         /**
418          * The device timezone +/- offset from UTC.
419          *
420          * @hide
421          */
422         @DataClass.Generated.Member
setTimezoneUtcOffsetMins(int value)423         public @NonNull Builder setTimezoneUtcOffsetMins(int value) {
424             checkNotUsed();
425             mBuilderFieldsSet |= 0x1;
426             mTimezoneUtcOffsetMins = value;
427             return this;
428         }
429 
430         /**
431          * The device orientation. The value can be one of the constants ORIENTATION_UNDEFINED,
432          * ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE defined in
433          * {@link android.content.res.Configuration}.
434          */
435         @DataClass.Generated.Member
setOrientation(@rientation int value)436         public @NonNull Builder setOrientation(@Orientation int value) {
437             checkNotUsed();
438             mBuilderFieldsSet |= 0x2;
439             mOrientation = value;
440             return this;
441         }
442 
443         /**
444          * The available space on device in bytes.
445          */
446         @DataClass.Generated.Member
setAvailableStorageBytes(@ntRangefrom = 0) long value)447         public @NonNull Builder setAvailableStorageBytes(@IntRange(from = 0) long value) {
448             checkNotUsed();
449             mBuilderFieldsSet |= 0x4;
450             mAvailableStorageBytes = value;
451             return this;
452         }
453 
454         /**
455          * Battery percentage.
456          */
457         @DataClass.Generated.Member
setBatteryPercentage(@ntRangefrom = 0, to = 100) int value)458         public @NonNull Builder setBatteryPercentage(@IntRange(from = 0, to = 100) int value) {
459             checkNotUsed();
460             mBuilderFieldsSet |= 0x8;
461             mBatteryPercentage = value;
462             return this;
463         }
464 
465         /**
466          * The Service Provider Name (SPN) returned by {@link TelephonyManager#getSimOperatorName()}
467          */
468         @DataClass.Generated.Member
setCarrier(@onNull String value)469         public @NonNull Builder setCarrier(@NonNull String value) {
470             checkNotUsed();
471             mBuilderFieldsSet |= 0x10;
472             mCarrier = value;
473             return this;
474         }
475 
476         /**
477          * A filtered subset of the Network capabilities of the device that contains upstream
478          * and downstream speeds, and whether the network is metered.
479          * This is an instance of {@link NetworkCapabilities} that contains the capability
480          * {@link android.net.NetworkCapabilities#NET_CAPABILITY_NOT_METERED} if the network is not
481          * metered, and {@link NetworkCapabilities#getLinkDownstreamBandwidthKbps()} and
482          * {@link NetworkCapabilities#getLinkUpstreamBandwidthKbps()} return the downstream and
483          * upstream connection speeds. All other methods of this {@link NetworkCapabilities} object
484          * return empty or default values.
485          */
486         @DataClass.Generated.Member
setNetworkCapabilities(@onNull NetworkCapabilities value)487         public @NonNull Builder setNetworkCapabilities(@NonNull NetworkCapabilities value) {
488             checkNotUsed();
489             mBuilderFieldsSet |= 0x20;
490             mNetworkCapabilities = value;
491             return this;
492         }
493 
494         /**
495          * Data network type. This is the value of
496          * {@link android.telephony.TelephonyManager#getDataNetworkType()}.
497          */
498         @DataClass.Generated.Member
setDataNetworkType(@etworkType int value)499         public @NonNull Builder setDataNetworkType(@NetworkType int value) {
500             checkNotUsed();
501             mBuilderFieldsSet |= 0x40;
502             mDataNetworkType = value;
503             return this;
504         }
505 
506         /**
507          * A map from package name to app information for installed and uninstalled apps.
508          */
509         @DataClass.Generated.Member
setAppInfos(@onNull Map<String,AppInfo> value)510         public @NonNull Builder setAppInfos(@NonNull Map<String,AppInfo> value) {
511             checkNotUsed();
512             mBuilderFieldsSet |= 0x80;
513             mAppInfos = value;
514             return this;
515         }
516 
517         /** @see #setAppInfos */
518         @DataClass.Generated.Member
addAppInfo(@onNull String key, @NonNull AppInfo value)519         public @NonNull Builder addAppInfo(@NonNull String key, @NonNull AppInfo value) {
520             if (mAppInfos == null) setAppInfos(new java.util.LinkedHashMap());
521             mAppInfos.put(key, value);
522             return this;
523         }
524 
525         /** Builds the instance. This builder should not be touched after calling this! */
build()526         public @NonNull UserData build() {
527             checkNotUsed();
528             mBuilderFieldsSet |= 0x100; // Mark builder used
529 
530             if ((mBuilderFieldsSet & 0x1) == 0) {
531                 mTimezoneUtcOffsetMins = 0;
532             }
533             if ((mBuilderFieldsSet & 0x2) == 0) {
534                 mOrientation = 0;
535             }
536             if ((mBuilderFieldsSet & 0x4) == 0) {
537                 mAvailableStorageBytes = 0;
538             }
539             if ((mBuilderFieldsSet & 0x8) == 0) {
540                 mBatteryPercentage = 0;
541             }
542             if ((mBuilderFieldsSet & 0x10) == 0) {
543                 mCarrier = "";
544             }
545             if ((mBuilderFieldsSet & 0x20) == 0) {
546                 mNetworkCapabilities = null;
547             }
548             if ((mBuilderFieldsSet & 0x40) == 0) {
549                 mDataNetworkType = 0;
550             }
551             if ((mBuilderFieldsSet & 0x80) == 0) {
552                 mAppInfos = Collections.emptyMap();
553             }
554             UserData o = new UserData(
555                     mTimezoneUtcOffsetMins,
556                     mOrientation,
557                     mAvailableStorageBytes,
558                     mBatteryPercentage,
559                     mCarrier,
560                     mNetworkCapabilities,
561                     mDataNetworkType,
562                     mAppInfos);
563             return o;
564         }
565 
checkNotUsed()566         private void checkNotUsed() {
567             if ((mBuilderFieldsSet & 0x100) != 0) {
568                 throw new IllegalStateException(
569                         "This Builder should not be reused. Use a new Builder instance instead");
570             }
571         }
572     }
573 
574     @DataClass.Generated(
575             time = 1707172832988L,
576             codegenVersion = "1.0.23",
577             sourceFile = "packages/modules/OnDevicePersonalization/framework/java/android/adservices/ondevicepersonalization/UserData.java",
578             inputSignatures = "  int mTimezoneUtcOffsetMins\n @android.adservices.ondevicepersonalization.UserData.Orientation int mOrientation\n @android.annotation.IntRange long mAvailableStorageBytes\n @android.annotation.IntRange int mBatteryPercentage\n @android.annotation.NonNull java.lang.String mCarrier\n @android.annotation.Nullable android.net.NetworkCapabilities mNetworkCapabilities\n @android.adservices.ondevicepersonalization.UserData.NetworkType int mDataNetworkType\n @com.android.ondevicepersonalization.internal.util.DataClass.PluralOf(\"appInfo\") @android.annotation.NonNull java.util.Map<java.lang.String,android.adservices.ondevicepersonalization.AppInfo> mAppInfos\npublic @android.annotation.NonNull java.time.Duration getTimezoneUtcOffset()\nclass UserData extends java.lang.Object implements [android.os.Parcelable]\n@com.android.ondevicepersonalization.internal.util.DataClass(genHiddenBuilder=true, genEqualsHashCode=true, genConstDefs=false)")
579     @Deprecated
__metadata()580     private void __metadata() {}
581 
582 
583     //@formatter:on
584     // End of generated code
585 
586 }
587