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