Merge "Add Performance-Optimization Methods to UiccAccessRule" into main
diff --git a/telephony/java/android/telephony/UiccAccessRule.java b/telephony/java/android/telephony/UiccAccessRule.java
index 38b551b..65e3254 100644
--- a/telephony/java/android/telephony/UiccAccessRule.java
+++ b/telephony/java/android/telephony/UiccAccessRule.java
@@ -169,18 +169,21 @@
     }
 
     private final byte[] mCertificateHash;
+    private final int mCertificateHashHashCode;
     private final @Nullable String mPackageName;
     // This bit is not currently used, but reserved for future use.
     private final long mAccessType;
 
     public UiccAccessRule(byte[] certificateHash, @Nullable String packageName, long accessType) {
         this.mCertificateHash = certificateHash;
+        this.mCertificateHashHashCode = getCertificateHashHashCode(this.mCertificateHash);
         this.mPackageName = packageName;
         this.mAccessType = accessType;
     }
 
     UiccAccessRule(Parcel in) {
         mCertificateHash = in.createByteArray();
+        mCertificateHashHashCode = getCertificateHashHashCode(mCertificateHash);
         mPackageName = in.readString();
         mAccessType = in.readLong();
     }
@@ -247,7 +250,7 @@
     public int getCarrierPrivilegeStatus(Signature signature, String packageName) {
         byte[] certHash256 = getCertHash(signature, "SHA-256");
         // Check SHA-256 first as it's the new standard.
-        if (matches(certHash256, packageName)) {
+        if (hasMatchingCertificateHashAndPackageName(certHash256, packageName)) {
             return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
         }
 
@@ -255,7 +258,7 @@
         // in the near future when GPD_SPE_068 fully replaces GPD_SPE_013.
         if (this.mCertificateHash.length == 20) {
             byte[] certHash = getCertHash(signature, "SHA-1");
-            if (matches(certHash, packageName)) {
+            if (hasMatchingCertificateHashAndPackageName(certHash, packageName)) {
                 return TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
             }
         }
@@ -267,15 +270,41 @@
      * Returns true if the given certificate and package name match this rule's values.
      * @hide
      */
-    public boolean matches(@Nullable String certHash, @Nullable String packageName) {
-        return matches(IccUtils.hexStringToBytes(certHash), packageName);
+    public boolean hasMatchingCertificateHashAndPackageName(
+            @Nullable String certHash, @Nullable String packageName) {
+        return hasMatchingCertificateHashAndPackageName(
+                IccUtils.hexStringToBytes(certHash), packageName);
     }
 
-    private boolean matches(byte[] certHash, String packageName) {
+    /**
+     * Returns true if the given certificate and package name match this rule's values.
+     * @hide
+     */
+    public boolean hasMatchingCertificateHashAndPackageName(
+            @Nullable byte[] certHash, @Nullable String packageName) {
         return certHash != null && Arrays.equals(this.mCertificateHash, certHash) &&
                 (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName));
     }
 
+    /**
+     * Returns true if the given certificate hash hash
+     * and package name both match this rules' values.
+     *
+     * @hide
+     */
+    public boolean hasMatchingCertificateHashHashAndPackageName(
+            int certHashHashCode, String packageName) {
+        return certHashHashCode == this.mCertificateHashHashCode
+                && (TextUtils.isEmpty(this.mPackageName) || this.mPackageName.equals(packageName));
+    }
+
+    /**
+     * @hide
+     */
+    public static int getCertificateHashHashCode(byte[] certHash) {
+        return Arrays.hashCode(certHash);
+    }
+
     @Override
     public boolean equals(@Nullable Object obj) {
         if (this == obj) {