From f26211a6c5cdf1ae020542d44b60840030a59b57 Mon Sep 17 00:00:00 2001 From: Paul Colta Date: Wed, 6 Dec 2023 19:11:03 +0100 Subject: HDMI: Update local active source in RequestActiveSourceAction callback In RequestActiveSourceAction's callback local active source should be updated. Until now only an message was broadcasted which is not enough since the internal active source is stil invalid. Bug: 315141766 Test: atest HdmiCecLocalDeviceTvTest Change-Id: I588b9586435283d64cfc94ecb81b63f6eff1fa3a --- .../core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java | 3 +++ .../src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 168715713f8d..b138e20151f5 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -198,6 +198,9 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mService.sendCecCommand(HdmiCecMessageBuilder.buildActiveSource( getDeviceInfo().getLogicalAddress(), getDeviceInfo().getPhysicalAddress())); + updateActiveSource(getDeviceInfo().getLogicalAddress(), + getDeviceInfo().getPhysicalAddress(), + "RequestActiveSourceAction#finishWithCallback()"); } } })); 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 5acbe658cf36..654bd213ea82 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java @@ -23,6 +23,7 @@ import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_2; import static com.android.server.hdmi.Constants.ADDR_RECORDER_1; import static com.android.server.hdmi.Constants.ADDR_TV; +import static com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.google.common.truth.Truth.assertThat; @@ -1712,18 +1713,21 @@ public class HdmiCecLocalDeviceTvTest { HdmiCecMessageBuilder.buildRequestActiveSource(ADDR_TV); HdmiCecMessage activeSourceFromTv = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); - mHdmiControlService.getHdmiCecNetwork().clearLocalDevices(); mNativeWrapper.setPollAddressResponse(ADDR_PLAYBACK_1, SendMessageResult.SUCCESS); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getResultMessages()).contains(requestActiveSource); + assertThat(mHdmiControlService.getLocalActiveSource()).isEqualTo( + new ActiveSource(Constants.ADDR_INVALID, Constants.INVALID_PHYSICAL_ADDRESS)); mNativeWrapper.clearResultMessages(); mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getResultMessages()).contains(activeSourceFromTv); + assertThat(mHdmiControlService.getLocalActiveSource()).isEqualTo( + new ActiveSource(mTvLogicalAddress, mTvPhysicalAddress)); } @Test -- cgit v1.2.3-59-g8ed1b From 4c55329b56510669e5f9614e0fda3fd4cbf86949 Mon Sep 17 00:00:00 2001 From: Paul Colta Date: Tue, 12 Dec 2023 10:30:43 +0100 Subject: HDMI: RequestActiveSource's callback updates local AS only when invalid The local active source may have already been changed by another action before the RequestActiveSource action is complete. This extra check provides more confidence that the TV needs to broadcast and helps to avoid future bugs if a new way of updating the active source is added. Bug: 315141766 Test: atest HdmiCecLocalDeviceTvTest Change-Id: Ied4bdfa5e74239ae28c18fff8b7beee8919353a9 --- .../android/server/hdmi/HdmiCecLocalDeviceTv.java | 3 ++- .../server/hdmi/HdmiCecLocalDeviceTvTest.java | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index b138e20151f5..43cdd8633687 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -194,7 +194,8 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { addAndStartAction(new RequestActiveSourceAction(this, new IHdmiControlCallback.Stub() { @Override public void onComplete(int result) { - if (result != HdmiControlManager.RESULT_SUCCESS) { + if (!mService.getLocalActiveSource().isValid() + && result != HdmiControlManager.RESULT_SUCCESS) { mService.sendCecCommand(HdmiCecMessageBuilder.buildActiveSource( getDeviceInfo().getLogicalAddress(), getDeviceInfo().getPhysicalAddress())); 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 654bd213ea82..b2c9c8111107 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java @@ -1730,6 +1730,26 @@ public class HdmiCecLocalDeviceTvTest { new ActiveSource(mTvLogicalAddress, mTvPhysicalAddress)); } + @Test + public void requestActiveSourceActionComplete_validLocalActiveSource_doNotSendActiveSource() { + HdmiCecMessage requestActiveSource = + HdmiCecMessageBuilder.buildRequestActiveSource(ADDR_TV); + HdmiCecMessage activeSourceFromTv = + HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); + mHdmiControlService.getHdmiCecNetwork().clearLocalDevices(); + mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); + mTestLooper.dispatchAll(); + + assertThat(mNativeWrapper.getResultMessages()).contains(requestActiveSource); + mHdmiControlService.setActiveSource(mTvLogicalAddress, mTvPhysicalAddress, + "HdmiCecLocalDeviceTvTest"); + mNativeWrapper.clearResultMessages(); + mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS * 2); + mTestLooper.dispatchAll(); + + assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSourceFromTv); + } + @Test public void newDeviceConnectedIfOnlyOneGiveOsdNameSent() { mHdmiControlService.getHdmiCecNetwork().clearDeviceList(); -- cgit v1.2.3-59-g8ed1b