From 6e1d2307a8cb69577c767f261b932225256d0b2a Mon Sep 17 00:00:00 2001 From: Ajay Panicker Date: Thu, 9 Nov 2017 10:16:35 -0800 Subject: [PATCH] Add MediaMetadata equals to make metadata comparisons easier Bug: 68854188 Test: Compare two metadata objects with the same title, album, and artist Change-Id: I89d1944bf237f8f3f1c52ccdb8ff385422b19070 --- media/java/android/media/MediaMetadata.java | 66 +++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/media/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java index bdc0fda6aca38..31eb948dcd091 100644 --- a/media/java/android/media/MediaMetadata.java +++ b/media/java/android/media/MediaMetadata.java @@ -34,6 +34,7 @@ import android.util.SparseArray; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Set; +import java.util.Objects; /** * Contains metadata about an item, such as the title, artist, etc. @@ -615,6 +616,71 @@ public final class MediaMetadata implements Parcelable { } }; + /** + * Compares the contents of this object to another MediaMetadata object. It + * does not compare Bitmaps and Ratings as the media player can choose to + * forgo these fields depending on how you retrieve the MediaMetadata. + * + * @param o The Metadata object to compare this object against + * @return Whether or not the two objects have matching fields (excluding + * Bitmaps and Ratings) + */ + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + + if (!(o instanceof MediaMetadata)) { + return false; + } + + final MediaMetadata m = (MediaMetadata) o; + + for (int i = 0; i < METADATA_KEYS_TYPE.size(); i++) { + String key = METADATA_KEYS_TYPE.keyAt(i); + switch (METADATA_KEYS_TYPE.valueAt(i)) { + case METADATA_TYPE_TEXT: + if (!Objects.equals(getString(key), m.getString(key))) { + return false; + } + break; + case METADATA_TYPE_LONG: + if (getLong(key) != m.getLong(key)) { + return false; + } + break; + default: + // Ignore ratings and bitmaps when comparing + break; + } + } + + return true; + } + + @Override + public int hashCode() { + int hashCode = 17; + + for (int i = 0; i < METADATA_KEYS_TYPE.size(); i++) { + String key = METADATA_KEYS_TYPE.keyAt(i); + switch (METADATA_KEYS_TYPE.valueAt(i)) { + case METADATA_TYPE_TEXT: + hashCode = 31 * hashCode + Objects.hash(getString(key)); + break; + case METADATA_TYPE_LONG: + hashCode = 31 * hashCode + Long.hashCode(getLong(key)); + break; + default: + // Ignore ratings and bitmaps when comparing + break; + } + } + + return hashCode; + } + /** * Use to build MediaMetadata objects. The system defined metadata keys must * use the appropriate data type.