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 1ce36b181eb0f..c0950bf13a1c4 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -96,8 +96,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);