• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.app.admin;
18 
19 import static android.app.admin.PolicyUpdateReceiver.EXTRA_PACKAGE_NAME;
20 import static android.app.admin.PolicyUpdateReceiver.EXTRA_PERMISSION_NAME;
21 import static android.app.admin.PolicyUpdateReceiver.EXTRA_POLICY_BUNDLE_KEY;
22 import static android.app.admin.PolicyUpdateReceiver.EXTRA_POLICY_KEY;
23 
24 import android.annotation.NonNull;
25 import android.annotation.Nullable;
26 import android.annotation.SystemApi;
27 import android.annotation.TestApi;
28 import android.os.Bundle;
29 import android.os.Parcel;
30 import android.os.Parcelable;
31 
32 import com.android.modules.utils.TypedXmlPullParser;
33 import com.android.modules.utils.TypedXmlSerializer;
34 
35 import org.xmlpull.v1.XmlPullParserException;
36 
37 import java.io.IOException;
38 import java.util.Objects;
39 
40 /**
41  * Class used to identify a policy that relates to a certain package and permission
42  * (e.g. {@link DevicePolicyManager#setPermissionGrantState}).
43  *
44  * @hide
45  */
46 @SystemApi
47 public final class PackagePermissionPolicyKey extends PolicyKey {
48     private static final String ATTR_PACKAGE_NAME = "package-name";
49     private static final String ATTR_PERMISSION_NAME = "permission-name";
50 
51     private final String mPackageName;
52     private final String mPermissionName;
53 
54     /**
55      * @hide
56      */
57     @TestApi
PackagePermissionPolicyKey(@onNull String identifier, @NonNull String packageName, @NonNull String permissionName)58     public PackagePermissionPolicyKey(@NonNull String identifier, @NonNull String packageName,
59             @NonNull String permissionName) {
60         super(identifier);
61         PolicySizeVerifier.enforceMaxPackageNameLength(packageName);
62         PolicySizeVerifier.enforceMaxStringLength(permissionName, "permissionName");
63         mPackageName = Objects.requireNonNull((packageName));
64         mPermissionName = Objects.requireNonNull((permissionName));
65     }
66 
67     /**
68      * @hide
69      */
PackagePermissionPolicyKey(@onNull String identifier)70     public PackagePermissionPolicyKey(@NonNull String identifier) {
71         super(identifier);
72         mPackageName = null;
73         mPermissionName = null;
74     }
75 
PackagePermissionPolicyKey(Parcel source)76     private PackagePermissionPolicyKey(Parcel source) {
77         super(source.readString());
78         mPackageName = source.readString();
79         mPermissionName = source.readString();
80     }
81 
82     /**
83      * Returns the package name this policy relates to.
84      */
85     @NonNull
getPackageName()86     public String getPackageName() {
87         return mPackageName;
88     }
89 
90     /**
91      * Returns the permission name this policy relates to.
92      */
93     @NonNull
getPermissionName()94     public String getPermissionName() {
95         return mPermissionName;
96     }
97 
98     /**
99      * @hide
100      */
101     @Override
saveToXml(TypedXmlSerializer serializer)102     public void saveToXml(TypedXmlSerializer serializer) throws IOException {
103         serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier());
104         serializer.attribute(/* namespace= */ null, ATTR_PACKAGE_NAME, mPackageName);
105         serializer.attribute(/* namespace= */ null, ATTR_PERMISSION_NAME, mPermissionName);
106     }
107 
108     /**
109      * @hide
110      */
111     @Override
readFromXml(TypedXmlPullParser parser)112     public PackagePermissionPolicyKey readFromXml(TypedXmlPullParser parser)
113             throws XmlPullParserException, IOException {
114         String identifier = parser.getAttributeValue(
115                 /* namespace= */ null, ATTR_POLICY_IDENTIFIER);
116         String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
117         String permissionName = parser.getAttributeValue(
118                 /* namespace= */ null, ATTR_PERMISSION_NAME);
119         return new PackagePermissionPolicyKey(identifier, packageName, permissionName);
120     }
121 
122     /**
123      * @hide
124      */
125     @Override
writeToBundle(Bundle bundle)126     public void writeToBundle(Bundle bundle) {
127         bundle.putString(EXTRA_POLICY_KEY, getIdentifier());
128         Bundle extraPolicyParams = new Bundle();
129         extraPolicyParams.putString(EXTRA_PACKAGE_NAME, mPackageName);
130         extraPolicyParams.putString(EXTRA_PERMISSION_NAME, mPermissionName);
131         bundle.putBundle(EXTRA_POLICY_BUNDLE_KEY, extraPolicyParams);
132     }
133 
134     @Override
equals(@ullable Object o)135     public boolean equals(@Nullable Object o) {
136         if (this == o) return true;
137         if (o == null || getClass() != o.getClass()) return false;
138         PackagePermissionPolicyKey other = (PackagePermissionPolicyKey) o;
139         return Objects.equals(getIdentifier(), other.getIdentifier())
140                 && Objects.equals(mPackageName, other.mPackageName)
141                 && Objects.equals(mPermissionName, other.mPermissionName);
142     }
143 
144     @Override
hashCode()145     public int hashCode() {
146         return Objects.hash(getIdentifier(), mPackageName, mPermissionName);
147     }
148 
149     @Override
toString()150     public String toString() {
151         return "PackagePermissionPolicyKey{mIdentifier= " + getIdentifier() + "; mPackageName= "
152                 + mPackageName + "; mPermissionName= " + mPermissionName + "}";
153     }
154 
155     @Override
describeContents()156     public int describeContents() {
157         return 0;
158     }
159 
160     @Override
writeToParcel(@onNull Parcel dest, int flags)161     public void writeToParcel(@NonNull Parcel dest, int flags) {
162         dest.writeString(getIdentifier());
163         dest.writeString(mPackageName);
164         dest.writeString(mPermissionName);
165     }
166 
167     @NonNull
168     public static final Parcelable.Creator<PackagePermissionPolicyKey> CREATOR =
169             new Parcelable.Creator<PackagePermissionPolicyKey>() {
170                 @Override
171                 public PackagePermissionPolicyKey createFromParcel(Parcel source) {
172                     return new PackagePermissionPolicyKey(source);
173                 }
174 
175                 @Override
176                 public PackagePermissionPolicyKey[] newArray(int size) {
177                     return new PackagePermissionPolicyKey[size];
178                 }
179             };
180 }
181