From 9884f20f9336af038b5d383d491b422e1453b18d Mon Sep 17 00:00:00 2001 From: "Venkatarama NG. Avadhani" Date: Thu, 3 Feb 2022 18:28:03 +0530 Subject: [PATCH] CEC: Modify Standby Mode Handler Add standby mode handler for generic device. Earlier, only TV devices would use the standby mode handler to filter messages or feature abort them when in standby. This does not change the standby mode handling of TV devices. Test: atest android.hdmicec.cts.playback.HdmiCecRemoteControlPassThroughTest#cect_hf4_8_13_AbortIncorrectMode Bug: 211843422 Change-Id: Ie00e16231e385db0f2d280f088882d5d0f9a8add --- .../server/hdmi/HdmiCecLocalDevice.java | 7 +++ .../hdmi/HdmiCecLocalDeviceAudioSystem.java | 1 + .../hdmi/HdmiCecLocalDevicePlayback.java | 1 + .../server/hdmi/HdmiCecLocalDeviceTv.java | 2 - .../hdmi/HdmiCecStandbyModeHandler.java | 55 +++++++++++-------- .../server/hdmi/HdmiControlServiceTest.java | 3 + 6 files changed, 45 insertions(+), 24 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 454a76ac04f44..26a161323e4fc 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -75,6 +75,8 @@ abstract class HdmiCecLocalDevice { protected int mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE; protected int mLastKeyRepeatCount = 0; + HdmiCecStandbyModeHandler mStandbyHandler; + // Stores recent changes to the active source in the CEC network. private final ArrayBlockingQueue mActiveSourceHistory = new ArrayBlockingQueue<>(MAX_HDMI_ACTIVE_SOURCE_HISTORY); @@ -263,6 +265,11 @@ abstract class HdmiCecLocalDevice { if (dest != mDeviceInfo.getLogicalAddress() && dest != Constants.ADDR_BROADCAST) { return Constants.NOT_HANDLED; } + if (mService.isPowerStandby() + && !mService.isWakeUpMessageReceived() + && mStandbyHandler.handleCommand(message)) { + return Constants.HANDLED; + } // Cache incoming message if it is included in the list of cacheable opcodes. mCecMessageCache.cacheMessage(message); return onMessage(message); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 2ef3ebf5d07ec..99bbc3f2d86b7 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -117,6 +117,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { mSystemAudioControlFeatureEnabled = mService.getHdmiCecConfig().getIntValue( HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL) == HdmiControlManager.SYSTEM_AUDIO_CONTROL_ENABLED; + mStandbyHandler = new HdmiCecStandbyModeHandler(service, this); } private static final String SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH = "/vendor/etc/sadConfig.xml"; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 0edcea548055c..27f64ecbe99a7 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -76,6 +76,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { super(service, HdmiDeviceInfo.DEVICE_PLAYBACK); mDelayedStandbyHandler = new Handler(service.getServiceLooper()); + mStandbyHandler = new HdmiCecStandbyModeHandler(service, this); } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index afcd3dde0633f..11b6b8c98d122 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -92,8 +92,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @GuardedBy("mLock") private boolean mSystemAudioMute = false; - private final HdmiCecStandbyModeHandler mStandbyHandler; - // If true, do not do routing control/send active source for internal source. // Set to true when the device was woken up by . private boolean mSkipRoutingControl; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java b/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java index 57fe9e6a4acc1..1c296e5b56406 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java @@ -16,6 +16,7 @@ package com.android.server.hdmi; +import android.hardware.hdmi.HdmiDeviceInfo; import android.util.SparseArray; /** @@ -56,7 +57,8 @@ public final class HdmiCecStandbyModeHandler { private final class AutoOnHandler implements CecMessageHandler { @Override public boolean handle(HdmiCecMessage message) { - if (!mTv.getAutoWakeup()) { + HdmiCecLocalDeviceTv tv = (HdmiCecLocalDeviceTv) mDevice; + if (!tv.getAutoWakeup()) { mAborterRefused.handle(message); return true; } @@ -78,7 +80,7 @@ public final class HdmiCecStandbyModeHandler { } private final HdmiControlService mService; - private final HdmiCecLocalDeviceTv mTv; + private final HdmiCecLocalDevice mDevice; private final SparseArray mCecMessageHandlers = new SparseArray<>(); private final CecMessageHandler mDefaultHandler = new Aborter( @@ -92,13 +94,7 @@ public final class HdmiCecStandbyModeHandler { private final UserControlProcessedHandler mUserControlProcessedHandler = new UserControlProcessedHandler(); - public HdmiCecStandbyModeHandler(HdmiControlService service, HdmiCecLocalDeviceTv tv) { - mService = service; - mTv = tv; - - addHandler(Constants.MESSAGE_IMAGE_VIEW_ON, mAutoOnHandler); - addHandler(Constants.MESSAGE_TEXT_VIEW_ON, mAutoOnHandler); - + private void addCommonHandlers() { addHandler(Constants.MESSAGE_ACTIVE_SOURCE, mBystander); addHandler(Constants.MESSAGE_REQUEST_ACTIVE_SOURCE, mBystander); addHandler(Constants.MESSAGE_ROUTING_CHANGE, mBystander); @@ -112,19 +108,6 @@ public final class HdmiCecStandbyModeHandler { addHandler(Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, mBystander); addHandler(Constants.MESSAGE_REPORT_AUDIO_STATUS, mBystander); - // If TV supports the following messages during power-on, ignore them and do nothing, - // else reply with ["Unrecognized Opcode"] - // , , , - addHandler(Constants.MESSAGE_RECORD_STATUS, mBystander); - - // If TV supports the following messages during power-on, reply with ["Not - // in correct mode to respond"], else reply with ["Unrecognized Opcode"] - // , , , + // , . + addHandler(Constants.MESSAGE_RECORD_TV_SCREEN, mAborterIncorrectMode); + addHandler(Constants.MESSAGE_INITIATE_ARC, mAborterIncorrectMode); + addHandler(Constants.MESSAGE_TERMINATE_ARC, mAborterIncorrectMode); + } + + public HdmiCecStandbyModeHandler(HdmiControlService service, HdmiCecLocalDevice device) { + mService = service; + mDevice = device; + + addCommonHandlers(); + if (mDevice.getType() == HdmiDeviceInfo.DEVICE_TV) { + addTvHandlers(); + } + } + private void addHandler(int opcode, CecMessageHandler handler) { mCecMessageHandlers.put(opcode, handler); } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index c48a974ddbb2c..3987c32277cd4 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -753,6 +753,7 @@ public class HdmiControlServiceTest { int sourceAddress = Constants.ADDR_TV; byte[] params = {0x00, 0x01, 0x02, 0x03}; int vendorId = 0x123456; + mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON); VendorCommandListener vendorCmdListener = new VendorCommandListener(sourceAddress, destAddress, params, vendorId); @@ -774,6 +775,7 @@ public class HdmiControlServiceTest { int sourceAddress = Constants.ADDR_TV; byte[] params = {0x00, 0x01, 0x02, 0x03}; int vendorId = 0x123456; + mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON); VendorCommandListener vendorCmdListener = new VendorCommandListener(sourceAddress, destAddress, params, vendorId); @@ -797,6 +799,7 @@ public class HdmiControlServiceTest { byte[] params = {0x00, 0x01, 0x02, 0x03}; int vendorId = 0x123456; int diffVendorId = 0x345678; + mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON); VendorCommandListener vendorCmdListener = new VendorCommandListener(sourceAddress, destAddress, params, vendorId);