diff options
| author | 2018-03-08 00:46:08 +0000 | |
|---|---|---|
| committer | 2018-03-08 00:46:08 +0000 | |
| commit | 71b71dada7d680e107d2b0de41538c36020b73da (patch) | |
| tree | 2ad6f4721791eae68c172ace7803d4b6fc360eca | |
| parent | 43a7980fc6f2dd0bfcb5467f56fe4dff91325009 (diff) | |
| parent | fc677394323d53b5844f099ae26bd8aed1f596dd (diff) | |
Merge "Implement front-end support for HAL 2.0 metadata." into pi-dev
| -rw-r--r-- | api/system-current.txt | 7 | ||||
| -rw-r--r-- | core/java/android/hardware/radio/RadioMetadata.java | 49 | ||||
| -rw-r--r-- | services/core/java/com/android/server/broadcastradio/hal2/Convert.java | 76 |
3 files changed, 131 insertions, 1 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 055526309093..6eef3a2d296c 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2115,8 +2115,15 @@ package android.hardware.radio { field public static final java.lang.String METADATA_KEY_ART = "android.hardware.radio.metadata.ART"; field public static final java.lang.String METADATA_KEY_ARTIST = "android.hardware.radio.metadata.ARTIST"; field public static final java.lang.String METADATA_KEY_CLOCK = "android.hardware.radio.metadata.CLOCK"; + field public static final java.lang.String METADATA_KEY_DAB_COMPONENT_NAME = "android.hardware.radio.metadata.DAB_COMPONENT_NAME"; + field public static final java.lang.String METADATA_KEY_DAB_COMPONENT_NAME_SHORT = "android.hardware.radio.metadata.DAB_COMPONENT_NAME_SHORT"; + field public static final java.lang.String METADATA_KEY_DAB_ENSEMBLE_NAME = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME"; + field public static final java.lang.String METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT = "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME_SHORT"; + field public static final java.lang.String METADATA_KEY_DAB_SERVICE_NAME = "android.hardware.radio.metadata.DAB_SERVICE_NAME"; + field public static final java.lang.String METADATA_KEY_DAB_SERVICE_NAME_SHORT = "android.hardware.radio.metadata.DAB_SERVICE_NAME_SHORT"; field public static final java.lang.String METADATA_KEY_GENRE = "android.hardware.radio.metadata.GENRE"; field public static final java.lang.String METADATA_KEY_ICON = "android.hardware.radio.metadata.ICON"; + field public static final java.lang.String METADATA_KEY_PROGRAM_NAME = "android.hardware.radio.metadata.PROGRAM_NAME"; field public static final java.lang.String METADATA_KEY_RBDS_PTY = "android.hardware.radio.metadata.RBDS_PTY"; field public static final java.lang.String METADATA_KEY_RDS_PI = "android.hardware.radio.metadata.RDS_PI"; field public static final java.lang.String METADATA_KEY_RDS_PS = "android.hardware.radio.metadata.RDS_PS"; diff --git a/core/java/android/hardware/radio/RadioMetadata.java b/core/java/android/hardware/radio/RadioMetadata.java index 3cc4b566a3c0..6e510607754a 100644 --- a/core/java/android/hardware/radio/RadioMetadata.java +++ b/core/java/android/hardware/radio/RadioMetadata.java @@ -96,6 +96,48 @@ public final class RadioMetadata implements Parcelable { */ public static final String METADATA_KEY_CLOCK = "android.hardware.radio.metadata.CLOCK"; + /** + * Technology-independent program name (station name). + */ + public static final String METADATA_KEY_PROGRAM_NAME = + "android.hardware.radio.metadata.PROGRAM_NAME"; + + /** + * DAB ensemble name. + */ + public static final String METADATA_KEY_DAB_ENSEMBLE_NAME = + "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME"; + + /** + * DAB ensemble name - short version (up to 8 characters). + */ + public static final String METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT = + "android.hardware.radio.metadata.DAB_ENSEMBLE_NAME_SHORT"; + + /** + * DAB service name. + */ + public static final String METADATA_KEY_DAB_SERVICE_NAME = + "android.hardware.radio.metadata.DAB_SERVICE_NAME"; + + /** + * DAB service name - short version (up to 8 characters). + */ + public static final String METADATA_KEY_DAB_SERVICE_NAME_SHORT = + "android.hardware.radio.metadata.DAB_SERVICE_NAME_SHORT"; + + /** + * DAB component name. + */ + public static final String METADATA_KEY_DAB_COMPONENT_NAME = + "android.hardware.radio.metadata.DAB_COMPONENT_NAME"; + + /** + * DAB component name. + */ + public static final String METADATA_KEY_DAB_COMPONENT_NAME_SHORT = + "android.hardware.radio.metadata.DAB_COMPONENT_NAME_SHORT"; + private static final int METADATA_TYPE_INVALID = -1; private static final int METADATA_TYPE_INT = 0; @@ -119,6 +161,13 @@ public final class RadioMetadata implements Parcelable { METADATA_KEYS_TYPE.put(METADATA_KEY_ICON, METADATA_TYPE_BITMAP); METADATA_KEYS_TYPE.put(METADATA_KEY_ART, METADATA_TYPE_BITMAP); METADATA_KEYS_TYPE.put(METADATA_KEY_CLOCK, METADATA_TYPE_CLOCK); + METADATA_KEYS_TYPE.put(METADATA_KEY_PROGRAM_NAME, METADATA_TYPE_TEXT); + METADATA_KEYS_TYPE.put(METADATA_KEY_DAB_ENSEMBLE_NAME, METADATA_TYPE_TEXT); + METADATA_KEYS_TYPE.put(METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT, METADATA_TYPE_TEXT); + METADATA_KEYS_TYPE.put(METADATA_KEY_DAB_SERVICE_NAME, METADATA_TYPE_TEXT); + METADATA_KEYS_TYPE.put(METADATA_KEY_DAB_SERVICE_NAME_SHORT, METADATA_TYPE_TEXT); + METADATA_KEYS_TYPE.put(METADATA_KEY_DAB_COMPONENT_NAME, METADATA_TYPE_TEXT); + METADATA_KEYS_TYPE.put(METADATA_KEY_DAB_COMPONENT_NAME_SHORT, METADATA_TYPE_TEXT); } // keep in sync with: system/media/radio/include/system/radio_metadata.h diff --git a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java index 5af19eca5034..6919282054ed 100644 --- a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java +++ b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java @@ -23,6 +23,8 @@ import android.hardware.broadcastradio.V2_0.AmFmRegionConfig; import android.hardware.broadcastradio.V2_0.Announcement; import android.hardware.broadcastradio.V2_0.DabTableEntry; import android.hardware.broadcastradio.V2_0.IdentifierType; +import android.hardware.broadcastradio.V2_0.Metadata; +import android.hardware.broadcastradio.V2_0.MetadataKey; import android.hardware.broadcastradio.V2_0.ProgramFilter; import android.hardware.broadcastradio.V2_0.ProgramIdentifier; import android.hardware.broadcastradio.V2_0.ProgramInfo; @@ -34,6 +36,7 @@ import android.hardware.broadcastradio.V2_0.VendorKeyValue; import android.hardware.radio.ProgramList; import android.hardware.radio.ProgramSelector; import android.hardware.radio.RadioManager; +import android.hardware.radio.RadioMetadata; import android.os.ParcelableException; import android.util.Slog; @@ -283,6 +286,77 @@ class Convert { secondaryIds, null); } + private enum MetadataType { + INT, STRING + } + + private static class MetadataDef { + private MetadataType type; + private String key; + private MetadataDef(MetadataType type, String key) { + this.type = type; + this.key = key; + } + } + + private static final Map<Integer, MetadataDef> metadataKeys; + static { + metadataKeys = new HashMap<>(); + metadataKeys.put(MetadataKey.RDS_PS, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_RDS_PS)); + metadataKeys.put(MetadataKey.RDS_PTY, new MetadataDef( + MetadataType.INT, RadioMetadata.METADATA_KEY_RDS_PTY)); + metadataKeys.put(MetadataKey.RBDS_PTY, new MetadataDef( + MetadataType.INT, RadioMetadata.METADATA_KEY_RBDS_PTY)); + metadataKeys.put(MetadataKey.RDS_RT, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_RDS_RT)); + metadataKeys.put(MetadataKey.SONG_TITLE, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_TITLE)); + metadataKeys.put(MetadataKey.SONG_ARTIST, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_ARTIST)); + metadataKeys.put(MetadataKey.SONG_ALBUM, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_ALBUM)); + metadataKeys.put(MetadataKey.STATION_ICON, new MetadataDef( + MetadataType.INT, RadioMetadata.METADATA_KEY_ICON)); + metadataKeys.put(MetadataKey.ALBUM_ART, new MetadataDef( + MetadataType.INT, RadioMetadata.METADATA_KEY_ART)); + metadataKeys.put(MetadataKey.PROGRAM_NAME, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_PROGRAM_NAME)); + metadataKeys.put(MetadataKey.DAB_ENSEMBLE_NAME, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME)); + metadataKeys.put(MetadataKey.DAB_ENSEMBLE_NAME_SHORT, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_ENSEMBLE_NAME_SHORT)); + metadataKeys.put(MetadataKey.DAB_SERVICE_NAME, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME)); + metadataKeys.put(MetadataKey.DAB_SERVICE_NAME_SHORT, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_SERVICE_NAME_SHORT)); + metadataKeys.put(MetadataKey.DAB_COMPONENT_NAME, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME)); + metadataKeys.put(MetadataKey.DAB_COMPONENT_NAME_SHORT, new MetadataDef( + MetadataType.STRING, RadioMetadata.METADATA_KEY_DAB_COMPONENT_NAME_SHORT)); + } + + private static @NonNull RadioMetadata metadataFromHal(@NonNull ArrayList<Metadata> meta) { + RadioMetadata.Builder builder = new RadioMetadata.Builder(); + + for (Metadata entry : meta) { + MetadataDef keyDef = metadataKeys.get(entry.key); + if (keyDef == null) { + Slog.i(TAG, "Ignored unknown metadata entry: " + MetadataKey.toString(entry.key)); + continue; + } + if (keyDef.type == MetadataType.STRING) { + builder.putString(keyDef.key, entry.stringValue); + } else { // MetadataType.INT + /* Current java API use 32-bit values for int metadata, + * but we might change it in the future */ + builder.putInt(keyDef.key, (int)entry.intValue); + } + } + + return builder.build(); + } + static @NonNull RadioManager.ProgramInfo programInfoFromHal(@NonNull ProgramInfo info) { Collection<ProgramSelector.Identifier> relatedContent = info.relatedContent.stream(). map(id -> Objects.requireNonNull(programIdentifierFromHal(id))). @@ -295,7 +369,7 @@ class Convert { relatedContent, info.infoFlags, info.signalQuality, - null, // TODO(b/69860743): metadata + metadataFromHal(info.metadata), vendorInfoFromHal(info.vendorInfo) ); } |