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