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

Commit 344b8860 authored by Yixiao Luo's avatar Yixiao Luo
Browse files

Split JNI TvInputCallback to separate AIDL and HIDL callbacks

Currently we have a single TvInputCallback class to inherit from both
AIDL and HIDL callback. This is causing problems when the
TvInputCallback object is dereferenced and the destructor of
TvInputCallback is called. Splitting into 2 separate callbacks of AIDL
and HIDL can fix the problem.

Bug: 300045634
Test: VtsHalTvInputV1_0TargetTest

Change-Id: I1b8a64f01807d4da60be9124f2cadcee9e7aa6ac
parent bdf96b34
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, std::shared_ptr<ITvInputWrap
    mThiz = env->NewWeakGlobalRef(thiz);
    mTvInput = tvInput;
    mLooper = looper;
    mTvInputCallback = ::ndk::SharedRefBase::make<TvInputCallback>(this);
    mTvInputCallback = std::shared_ptr<TvInputCallbackWrapper>(new TvInputCallbackWrapper(this));
    mTvInput->setCallback(mTvInputCallback);
}

@@ -443,18 +443,23 @@ void JTvInputHal::NotifyTvMessageHandler::handleMessage(const Message& message)
    }
}

JTvInputHal::TvInputCallback::TvInputCallback(JTvInputHal* hal) {
JTvInputHal::TvInputCallbackWrapper::TvInputCallbackWrapper(JTvInputHal* hal) {
    aidlTvInputCallback = ::ndk::SharedRefBase::make<AidlTvInputCallback>(hal);
    hidlTvInputCallback = sp<HidlTvInputCallback>::make(hal);
}

JTvInputHal::AidlTvInputCallback::AidlTvInputCallback(JTvInputHal* hal) {
    mHal = hal;
}

::ndk::ScopedAStatus JTvInputHal::TvInputCallback::notify(const AidlTvInputEvent& event) {
::ndk::ScopedAStatus JTvInputHal::AidlTvInputCallback::notify(const AidlTvInputEvent& event) {
    mHal->mLooper->sendMessage(new NotifyHandler(mHal,
                                                 TvInputEventWrapper::createEventWrapper(event)),
                               static_cast<int>(event.type));
    return ::ndk::ScopedAStatus::ok();
}

::ndk::ScopedAStatus JTvInputHal::TvInputCallback::notifyTvMessageEvent(
::ndk::ScopedAStatus JTvInputHal::AidlTvInputCallback::notifyTvMessageEvent(
        const AidlTvMessageEvent& event) {
    const std::string DEVICE_ID_SUBTYPE = "device_id";
    ::ndk::ScopedAStatus status = ::ndk::ScopedAStatus::ok();
@@ -487,11 +492,14 @@ JTvInputHal::ITvInputWrapper::ITvInputWrapper(std::shared_ptr<AidlITvInput>& aid
      : mIsHidl(false), mAidlTvInput(aidlTvInput) {}

::ndk::ScopedAStatus JTvInputHal::ITvInputWrapper::setCallback(
        const std::shared_ptr<TvInputCallback>& in_callback) {
        const std::shared_ptr<TvInputCallbackWrapper>& in_callback) {
    if (mIsHidl) {
        return hidlSetCallback(in_callback);
        in_callback->aidlTvInputCallback = nullptr;
        return hidlSetCallback(in_callback == nullptr ? nullptr : in_callback->hidlTvInputCallback);
    } else {
        return mAidlTvInput->setCallback(in_callback);
        in_callback->hidlTvInputCallback = nullptr;
        return mAidlTvInput->setCallback(in_callback == nullptr ? nullptr
                                                                : in_callback->aidlTvInputCallback);
    }
}

+21 −5
Original line number Diff line number Diff line
@@ -168,23 +168,39 @@ private:
        JTvInputHal* mHal;
    };

    class TvInputCallback : public HidlITvInputCallback, public BnTvInputCallback {
    class AidlTvInputCallback : public BnTvInputCallback {
    public:
        explicit TvInputCallback(JTvInputHal* hal);
        explicit AidlTvInputCallback(JTvInputHal* hal);
        ::ndk::ScopedAStatus notify(const AidlTvInputEvent& event) override;
        ::ndk::ScopedAStatus notifyTvMessageEvent(const AidlTvMessageEvent& event) override;

    private:
        JTvInputHal* mHal;
    };

    class HidlTvInputCallback : public HidlITvInputCallback {
    public:
        explicit HidlTvInputCallback(JTvInputHal* hal);
        Return<void> notify(const HidlTvInputEvent& event) override;

    private:
        JTvInputHal* mHal;
    };

    class TvInputCallbackWrapper {
    public:
        explicit TvInputCallbackWrapper(JTvInputHal* hal);
        std::shared_ptr<AidlTvInputCallback> aidlTvInputCallback;
        sp<HidlTvInputCallback> hidlTvInputCallback;
    };

    class ITvInputWrapper {
    public:
        ITvInputWrapper(std::shared_ptr<AidlITvInput>& aidlTvInput);
        ITvInputWrapper(sp<HidlITvInput>& hidlTvInput);

        ::ndk::ScopedAStatus setCallback(const std::shared_ptr<TvInputCallback>& in_callback);
        ::ndk::ScopedAStatus setCallback(
                const std::shared_ptr<TvInputCallbackWrapper>& in_callback);
        ::ndk::ScopedAStatus getStreamConfigurations(int32_t in_deviceId,
                                                     std::vector<AidlTvStreamConfig>* _aidl_return);
        ::ndk::ScopedAStatus openStream(int32_t in_deviceId, int32_t in_streamId,
@@ -198,7 +214,7 @@ private:
        ::ndk::ScopedAStatus getAidlInterfaceVersion(int32_t* _aidl_return);

    private:
        ::ndk::ScopedAStatus hidlSetCallback(const std::shared_ptr<TvInputCallback>& in_callback);
        ::ndk::ScopedAStatus hidlSetCallback(const sp<HidlTvInputCallback>& in_callback);
        ::ndk::ScopedAStatus hidlGetStreamConfigurations(
                int32_t in_deviceId, std::vector<AidlTvStreamConfig>* _aidl_return);
        ::ndk::ScopedAStatus hidlOpenStream(int32_t in_deviceId, int32_t in_streamId,
@@ -229,7 +245,7 @@ private:
    KeyedVector<int, KeyedVector<int, Connection> > mConnections;

    std::shared_ptr<ITvInputWrapper> mTvInput;
    std::shared_ptr<TvInputCallback> mTvInputCallback;
    std::shared_ptr<TvInputCallbackWrapper> mTvInputCallback;
};

} // namespace android
+7 −4
Original line number Diff line number Diff line
@@ -59,7 +59,11 @@ JTvInputHal::TvInputEventWrapper JTvInputHal::TvInputEventWrapper::createEventWr
    return event;
}

Return<void> JTvInputHal::TvInputCallback::notify(const HidlTvInputEvent& event) {
JTvInputHal::HidlTvInputCallback::HidlTvInputCallback(JTvInputHal* hal) {
    mHal = hal;
}

Return<void> JTvInputHal::HidlTvInputCallback::notify(const HidlTvInputEvent& event) {
    mHal->mLooper->sendMessage(new NotifyHandler(mHal,
                                                 TvInputEventWrapper::createEventWrapper(event)),
                               static_cast<int>(event.type));
@@ -70,9 +74,8 @@ JTvInputHal::ITvInputWrapper::ITvInputWrapper(sp<HidlITvInput>& hidlTvInput)
      : mIsHidl(true), mHidlTvInput(hidlTvInput) {}

::ndk::ScopedAStatus JTvInputHal::ITvInputWrapper::hidlSetCallback(
        const std::shared_ptr<TvInputCallback>& in_callback) {
    mHidlTvInput->setCallback(in_callback == nullptr ? nullptr
                                                     : sp<TvInputCallback>(in_callback.get()));
        const sp<HidlTvInputCallback>& in_callback) {
    mHidlTvInput->setCallback(in_callback);
    return ::ndk::ScopedAStatus::ok();
}