Merge "CEC: Modify Standby Mode Handler"

This commit is contained in:
Treehugger Robot
2022-02-08 10:32:16 +00:00
committed by Gerrit Code Review
6 changed files with 45 additions and 24 deletions

View File

@@ -75,6 +75,8 @@ abstract class HdmiCecLocalDevice {
protected int mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE; protected int mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE;
protected int mLastKeyRepeatCount = 0; protected int mLastKeyRepeatCount = 0;
HdmiCecStandbyModeHandler mStandbyHandler;
// Stores recent changes to the active source in the CEC network. // Stores recent changes to the active source in the CEC network.
private final ArrayBlockingQueue<HdmiCecController.Dumpable> mActiveSourceHistory = private final ArrayBlockingQueue<HdmiCecController.Dumpable> mActiveSourceHistory =
new ArrayBlockingQueue<>(MAX_HDMI_ACTIVE_SOURCE_HISTORY); new ArrayBlockingQueue<>(MAX_HDMI_ACTIVE_SOURCE_HISTORY);
@@ -263,6 +265,11 @@ abstract class HdmiCecLocalDevice {
if (dest != mAddress && dest != Constants.ADDR_BROADCAST) { if (dest != mAddress && dest != Constants.ADDR_BROADCAST) {
return Constants.NOT_HANDLED; 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. // Cache incoming message if it is included in the list of cacheable opcodes.
mCecMessageCache.cacheMessage(message); mCecMessageCache.cacheMessage(message);
return onMessage(message); return onMessage(message);

View File

@@ -112,6 +112,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
mService.readBooleanSetting(Global.HDMI_CEC_SWITCH_ENABLED, false); mService.readBooleanSetting(Global.HDMI_CEC_SWITCH_ENABLED, false);
mSystemAudioControlFeatureEnabled = mSystemAudioControlFeatureEnabled =
mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true); mService.readBooleanSetting(Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED, true);
mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
} }
private static final String SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH = "/vendor/etc/sadConfig.xml"; private static final String SHORT_AUDIO_DESCRIPTOR_CONFIG_PATH = "/vendor/etc/sadConfig.xml";

View File

@@ -64,6 +64,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
HdmiCecLocalDevicePlayback(HdmiControlService service) { HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK); super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
} }
@Override @Override

View File

@@ -91,8 +91,6 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@GuardedBy("mLock") @GuardedBy("mLock")
private boolean mSystemAudioMute = false; private boolean mSystemAudioMute = false;
private final HdmiCecStandbyModeHandler mStandbyHandler;
// If true, do not do routing control/send active source for internal source. // If true, do not do routing control/send active source for internal source.
// Set to true when the device was woken up by <Text/Image View On>. // Set to true when the device was woken up by <Text/Image View On>.
private boolean mSkipRoutingControl; private boolean mSkipRoutingControl;

View File

