Merge "HDMI: Retry one time to send <Request Active Source>" into main
diff --git a/services/core/java/com/android/server/hdmi/RequestActiveSourceAction.java b/services/core/java/com/android/server/hdmi/RequestActiveSourceAction.java
index 017c86d..d250416 100644
--- a/services/core/java/com/android/server/hdmi/RequestActiveSourceAction.java
+++ b/services/core/java/com/android/server/hdmi/RequestActiveSourceAction.java
@@ -29,6 +29,12 @@
     // State to wait for the <Active Source> message.
     private static final int STATE_WAIT_FOR_ACTIVE_SOURCE = 1;
 
+    // Number of retries <Request Active Source> is sent if no device answers this message.
+    private static final int MAX_SEND_RETRY_COUNT = 1;
+
+    private int mSendRetryCount = 0;
+
+
     RequestActiveSourceAction(HdmiCecLocalDevice source, IHdmiControlCallback callback) {
         super(source, callback);
     }
@@ -60,7 +66,12 @@
             return;
         }
         if (mState == STATE_WAIT_FOR_ACTIVE_SOURCE) {
-            finishWithCallback(HdmiControlManager.RESULT_TIMEOUT);
+            if (mSendRetryCount++ < MAX_SEND_RETRY_COUNT) {
+                sendCommand(HdmiCecMessageBuilder.buildRequestActiveSource(getSourceAddress()));
+                addTimer(mState, HdmiConfig.TIMEOUT_MS);
+            } else {
+                finishWithCallback(HdmiControlManager.RESULT_TIMEOUT);
+            }
         }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
index 5acbe65..a2a8424 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -1722,7 +1722,11 @@
         mNativeWrapper.clearResultMessages();
         mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
         mTestLooper.dispatchAll();
+        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSourceFromTv);
 
+        // Skip the retry.
+        mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
+        mTestLooper.dispatchAll();
         assertThat(mNativeWrapper.getResultMessages()).contains(activeSourceFromTv);
     }