From 5fb600b1e8ec4c27968dda544d898b34d8902a91 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Fri, 24 Mar 2017 14:55:08 -0700 Subject: [PATCH] Add digital radio flags to ProgramInfo API. Bug: b/32621193 Test: manual (KitchenSink) Change-Id: I24b6beb326d23f456a010699d5ecdf20464ebb78 --- .../android/hardware/radio/RadioManager.java | 39 ++++++++++++++++++- core/jni/android_hardware_Radio.cpp | 5 ++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index 58c3d2430425b..0e59a2dfe6bb7 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -1149,21 +1149,27 @@ public class RadioManager { * {@link RadioTuner#getProgramInformation(RadioManager.ProgramInfo[])} */ public static class ProgramInfo implements Parcelable { + // sourced from hardware/interfaces/broadcastradio/1.1/types.hal + private final static int FLAG_LIVE = 1 << 0; + private final static int FLAG_MUTED = 1 << 1; + private final int mChannel; private final int mSubChannel; private final boolean mTuned; private final boolean mStereo; private final boolean mDigital; + private final int mFlags; private final int mSignalStrength; private final RadioMetadata mMetadata; ProgramInfo(int channel, int subChannel, boolean tuned, boolean stereo, - boolean digital, int signalStrength, RadioMetadata metadata) { + boolean digital, int signalStrength, RadioMetadata metadata, int flags) { mChannel = channel; mSubChannel = subChannel; mTuned = tuned; mStereo = stereo; mDigital = digital; + mFlags = flags; mSignalStrength = signalStrength; mMetadata = metadata; } @@ -1199,6 +1205,30 @@ public class RadioManager { public boolean isDigital() { return mDigital; } + + /** + * {@code true} if the program is currently playing live stream. + * This may result in a slightly altered reception parameters, + * usually targetted at reduced latency. + * + * @hide FutureFeature + */ + public boolean isLive() { + return (mFlags & FLAG_LIVE) != 0; + } + + /** + * {@code true} if radio stream is not playing, ie. due to bad reception + * conditions or buffering. In this state volume knob MAY be disabled to + * prevent user increasing volume too much. + * It does NOT mean the user has muted audio. + * + * @hide FutureFeature + */ + public boolean isMuted() { + return (mFlags & FLAG_MUTED) != 0; + } + /** Signal strength indicator from 0 (no signal) to 100 (excellent) * @return the signal strength indication. */ @@ -1225,6 +1255,7 @@ public class RadioManager { } else { mMetadata = null; } + mFlags = in.readInt(); } public static final Parcelable.Creator CREATOR @@ -1252,6 +1283,7 @@ public class RadioManager { dest.writeByte((byte)1); mMetadata.writeToParcel(dest, flags); } + dest.writeInt(mFlags); } @Override @@ -1263,7 +1295,7 @@ public class RadioManager { public String toString() { return "ProgramInfo [mChannel=" + mChannel + ", mSubChannel=" + mSubChannel + ", mTuned=" + mTuned + ", mStereo=" + mStereo + ", mDigital=" + mDigital - + ", mSignalStrength=" + mSignalStrength + + ", mFlags=" + mFlags + ", mSignalStrength=" + mSignalStrength + ((mMetadata == null) ? "" : (", mMetadata=" + mMetadata.toString())) + "]"; } @@ -1277,6 +1309,7 @@ public class RadioManager { result = prime * result + (mTuned ? 1 : 0); result = prime * result + (mStereo ? 1 : 0); result = prime * result + (mDigital ? 1 : 0); + result = prime * result + mFlags; result = prime * result + mSignalStrength; result = prime * result + ((mMetadata == null) ? 0 : mMetadata.hashCode()); return result; @@ -1299,6 +1332,8 @@ public class RadioManager { return false; if (mDigital != other.isDigital()) return false; + if (mFlags != other.mFlags) + return false; if (mSignalStrength != other.getSignalStrength()) return false; if (mMetadata == null) { diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp index b6b1ac75f0e90..fcb72c2a869df 100644 --- a/core/jni/android_hardware_Radio.cpp +++ b/core/jni/android_hardware_Radio.cpp @@ -325,11 +325,12 @@ static jint convertProgramInfoFromNative(JNIEnv *env, ALOGV("%s channel %d tuned %d", __FUNCTION__, nProgramInfo->channel, nProgramInfo->tuned); + int flags = 0; // TODO(b/32621193): pass from the HAL *jProgramInfo = env->NewObject(gRadioProgramInfoClass, gRadioProgramInfoCstor, nProgramInfo->channel, nProgramInfo->sub_channel, nProgramInfo->tuned, nProgramInfo->stereo, nProgramInfo->digital, nProgramInfo->signal_strength, - jMetadata); + jMetadata, flags); env->DeleteLocalRef(jMetadata); return (jint)RADIO_STATUS_OK; @@ -932,7 +933,7 @@ int register_android_hardware_Radio(JNIEnv *env) jclass programInfoClass = FindClassOrDie(env, kRadioProgramInfoClassPathName); gRadioProgramInfoClass = MakeGlobalRefOrDie(env, programInfoClass); gRadioProgramInfoCstor = GetMethodIDOrDie(env, programInfoClass, "", - "(IIZZZILandroid/hardware/radio/RadioMetadata;)V"); + "(IIZZZILandroid/hardware/radio/RadioMetadata;I)V"); jclass metadataClass = FindClassOrDie(env, kRadioMetadataClassPathName); gRadioMetadataClass = MakeGlobalRefOrDie(env, metadataClass);