summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-03-08 00:46:08 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-03-08 00:46:08 +0000
commit71b71dada7d680e107d2b0de41538c36020b73da (patch)
tree2ad6f4721791eae68c172ace7803d4b6fc360eca
parent43a7980fc6f2dd0bfcb5467f56fe4dff91325009 (diff)
parentfc677394323d53b5844f099ae26bd8aed1f596dd (diff)
Merge "Implement front-end support for HAL 2.0 metadata." into pi-dev
-rw-r--r--api/system-current.txt7
-rw-r--r--core/java/android/hardware/radio/RadioMetadata.java49
-rw-r--r--services/core/java/com/android/server/broadcastradio/hal2/Convert.java76
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)
);
}