CEC: Add implementation of WAKEUP option to default HdmiCec

When WAKEUP is set to false, HAL does not wake up the system
upon receiving <Image View On> or <Text View On> messages.

Bug: 185434120
Test: manual
Change-Id: Iaf98020decc887f04b02da480adc70b76189b66d
diff --git a/tv/cec/1.0/default/HdmiCecDefault.cpp b/tv/cec/1.0/default/HdmiCecDefault.cpp
index 8ce4d11..299bcf0 100644
--- a/tv/cec/1.0/default/HdmiCecDefault.cpp
+++ b/tv/cec/1.0/default/HdmiCecDefault.cpp
@@ -38,6 +38,11 @@
 
 // When set to false, all the CEC commands are discarded. True by default after initialization.
 bool mCecEnabled;
+/*
+ * When set to false, HAL does not wake up the system upon receiving <Image View On> or
+ * <Text View On>. True by default after initialization.
+ */
+bool mWakeupEnabled;
 
 int mCecFd;
 int mExitFd;
@@ -48,6 +53,7 @@
     mCecFd = -1;
     mExitFd = -1;
     mCecEnabled = false;
+    mWakeupEnabled = false;
     mCallback = nullptr;
 }
 
@@ -244,6 +250,10 @@
             LOG(DEBUG) << "setOption: Enable CEC: " << value;
             mCecEnabled = value;
             break;
+        case OptionKey::WAKEUP:
+            LOG(DEBUG) << "setOption: WAKEUP: " << value;
+            mWakeupEnabled = value;
+            break;
         default:
             break;
     }
@@ -317,6 +327,7 @@
     }
 
     mCecEnabled = true;
+    mWakeupEnabled = true;
     return Result::SUCCESS;
 }
 
@@ -333,6 +344,7 @@
         close(mCecFd);
     }
     mCecEnabled = false;
+    mWakeupEnabled = false;
     setCallback(nullptr);
     return Void();
 }
@@ -402,6 +414,11 @@
                 continue;
             }
 
+            if (!mWakeupEnabled && isWakeupMessage(msg)) {
+                LOG(DEBUG) << "Filter wakeup message";
+                continue;
+            }
+
             if (mCallback != nullptr) {
                 size_t length = std::min(msg.len - 1, (uint32_t)MaxLength::MESSAGE_BODY);
                 CecMessage cecMessage{
@@ -421,6 +438,21 @@
     return NULL;
 }
 
+int HdmiCecDefault::getOpcode(struct cec_msg message) {
+    return (static_cast<uint8_t>(message.msg[1]) & 0xff);
+}
+
+bool HdmiCecDefault::isWakeupMessage(struct cec_msg message) {
+    int opcode = getOpcode(message);
+    switch (opcode) {
+        case CEC_MESSAGE_TEXT_VIEW_ON:
+        case CEC_MESSAGE_IMAGE_VIEW_ON:
+            return true;
+        default:
+            return false;
+    }
+}
+
 }  // namespace implementation
 }  // namespace V1_0
 }  // namespace cec