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 com.android.internal.pm.pkg.component;
18 
19 import static java.util.Collections.emptySet;
20 
21 import android.annotation.NonNull;
22 import android.content.pm.ApplicationInfo;
23 import android.os.Parcel;
24 import android.os.Parcelable;
25 import android.util.ArrayMap;
26 import android.util.ArraySet;
27 
28 import com.android.internal.util.CollectionUtils;
29 import com.android.internal.util.DataClass;
30 import com.android.internal.util.Parcelling;
31 
32 import java.util.Set;
33 
34 /** @hide */
35 @DataClass(genGetters = true, genSetters = true, genParcelable = true, genAidl = false,
36         genBuilder = false)
37 public class ParsedProcessImpl implements ParsedProcess, Parcelable {
38 
39     @NonNull
40     private String name;
41 
42     /** @see ParsedProcess#getAppClassNamesByPackage() */
43     @NonNull
44     private ArrayMap<String, String> appClassNamesByPackage = ArrayMap.EMPTY;
45 
46     @NonNull
47     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class)
48     private Set<String> deniedPermissions = emptySet();
49 
50     @ApplicationInfo.GwpAsanMode
51     private int gwpAsanMode = ApplicationInfo.GWP_ASAN_DEFAULT;
52     @ApplicationInfo.MemtagMode
53     private int memtagMode = ApplicationInfo.MEMTAG_DEFAULT;
54     @ApplicationInfo.NativeHeapZeroInitialized
55     private int nativeHeapZeroInitialized = ApplicationInfo.ZEROINIT_DEFAULT;
56 
57     private boolean useEmbeddedDex;
58 
ParsedProcessImpl()59     public ParsedProcessImpl() {
60     }
61 
ParsedProcessImpl(@onNull ParsedProcess other)62     public ParsedProcessImpl(@NonNull ParsedProcess other) {
63         name = other.getName();
64         appClassNamesByPackage = (other.getAppClassNamesByPackage().size() == 0)
65                 ? ArrayMap.EMPTY : new ArrayMap<>(other.getAppClassNamesByPackage());
66         deniedPermissions = new ArraySet<>(other.getDeniedPermissions());
67         gwpAsanMode = other.getGwpAsanMode();
68         memtagMode = other.getMemtagMode();
69         nativeHeapZeroInitialized = other.getNativeHeapZeroInitialized();
70         useEmbeddedDex = other.isUseEmbeddedDex();
71     }
72 
addStateFrom(@onNull ParsedProcess other)73     public void addStateFrom(@NonNull ParsedProcess other) {
74         deniedPermissions = CollectionUtils.addAll(deniedPermissions, other.getDeniedPermissions());
75         gwpAsanMode = other.getGwpAsanMode();
76         memtagMode = other.getMemtagMode();
77         nativeHeapZeroInitialized = other.getNativeHeapZeroInitialized();
78         useEmbeddedDex = other.isUseEmbeddedDex();
79 
80         final ArrayMap<String, String> oacn = other.getAppClassNamesByPackage();
81         for (int i = 0; i < oacn.size(); i++) {
82             appClassNamesByPackage.put(oacn.keyAt(i), oacn.valueAt(i));
83         }
84     }
85 
86     /**
87      * Sets a custom application name used in this process for a given package.
88      */
putAppClassNameForPackage(String packageName, String className)89     public void putAppClassNameForPackage(String packageName, String className) {
90         if (appClassNamesByPackage.size() == 0) {
91             appClassNamesByPackage = new ArrayMap<>(4);
92         }
93         appClassNamesByPackage.put(packageName, className);
94     }
95 
96 
97 
98     // Code below generated by codegen v1.0.23.
99     //
100     // DO NOT MODIFY!
101     // CHECKSTYLE:OFF Generated code
102     //
103     // To regenerate run:
104     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/com/android/internal/pm/pkg/component/ParsedProcessImpl.java
105     //
106     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
107     //   Settings > Editor > Code Style > Formatter Control
108     //@formatter:off
109 
110 
111     /**
112      * Creates a new ParsedProcessImpl.
113      *
114      */
115     @DataClass.Generated.Member
ParsedProcessImpl( @onNull String name, @NonNull ArrayMap<String,String> appClassNamesByPackage, @NonNull Set<String> deniedPermissions, @ApplicationInfo.GwpAsanMode int gwpAsanMode, @ApplicationInfo.MemtagMode int memtagMode, @ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized, boolean useEmbeddedDex)116     public ParsedProcessImpl(
117             @NonNull String name,
118             @NonNull ArrayMap<String,String> appClassNamesByPackage,
119             @NonNull Set<String> deniedPermissions,
120             @ApplicationInfo.GwpAsanMode int gwpAsanMode,
121             @ApplicationInfo.MemtagMode int memtagMode,
122             @ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized,
123             boolean useEmbeddedDex) {
124         this.name = name;
125         com.android.internal.util.AnnotationValidations.validate(
126                 NonNull.class, null, name);
127         this.appClassNamesByPackage = appClassNamesByPackage;
128         com.android.internal.util.AnnotationValidations.validate(
129                 NonNull.class, null, appClassNamesByPackage);
130         this.deniedPermissions = deniedPermissions;
131         com.android.internal.util.AnnotationValidations.validate(
132                 NonNull.class, null, deniedPermissions);
133         this.gwpAsanMode = gwpAsanMode;
134         com.android.internal.util.AnnotationValidations.validate(
135                 ApplicationInfo.GwpAsanMode.class, null, gwpAsanMode);
136         this.memtagMode = memtagMode;
137         com.android.internal.util.AnnotationValidations.validate(
138                 ApplicationInfo.MemtagMode.class, null, memtagMode);
139         this.nativeHeapZeroInitialized = nativeHeapZeroInitialized;
140         com.android.internal.util.AnnotationValidations.validate(
141                 ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
142         this.useEmbeddedDex = useEmbeddedDex;
143 
144         // onConstructed(); // You can define this method to get a callback
145     }
146 
147     @DataClass.Generated.Member
getName()148     public @NonNull String getName() {
149         return name;
150     }
151 
152     /**
153      * @see ParsedProcess#getAppClassNamesByPackage()
154      */
155     @DataClass.Generated.Member
getAppClassNamesByPackage()156     public @NonNull ArrayMap<String,String> getAppClassNamesByPackage() {
157         return appClassNamesByPackage;
158     }
159 
160     @DataClass.Generated.Member
getDeniedPermissions()161     public @NonNull Set<String> getDeniedPermissions() {
162         return deniedPermissions;
163     }
164 
165     @DataClass.Generated.Member
getGwpAsanMode()166     public @ApplicationInfo.GwpAsanMode int getGwpAsanMode() {
167         return gwpAsanMode;
168     }
169 
170     @DataClass.Generated.Member
getMemtagMode()171     public @ApplicationInfo.MemtagMode int getMemtagMode() {
172         return memtagMode;
173     }
174 
175     @DataClass.Generated.Member
getNativeHeapZeroInitialized()176     public @ApplicationInfo.NativeHeapZeroInitialized int getNativeHeapZeroInitialized() {
177         return nativeHeapZeroInitialized;
178     }
179 
180     @DataClass.Generated.Member
isUseEmbeddedDex()181     public boolean isUseEmbeddedDex() {
182         return useEmbeddedDex;
183     }
184 
185     @DataClass.Generated.Member
setName(@onNull String value)186     public @NonNull ParsedProcessImpl setName(@NonNull String value) {
187         name = value;
188         com.android.internal.util.AnnotationValidations.validate(
189                 NonNull.class, null, name);
190         return this;
191     }
192 
193     /**
194      * @see ParsedProcess#getAppClassNamesByPackage()
195      */
196     @DataClass.Generated.Member
setAppClassNamesByPackage(@onNull ArrayMap<String,String> value)197     public @NonNull ParsedProcessImpl setAppClassNamesByPackage(@NonNull ArrayMap<String,String> value) {
198         appClassNamesByPackage = value;
199         com.android.internal.util.AnnotationValidations.validate(
200                 NonNull.class, null, appClassNamesByPackage);
201         return this;
202     }
203 
204     @DataClass.Generated.Member
setDeniedPermissions(@onNull Set<String> value)205     public @NonNull ParsedProcessImpl setDeniedPermissions(@NonNull Set<String> value) {
206         deniedPermissions = value;
207         com.android.internal.util.AnnotationValidations.validate(
208                 NonNull.class, null, deniedPermissions);
209         return this;
210     }
211 
212     @DataClass.Generated.Member
setGwpAsanMode(@pplicationInfo.GwpAsanMode int value)213     public @NonNull ParsedProcessImpl setGwpAsanMode(@ApplicationInfo.GwpAsanMode int value) {
214         gwpAsanMode = value;
215         com.android.internal.util.AnnotationValidations.validate(
216                 ApplicationInfo.GwpAsanMode.class, null, gwpAsanMode);
217         return this;
218     }
219 
220     @DataClass.Generated.Member
setMemtagMode(@pplicationInfo.MemtagMode int value)221     public @NonNull ParsedProcessImpl setMemtagMode(@ApplicationInfo.MemtagMode int value) {
222         memtagMode = value;
223         com.android.internal.util.AnnotationValidations.validate(
224                 ApplicationInfo.MemtagMode.class, null, memtagMode);
225         return this;
226     }
227 
228     @DataClass.Generated.Member
setNativeHeapZeroInitialized(@pplicationInfo.NativeHeapZeroInitialized int value)229     public @NonNull ParsedProcessImpl setNativeHeapZeroInitialized(@ApplicationInfo.NativeHeapZeroInitialized int value) {
230         nativeHeapZeroInitialized = value;
231         com.android.internal.util.AnnotationValidations.validate(
232                 ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
233         return this;
234     }
235 
236     @DataClass.Generated.Member
setUseEmbeddedDex( boolean value)237     public @NonNull ParsedProcessImpl setUseEmbeddedDex( boolean value) {
238         useEmbeddedDex = value;
239         return this;
240     }
241 
242     @DataClass.Generated.Member
243     static Parcelling<Set<String>> sParcellingForDeniedPermissions =
244             Parcelling.Cache.get(
245                     Parcelling.BuiltIn.ForInternedStringSet.class);
246     static {
247         if (sParcellingForDeniedPermissions == null) {
248             sParcellingForDeniedPermissions = Parcelling.Cache.put(
249                     new Parcelling.BuiltIn.ForInternedStringSet());
250         }
251     }
252 
253     @Override
254     @DataClass.Generated.Member
writeToParcel(@onNull Parcel dest, int flags)255     public void writeToParcel(@NonNull Parcel dest, int flags) {
256         // You can override field parcelling by defining methods like:
257         // void parcelFieldName(Parcel dest, int flags) { ... }
258 
259         byte flg = 0;
260         if (useEmbeddedDex) flg |= 0x40;
261         dest.writeByte(flg);
262         dest.writeString(name);
263         dest.writeMap(appClassNamesByPackage);
264         sParcellingForDeniedPermissions.parcel(deniedPermissions, dest, flags);
265         dest.writeInt(gwpAsanMode);
266         dest.writeInt(memtagMode);
267         dest.writeInt(nativeHeapZeroInitialized);
268     }
269 
270     @Override
271     @DataClass.Generated.Member
describeContents()272     public int describeContents() { return 0; }
273 
274     /** @hide */
275     @SuppressWarnings({"unchecked", "RedundantCast"})
276     @DataClass.Generated.Member
ParsedProcessImpl(@onNull Parcel in)277     protected ParsedProcessImpl(@NonNull Parcel in) {
278         // You can override field unparcelling by defining methods like:
279         // static FieldType unparcelFieldName(Parcel in) { ... }
280 
281         byte flg = in.readByte();
282         boolean _useEmbeddedDex = (flg & 0x40) != 0;
283         String _name = in.readString();
284         ArrayMap<String,String> _appClassNamesByPackage = new ArrayMap();
285         in.readMap(_appClassNamesByPackage, String.class.getClassLoader());
286         Set<String> _deniedPermissions = sParcellingForDeniedPermissions.unparcel(in);
287         int _gwpAsanMode = in.readInt();
288         int _memtagMode = in.readInt();
289         int _nativeHeapZeroInitialized = in.readInt();
290 
291         this.name = _name;
292         com.android.internal.util.AnnotationValidations.validate(
293                 NonNull.class, null, name);
294         this.appClassNamesByPackage = _appClassNamesByPackage;
295         com.android.internal.util.AnnotationValidations.validate(
296                 NonNull.class, null, appClassNamesByPackage);
297         this.deniedPermissions = _deniedPermissions;
298         com.android.internal.util.AnnotationValidations.validate(
299                 NonNull.class, null, deniedPermissions);
300         this.gwpAsanMode = _gwpAsanMode;
301         com.android.internal.util.AnnotationValidations.validate(
302                 ApplicationInfo.GwpAsanMode.class, null, gwpAsanMode);
303         this.memtagMode = _memtagMode;
304         com.android.internal.util.AnnotationValidations.validate(
305                 ApplicationInfo.MemtagMode.class, null, memtagMode);
306         this.nativeHeapZeroInitialized = _nativeHeapZeroInitialized;
307         com.android.internal.util.AnnotationValidations.validate(
308                 ApplicationInfo.NativeHeapZeroInitialized.class, null, nativeHeapZeroInitialized);
309         this.useEmbeddedDex = _useEmbeddedDex;
310 
311         // onConstructed(); // You can define this method to get a callback
312     }
313 
314     @DataClass.Generated.Member
315     public static final @NonNull Parcelable.Creator<ParsedProcessImpl> CREATOR
316             = new Parcelable.Creator<ParsedProcessImpl>() {
317         @Override
318         public ParsedProcessImpl[] newArray(int size) {
319             return new ParsedProcessImpl[size];
320         }
321 
322         @Override
323         public ParsedProcessImpl createFromParcel(@NonNull Parcel in) {
324             return new ParsedProcessImpl(in);
325         }
326     };
327 
328     @DataClass.Generated(
329             time = 1706177189475L,
330             codegenVersion = "1.0.23",
331             sourceFile = "frameworks/base/core/java/com/android/internal/pm/pkg/component/ParsedProcessImpl.java",
332             inputSignatures = "private @android.annotation.NonNull java.lang.String name\nprivate @android.annotation.NonNull android.util.ArrayMap<java.lang.String,java.lang.String> appClassNamesByPackage\nprivate @android.annotation.NonNull @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedStringSet.class) java.util.Set<java.lang.String> deniedPermissions\nprivate @android.content.pm.ApplicationInfo.GwpAsanMode int gwpAsanMode\nprivate @android.content.pm.ApplicationInfo.MemtagMode int memtagMode\nprivate @android.content.pm.ApplicationInfo.NativeHeapZeroInitialized int nativeHeapZeroInitialized\nprivate  boolean useEmbeddedDex\npublic  void addStateFrom(com.android.internal.pm.pkg.component.ParsedProcess)\npublic  void putAppClassNameForPackage(java.lang.String,java.lang.String)\nclass ParsedProcessImpl extends java.lang.Object implements [com.android.internal.pm.pkg.component.ParsedProcess, android.os.Parcelable]\n@com.android.internal.util.DataClass(genGetters=true, genSetters=true, genParcelable=true, genAidl=false, genBuilder=false)")
333     @Deprecated
__metadata()334     private void __metadata() {}
335 
336 
337     //@formatter:on
338     // End of generated code
339 
340 }
341