CEC: Change the logical address allocation policy

According to the CEC spec (Section 7), a message transmitted and
acknowledged should be assumed correctly received. Therefore, If a
polling message to certain logical address(LA) is acknowledged during
the LA allocation phase, it can be assumed that there exists a CEC
device on the LA. This CL will see whether at least 1 polling message is
acknowledged or not in order to check the CEC device existence, instead
of using the previous voting policy.

Bug: 27337386
Change-Id: I39df78f6db29a1b47cb962f8fe5e0382c16028de
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index 55917fc..687aaa1 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -188,15 +188,16 @@
             int curAddress = (startAddress + i) % NUM_LOGICAL_ADDRESS;
             if (curAddress != Constants.ADDR_UNREGISTERED
                     && deviceType == HdmiUtils.getTypeFromAddress(curAddress)) {
-                int failedPollingCount = 0;
+                boolean acked = false;
                 for (int j = 0; j < HdmiConfig.ADDRESS_ALLOCATION_RETRY; ++j) {
-                    if (!sendPollMessage(curAddress, curAddress, 1)) {
-                        failedPollingCount++;
+                    if (sendPollMessage(curAddress, curAddress, 1)) {
+                        acked = true;
+                        break;
                     }
                 }
-
-                // Pick logical address if failed ratio is more than a half of all retries.
-                if (failedPollingCount * 2 >  HdmiConfig.ADDRESS_ALLOCATION_RETRY) {
+                // If sending <Polling Message> failed, it becomes new logical address for the
+                // device because no device uses it as logical address of the device.
+                if (!acked) {
                     logicalAddress = curAddress;
                     break;
                 }
@@ -469,12 +470,14 @@
         assertRunOnIoThread();
         for (int i = 0; i < retryCount; ++i) {
             // <Polling Message> is a message which has empty body.
-            // If sending <Polling Message> failed (NAK), it becomes
-            // new logical address for the device because no device uses
-            // it as logical address of the device.
-            if (nativeSendCecCommand(mNativePtr, sourceAddress, destinationAddress, EMPTY_BODY)
-                    == Constants.SEND_RESULT_SUCCESS) {
+            int ret =
+                    nativeSendCecCommand(mNativePtr, sourceAddress, destinationAddress, EMPTY_BODY);
+            if (ret == Constants.SEND_RESULT_SUCCESS) {
                 return true;
+            } else if (ret != Constants.SEND_RESULT_NAK) {
+                // Unusual failure
+                HdmiLogger.warning("Failed to send a polling message(%d->%d) with return code %d",
+                        sourceAddress, destinationAddress, ret);
             }
         }
         return false;