Merge "Add secondaryId comparison for ProgramInfo"
diff --git a/core/java/android/hardware/radio/ProgramSelector.java b/core/java/android/hardware/radio/ProgramSelector.java
index d525753..6300a12 100644
--- a/core/java/android/hardware/radio/ProgramSelector.java
+++ b/core/java/android/hardware/radio/ProgramSelector.java
@@ -279,6 +279,7 @@
         mPrimaryId = Objects.requireNonNull(primaryId);
         mSecondaryIds = secondaryIds;
         mVendorIds = vendorIds;
+        Arrays.sort(mSecondaryIds);
     }
 
     /**
@@ -512,10 +513,22 @@
         return mPrimaryId.equals(other.getPrimaryId());
     }
 
+    /** @hide */
+    public boolean strictEquals(@Nullable Object obj) {
+        if (this == obj) return true;
+        if (!(obj instanceof ProgramSelector)) return false;
+        ProgramSelector other = (ProgramSelector) obj;
+        // vendorIds are ignored for equality
+        // programType can be inferred from primaryId, thus not checked
+        return mPrimaryId.equals(other.getPrimaryId())
+                && Arrays.equals(mSecondaryIds, other.mSecondaryIds);
+    }
+
     private ProgramSelector(Parcel in) {
         mProgramType = in.readInt();
         mPrimaryId = in.readTypedObject(Identifier.CREATOR);
         mSecondaryIds = in.createTypedArray(Identifier.CREATOR);
+        Arrays.sort(mSecondaryIds);
         if (Stream.of(mSecondaryIds).anyMatch(id -> id == null)) {
             throw new IllegalArgumentException("secondaryIds list must not contain nulls");
         }
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 4cc001a..8180caa 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -1690,7 +1690,7 @@
             if (!(obj instanceof ProgramInfo)) return false;
             ProgramInfo other = (ProgramInfo) obj;
 
-            if (!Objects.equals(mSelector, other.mSelector)) return false;
+            if (!mSelector.strictEquals(other.mSelector)) return false;
             if (!Objects.equals(mLogicallyTunedTo, other.mLogicallyTunedTo)) return false;
             if (!Objects.equals(mPhysicallyTunedTo, other.mPhysicallyTunedTo)) return false;
             if (!Objects.equals(mRelatedContent, other.mRelatedContent)) return false;