Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 00137206 authored by Shubang Lu's avatar Shubang Lu Committed by Android (Google) Code Review
Browse files

Merge "Handle filter status callback"

parents b31c6af2 cdf30dec
Loading
Loading
Loading
Loading
+37 −2
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ public final class Tuner implements AutoCloseable {
    private static final boolean DEBUG = false;

    private static final int MSG_ON_FRONTEND_EVENT = 1;
    private static final int MSG_ON_FILTER_EVENT = 2;
    private static final int MSG_ON_FILTER_STATUS = 3;

    static {
        System.loadLibrary("media_tv_tuner");
@@ -86,6 +88,16 @@ public final class Tuner implements AutoCloseable {
        void onEvent(int frontendEventType);
    }

    /**
     * Frontend Callback.
     */
    public interface FilterCallback {
        /**
         * Invoked when filter status changed.
         */
        void onFilterStatus(int status);
    }

    @Nullable
    private EventHandler createEventHandler() {
        Looper looper;
@@ -110,6 +122,13 @@ public final class Tuner implements AutoCloseable {
                        mFrontend.mCallback.onEvent(msg.arg1);
                    }
                    break;
                case MSG_ON_FILTER_STATUS: {
                    Filter filter = (Filter) msg.obj;
                    if (filter.mCallback != null) {
                        filter.mCallback.onFilterStatus(msg.arg1);
                    }
                    break;
                }
                default:
                    // fall through
            }
@@ -171,13 +190,29 @@ public final class Tuner implements AutoCloseable {
    }

    protected class Filter {
        private long mNativeContext;
        private FilterCallback mCallback;
        int mId;
        private Filter(int id) {
            mId = id;
        }

        private void onFilterStatus(int status) {
            if (mHandler != null) {
                mHandler.sendMessage(
                        mHandler.obtainMessage(MSG_ON_FILTER_STATUS, status, 0, this));
            }
        }
    }

    private Filter openFilter(int type, int subType, int bufferSize) {
        return nativeOpenFilter(type, subType, bufferSize);
    private Filter openFilter(int type, int subType, int bufferSize, FilterCallback cb) {
        Filter filter = nativeOpenFilter(type, subType, bufferSize);
        if (filter != null) {
            filter.mCallback = cb;
            if (mHandler == null) {
                mHandler = createEventHandler();
            }
        }
        return filter;
    }
}
+43 −14
Original line number Diff line number Diff line
@@ -34,9 +34,11 @@ using ::android::hardware::tv::tuner::V1_0::Result;

struct fields_t {
    jfieldID context;
    jfieldID filterContext;
    jmethodID frontendInitID;
    jmethodID filterInitID;
    jmethodID onFrontendEventID;
    jmethodID onFilterStatusID;
};

static fields_t gFields;
@@ -48,11 +50,23 @@ Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /* filterEven
    ALOGD("FilterCallback::onFilterEvent");
    return Void();
}
Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus /*status*/) {
    ALOGD("FilterCallback::onFilterStatu");

Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus status) {
    ALOGD("FilterCallback::onFilterStatus");
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    env->CallVoidMethod(
            mFilter,
            gFields.onFilterStatusID,
            (jint)status);
    return Void();
}

void FilterCallback::setFilter(const jobject filter) {
    ALOGD("FilterCallback::setFilter");
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    mFilter = env->NewWeakGlobalRef(filter);
}

/////////////// FrontendCallback ///////////////////////

FrontendCallback::FrontendCallback(jweak tunerObj, FrontendId id) : mObject(tunerObj), mId(id) {}
@@ -186,27 +200,35 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) {
        }
    }

    sp<IFilter> f;
    mDemux->openFilter(type, bufferSize, new FilterCallback,
    sp<IFilter> filterSp;
    sp<FilterCallback> callback = new FilterCallback();
    mDemux->openFilter(type, bufferSize, callback,
            [&](Result, const sp<IFilter>& filter) {
                f = filter;
                filterSp = filter;
            });
    if (f == NULL) {
    if (filterSp == NULL) {
        ALOGD("Failed to open filter, type = %d", type.mainType);
        return NULL;
    }
    int fId;
    f->getId([&](Result, uint32_t filterId) {
    filterSp->getId([&](Result, uint32_t filterId) {
        fId = filterId;
    });
    mFilters[fId] = f;

    JNIEnv *env = AndroidRuntime::getJNIEnv();
    return env->NewObject(
    jobject filterObj =
            env->NewObject(
                    env->FindClass("android/media/tv/tuner/Tuner$Filter"),
                    gFields.filterInitID,
                    mObject,
                    (jint) fId);

    filterSp->incStrong(filterObj);
    env->SetLongField(filterObj, gFields.filterContext, (jlong)filterSp.get());

    callback->setFilter(filterObj);

    return filterObj;
}

}  // namespace android
@@ -233,6 +255,10 @@ static sp<JTuner> getTuner(JNIEnv *env, jobject thiz) {
    return (JTuner *)env->GetLongField(thiz, gFields.context);
}

static sp<IFilter> getFilter(JNIEnv *env, jobject filter) {
    return (IFilter *)env->GetLongField(filter, gFields.filterContext);
}

static void android_media_tv_Tuner_native_init(JNIEnv *env) {
    jclass clazz = env->FindClass("android/media/tv/tuner/Tuner");
    CHECK(clazz != NULL);
@@ -247,8 +273,11 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) {
            env->GetMethodID(frontendClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V");

    jclass filterClazz = env->FindClass("android/media/tv/tuner/Tuner$Filter");
    gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J");
    gFields.filterInitID =
            env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V");
    gFields.onFilterStatusID =
            env->GetMethodID(filterClazz, "onFilterStatus", "(I)V");
}

static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) {
+4 −1
Original line number Diff line number Diff line
@@ -44,6 +44,10 @@ namespace android {
struct FilterCallback : public IFilterCallback {
    virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
    virtual Return<void> onFilterStatus(const DemuxFilterStatus status);

    void setFilter(const jobject filter);
private:
    jweak mFilter;
};

struct FrontendCallback : public IFrontendCallback {
@@ -76,7 +80,6 @@ private:
    sp<IFrontend> mFe;
    sp<IDemux> mDemux;
    int mDemuxId;
    std::unordered_map<int, sp<IFilter>> mFilters;
};

}  // namespace android