From e5f5b8b4848b5e72b22996246e829cd816e85d7d Mon Sep 17 00:00:00 2001 From: David Zhao Date: Mon, 17 Apr 2023 17:25:22 -0700 Subject: [PATCH] Update TvInputJNI for setTvMessageEnabled Bug: 278628657 Test: atest TvInputServiceTest Change-Id: I18106fc2af445f761d5c158b6b1d3b6f81e37d6b --- .../com/android/server/tv/TvInputHal.java | 24 +++++++++++-- .../server/tv/TvInputHardwareManager.java | 34 +++++++++++++++++++ .../server/tv/TvInputManagerService.java | 8 ++++- .../jni/com_android_server_tv_TvInputHal.cpp | 25 ++++++++------ services/core/jni/tvinput/JTvInputHal.cpp | 22 ++++++++++++ services/core/jni/tvinput/JTvInputHal.h | 6 ++++ 6 files changed, 104 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index b6ab35169fc4f..4bbca335b8e30 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -27,9 +27,6 @@ import android.util.SparseArray; import android.util.SparseIntArray; import android.view.Surface; -import java.util.LinkedList; -import java.util.Queue; - /** * Provides access to the low-level TV input hardware abstraction layer. */ @@ -64,6 +61,8 @@ final class TvInputHal implements Handler.Callback { private static native TvStreamConfig[] nativeGetStreamConfigs(long ptr, int deviceId, int generation); private static native void nativeClose(long ptr); + private static native int nativeSetTvMessageEnabled(long ptr, int deviceId, int streamId, + int type, boolean enabled); private final Object mLock = new Object(); private long mPtr = 0; @@ -100,6 +99,25 @@ final class TvInputHal implements Handler.Callback { } } + public int setTvMessageEnabled(int deviceId, TvStreamConfig streamConfig, int type, + boolean enabled) { + synchronized (mLock) { + if (mPtr == 0) { + return ERROR_NO_INIT; + } + int generation = mStreamConfigGenerations.get(deviceId, 0); + if (generation != streamConfig.getGeneration()) { + return ERROR_STALE_CONFIG; + } + if (nativeSetTvMessageEnabled(mPtr, deviceId, streamConfig.getStreamId(), type, + enabled) == 0) { + return SUCCESS; + } else { + return ERROR_UNKNOWN; + } + } + } + public int removeStream(int deviceId, TvStreamConfig streamConfig) { synchronized (mLock) { if (mPtr == 0) { diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java index 3cb183fe07e22..580b4d62bdd06 100755 --- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java +++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java @@ -491,6 +491,27 @@ class TvInputHardwareManager implements TvInputHal.Callback { return configsList; } + public boolean setTvMessageEnabled(String inputId, int type, + boolean enabled) { + synchronized (mLock) { + int deviceId = findDeviceIdForInputIdLocked(inputId); + if (deviceId < 0) { + Slog.e(TAG, "Invalid inputId : " + inputId); + return false; + } + + Connection connection = mConnections.get(deviceId); + boolean success = true; + for (TvStreamConfig config : connection.getConfigsLocked()) { + success = success + && mHal.setTvMessageEnabled(deviceId, config, type, enabled) + == TvInputHal.SUCCESS; + } + + return success; + } + } + /** * Take a snapshot of the given TV input into the provided Surface. */ @@ -766,6 +787,7 @@ class TvInputHardwareManager implements TvInputHal.Callback { + " mHardwareInfo: " + mHardwareInfo + ", mInfo: " + mInfo + ", mCallback: " + mCallback + + ", mHardware: " + mHardware + ", mConfigs: " + Arrays.toString(mConfigs) + ", mCallingUid: " + mCallingUid + ", mResolvedUserId: " + mResolvedUserId @@ -1102,6 +1124,18 @@ class TvInputHardwareManager implements TvInputHal.Callback { } } + private boolean setTvMessageEnabled(int deviceId, TvStreamConfig streamConfig, int type, + boolean enabled) { + synchronized (mImplLock) { + if (mReleased) { + return false; + } + + return mHal.setTvMessageEnabled(deviceId, streamConfig, type, enabled) + == TvInputHal.SUCCESS; + } + } + private boolean startCapture(Surface surface, TvStreamConfig config) { synchronized (mImplLock) { if (mReleased) { diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index fd203bbfe3b5a..88c9042c963e5 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -2154,6 +2154,9 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { + final String inputId = + getSessionStateLocked(sessionToken, callingUid, userId).inputId; + mTvInputHardwareManager.setTvMessageEnabled(inputId, type, enabled); getSessionLocked(sessionToken, callingUid, resolvedUserId) .setTvMessageEnabled(type, enabled); } catch (RemoteException | SessionNotFoundException e) { @@ -2711,7 +2714,10 @@ public final class TvInputManagerService extends SystemService { .audioAddress("0") .hdmiPortId(0) .build(); - mTvInputHardwareManager.onDeviceAvailable(info, null); + TvStreamConfig[] configs = { + new TvStreamConfig.Builder().streamId(19001) + .generation(1).maxHeight(600).maxWidth(800).type(1).build()}; + mTvInputHardwareManager.onDeviceAvailable(info, configs); } /** diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp index a8d2f4e9be5b2..a8806b5ef643c 100644 --- a/services/core/jni/com_android_server_tv_TvInputHal.cpp +++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp @@ -84,23 +84,26 @@ static jobjectArray nativeGetStreamConfigs(JNIEnv* env, jclass clazz, return result; } +static int nativeSetTvMessageEnabled(JNIEnv* env, jclass clazz, jlong ptr, jint deviceId, + jint streamId, jint type, jboolean enabled) { + JTvInputHal* tvInputHal = (JTvInputHal*)ptr; + return tvInputHal->setTvMessageEnabled(deviceId, streamId, type, enabled); +} + static void nativeClose(JNIEnv* env, jclass clazz, jlong ptr) { JTvInputHal* tvInputHal = (JTvInputHal*)ptr; delete tvInputHal; } static const JNINativeMethod gTvInputHalMethods[] = { - /* name, signature, funcPtr */ - { "nativeOpen", "(Landroid/os/MessageQueue;)J", - (void*) nativeOpen }, - { "nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I", - (void*) nativeAddOrUpdateStream }, - { "nativeRemoveStream", "(JII)I", - (void*) nativeRemoveStream }, - { "nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;", - (void*) nativeGetStreamConfigs }, - { "nativeClose", "(J)V", - (void*) nativeClose }, + /* name, signature, funcPtr */ + {"nativeOpen", "(Landroid/os/MessageQueue;)J", (void*)nativeOpen}, + {"nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I", (void*)nativeAddOrUpdateStream}, + {"nativeRemoveStream", "(JII)I", (void*)nativeRemoveStream}, + {"nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;", + (void*)nativeGetStreamConfigs}, + {"nativeSetTvMessageEnabled", "(JIIIZ)I", (void*)nativeSetTvMessageEnabled}, + {"nativeClose", "(J)V", (void*)nativeClose}, }; #define FIND_CLASS(var, className) \ diff --git a/services/core/jni/tvinput/JTvInputHal.cpp b/services/core/jni/tvinput/JTvInputHal.cpp index 98e6b19ce410f..6bb52174fcb25 100644 --- a/services/core/jni/tvinput/JTvInputHal.cpp +++ b/services/core/jni/tvinput/JTvInputHal.cpp @@ -144,6 +144,17 @@ int JTvInputHal::removeStream(int deviceId, int streamId) { return NO_ERROR; } +int JTvInputHal::setTvMessageEnabled(int deviceId, int streamId, int type, bool enabled) { + Mutex::Autolock autoLock(&mLock); + if (!mTvInput->setTvMessageEnabled(deviceId, streamId, + static_cast(type), enabled) + .isOk()) { + ALOGE("Error in setTvMessageEnabled. device id:%d stream id:%d", deviceId, streamId); + return BAD_VALUE; + } + return NO_ERROR; +} + const std::vector JTvInputHal::getStreamConfigs(int deviceId) { std::vector list; ::ndk::ScopedAStatus status = mTvInput->getStreamConfigurations(deviceId, &list); @@ -384,4 +395,15 @@ JTvInputHal::ITvInputWrapper::ITvInputWrapper(std::shared_ptr& aid } } +::ndk::ScopedAStatus JTvInputHal::ITvInputWrapper::setTvMessageEnabled(int32_t deviceId, + int32_t streamId, + TvMessageEventType in_type, + bool enabled) { + if (mIsHidl) { + return ::ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } else { + return mAidlTvInput->setTvMessageEnabled(deviceId, streamId, in_type, enabled); + } +} + } // namespace android diff --git a/services/core/jni/tvinput/JTvInputHal.h b/services/core/jni/tvinput/JTvInputHal.h index 984407a0c37c2..e29da79d62dd8 100644 --- a/services/core/jni/tvinput/JTvInputHal.h +++ b/services/core/jni/tvinput/JTvInputHal.h @@ -44,6 +44,8 @@ using ::aidl::android::hardware::tv::input::BnTvInputCallback; using ::aidl::android::hardware::tv::input::CableConnectionStatus; using ::aidl::android::hardware::tv::input::TvInputEventType; using ::aidl::android::hardware::tv::input::TvInputType; +using ::aidl::android::hardware::tv::input::TvMessageEvent; +using ::aidl::android::hardware::tv::input::TvMessageEventType; using AidlAudioDevice = ::aidl::android::media::audio::common::AudioDevice; using AidlAudioDeviceAddress = ::aidl::android::media::audio::common::AudioDeviceAddress; @@ -53,6 +55,7 @@ using AidlNativeHandle = ::aidl::android::hardware::common::NativeHandle; using AidlTvInputDeviceInfo = ::aidl::android::hardware::tv::input::TvInputDeviceInfo; using AidlTvInputEvent = ::aidl::android::hardware::tv::input::TvInputEvent; using AidlTvMessageEvent = ::aidl::android::hardware::tv::input::TvMessageEvent; +using AidlTvMessageEventType = ::aidl::android::hardware::tv::input::TvMessageEventType; using AidlTvStreamConfig = ::aidl::android::hardware::tv::input::TvStreamConfig; extern gTvInputHalClassInfoType gTvInputHalClassInfo; @@ -69,6 +72,7 @@ public: static JTvInputHal* createInstance(JNIEnv* env, jobject thiz, const sp& looper); int addOrUpdateStream(int deviceId, int streamId, const sp& surface); + int setTvMessageEnabled(int deviceId, int streamId, int type, bool enabled); int removeStream(int deviceId, int streamId); const std::vector getStreamConfigs(int deviceId); @@ -150,6 +154,8 @@ private: ::ndk::ScopedAStatus openStream(int32_t in_deviceId, int32_t in_streamId, AidlNativeHandle* _aidl_return); ::ndk::ScopedAStatus closeStream(int32_t in_deviceId, int32_t in_streamId); + ::ndk::ScopedAStatus setTvMessageEnabled(int32_t deviceId, int32_t streamId, + TvMessageEventType in_type, bool enabled); private: ::ndk::ScopedAStatus hidlSetCallback(const std::shared_ptr& in_callback);