summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sanket Agarwal <sanketa@google.com> 2015-10-08 14:14:20 -0700
committer Eric Laurent <elaurent@google.com> 2015-11-05 22:50:59 +0000
commit7058e4ca585a06462a495d021d61e1fd27f85cd2 (patch)
tree817b1780be624ab57ab32a863e3b92e799f1d854
parent557b64abad9915f92a9d35c748766e873f3a29fd (diff)
Radio features for Automotive usecase.
1. Add clock to metadata - If the CAR does not have a clock (no network or bad clock) then Radio RDS could be used as a proxy. 2. Add support for emergency announcement - If the CAR wants to make an emergency announcement. 2.1 Add support for callbacks. Bug: b/24807501 Bug: b/22701655 Change-Id: Ib3131de03a022181559fd31da6701d9d3fa8698d (cherry picked from commit 659688a129189f2a9aa353ddf9e107d5f293c4ca)
-rw-r--r--api/system-current.txt16
-rw-r--r--core/java/android/hardware/radio/RadioManager.java53
-rw-r--r--core/java/android/hardware/radio/RadioMetadata.java105
-rw-r--r--core/java/android/hardware/radio/RadioModule.java5
-rw-r--r--core/java/android/hardware/radio/RadioTuner.java4
-rw-r--r--core/jni/android_hardware_Radio.cpp31
6 files changed, 205 insertions, 9 deletions
diff --git a/api/system-current.txt b/api/system-current.txt
index bd674ef65f0b..64162aed38eb 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -14919,6 +14919,7 @@ package android.hardware.radio {
public static class RadioManager.FmBandConfig extends android.hardware.radio.RadioManager.BandConfig {
method public boolean getAf();
+ method public boolean getEa();
method public boolean getRds();
method public boolean getStereo();
method public boolean getTa();
@@ -14930,6 +14931,7 @@ package android.hardware.radio {
ctor public RadioManager.FmBandConfig.Builder(android.hardware.radio.RadioManager.FmBandConfig);
method public android.hardware.radio.RadioManager.FmBandConfig build();
method public android.hardware.radio.RadioManager.FmBandConfig.Builder setAf(boolean);
+ method public android.hardware.radio.RadioManager.FmBandConfig.Builder setEa(boolean);
method public android.hardware.radio.RadioManager.FmBandConfig.Builder setRds(boolean);
method public android.hardware.radio.RadioManager.FmBandConfig.Builder setStereo(boolean);
method public android.hardware.radio.RadioManager.FmBandConfig.Builder setTa(boolean);
@@ -14937,6 +14939,7 @@ package android.hardware.radio {
public static class RadioManager.FmBandDescriptor extends android.hardware.radio.RadioManager.BandDescriptor {
method public boolean isAfSupported();
+ method public boolean isEaSupported();
method public boolean isRdsSupported();
method public boolean isStereoSupported();
method public boolean isTaSupported();
@@ -14976,6 +14979,7 @@ package android.hardware.radio {
method public boolean containsKey(java.lang.String);
method public int describeContents();
method public android.graphics.Bitmap getBitmap(java.lang.String);
+ method public android.hardware.radio.RadioMetadata.Clock getClock(java.lang.String);
method public int getInt(java.lang.String);
method public java.lang.String getString(java.lang.String);
method public java.util.Set<java.lang.String> keySet();
@@ -14985,6 +14989,7 @@ package android.hardware.radio {
field public static final java.lang.String METADATA_KEY_ALBUM = "android.hardware.radio.metadata.ALBUM";
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_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_RBDS_PTY = "android.hardware.radio.metadata.RBDS_PTY";
@@ -15000,10 +15005,20 @@ package android.hardware.radio {
ctor public RadioMetadata.Builder(android.hardware.radio.RadioMetadata);
method public android.hardware.radio.RadioMetadata build();
method public android.hardware.radio.RadioMetadata.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
+ method public android.hardware.radio.RadioMetadata.Builder putClock(java.lang.String, long, int);
method public android.hardware.radio.RadioMetadata.Builder putInt(java.lang.String, int);
method public android.hardware.radio.RadioMetadata.Builder putString(java.lang.String, java.lang.String);
}
+ public static final class RadioMetadata.Clock implements android.os.Parcelable {
+ ctor public RadioMetadata.Clock(long, int);
+ method public int describeContents();
+ method public int getTimezoneOffsetMinutes();
+ method public long getUtcEpochSeconds();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.radio.RadioMetadata.Clock> CREATOR;
+ }
+
public abstract class RadioTuner {
ctor public RadioTuner();
method public abstract int cancel();
@@ -15032,6 +15047,7 @@ package android.hardware.radio {
method public void onAntennaState(boolean);
method public void onConfigurationChanged(android.hardware.radio.RadioManager.BandConfig);
method public void onControlChanged(boolean);
+ method public void onEmergencyAnnouncement(boolean);
method public void onError(int);
method public void onMetadataChanged(android.hardware.radio.RadioMetadata);
method public void onProgramInfoChanged(android.hardware.radio.RadioManager.ProgramInfo);
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 32930a798201..14bb923767ed 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -457,14 +457,16 @@ public class RadioManager {
private final boolean mRds;
private final boolean mTa;
private final boolean mAf;
+ private final boolean mEa;
FmBandDescriptor(int region, int type, int lowerLimit, int upperLimit, int spacing,
- boolean stereo, boolean rds, boolean ta, boolean af) {
+ boolean stereo, boolean rds, boolean ta, boolean af, boolean ea) {
super(region, type, lowerLimit, upperLimit, spacing);
mStereo = stereo;
mRds = rds;
mTa = ta;
mAf = af;
+ mEa = ea;
}
/** Stereo is supported
@@ -492,6 +494,13 @@ public class RadioManager {
return mAf;
}
+ /** Emergency Announcement is supported
+ * @return {@code true} if Emergency annoucement is supported, {@code false} otherwise.
+ */
+ public boolean isEaSupported() {
+ return mEa;
+ }
+
/* Parcelable implementation */
private FmBandDescriptor(Parcel in) {
super(in);
@@ -499,6 +508,7 @@ public class RadioManager {
mRds = in.readByte() == 1;
mTa = in.readByte() == 1;
mAf = in.readByte() == 1;
+ mEa = in.readByte() == 1;
}
public static final Parcelable.Creator<FmBandDescriptor> CREATOR
@@ -519,6 +529,7 @@ public class RadioManager {
dest.writeByte((byte) (mRds ? 1 : 0));
dest.writeByte((byte) (mTa ? 1 : 0));
dest.writeByte((byte) (mAf ? 1 : 0));
+ dest.writeByte((byte) (mEa ? 1 : 0));
}
@Override
@@ -529,7 +540,8 @@ public class RadioManager {
@Override
public String toString() {
return "FmBandDescriptor [ "+ super.toString() + " mStereo=" + mStereo
- + ", mRds=" + mRds + ", mTa=" + mTa + ", mAf=" + mAf + "]";
+ + ", mRds=" + mRds + ", mTa=" + mTa + ", mAf=" + mAf +
+ ", mEa =" + mEa + "]";
}
@Override
@@ -540,6 +552,7 @@ public class RadioManager {
result = prime * result + (mRds ? 1 : 0);
result = prime * result + (mTa ? 1 : 0);
result = prime * result + (mAf ? 1 : 0);
+ result = prime * result + (mEa ? 1 : 0);
return result;
}
@@ -560,6 +573,8 @@ public class RadioManager {
return false;
if (mAf != other.isAfSupported())
return false;
+ if (mEa != other.isEaSupported())
+ return false;
return true;
}
}
@@ -754,6 +769,7 @@ public class RadioManager {
private final boolean mRds;
private final boolean mTa;
private final boolean mAf;
+ private final boolean mEa;
FmBandConfig(FmBandDescriptor descriptor) {
super((BandDescriptor)descriptor);
@@ -761,15 +777,17 @@ public class RadioManager {
mRds = descriptor.isRdsSupported();
mTa = descriptor.isTaSupported();
mAf = descriptor.isAfSupported();
+ mEa = descriptor.isEaSupported();
}
FmBandConfig(int region, int type, int lowerLimit, int upperLimit, int spacing,
- boolean stereo, boolean rds, boolean ta, boolean af) {
+ boolean stereo, boolean rds, boolean ta, boolean af, boolean ea) {
super(region, type, lowerLimit, upperLimit, spacing);
mStereo = stereo;
mRds = rds;
mTa = ta;
mAf = af;
+ mEa = ea;
}
/** Get stereo enable state
@@ -800,12 +818,21 @@ public class RadioManager {
return mAf;
}
+ /**
+ * Get Emergency announcement enable state
+ * @return the enable state.
+ */
+ public boolean getEa() {
+ return mEa;
+ }
+
private FmBandConfig(Parcel in) {
super(in);
mStereo = in.readByte() == 1;
mRds = in.readByte() == 1;
mTa = in.readByte() == 1;
mAf = in.readByte() == 1;
+ mEa = in.readByte() == 1;
}
public static final Parcelable.Creator<FmBandConfig> CREATOR
@@ -826,6 +853,7 @@ public class RadioManager {
dest.writeByte((byte) (mRds ? 1 : 0));
dest.writeByte((byte) (mTa ? 1 : 0));
dest.writeByte((byte) (mAf ? 1 : 0));
+ dest.writeByte((byte) (mEa ? 1 : 0));
}
@Override
@@ -837,7 +865,7 @@ public class RadioManager {
public String toString() {
return "FmBandConfig [" + super.toString()
+ ", mStereo=" + mStereo + ", mRds=" + mRds + ", mTa=" + mTa
- + ", mAf=" + mAf + "]";
+ + ", mAf=" + mAf + ", mEa =" + mEa + "]";
}
@Override
@@ -848,6 +876,7 @@ public class RadioManager {
result = prime * result + (mRds ? 1 : 0);
result = prime * result + (mTa ? 1 : 0);
result = prime * result + (mAf ? 1 : 0);
+ result = prime * result + (mEa ? 1 : 0);
return result;
}
@@ -868,6 +897,8 @@ public class RadioManager {
return false;
if (mAf != other.mAf)
return false;
+ if (mEa != other.mEa)
+ return false;
return true;
}
@@ -880,6 +911,7 @@ public class RadioManager {
private boolean mRds;
private boolean mTa;
private boolean mAf;
+ private boolean mEa;
/**
* Constructs a new Builder with the defaults from an {@link FmBandDescriptor} .
@@ -893,6 +925,7 @@ public class RadioManager {
mRds = descriptor.isRdsSupported();
mTa = descriptor.isTaSupported();
mAf = descriptor.isAfSupported();
+ mEa = descriptor.isEaSupported();
}
/**
@@ -906,6 +939,7 @@ public class RadioManager {
mRds = config.getRds();
mTa = config.getTa();
mAf = config.getAf();
+ mEa = config.getEa();
}
/**
@@ -917,7 +951,7 @@ public class RadioManager {
FmBandConfig config = new FmBandConfig(mDescriptor.getRegion(),
mDescriptor.getType(), mDescriptor.getLowerLimit(),
mDescriptor.getUpperLimit(), mDescriptor.getSpacing(),
- mStereo, mRds, mTa, mAf);
+ mStereo, mRds, mTa, mAf, mEa);
return config;
}
@@ -956,6 +990,15 @@ public class RadioManager {
mAf = state;
return this;
}
+
+ /** Set Emergency Announcement enable state
+ * @param state The new enable state.
+ * @return the same Builder instance.
+ */
+ public Builder setEa(boolean state) {
+ mEa = state;
+ return this;
+ }
};
}
diff --git a/core/java/android/hardware/radio/RadioMetadata.java b/core/java/android/hardware/radio/RadioMetadata.java
index 8b1851b8397d..b7715da5ff61 100644
--- a/core/java/android/hardware/radio/RadioMetadata.java
+++ b/core/java/android/hardware/radio/RadioMetadata.java
@@ -95,11 +95,17 @@ public final class RadioMetadata implements Parcelable {
*/
public static final String METADATA_KEY_ART = "android.hardware.radio.metadata.ART";
+ /**
+ * The clock.
+ */
+ public static final String METADATA_KEY_CLOCK = "android.hardware.radio.metadata.CLOCK";
+
private static final int METADATA_TYPE_INVALID = -1;
private static final int METADATA_TYPE_INT = 0;
private static final int METADATA_TYPE_TEXT = 1;
private static final int METADATA_TYPE_BITMAP = 2;
+ private static final int METADATA_TYPE_CLOCK = 3;
private static final ArrayMap<String, Integer> METADATA_KEYS_TYPE;
@@ -116,6 +122,7 @@ public final class RadioMetadata implements Parcelable {
METADATA_KEYS_TYPE.put(METADATA_KEY_GENRE, METADATA_TYPE_TEXT);
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);
}
// keep in sync with: system/media/radio/include/system/radio_metadata.h
@@ -131,6 +138,7 @@ public final class RadioMetadata implements Parcelable {
private static final int NATIVE_KEY_GENRE = 8;
private static final int NATIVE_KEY_ICON = 9;
private static final int NATIVE_KEY_ART = 10;
+ private static final int NATIVE_KEY_CLOCK = 11;
private static final SparseArray<String> NATIVE_KEY_MAPPING;
@@ -147,6 +155,59 @@ public final class RadioMetadata implements Parcelable {
NATIVE_KEY_MAPPING.put(NATIVE_KEY_GENRE, METADATA_KEY_GENRE);
NATIVE_KEY_MAPPING.put(NATIVE_KEY_ICON, METADATA_KEY_ICON);
NATIVE_KEY_MAPPING.put(NATIVE_KEY_ART, METADATA_KEY_ART);
+ NATIVE_KEY_MAPPING.put(NATIVE_KEY_CLOCK, METADATA_KEY_CLOCK);
+ }
+
+ /**
+ * Provides a Clock that can be used to describe time as provided by the Radio.
+ *
+ * The clock is defined by the seconds since epoch at the UTC + 0 timezone
+ * and timezone offset from UTC + 0 represented in number of minutes.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final class Clock implements Parcelable {
+ private final long mUtcEpochSeconds;
+ private final int mTimezoneOffsetMinutes;
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeLong(mUtcEpochSeconds);
+ out.writeInt(mTimezoneOffsetMinutes);
+ }
+
+ public static final Parcelable.Creator<Clock> CREATOR
+ = new Parcelable.Creator<Clock>() {
+ public Clock createFromParcel(Parcel in) {
+ return new Clock(in);
+ }
+
+ public Clock[] newArray(int size) {
+ return new Clock[size];
+ }
+ };
+
+ public Clock(long utcEpochSeconds, int timezoneOffsetMinutes) {
+ mUtcEpochSeconds = utcEpochSeconds;
+ mTimezoneOffsetMinutes = timezoneOffsetMinutes;
+ }
+
+ private Clock(Parcel in) {
+ mUtcEpochSeconds = in.readLong();
+ mTimezoneOffsetMinutes = in.readInt();
+ }
+
+ public long getUtcEpochSeconds() {
+ return mUtcEpochSeconds;
+ }
+
+ public int getTimezoneOffsetMinutes() {
+ return mTimezoneOffsetMinutes;
+ }
}
private final Bundle mBundle;
@@ -212,6 +273,17 @@ public final class RadioMetadata implements Parcelable {
return bmp;
}
+ public Clock getClock(String key) {
+ Clock clock = null;
+ try {
+ clock = mBundle.getParcelable(key);
+ } catch (Exception e) {
+ // ignore, value was not a clock.
+ Log.w(TAG, "Failed to retrieve a key as Clock.", e);
+ }
+ return clock;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -389,6 +461,27 @@ public final class RadioMetadata implements Parcelable {
}
/**
+ * Put a {@link RadioMetadata.Clock} into the meta data. Custom keys may be used, but if the
+ * METADATA_KEYs defined in this class are used they may only be one of the following:
+ * <ul>
+ * <li>{@link #MEADATA_KEY_CLOCK}</li>
+ * </ul>
+ *
+ * @param utcSecondsSinceEpoch Number of seconds since epoch for UTC + 0 timezone.
+ * @param timezoneOffsetInMinutes Offset of timezone from UTC + 0 in minutes.
+ * @return the same Builder instance.
+ */
+ public Builder putClock(String key, long utcSecondsSinceEpoch, int timezoneOffsetMinutes) {
+ if (!METADATA_KEYS_TYPE.containsKey(key) ||
+ METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_CLOCK) {
+ throw new IllegalArgumentException("The " + key
+ + " key cannot be used to put a RadioMetadata.Clock.");
+ }
+ mBundle.putParcelable(key, new Clock(utcSecondsSinceEpoch, timezoneOffsetMinutes));
+ return this;
+ }
+
+ /**
* Creates a {@link RadioMetadata} instance with the specified fields.
*
* @return a new {@link RadioMetadata} object
@@ -446,4 +539,16 @@ public final class RadioMetadata implements Parcelable {
return 0;
}
}
+
+ int putClockFromNative(int nativeKey, long utcEpochSeconds, int timezoneOffsetInMinutes) {
+ Log.d(TAG, "putClockFromNative()");
+ String key = getKeyFromNativeKey(nativeKey);
+ if (!METADATA_KEYS_TYPE.containsKey(key) ||
+ METADATA_KEYS_TYPE.get(key) != METADATA_TYPE_CLOCK) {
+ return -1;
+ }
+ mBundle.putParcelable(key, new RadioMetadata.Clock(
+ utcEpochSeconds, timezoneOffsetInMinutes));
+ return 0;
+ }
}
diff --git a/core/java/android/hardware/radio/RadioModule.java b/core/java/android/hardware/radio/RadioModule.java
index 15916ae60c59..fc7d0d2afbd4 100644
--- a/core/java/android/hardware/radio/RadioModule.java
+++ b/core/java/android/hardware/radio/RadioModule.java
@@ -89,6 +89,7 @@ public class RadioModule extends RadioTuner {
static final int EVENT_METADATA = 4;
static final int EVENT_TA = 5;
static final int EVENT_AF_SWITCH = 6;
+ static final int EVENT_EA = 7;
static final int EVENT_CONTROL = 100;
static final int EVENT_SERVER_DIED = 101;
@@ -170,6 +171,10 @@ public class RadioModule extends RadioTuner {
callback.onTrafficAnnouncement(msg.arg2 == 1);
}
break;
+ case EVENT_EA:
+ if (callback != null) {
+ callback.onEmergencyAnnouncement(msg.arg2 == 1);
+ }
case EVENT_CONTROL:
if (callback != null) {
callback.onControlChanged(msg.arg2 == 1);
diff --git a/core/java/android/hardware/radio/RadioTuner.java b/core/java/android/hardware/radio/RadioTuner.java
index 376900a03444..5c82555663de 100644
--- a/core/java/android/hardware/radio/RadioTuner.java
+++ b/core/java/android/hardware/radio/RadioTuner.java
@@ -281,6 +281,10 @@ public abstract class RadioTuner {
*/
public void onTrafficAnnouncement(boolean active) {}
/**
+ * onEmergencyAnnouncement() is called when an emergency annoucement starts and stops.
+ */
+ public void onEmergencyAnnouncement(boolean active) {}
+ /**
* onAntennaState() is called when the antenna is connected or disconnected.
*/
public void onAntennaState(boolean connected) {}
diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp
index b9dd77af8c8a..5b92a6e208e2 100644
--- a/core/jni/android_hardware_Radio.cpp
+++ b/core/jni/android_hardware_Radio.cpp
@@ -93,6 +93,7 @@ static struct {
jfieldID mRds;
jfieldID mTa;
jfieldID mAf;
+ jfieldID mEa;
} gRadioFmBandConfigFields;
static const char* const kRadioAmBandConfigClassPathName =
@@ -117,6 +118,7 @@ static struct {
jmethodID putIntFromNative;
jmethodID putStringFromNative;
jmethodID putBitmapFromNative;
+ jmethodID putClockFromNative;
} gRadioMetadataMethods;
static Mutex gLock;
@@ -171,7 +173,8 @@ static jint convertBandDescriptorFromNative(JNIEnv *env,
nBandconfig->band.fm.stereo,
nBandconfig->band.fm.rds != RADIO_RDS_NONE,
nBandconfig->band.fm.ta,
- nBandconfig->band.fm.af);
+ nBandconfig->band.fm.af,
+ nBandconfig->band.fm.ea);
} else if (nBandconfig->band.type == RADIO_BAND_AM) {
*jBandDescriptor = env->NewObject(gRadioAmBandDescriptorClass, gRadioAmBandDescriptorCstor,
nBandconfig->region, nBandconfig->band.type,
@@ -205,7 +208,8 @@ static jint convertBandConfigFromNative(JNIEnv *env,
nBandconfig->band.fm.stereo,
nBandconfig->band.fm.rds != RADIO_RDS_NONE,
nBandconfig->band.fm.ta,
- nBandconfig->band.fm.af);
+ nBandconfig->band.fm.af,
+ nBandconfig->band.fm.ea);
} else if (nBandconfig->band.type == RADIO_BAND_AM) {
*jBandConfig = env->NewObject(gRadioAmBandConfigClass, gRadioAmBandConfigCstor,
nBandconfig->region, nBandconfig->band.type,
@@ -284,6 +288,18 @@ static jint convertMetadataFromNative(JNIEnv *env,
}
env->DeleteLocalRef(jData);
} break;
+ case RADIO_METADATA_TYPE_CLOCK: {
+ ALOGV("%s RADIO_METADATA_TYPE_CLOCK %d", __FUNCTION__, key);
+ radio_metadata_clock_t *clock = (radio_metadata_clock_t *) value;
+ jStatus =
+ env->CallIntMethod(*jMetadata,
+ gRadioMetadataMethods.putClockFromNative,
+ key, (jint) clock->utc_seconds_since_epoch,
+ (jint) clock->timezone_offset_in_minutes);
+ if (jStatus == 0) {
+ jCount++;
+ }
+ } break;
}
}
return jCount;
@@ -351,6 +367,7 @@ static jint convertBandConfigToNative(JNIEnv *env,
nBandconfig->region);
nBandconfig->band.fm.ta = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mTa);
nBandconfig->band.fm.af = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mAf);
+ nBandconfig->band.fm.ea = env->GetBooleanField(jBandConfig, gRadioFmBandConfigFields.mEa);
} else if (env->IsInstanceOf(jBandConfig, gRadioAmBandConfigClass)) {
nBandconfig->band.am.stereo =
env->GetBooleanField(jBandConfig, gRadioAmBandConfigFields.mStereo);
@@ -518,6 +535,7 @@ void JNIRadioCallback::onEvent(struct radio_event *event)
break;
case RADIO_EVENT_ANTENNA:
case RADIO_EVENT_TA:
+ case RADIO_EVENT_EA:
case RADIO_EVENT_CONTROL:
jArg2 = event->on ? 1 : 0;
break;
@@ -878,7 +896,7 @@ int register_android_hardware_Radio(JNIEnv *env)
jclass fmBandDescriptorClass = FindClassOrDie(env, kRadioFmBandDescriptorClassPathName);
gRadioFmBandDescriptorClass = MakeGlobalRefOrDie(env, fmBandDescriptorClass);
gRadioFmBandDescriptorCstor = GetMethodIDOrDie(env, fmBandDescriptorClass, "<init>",
- "(IIIIIZZZZ)V");
+ "(IIIIIZZZZZ)V");
jclass amBandDescriptorClass = FindClassOrDie(env, kRadioAmBandDescriptorClassPathName);
gRadioAmBandDescriptorClass = MakeGlobalRefOrDie(env, amBandDescriptorClass);
@@ -894,11 +912,13 @@ int register_android_hardware_Radio(JNIEnv *env)
jclass fmBandConfigClass = FindClassOrDie(env, kRadioFmBandConfigClassPathName);
gRadioFmBandConfigClass = MakeGlobalRefOrDie(env, fmBandConfigClass);
gRadioFmBandConfigCstor = GetMethodIDOrDie(env, fmBandConfigClass, "<init>",
- "(IIIIIZZZZ)V");
+ "(IIIIIZZZZZ)V");
gRadioFmBandConfigFields.mStereo = GetFieldIDOrDie(env, fmBandConfigClass, "mStereo", "Z");
gRadioFmBandConfigFields.mRds = GetFieldIDOrDie(env, fmBandConfigClass, "mRds", "Z");
gRadioFmBandConfigFields.mTa = GetFieldIDOrDie(env, fmBandConfigClass, "mTa", "Z");
gRadioFmBandConfigFields.mAf = GetFieldIDOrDie(env, fmBandConfigClass, "mAf", "Z");
+ gRadioFmBandConfigFields.mEa =
+ GetFieldIDOrDie(env, fmBandConfigClass, "mEa", "Z");
jclass amBandConfigClass = FindClassOrDie(env, kRadioAmBandConfigClassPathName);
@@ -924,6 +944,9 @@ int register_android_hardware_Radio(JNIEnv *env)
gRadioMetadataMethods.putBitmapFromNative = GetMethodIDOrDie(env, metadataClass,
"putBitmapFromNative",
"(I[B)I");
+ gRadioMetadataMethods.putClockFromNative = GetMethodIDOrDie(env, metadataClass,
+ "putClockFromNative",
+ "(III)I");
RegisterMethodsOrDie(env, kRadioManagerClassPathName, gMethods, NELEM(gMethods));