Merge "Add frontend constants and callback"

This commit is contained in:
TreeHugger Robot
2019-10-30 02:06:59 +00:00
committed by Android (Google) Code Review
5 changed files with 152 additions and 0 deletions

View File

@@ -307,6 +307,7 @@ java_library {
"android.hardware.thermal-V1.1-java",
"android.hardware.thermal-V2.0-java",
"android.hardware.tv.input-V1.0-java-constants",
"android.hardware.tv.tuner-V1.0-java-constants",
"android.hardware.usb-V1.0-java-constants",
"android.hardware.usb-V1.1-java-constants",
"android.hardware.usb-V1.2-java-constants",

View File

@@ -16,6 +16,13 @@
package android.media.tv.tuner;
import android.annotation.IntDef;
import android.hardware.tv.tuner.V1_0.Constants;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
* Tuner is used to interact with tuner devices.
*
@@ -25,11 +32,41 @@ public final class Tuner implements AutoCloseable {
private static final String TAG = "MediaTvTuner";
private static final boolean DEBUG = false;
@Retention(RetentionPolicy.SOURCE)
@IntDef({FRONTEND_TYPE_UNDEFINED, FRONTEND_TYPE_ANALOG, FRONTEND_TYPE_ATSC, FRONTEND_TYPE_ATSC3,
FRONTEND_TYPE_DVBC, FRONTEND_TYPE_DVBS, FRONTEND_TYPE_DVBT, FRONTEND_TYPE_ISDBS,
FRONTEND_TYPE_ISDBS3, FRONTEND_TYPE_ISDBT})
public @interface FrontendType {}
public static final int FRONTEND_TYPE_UNDEFINED = Constants.FrontendType.UNDEFINED;
public static final int FRONTEND_TYPE_ANALOG = Constants.FrontendType.ANALOG;
public static final int FRONTEND_TYPE_ATSC = Constants.FrontendType.ATSC;
public static final int FRONTEND_TYPE_ATSC3 = Constants.FrontendType.ATSC3;
public static final int FRONTEND_TYPE_DVBC = Constants.FrontendType.DVBC;
public static final int FRONTEND_TYPE_DVBS = Constants.FrontendType.DVBS;
public static final int FRONTEND_TYPE_DVBT = Constants.FrontendType.DVBT;
public static final int FRONTEND_TYPE_ISDBS = Constants.FrontendType.ISDBS;
public static final int FRONTEND_TYPE_ISDBS3 = Constants.FrontendType.ISDBS3;
public static final int FRONTEND_TYPE_ISDBT = Constants.FrontendType.ISDBT;
@Retention(RetentionPolicy.SOURCE)
@IntDef({FRONTEND_EVENT_TYPE_LOCKED, FRONTEND_EVENT_TYPE_NO_SIGNAL,
FRONTEND_EVENT_TYPE_LOST_LOCK})
public @interface FrontendEventType {}
public static final int FRONTEND_EVENT_TYPE_LOCKED = Constants.FrontendEventType.LOCKED;
public static final int FRONTEND_EVENT_TYPE_NO_SIGNAL = Constants.FrontendEventType.NO_SIGNAL;
public static final int FRONTEND_EVENT_TYPE_LOST_LOCK = Constants.FrontendEventType.LOST_LOCK;
static {
System.loadLibrary("media_tv_tuner");
nativeInit();
}
private FrontendCallback mFrontendCallback;
private List<Integer> mFrontendIds;
public Tuner() {
nativeSetup();
}
@@ -48,4 +85,48 @@ public final class Tuner implements AutoCloseable {
* Native setup.
*/
private native void nativeSetup();
/**
* Native method to get all frontend IDs.
*/
private native List<Integer> nativeGetFrontendIds();
/**
* Native method to open frontend of the given ID.
*/
private native Frontend nativeOpenFrontendById(int id);
/**
* Frontend Callback.
*/
public interface FrontendCallback {
/**
* Invoked when there is a frontend event.
*/
void onEvent(int frontendEventType);
}
protected static class Frontend {
int mId;
private Frontend(int id) {
mId = id;
}
}
private List<Integer> getFrontendIds() {
mFrontendIds = nativeGetFrontendIds();
return mFrontendIds;
}
private Frontend openFrontendById(int id) {
if (mFrontendIds == null) {
getFrontendIds();
}
if (!mFrontendIds.contains(id)) {
return null;
}
return nativeOpenFrontendById(id);
}
}

View File

@@ -132,6 +132,7 @@ cc_library_shared {
shared_libs: [
"android.hardware.tv.tuner@1.0",
"libandroid_runtime",
"libhidlbase",
"liblog",
"libutils",
],

View File

@@ -25,10 +25,13 @@
#pragma GCC diagnostic ignored "-Wunused-function"
using ::android::hardware::hidl_vec;
using ::android::hardware::tv::tuner::V1_0::ITuner;
using ::android::hardware::tv::tuner::V1_0::Result;
struct fields_t {
jfieldID context;
jmethodID frontendInitID;
};
static fields_t gFields;
@@ -69,6 +72,50 @@ sp<ITuner> JTuner::getTunerService() {
return mTuner;
}
jobject JTuner::getFrontendIds() {
ALOGD("JTuner::getFrontendIds()");
hidl_vec<FrontendId> feIds;
mTuner->getFrontendIds([&](Result, const hidl_vec<FrontendId>& frontendIds) {
feIds = frontendIds;
});
if (feIds.size() == 0) {
ALOGW("Frontend isn't available");
return NULL;
}
JNIEnv *env = AndroidRuntime::getJNIEnv();
jclass arrayListClazz = env->FindClass("java/util/ArrayList");
jmethodID arrayListAdd = env->GetMethodID(arrayListClazz, "add", "(Ljava/lang/Object;)Z");
jobject obj = env->NewObject(arrayListClazz, env->GetMethodID(arrayListClazz, "<init>", "()V"));
jclass integerClazz = env->FindClass("java/lang/Integer");
jmethodID intInit = env->GetMethodID(integerClazz, "<init>", "(I)V");
for (int i=0; i < feIds.size(); i++) {
jobject idObj = env->NewObject(integerClazz, intInit, feIds[i]);
env->CallBooleanMethod(obj, arrayListAdd, idObj);
}
return obj;
}
jobject JTuner::openFrontendById(int id) {
mTuner->openFrontendById(id, [&](Result, const sp<IFrontend>& frontend) {
mFe = frontend;
});
if (mFe == nullptr) {
ALOGE("Failed to open frontend");
return NULL;
}
jint jId = (jint) id;
JNIEnv *env = AndroidRuntime::getJNIEnv();
// TODO: add more fields to frontend
return env->NewObject(
env->FindClass("android/media/tv/tuner/Tuner$Frontend"),
gFields.frontendInitID,
(jint) jId);
}
} // namespace android
////////////////////////////////////////////////////////////////////////////////
@@ -99,6 +146,9 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) {
gFields.context = env->GetFieldID(clazz, "mNativeContext", "J");
CHECK(gFields.context != NULL);
jclass frontendClazz = env->FindClass("android/media/tv/tuner/Tuner$Frontend");
gFields.frontendInitID = env->GetMethodID(frontendClazz, "<init>", "(I)V");
}
static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) {
@@ -106,9 +156,23 @@ static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) {
setTuner(env,thiz, tuner);
}
static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz) {
sp<JTuner> tuner = getTuner(env, thiz);
return tuner->getFrontendIds();
}
static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject thiz, jint id) {
sp<JTuner> tuner = getTuner(env, thiz);
return tuner->openFrontendById(id);
}
static const JNINativeMethod gMethods[] = {
{ "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init },
{ "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup },
{ "nativeGetFrontendIds", "()Ljava/util/List;",
(void *)android_media_tv_Tuner_get_frontend_ids },
{ "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;",
(void *)android_media_tv_Tuner_open_frontend_by_id },
};
static int register_android_media_tv_Tuner(JNIEnv *env) {

View File

@@ -22,6 +22,8 @@
#include "jni.h"
using ::android::hardware::tv::tuner::V1_0::FrontendId;
using ::android::hardware::tv::tuner::V1_0::IFrontend;
using ::android::hardware::tv::tuner::V1_0::ITuner;
namespace android {
@@ -29,6 +31,8 @@ namespace android {
struct JTuner : public RefBase {
JTuner(JNIEnv *env, jobject thiz);
sp<ITuner> getTunerService();
jobject getFrontendIds();
jobject openFrontendById(int id);
protected:
virtual ~JTuner();
@@ -36,6 +40,7 @@ private:
jclass mClass;
jweak mObject;
static sp<ITuner> mTuner;
sp<IFrontend> mFe;
};
} // namespace android