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 com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.content.ComponentName;
24 import android.content.pm.PathPermission;
25 import android.os.Parcel;
26 import android.os.Parcelable;
27 import android.os.PatternMatcher;
28 import android.text.TextUtils;
29 
30 import com.android.internal.annotations.VisibleForTesting;
31 import com.android.internal.util.CollectionUtils;
32 import com.android.internal.util.DataClass;
33 import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
34 
35 import java.util.ArrayList;
36 import java.util.Collections;
37 import java.util.List;
38 
39 /**
40  * @hide
41  **/
42 @DataClass(genSetters = true, genGetters = true, genParcelable = false, genBuilder = false)
43 @DataClass.Suppress({"setUriPermissionPatterns", "setPathPermissions"})
44 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
45 public class ParsedProviderImpl extends ParsedMainComponentImpl implements ParsedProvider,
46         Parcelable {
47 
48     @Nullable
49     @DataClass.ParcelWith(ForInternedString.class)
50     private String authority;
51     private boolean syncable;
52     @Nullable
53     @DataClass.ParcelWith(ForInternedString.class)
54     private String readPermission;
55     @Nullable
56     @DataClass.ParcelWith(ForInternedString.class)
57     private String writePermission;
58     private boolean grantUriPermissions;
59     private boolean forceUriPermissions;
60     private boolean multiProcess;
61     private int initOrder;
62     @NonNull
63     private List<PatternMatcher> uriPermissionPatterns = Collections.emptyList();
64     @NonNull
65     private List<PathPermission> pathPermissions = Collections.emptyList();
66 
ParsedProviderImpl(ParsedProvider other)67     public ParsedProviderImpl(ParsedProvider other) {
68         super(other);
69 
70         this.authority = other.getAuthority();
71         this.syncable = other.isSyncable();
72         this.readPermission = other.getReadPermission();
73         this.writePermission = other.getWritePermission();
74         this.grantUriPermissions = other.isGrantUriPermissions();
75         this.forceUriPermissions = other.isForceUriPermissions();
76         this.multiProcess = other.isMultiProcess();
77         this.initOrder = other.getInitOrder();
78         this.uriPermissionPatterns = new ArrayList<>(other.getUriPermissionPatterns());
79         this.pathPermissions = new ArrayList<>(other.getPathPermissions());
80     }
81 
setReadPermission(String readPermission)82     public ParsedProviderImpl setReadPermission(String readPermission) {
83         // Empty string must be converted to null
84         this.readPermission = TextUtils.isEmpty(readPermission)
85                 ? null : readPermission.intern();
86         return this;
87     }
88 
setWritePermission(String writePermission)89     public ParsedProviderImpl setWritePermission(String writePermission) {
90         // Empty string must be converted to null
91         this.writePermission = TextUtils.isEmpty(writePermission)
92                 ? null : writePermission.intern();
93         return this;
94     }
95 
96     @NonNull
addUriPermissionPattern(@onNull PatternMatcher value)97     public ParsedProviderImpl addUriPermissionPattern(@NonNull PatternMatcher value) {
98         uriPermissionPatterns = CollectionUtils.add(uriPermissionPatterns, value);
99         return this;
100     }
101 
102     @NonNull
addPathPermission(@onNull PathPermission value)103     public ParsedProviderImpl addPathPermission(@NonNull PathPermission value) {
104         pathPermissions = CollectionUtils.add(pathPermissions, value);
105         return this;
106     }
107 
toString()108     public String toString() {
109         StringBuilder sb = new StringBuilder(128);
110         sb.append("Provider{");
111         sb.append(Integer.toHexString(System.identityHashCode(this)));
112         sb.append(' ');
113         ComponentName.appendShortString(sb, getPackageName(), getName());
114         sb.append('}');
115         return sb.toString();
116     }
117 
118     @Override
describeContents()119     public int describeContents() {
120         return 0;
121     }
122 
123     @Override
writeToParcel(Parcel dest, int flags)124     public void writeToParcel(Parcel dest, int flags) {
125         super.writeToParcel(dest, flags);
126         dest.writeString(this.authority);
127         dest.writeBoolean(this.syncable);
128         sForInternedString.parcel(this.readPermission, dest, flags);
129         sForInternedString.parcel(this.writePermission, dest, flags);
130         dest.writeBoolean(this.grantUriPermissions);
131         dest.writeBoolean(this.forceUriPermissions);
132         dest.writeBoolean(this.multiProcess);
133         dest.writeInt(this.initOrder);
134         dest.writeTypedList(this.uriPermissionPatterns, flags);
135         dest.writeTypedList(this.pathPermissions, flags);
136     }
137 
ParsedProviderImpl()138     public ParsedProviderImpl() {
139     }
140 
ParsedProviderImpl(Parcel in)141     protected ParsedProviderImpl(Parcel in) {
142         super(in);
143         this.authority = in.readString();
144         this.syncable = in.readBoolean();
145         this.readPermission = sForInternedString.unparcel(in);
146         this.writePermission = sForInternedString.unparcel(in);
147         this.grantUriPermissions = in.readBoolean();
148         this.forceUriPermissions = in.readBoolean();
149         this.multiProcess = in.readBoolean();
150         this.initOrder = in.readInt();
151         this.uriPermissionPatterns = in.createTypedArrayList(PatternMatcher.CREATOR);
152         this.pathPermissions = in.createTypedArrayList(PathPermission.CREATOR);
153     }
154 
155     @NonNull
156     public static final Parcelable.Creator<ParsedProviderImpl> CREATOR =
157             new Parcelable.Creator<ParsedProviderImpl>() {
158                 @Override
159                 public ParsedProviderImpl createFromParcel(Parcel source) {
160                     return new ParsedProviderImpl(source);
161                 }
162 
163                 @Override
164                 public ParsedProviderImpl[] newArray(int size) {
165                     return new ParsedProviderImpl[size];
166                 }
167             };
168 
169 
170 
171     // Code below generated by codegen v1.0.23.
172     //
173     // DO NOT MODIFY!
174     // CHECKSTYLE:OFF Generated code
175     //
176     // To regenerate run:
177     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/component/ParsedProviderImpl.java
178     //
179     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
180     //   Settings > Editor > Code Style > Formatter Control
181     //@formatter:off
182 
183 
184     @DataClass.Generated.Member
ParsedProviderImpl( @ullable String authority, boolean syncable, @Nullable String readPermission, @Nullable String writePermission, boolean grantUriPermissions, boolean forceUriPermissions, boolean multiProcess, int initOrder, @NonNull List<PatternMatcher> uriPermissionPatterns, @NonNull List<PathPermission> pathPermissions)185     public ParsedProviderImpl(
186             @Nullable String authority,
187             boolean syncable,
188             @Nullable String readPermission,
189             @Nullable String writePermission,
190             boolean grantUriPermissions,
191             boolean forceUriPermissions,
192             boolean multiProcess,
193             int initOrder,
194             @NonNull List<PatternMatcher> uriPermissionPatterns,
195             @NonNull List<PathPermission> pathPermissions) {
196         this.authority = authority;
197         this.syncable = syncable;
198         this.readPermission = readPermission;
199         this.writePermission = writePermission;
200         this.grantUriPermissions = grantUriPermissions;
201         this.forceUriPermissions = forceUriPermissions;
202         this.multiProcess = multiProcess;
203         this.initOrder = initOrder;
204         this.uriPermissionPatterns = uriPermissionPatterns;
205         com.android.internal.util.AnnotationValidations.validate(
206                 NonNull.class, null, uriPermissionPatterns);
207         this.pathPermissions = pathPermissions;
208         com.android.internal.util.AnnotationValidations.validate(
209                 NonNull.class, null, pathPermissions);
210 
211         // onConstructed(); // You can define this method to get a callback
212     }
213 
214     @DataClass.Generated.Member
getAuthority()215     public @Nullable String getAuthority() {
216         return authority;
217     }
218 
219     @DataClass.Generated.Member
isSyncable()220     public boolean isSyncable() {
221         return syncable;
222     }
223 
224     @DataClass.Generated.Member
getReadPermission()225     public @Nullable String getReadPermission() {
226         return readPermission;
227     }
228 
229     @DataClass.Generated.Member
getWritePermission()230     public @Nullable String getWritePermission() {
231         return writePermission;
232     }
233 
234     @DataClass.Generated.Member
isGrantUriPermissions()235     public boolean isGrantUriPermissions() {
236         return grantUriPermissions;
237     }
238 
239     @DataClass.Generated.Member
isForceUriPermissions()240     public boolean isForceUriPermissions() {
241         return forceUriPermissions;
242     }
243 
244     @DataClass.Generated.Member
isMultiProcess()245     public boolean isMultiProcess() {
246         return multiProcess;
247     }
248 
249     @DataClass.Generated.Member
getInitOrder()250     public int getInitOrder() {
251         return initOrder;
252     }
253 
254     @DataClass.Generated.Member
getUriPermissionPatterns()255     public @NonNull List<PatternMatcher> getUriPermissionPatterns() {
256         return uriPermissionPatterns;
257     }
258 
259     @DataClass.Generated.Member
getPathPermissions()260     public @NonNull List<PathPermission> getPathPermissions() {
261         return pathPermissions;
262     }
263 
264     @DataClass.Generated.Member
setAuthority(@onNull String value)265     public @NonNull ParsedProviderImpl setAuthority(@NonNull String value) {
266         authority = value;
267         return this;
268     }
269 
270     @DataClass.Generated.Member
setSyncable( boolean value)271     public @NonNull ParsedProviderImpl setSyncable( boolean value) {
272         syncable = value;
273         return this;
274     }
275 
276     @DataClass.Generated.Member
setGrantUriPermissions( boolean value)277     public @NonNull ParsedProviderImpl setGrantUriPermissions( boolean value) {
278         grantUriPermissions = value;
279         return this;
280     }
281 
282     @DataClass.Generated.Member
setForceUriPermissions( boolean value)283     public @NonNull ParsedProviderImpl setForceUriPermissions( boolean value) {
284         forceUriPermissions = value;
285         return this;
286     }
287 
288     @DataClass.Generated.Member
setMultiProcess( boolean value)289     public @NonNull ParsedProviderImpl setMultiProcess( boolean value) {
290         multiProcess = value;
291         return this;
292     }
293 
294     @DataClass.Generated.Member
setInitOrder( int value)295     public @NonNull ParsedProviderImpl setInitOrder( int value) {
296         initOrder = value;
297         return this;
298     }
299 
300     @DataClass.Generated(
301             time = 1642560323360L,
302             codegenVersion = "1.0.23",
303             sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/component/ParsedProviderImpl.java",
304             inputSignatures = "private @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String authority\nprivate  boolean syncable\nprivate @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String readPermission\nprivate @android.annotation.Nullable @com.android.internal.util.DataClass.ParcelWith(com.android.internal.util.Parcelling.BuiltIn.ForInternedString.class) java.lang.String writePermission\nprivate  boolean grantUriPermissions\nprivate  boolean forceUriPermissions\nprivate  boolean multiProcess\nprivate  int initOrder\nprivate @android.annotation.NonNull java.util.List<android.os.PatternMatcher> uriPermissionPatterns\nprivate @android.annotation.NonNull java.util.List<android.content.pm.PathPermission> pathPermissions\npublic static final @android.annotation.NonNull android.os.Parcelable.Creator<com.android.server.pm.pkg.component.ParsedProviderImpl> CREATOR\npublic  com.android.server.pm.pkg.component.ParsedProviderImpl setReadPermission(java.lang.String)\npublic  com.android.server.pm.pkg.component.ParsedProviderImpl setWritePermission(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.component.ParsedProviderImpl addUriPermissionPattern(android.os.PatternMatcher)\npublic @android.annotation.NonNull com.android.server.pm.pkg.component.ParsedProviderImpl addPathPermission(android.content.pm.PathPermission)\npublic  java.lang.String toString()\npublic @java.lang.Override int describeContents()\npublic @java.lang.Override void writeToParcel(android.os.Parcel,int)\nclass ParsedProviderImpl extends com.android.server.pm.pkg.component.ParsedMainComponentImpl implements [com.android.server.pm.pkg.component.ParsedProvider, android.os.Parcelable]\n@com.android.internal.util.DataClass(genSetters=true, genGetters=true, genParcelable=false, genBuilder=false)")
305     @Deprecated
__metadata()306     private void __metadata() {}
307 
308 
309     //@formatter:on
310     // End of generated code
311 
312 }
313