@@ -16,6 +16,7 @@
package com.android.server.hdmi; package com.android.server.hdmi;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.util.SparseArray; import android.util.SparseArray;
/** /**
@@ -56,7 +57,8 @@ public final class HdmiCecStandbyModeHandler {
private final class AutoOnHandler implements CecMessageHandler { private final class AutoOnHandler implements CecMessageHandler {
@Override @Override
public boolean handle(HdmiCecMessage message) { public boolean handle(HdmiCecMessage message) {
if (!mTv.getAutoWakeup()) { HdmiCecLocalDeviceTv tv = (HdmiCecLocalDeviceTv) mDevice;
if (!tv.getAutoWakeup()) {
mAborterRefused.handle(message); mAborterRefused.handle(message);
return true; return true;
} }
@@ -78,7 +80,7 @@ public final class HdmiCecStandbyModeHandler {
} }
private final HdmiControlService mService; private final HdmiControlService mService;
private final HdmiCecLocalDeviceTv mTv; private final HdmiCecLocalDevice mDevice;
private final SparseArray<CecMessageHandler> mCecMessageHandlers = new SparseArray<>(); private final SparseArray<CecMessageHandler> mCecMessageHandlers = new SparseArray<>();
private final CecMessageHandler mDefaultHandler = new Aborter( private final CecMessageHandler mDefaultHandler = new Aborter(
@@ -92,13 +94,7 @@ public final class HdmiCecStandbyModeHandler {
private final UserControlProcessedHandler private final UserControlProcessedHandler
mUserControlProcessedHandler = new UserControlProcessedHandler(); mUserControlProcessedHandler = new UserControlProcessedHandler();
public HdmiCecStandbyModeHandler(HdmiControlService service, HdmiCecLocalDeviceTv tv) { private void addCommonHandlers() {
mService = service;
mTv = tv;
addHandler(Constants.MESSAGE_IMAGE_VIEW_ON, mAutoOnHandler);
addHandler(Constants.MESSAGE_TEXT_VIEW_ON, mAutoOnHandler);
addHandler(Constants.MESSAGE_ACTIVE_SOURCE, mBystander); addHandler(Constants.MESSAGE_ACTIVE_SOURCE, mBystander);
addHandler(Constants.MESSAGE_REQUEST_ACTIVE_SOURCE, mBystander); addHandler(Constants.MESSAGE_REQUEST_ACTIVE_SOURCE, mBystander);
addHandler(Constants.MESSAGE_ROUTING_CHANGE, 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_SYSTEM_AUDIO_MODE_STATUS, mBystander);
addHandler(Constants.MESSAGE_REPORT_AUDIO_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 <Feature Abort>["Unrecognized Opcode"]
// <Deck Status>, <Tuner Device Status>, <Tuner Cleared Status>, <Timer Status>
addHandler(Constants.MESSAGE_RECORD_STATUS, mBystander);
// If TV supports the following messages during power-on, reply with <Feature Abort>["Not
// in correct mode to respond"], else reply with <Feature Abort>["Unrecognized Opcode"]
// <Give Tuner Device Status>, <Select Digital Service>, <Tuner Step Decrement>,
// <Tuner Stem Increment>, <Menu Status>.
addHandler(Constants.MESSAGE_RECORD_TV_SCREEN, mAborterIncorrectMode);
addHandler(Constants.MESSAGE_INITIATE_ARC, mAborterIncorrectMode);
addHandler(Constants.MESSAGE_TERMINATE_ARC, mAborterIncorrectMode);
addHandler(Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS, mBypasser); addHandler(Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS, mBypasser);
addHandler(Constants.MESSAGE_GET_MENU_LANGUAGE, mBypasser); addHandler(Constants.MESSAGE_GET_MENU_LANGUAGE, mBypasser);
addHandler(Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS, mBypasser); addHandler(Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS, mBypasser);
@@ -145,6 +128,34 @@ public final class HdmiCecStandbyModeHandler {
addHandler(Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, mAborterIncorrectMode); addHandler(Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, mAborterIncorrectMode);
} }
private void addTvHandlers() {
addHandler(Constants.MESSAGE_IMAGE_VIEW_ON, mAutoOnHandler);
addHandler(Constants.MESSAGE_TEXT_VIEW_ON, mAutoOnHandler);
// If TV supports the following messages during power-on, ignore them and do nothing,
// else reply with <Feature Abort>["Unrecognized Opcode"]
// <Deck Status>, <Tuner Device Status>, <Tuner Cleared Status>, <Timer Status>
addHandler(Constants.MESSAGE_RECORD_STATUS, mBystander);
// If TV supports the following messages during power-on, reply with <Feature Abort>["Not
// in correct mode to respond"], else reply with <Feature Abort>["Unrecognized Opcode"]
// <Give Tuner Device Status>, <Select Digital Service>, <Tuner Step Decrement>,
// <Tuner Stem Increment>, <Menu Status>.
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) { private void addHandler(int opcode, CecMessageHandler handler) {
mCecMessageHandlers.put(opcode, handler); mCecMessageHandlers.put(opcode, handler);
} }

View File

@@ -892,6 +892,7 @@ public class HdmiControlServiceTest {
int sourceAddress = Constants.ADDR_TV; int sourceAddress = Constants.ADDR_TV;
byte[] params = {0x00, 0x01, 0x02, 0x03}; byte[] params = {0x00, 0x01, 0x02, 0x03};
int vendorId = 0x123456; int vendorId = 0x123456;
mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
VendorCommandListener vendorCmdListener = VendorCommandListener vendorCmdListener =
new VendorCommandListener(sourceAddress, destAddress, params, vendorId); new VendorCommandListener(sourceAddress, destAddress, params, vendorId);
@@ -913,6 +914,7 @@ public class HdmiControlServiceTest {
int sourceAddress = Constants.ADDR_TV; int sourceAddress = Constants.ADDR_TV;
byte[] params = {0x00, 0x01, 0x02, 0x03}; byte[] params = {0x00, 0x01, 0x02, 0x03};
int vendorId = 0x123456; int vendorId = 0x123456;
mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
VendorCommandListener vendorCmdListener = VendorCommandListener vendorCmdListener =
new VendorCommandListener(sourceAddress, destAddress, params, vendorId); new VendorCommandListener(sourceAddress, destAddress, params, vendorId);
@@ -936,6 +938,7 @@ public class HdmiControlServiceTest {
byte[] params = {0x00, 0x01, 0x02, 0x03}; byte[] params = {0x00, 0x01, 0x02, 0x03};
int vendorId = 0x123456; int vendorId = 0x123456;
int diffVendorId = 0x345678; int diffVendorId = 0x345678;
mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
VendorCommandListener vendorCmdListener = VendorCommandListener vendorCmdListener =
new VendorCommandListener(sourceAddress, destAddress, params, vendorId); new VendorCommandListener(sourceAddress, destAddress, params, vendorId);