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         mPackageName = Objects.requireNonNull((packageName));
62         mPermissionName = Objects.requireNonNull((permissionName));
63     }
64 
65     /**
66      * @hide
67      */
PackagePermissionPolicyKey(@onNull String identifier)68     public PackagePermissionPolicyKey(@NonNull String identifier) {
69         super(identifier);
70         mPackageName = null;
71         mPermissionName = null;
72     }
73 
PackagePermissionPolicyKey(Parcel source)74     private PackagePermissionPolicyKey(Parcel source) {
75         super(source.readString());
76         mPackageName = source.readString();
77         mPermissionName = source.readString();
78     }
79 
80     /**
81      * Returns the package name this policy relates to.
82      */
83     @NonNull
getPackageName()84     public String getPackageName() {
85         return mPackageName;
86     }
87 
88     /**
89      * Returns the permission name this policy relates to.
90      */
91     @NonNull
getPermissionName()92     public String getPermissionName() {
93         return mPermissionName;
94     }
95 
96     /**
97      * @hide
98      */
99     @Override
saveToXml(TypedXmlSerializer serializer)100     public void saveToXml(TypedXmlSerializer serializer) throws IOException {
101         serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier());
102         serializer.attribute(/* namespace= */ null, ATTR_PACKAGE_NAME, mPackageName);
103         serializer.attribute(/* namespace= */ null, ATTR_PERMISSION_NAME, mPermissionName);
104     }
105 
106     /**
107      * @hide
108      */
109     @Override
readFromXml(TypedXmlPullParser parser)110     public PackagePermissionPolicyKey readFromXml(TypedXmlPullParser parser)
111             throws XmlPullParserException, IOException {
112         String identifier = parser.getAttributeValue(
113                 /* namespace= */ null, ATTR_POLICY_IDENTIFIER);
114         String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
115         String permissionName = parser.getAttributeValue(
116                 /* namespace= */ null, ATTR_PERMISSION_NAME);
117         return new PackagePermissionPolicyKey(identifier, packageName, permissionName);
118     }
119 
120     /**
121      * @hide
122      */
123     @Override
writeToBundle(Bundle bundle)124     public void writeToBundle(Bundle bundle) {
125         bundle.putString(EXTRA_POLICY_KEY, getIdentifier());
126         Bundle extraPolicyParams = new Bundle();
127         extraPolicyParams.putString(EXTRA_PACKAGE_NAME, mPackageName);
128         extraPolicyParams.putString(EXTRA_PERMISSION_NAME, mPermissionName);
129         bundle.putBundle(EXTRA_POLICY_BUNDLE_KEY, extraPolicyParams);
130     }
131 
132     @Override
equals(@ullable Object o)133     public boolean equals(@Nullable Object o) {
134         if (this == o) return true;
135         if (o == null || getClass() != o.getClass()) return false;
136         PackagePermissionPolicyKey other = (PackagePermissionPolicyKey) o;
137         return Objects.equals(getIdentifier(), other.getIdentifier())
138                 && Objects.equals(mPackageName, other.mPackageName)
139                 && Objects.equals(mPermissionName, other.mPermissionName);
140     }
141 
142     @Override
hashCode()143     public int hashCode() {
144         return Objects.hash(getIdentifier(), mPackageName, mPermissionName);
145     }
146 
147     @Override
toString()148     public String toString() {
149         return "PackagePermissionPolicyKey{mIdentifier= " + getIdentifier() + "; mPackageName= "
150                 + mPackageName + "; mPermissionName= " + mPermissionName + "}";
151     }
152 
153     @Override
describeContents()154     public int describeContents() {
155         return 0;
156     }
157 
158     @Override
writeToParcel(@onNull Parcel dest, int flags)159     public void writeToParcel(@NonNull Parcel dest, int flags) {
160         dest.writeString(getIdentifier());
161         dest.writeString(mPackageName);
162         dest.writeString(mPermissionName);
163     }
164 
165     @NonNull
166     public static final Parcelable.Creator<PackagePermissionPolicyKey> CREATOR =
167             new Parcelable.Creator<PackagePermissionPolicyKey>() {
168                 @Override
169                 public PackagePermissionPolicyKey createFromParcel(Parcel source) {
170                     return new PackagePermissionPolicyKey(source);
171                 }
172 
173                 @Override
174                 public PackagePermissionPolicyKey[] newArray(int size) {
175                     return new PackagePermissionPolicyKey[size];
176                 }
177             };
178 }
179