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

Commit 108a72a2 authored by chenhg's avatar chenhg Committed by Wally Yau
Browse files

hdmi_cec: deal with the framework side went away.

Register a death recipient to remove the callback if
the framework side died.

BUG: 67913697
Test: VTS
Change-Id: I51ce5c85c9ec5d1bc90cac72f314647e1075d657
parent 7e156d15
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -264,8 +264,7 @@ static_assert(HDMI_OPTION_SYSTEM_CEC_CONTROL == static_cast<int>(OptionKey::SYST

sp<IHdmiCecCallback> HdmiCec::mCallback = nullptr;

HdmiCec::HdmiCec(hdmi_cec_device_t* device) : mDevice(device) {
}
HdmiCec::HdmiCec(hdmi_cec_device_t* device) : mDevice(device) {}

// Methods from ::android::hardware::tv::cec::V1_0::IHdmiCec follow.
Return<Result> HdmiCec::addLogicalAddress(CecLogicalAddress addr) {
@@ -319,8 +318,16 @@ Return<SendMessageResult> HdmiCec::sendMessage(const CecMessage& message) {
}

Return<void> HdmiCec::setCallback(const sp<IHdmiCecCallback>& callback) {
    if (mCallback != nullptr) {
        mCallback->unlinkToDeath(this);
        mCallback = nullptr;
    }

    if (callback != nullptr) {
        mCallback = callback;
        mCallback->linkToDeath(this, 0 /*cookie*/);
        mDevice->register_event_callback(mDevice, eventCallback, nullptr);
    }
    return Void();
}

+7 −2
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp;

struct HdmiCec : public IHdmiCec {
struct HdmiCec : public IHdmiCec, public hidl_death_recipient {
    HdmiCec(hdmi_cec_device_t* device);
    // Methods from ::android::hardware::tv::cec::V1_0::IHdmiCec follow.
    Return<Result> addLogicalAddress(CecLogicalAddress addr)  override;
@@ -87,6 +87,11 @@ struct HdmiCec : public IHdmiCec {
        }
    }

    virtual void serviceDied(uint64_t /*cookie*/,
                             const wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
        setCallback(nullptr);
    }

   private:
    static sp<IHdmiCecCallback> mCallback;
    const hdmi_cec_device_t* mDevice;