diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index c05d148d50d85..87ebdbfbf4e8b 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -234,6 +234,7 @@ final class TvInputHal implements Handler.Callback { int type = msg.arg2; Bundle data = (Bundle) msg.obj; mCallback.onTvMessage(deviceId, type, data); + break; } default: diff --git a/services/core/jni/tvinput/JTvInputHal.cpp b/services/core/jni/tvinput/JTvInputHal.cpp index a3eb3906cc653..6782b5c8d7846 100644 --- a/services/core/jni/tvinput/JTvInputHal.cpp +++ b/services/core/jni/tvinput/JTvInputHal.cpp @@ -16,6 +16,8 @@ #include "JTvInputHal.h" +#include + namespace android { JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, std::shared_ptr tvInput, @@ -278,21 +280,27 @@ void JTvInputHal::onStreamConfigurationsChanged(int deviceId, int cableConnectio void JTvInputHal::onTvMessage(int deviceId, int streamId, AidlTvMessageEventType type, AidlTvMessage& message, signed char data[], int dataLength) { JNIEnv* env = AndroidRuntime::getJNIEnv(); - jobject bundle = env->NewObject(gBundleClassInfo.clazz, gBundleClassInfo.constructor); - const jsize len = static_cast(dataLength); - jbyteArray convertedData = env->NewByteArray(len); - env->SetByteArrayRegion(convertedData, 0, len, reinterpret_cast(data)); - env->CallObjectMethod(bundle, gBundleClassInfo.putString, - "android.media.tv.TvInputManager.subtype", message.subType.c_str()); - env->CallObjectMethod(bundle, gBundleClassInfo.putByteArray, - "android.media.tv.TvInputManager.raw_data", convertedData); - env->CallObjectMethod(bundle, gBundleClassInfo.putInt, - "android.media.tv.TvInputManager.group_id", message.groupId); - env->CallObjectMethod(bundle, gBundleClassInfo.putInt, - "android.media.tv.TvInputManager.stream_id", streamId); + ScopedLocalRef bundle(env, + env->NewObject(gBundleClassInfo.clazz, + gBundleClassInfo.constructor)); + ScopedLocalRef convertedData(env, env->NewByteArray(dataLength)); + env->SetByteArrayRegion(convertedData.get(), 0, dataLength, reinterpret_cast(data)); + std::string key = "android.media.tv.TvInputManager.raw_data"; + ScopedLocalRef jkey(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putByteArray, jkey.get(), + convertedData.get()); + ScopedLocalRef subtype(env, env->NewStringUTF(message.subType.c_str())); + key = "android.media.tv.TvInputManager.subtype"; + jkey = ScopedLocalRef(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putString, jkey.get(), subtype.get()); + key = "android.media.tv.TvInputManager.group_id"; + jkey = ScopedLocalRef(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putInt, jkey.get(), message.groupId); + key = "android.media.tv.TvInputManager.stream_id"; + jkey = ScopedLocalRef(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putInt, jkey.get(), streamId); env->CallVoidMethod(mThiz, gTvInputHalClassInfo.tvMessageReceived, deviceId, - static_cast(type), bundle); - env->DeleteLocalRef(convertedData); + static_cast(type), bundle.get()); } void JTvInputHal::onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded) {