CEC: Add implementation of ENABLE_CEC option to default HdmiCec

When ENABLE_CEC is set to false, all the CEC commands are discarded

Bug: 185434120
Test: manual
Change-Id: Iaf7e61af0b5047b041818acf2590c3ffce2f3318
diff --git a/tv/cec/1.0/default/HdmiCecDefault.cpp b/tv/cec/1.0/default/HdmiCecDefault.cpp
index c8dd511..8ce4d11 100644
--- a/tv/cec/1.0/default/HdmiCecDefault.cpp
+++ b/tv/cec/1.0/default/HdmiCecDefault.cpp
@@ -36,6 +36,9 @@
 namespace V1_0 {
 namespace implementation {
 
+// When set to false, all the CEC commands are discarded. True by default after initialization.
+bool mCecEnabled;
+
 int mCecFd;
 int mExitFd;
 pthread_t mEventThread;
@@ -44,6 +47,7 @@
 HdmiCecDefault::HdmiCecDefault() {
     mCecFd = -1;
     mExitFd = -1;
+    mCecEnabled = false;
     mCallback = nullptr;
 }
 
@@ -156,6 +160,10 @@
 }
 
 Return<SendMessageResult> HdmiCecDefault::sendMessage(const CecMessage& message) {
+    if (!mCecEnabled) {
+        return SendMessageResult::FAIL;
+    }
+
     struct cec_msg cecMsg;
     memset(&cecMsg, 0, sizeof(cec_msg));
 
@@ -230,7 +238,15 @@
     return Void();
 }
 
-Return<void> HdmiCecDefault::setOption(OptionKey /*key*/, bool /*value*/) {
+Return<void> HdmiCecDefault::setOption(OptionKey key, bool value) {
+    switch (key) {
+        case OptionKey::ENABLE_CEC:
+            LOG(DEBUG) << "setOption: Enable CEC: " << value;
+            mCecEnabled = value;
+            break;
+        default:
+            break;
+    }
     return Void();
 }
 
@@ -300,6 +316,7 @@
         return Result::FAILURE_NOT_SUPPORTED;
     }
 
+    mCecEnabled = true;
     return Result::SUCCESS;
 }
 
@@ -315,6 +332,7 @@
     if (mCecFd > 0) {
         close(mCecFd);
     }
+    mCecEnabled = false;
     setCallback(nullptr);
     return Void();
 }
@@ -345,6 +363,10 @@
             struct cec_event ev;
             ret = ioctl(mCecFd, CEC_DQEVENT, &ev);
 
+            if (!mCecEnabled) {
+                continue;
+            }
+
             if (ret) {
                 LOG(ERROR) << "CEC_DQEVENT failed, Error = " << strerror(errno);
                 continue;
@@ -366,6 +388,10 @@
             struct cec_msg msg = {};
             ret = ioctl(mCecFd, CEC_RECEIVE, &msg);
 
+            if (!mCecEnabled) {
+                continue;
+            }
+
             if (ret) {
                 LOG(ERROR) << "CEC_RECEIVE failed, Error = " << strerror(errno);
                 continue;