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