diff options
author | chenhg <chenhg@synaptics.com> | 2017-10-17 17:06:50 -0700 |
---|---|---|
committer | Wally Yau <wyau@google.com> | 2017-11-03 11:39:33 -0700 |
commit | 108a72a20a72ef96ce1fc046493ea1c0ac8afce7 (patch) | |
tree | 39e887cf1781247d891e2c09d1c1c1dcfdc372b8 /tv | |
parent | 7e156d15121b26537b6a9dbe8e5539e45cd616a9 (diff) | |
download | android_hardware_interfaces-108a72a20a72ef96ce1fc046493ea1c0ac8afce7.tar.gz android_hardware_interfaces-108a72a20a72ef96ce1fc046493ea1c0ac8afce7.tar.bz2 android_hardware_interfaces-108a72a20a72ef96ce1fc046493ea1c0ac8afce7.zip |
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
Diffstat (limited to 'tv')
-rw-r--r-- | tv/cec/1.0/default/HdmiCec.cpp | 15 | ||||
-rw-r--r-- | tv/cec/1.0/default/HdmiCec.h | 9 |
2 files changed, 18 insertions, 6 deletions
diff --git a/tv/cec/1.0/default/HdmiCec.cpp b/tv/cec/1.0/default/HdmiCec.cpp index ebe26816b..171bdfe04 100644 --- a/tv/cec/1.0/default/HdmiCec.cpp +++ b/tv/cec/1.0/default/HdmiCec.cpp @@ -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) { - mCallback = callback; - mDevice->register_event_callback(mDevice, eventCallback, nullptr); + 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(); } diff --git a/tv/cec/1.0/default/HdmiCec.h b/tv/cec/1.0/default/HdmiCec.h index 34a3bb081..0133abc08 100644 --- a/tv/cec/1.0/default/HdmiCec.h +++ b/tv/cec/1.0/default/HdmiCec.h @@ -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,7 +87,12 @@ struct HdmiCec : public IHdmiCec { } } -private: + 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; }; |