Support frontend status readiness query.
The caller could use it to check whether frontend status is ready to
read or not.
Bug: 171540820
Fix: 171540820
Test: atest android.media.tv.tuner.cts on AIDL and HILD HALs
Change-Id: I55610e02412d6043e7fab91d1a2bf187a8e5e3ba
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 41f3a678..68dd8d0 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -1631,6 +1631,36 @@
return (jint)mFeClient->removeOutputPid(pid);
}
+jobjectArray JTuner::getFrontendStatusReadiness(jintArray types) {
+ if (mFeClient == nullptr) {
+ ALOGE("frontend is not initialized");
+ return nullptr;
+ }
+
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ jsize size = env->GetArrayLength(types);
+ jint intTypes[size];
+ env->GetIntArrayRegion(types, 0, size, intTypes);
+ std::vector<FrontendStatusType> v;
+ for (int i = 0; i < size; i++) {
+ v.push_back(static_cast<FrontendStatusType>(intTypes[i]));
+ }
+
+ vector<FrontendStatusReadiness> readiness = mFeClient->getStatusReadiness(v);
+ if (readiness.size() < size) {
+ return nullptr;
+ }
+
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatusReadiness");
+ jmethodID init = env->GetMethodID(clazz, "<init>", "(II)V");
+ jobjectArray valObj = env->NewObjectArray(size, clazz, nullptr);
+ for (int i = 0; i < size; i++) {
+ jobject readinessObj = env->NewObject(clazz, init, intTypes[i], readiness[i]);
+ env->SetObjectArrayElement(valObj, i, readinessObj);
+ }
+ return valObj;
+}
+
jobject JTuner::openLnbByHandle(int handle) {
if (mTunerClient == nullptr) {
return nullptr;
@@ -4389,6 +4419,12 @@
return tuner->removeOutputPid(pid);
}
+static jobjectArray android_media_tv_Tuner_get_frontend_status_readiness(JNIEnv *env, jobject thiz,
+ jintArray types) {
+ sp<JTuner> tuner = getTuner(env, thiz);
+ return tuner->getFrontendStatusReadiness(types);
+}
+
static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) {
sp<JTuner> tuner = getTuner(env, thiz);
return tuner->closeFrontend();
@@ -4710,6 +4746,9 @@
(void *)android_media_tv_Tuner_get_maximum_frontends },
{ "nativeRemoveOutputPid", "(I)I",
(void *)android_media_tv_Tuner_remove_output_pid },
+ { "nativeGetFrontendStatusReadiness",
+ "([I)[Landroid/media/tv/tuner/frontend/FrontendStatusReadiness;",
+ (void *)android_media_tv_Tuner_get_frontend_status_readiness },
};
static const JNINativeMethod gFilterMethods[] = {
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index e9475dc..03e7fa9 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -206,6 +206,7 @@
jint setMaxNumberOfFrontends(int32_t frontendType, int32_t maxNumber);
int32_t getMaxNumberOfFrontends(int32_t frontendType);
jint removeOutputPid(int32_t pid);
+ jobjectArray getFrontendStatusReadiness(jintArray types);
jweak getObject();
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index bea0342..c6337ec 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -152,6 +152,16 @@
return Result::INVALID_STATE;
}
+vector<FrontendStatusReadiness> FrontendClient::getStatusReadiness(
+ const std::vector<FrontendStatusType>& statusTypes) {
+ vector<FrontendStatusReadiness> readiness;
+ if (mTunerFrontend != nullptr) {
+ mTunerFrontend->getFrontendStatusReadiness(statusTypes, &readiness);
+ }
+
+ return readiness;
+}
+
shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
return mTunerFrontend;
}
diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h
index c6838c8..85f6d56 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -35,6 +35,7 @@
using ::aidl::android::hardware::tv::tuner::FrontendScanType;
using ::aidl::android::hardware::tv::tuner::FrontendSettings;
using ::aidl::android::hardware::tv::tuner::FrontendStatus;
+using ::aidl::android::hardware::tv::tuner::FrontendStatusReadiness;
using ::aidl::android::hardware::tv::tuner::FrontendStatusType;
using ::aidl::android::hardware::tv::tuner::FrontendType;
using ::aidl::android::hardware::tv::tuner::Result;
@@ -125,6 +126,12 @@
*/
Result removeOutputPid(int32_t pid);
+ /**
+ * Gets Frontend Status Readiness statuses for given status types.
+ */
+ vector<FrontendStatusReadiness> getStatusReadiness(
+ const std::vector<FrontendStatusType>& types);
+
int32_t getId();
shared_ptr<ITunerFrontend> getAidlFrontend();