summaryrefslogtreecommitdiffstats
path: root/tv
diff options
context:
space:
mode:
authorchenhg <chenhg@synaptics.com>2017-10-17 17:06:50 -0700
committerWally Yau <wyau@google.com>2017-11-03 11:39:33 -0700
commit108a72a20a72ef96ce1fc046493ea1c0ac8afce7 (patch)
tree39e887cf1781247d891e2c09d1c1c1dcfdc372b8 /tv
parent7e156d15121b26537b6a9dbe8e5539e45cd616a9 (diff)
downloadandroid_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.cpp15
-rw-r--r--tv/cec/1.0/default/HdmiCec.h9
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;
};