diff options
-rw-r--r-- | services/core/java/com/android/server/tv/TvInputHal.java | 1 | ||||
-rw-r--r-- | services/core/jni/tvinput/JTvInputHal.cpp | 36 |
2 files changed, 23 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index c05d148d50d8..87ebdbfbf4e8 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 a3eb3906cc65..6782b5c8d784 100644 --- a/services/core/jni/tvinput/JTvInputHal.cpp +++ b/services/core/jni/tvinput/JTvInputHal.cpp @@ -16,6 +16,8 @@ #include "JTvInputHal.h" +#include <nativehelper/ScopedLocalRef.h> + namespace android { JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, std::shared_ptr<ITvInputWrapper> 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<jsize>(dataLength); - jbyteArray convertedData = env->NewByteArray(len); - env->SetByteArrayRegion(convertedData, 0, len, reinterpret_cast<const jbyte*>(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<jobject> bundle(env, + env->NewObject(gBundleClassInfo.clazz, + gBundleClassInfo.constructor)); + ScopedLocalRef<jbyteArray> convertedData(env, env->NewByteArray(dataLength)); + env->SetByteArrayRegion(convertedData.get(), 0, dataLength, reinterpret_cast<jbyte*>(data)); + std::string key = "android.media.tv.TvInputManager.raw_data"; + ScopedLocalRef<jstring> jkey(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putByteArray, jkey.get(), + convertedData.get()); + ScopedLocalRef<jstring> subtype(env, env->NewStringUTF(message.subType.c_str())); + key = "android.media.tv.TvInputManager.subtype"; + jkey = ScopedLocalRef<jstring>(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<jstring>(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<jstring>(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putInt, jkey.get(), streamId); env->CallVoidMethod(mThiz, gTvInputHalClassInfo.tvMessageReceived, deviceId, - static_cast<int>(type), bundle); - env->DeleteLocalRef(convertedData); + static_cast<jint>(type), bundle.get()); } void JTvInputHal::onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded) { |