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