summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sherry Huang <sherrhxr@google.com> 2025-03-05 17:16:28 -0800
committer Sherry Huang <sherrhxr@google.com> 2025-03-05 17:16:28 -0800
commite98494236c5097486b1ee87c12c1c3a1154329cd (patch)
tree5b7a692d75ed9b51b221c56e8e7687b3e41cb151
parent0c0cfa27c5c36360b922dfd2edc7f93bef708b7a (diff)
HDMI-CEC: Do not request active source if it is already cached
Check if HdmiControlService's buffer contains <Active Source> before send <Request Active Source>. Added a new function in HdmiControlService to getCecMessageWithOpcode. Test: atest HdmiCecLocalDeviceTvTest Bug: b/383941201 Flag: EXEMPT bugfix only Change-Id: I929b470e0ae7a7715f67550afbc6f040c33812c8
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java4
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java32
3 files changed, 46 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 3cb21c3e2697..93a992d75d94 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -219,7 +219,9 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
&& reason != HdmiControlService.INITIATED_BY_BOOT_UP;
List<HdmiCecMessage> bufferedActiveSource = mDelayedMessageBuffer
.getBufferedMessagesWithOpcode(Constants.MESSAGE_ACTIVE_SOURCE);
- if (bufferedActiveSource.isEmpty()) {
+ List<HdmiCecMessage> bufferedActiveSourceFromService = mService.getCecMessageWithOpcode(
+ Constants.MESSAGE_ACTIVE_SOURCE);
+ if (bufferedActiveSource.isEmpty() && bufferedActiveSourceFromService.isEmpty()) {
addAndStartAction(new RequestActiveSourceAction(this, new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 6d973ac8d1b5..fdd0ef2f90e1 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -1593,6 +1593,17 @@ public class HdmiControlService extends SystemService {
this.mCecMessageBuffer = cecMessageBuffer;
}
+ List<HdmiCecMessage> getCecMessageWithOpcode(int opcode) {
+ List<HdmiCecMessage> cecMessagesWithOpcode = new ArrayList<>();
+ List<HdmiCecMessage> cecMessages = mCecMessageBuffer.getBuffer();
+ for (HdmiCecMessage message: cecMessages) {
+ if (message.getOpcode() == opcode) {
+ cecMessagesWithOpcode.add(message);
+ }
+ }
+ return cecMessagesWithOpcode;
+ }
+
/**
* Returns {@link Looper} of main thread. Use this {@link Looper} instance
* for tasks that are running on main service thread.
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 b0ffebb973a1..aa1d5835bfc8 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java
@@ -2295,6 +2295,38 @@ public class HdmiCecLocalDeviceTvTest {
.hasSize(1);
}
+ @Test
+ public void onOneTouchPlay_wakeUp_exist_device() {
+ HdmiCecMessage requestActiveSource =
+ HdmiCecMessageBuilder.buildRequestActiveSource(ADDR_TV);
+
+ // Go to standby to trigger RequestActiveSourceAction for playback_1
+ mHdmiControlService.onStandby(STANDBY_SCREEN_OFF);
+ mTestLooper.dispatchAll();
+
+ mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS);
+ mHdmiControlService.onWakeUp(WAKE_UP_SCREEN_ON);
+ mTestLooper.dispatchAll();
+
+ // Skip the LauncherX API timeout.
+ mTestLooper.moveTimeForward(TIMEOUT_WAIT_FOR_TV_ASSERT_ACTIVE_SOURCE_MS);
+ mTestLooper.dispatchAll();
+
+ assertThat(mNativeWrapper.getResultMessages()).contains(requestActiveSource);
+ mNativeWrapper.clearResultMessages();
+
+ // turn off TV and wake up with one touch play
+ mHdmiControlService.onStandby(STANDBY_SCREEN_OFF);
+ mTestLooper.dispatchAll();
+
+ // FakePowerManagerWrapper#wakeUp() doesn't broadcast Intent.ACTION_SCREEN_ON
+ // manually trigger onWakeUp to mock OTP
+ mHdmiControlService.onWakeUp(WAKE_UP_SCREEN_ON);
+ mTestLooper.dispatchAll();
+
+ assertThat(mNativeWrapper.getResultMessages()).doesNotContain(requestActiveSource);
+ }
+
@Test
public void handleReportAudioStatus_SamOnAvrStandby_startSystemAudioActionFromTv() {