Merge "Refactor handling of <Feature Abort> responses" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-03-23 14:19:46 +00:00
committed by Android (Google) Code Review
17 changed files with 954 additions and 592 deletions

View File

@@ -250,7 +250,19 @@ final class Constants {
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
ABORT_NO_ERROR, NOT_HANDLED,
HANDLED,
ABORT_UNRECOGNIZED_OPCODE,
ABORT_NOT_IN_CORRECT_MODE,
ABORT_CANNOT_PROVIDE_SOURCE,
ABORT_INVALID_OPERAND,
ABORT_REFUSED,
ABORT_UNABLE_TO_DETERMINE,
})
public @interface HandleMessageResult {}
@Retention(RetentionPolicy.SOURCE)
@IntDef({
ABORT_UNRECOGNIZED_OPCODE, ABORT_UNRECOGNIZED_OPCODE,
ABORT_NOT_IN_CORRECT_MODE, ABORT_NOT_IN_CORRECT_MODE,
ABORT_CANNOT_PROVIDE_SOURCE, ABORT_CANNOT_PROVIDE_SOURCE,
@@ -260,8 +272,11 @@ final class Constants {
}) })
public @interface AbortReason {} public @interface AbortReason {}
// Internal abort error code. It's the same as success. // Indicates that a message was not handled, but could be handled by another local device.
static final int ABORT_NO_ERROR = -1; // If no local devices handle the message, we send <Feature Abort>[Unrecognized Opcode].
static final int NOT_HANDLED = -2;
// Indicates that a message has been handled successfully; no feature abort needed.
static final int HANDLED = -1;
// Constants related to operands of HDMI CEC commands. // Constants related to operands of HDMI CEC commands.
// Refer to CEC Table 29 in HDMI Spec v1.4b. // Refer to CEC Table 29 in HDMI Spec v1.4b.
// [Abort Reason] // [Abort Reason]

View File

@@ -565,19 +565,24 @@ final class HdmiCecController {
} }
@ServiceThreadOnly @ServiceThreadOnly
private void onReceiveCommand(HdmiCecMessage message) { @VisibleForTesting
void onReceiveCommand(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if ((isAcceptableAddress(message.getDestination()) if (mService.isAddressAllocated() && !isAcceptableAddress(message.getDestination())) {
|| !mService.isAddressAllocated())
&& mService.handleCecCommand(message)) {
return; return;
} }
// Not handled message, so we will reply it with <Feature Abort>. @Constants.HandleMessageResult int messageState = mService.handleCecCommand(message);
maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE); if (messageState == Constants.NOT_HANDLED) {
// Message was not handled
maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE);
} else if (messageState != Constants.HANDLED) {
// Message handler wants to send a feature abort
maySendFeatureAbortCommand(message, messageState);
}
} }
@ServiceThreadOnly @ServiceThreadOnly
void maySendFeatureAbortCommand(HdmiCecMessage message, int reason) { void maySendFeatureAbortCommand(HdmiCecMessage message, @Constants.AbortReason int reason) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Swap the source and the destination. // Swap the source and the destination.
int src = message.getDestination(); int src = message.getDestination();

View File

@@ -248,11 +248,13 @@ abstract class HdmiCecLocalDevice {
* @return true if consumed a message; otherwise, return false. * @return true if consumed a message; otherwise, return false.
*/ */
@ServiceThreadOnly @ServiceThreadOnly
boolean dispatchMessage(HdmiCecMessage message) { @VisibleForTesting
@Constants.HandleMessageResult
protected int dispatchMessage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int dest = message.getDestination(); int dest = message.getDestination();
if (dest != mAddress && dest != Constants.ADDR_BROADCAST) { if (dest != mAddress && dest != Constants.ADDR_BROADCAST) {
return false; return Constants.NOT_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);
@@ -260,10 +262,11 @@ abstract class HdmiCecLocalDevice {
} }
@ServiceThreadOnly @ServiceThreadOnly
protected final boolean onMessage(HdmiCecMessage message) { @Constants.HandleMessageResult
protected final int onMessage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (dispatchMessageToAction(message)) { if (dispatchMessageToAction(message)) {
return true; return Constants.HANDLED;
} }
switch (message.getOpcode()) { switch (message.getOpcode()) {
case Constants.MESSAGE_ACTIVE_SOURCE: case Constants.MESSAGE_ACTIVE_SOURCE:
@@ -357,7 +360,7 @@ abstract class HdmiCecLocalDevice {
case Constants.MESSAGE_GIVE_FEATURES: case Constants.MESSAGE_GIVE_FEATURES:
return handleGiveFeatures(message); return handleGiveFeatures(message);
default: default:
return false; return Constants.NOT_HANDLED;
} }
} }
@@ -375,7 +378,8 @@ abstract class HdmiCecLocalDevice {
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGivePhysicalAddress(@Nullable SendMessageCallback callback) { @Constants.HandleMessageResult
protected int handleGivePhysicalAddress(@Nullable SendMessageCallback callback) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int physicalAddress = mService.getPhysicalAddress(); int physicalAddress = mService.getPhysicalAddress();
@@ -383,76 +387,83 @@ abstract class HdmiCecLocalDevice {
HdmiCecMessageBuilder.buildReportPhysicalAddressCommand( HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
mAddress, physicalAddress, mDeviceType); mAddress, physicalAddress, mDeviceType);
mService.sendCecCommand(cecMessage, callback); mService.sendCecCommand(cecMessage, callback);
return true; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGiveDeviceVendorId(@Nullable SendMessageCallback callback) { @Constants.HandleMessageResult
protected int handleGiveDeviceVendorId(@Nullable SendMessageCallback callback) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int vendorId = mService.getVendorId(); int vendorId = mService.getVendorId();
HdmiCecMessage cecMessage = HdmiCecMessage cecMessage =
HdmiCecMessageBuilder.buildDeviceVendorIdCommand(mAddress, vendorId); HdmiCecMessageBuilder.buildDeviceVendorIdCommand(mAddress, vendorId);
mService.sendCecCommand(cecMessage, callback); mService.sendCecCommand(cecMessage, callback);
return true; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGetCecVersion(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGetCecVersion(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int version = mService.getCecVersion(); int version = mService.getCecVersion();
HdmiCecMessage cecMessage = HdmiCecMessage cecMessage =
HdmiCecMessageBuilder.buildCecVersion( HdmiCecMessageBuilder.buildCecVersion(
message.getDestination(), message.getSource(), version); message.getDestination(), message.getSource(), version);
mService.sendCecCommand(cecMessage); mService.sendCecCommand(cecMessage);
return true; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
private boolean handleCecVersion() { @Constants.HandleMessageResult
protected int handleCecVersion() {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Return true to avoid <Feature Abort> responses. Cec Version is tracked in HdmiCecNetwork. // Return true to avoid <Feature Abort> responses. Cec Version is tracked in HdmiCecNetwork.
return true; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleActiveSource(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleInactiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleInactiveSource(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRequestActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRequestActiveSource(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGetMenuLanguage(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGetMenuLanguage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
Slog.w(TAG, "Only TV can handle <Get Menu Language>:" + message.toString()); Slog.w(TAG, "Only TV can handle <Get Menu Language>:" + message.toString());
// 'return false' will cause to reply with <Feature Abort>. return Constants.NOT_HANDLED;
return false;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSetMenuLanguage(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetMenuLanguage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
Slog.w(TAG, "Only Playback device can handle <Set Menu Language>:" + message.toString()); Slog.w(TAG, "Only Playback device can handle <Set Menu Language>:" + message.toString());
// 'return false' will cause to reply with <Feature Abort>. return Constants.NOT_HANDLED;
return false;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGiveOsdName(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGiveOsdName(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Note that since this method is called after logical address allocation is done, // Note that since this method is called after logical address allocation is done,
// mDeviceInfo should not be null. // mDeviceInfo should not be null.
buildAndSendSetOsdName(message.getSource()); buildAndSendSetOsdName(message.getSource());
return true; return Constants.HANDLED;
} }
protected void buildAndSendSetOsdName(int dest) { protected void buildAndSendSetOsdName(int dest) {
@@ -475,18 +486,21 @@ abstract class HdmiCecLocalDevice {
// Audio System device with no Playback device type // Audio System device with no Playback device type
// needs to refactor this function if it's also a switch // needs to refactor this function if it's also a switch
protected boolean handleRoutingChange(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRoutingChange(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
// Audio System device with no Playback device type // Audio System device with no Playback device type
// needs to refactor this function if it's also a switch // needs to refactor this function if it's also a switch
protected boolean handleRoutingInformation(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRoutingInformation(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
@CallSuper @CallSuper
protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleReportPhysicalAddress(HdmiCecMessage message) {
// <Report Physical Address> is also handled in HdmiCecNetwork to update the local network // <Report Physical Address> is also handled in HdmiCecNetwork to update the local network
// state // state
@@ -495,7 +509,7 @@ abstract class HdmiCecLocalDevice {
// Ignore if [Device Discovery Action] is going on. // Ignore if [Device Discovery Action] is going on.
if (hasAction(DeviceDiscoveryAction.class)) { if (hasAction(DeviceDiscoveryAction.class)) {
Slog.i(TAG, "Ignored while Device Discovery Action is in progress: " + message); Slog.i(TAG, "Ignored while Device Discovery Action is in progress: " + message);
return true; return Constants.HANDLED;
} }
HdmiDeviceInfo cecDeviceInfo = mService.getHdmiCecNetwork().getCecDeviceInfo(address); HdmiDeviceInfo cecDeviceInfo = mService.getHdmiCecNetwork().getCecDeviceInfo(address);
@@ -506,63 +520,77 @@ abstract class HdmiCecLocalDevice {
HdmiCecMessageBuilder.buildGiveOsdNameCommand(mAddress, address)); HdmiCecMessageBuilder.buildGiveOsdNameCommand(mAddress, address));
} }
return true; return Constants.HANDLED;
} }
protected boolean handleSystemAudioModeStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleSystemAudioModeStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleGiveSystemAudioModeStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleGiveSystemAudioModeStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleSetSystemAudioMode(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleSystemAudioModeRequest(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleSystemAudioModeRequest(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleTerminateArc(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleTerminateArc(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleInitiateArc(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleInitiateArc(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleRequestArcInitiate(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRequestArcInitiate(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleRequestArcTermination(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRequestArcTermination(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleReportArcInitiate(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleReportArcInitiate(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleReportArcTermination(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleReportArcTermination(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleReportAudioStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleReportAudioStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleGiveAudioStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleGiveAudioStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleRequestShortAudioDescriptor(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRequestShortAudioDescriptor(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleReportShortAudioDescriptor(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleReportShortAudioDescriptor(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
@Constants.RcProfile @Constants.RcProfile
@@ -572,13 +600,14 @@ abstract class HdmiCecLocalDevice {
protected abstract List<Integer> getDeviceFeatures(); protected abstract List<Integer> getDeviceFeatures();
protected boolean handleGiveFeatures(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGiveFeatures(HdmiCecMessage message) {
if (mService.getCecVersion() < HdmiControlManager.HDMI_CEC_VERSION_2_0) { if (mService.getCecVersion() < HdmiControlManager.HDMI_CEC_VERSION_2_0) {
return false; return Constants.ABORT_UNRECOGNIZED_OPCODE;
} }
reportFeatures(); reportFeatures();
return true; return Constants.HANDLED;
} }
protected void reportFeatures() { protected void reportFeatures() {
@@ -598,32 +627,34 @@ abstract class HdmiCecLocalDevice {
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleStandby(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleStandby(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Seq #12 // Seq #12
if (mService.isControlEnabled() if (mService.isControlEnabled()
&& !mService.isProhibitMode() && !mService.isProhibitMode()
&& mService.isPowerOnOrTransient()) { && mService.isPowerOnOrTransient()) {
mService.standby(); mService.standby();
return true; return Constants.HANDLED;
} }
return false; return Constants.ABORT_NOT_IN_CORRECT_MODE;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleUserControlPressed(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleUserControlPressed(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
mHandler.removeMessages(MSG_USER_CONTROL_RELEASE_TIMEOUT); mHandler.removeMessages(MSG_USER_CONTROL_RELEASE_TIMEOUT);
if (mService.isPowerOnOrTransient() && isPowerOffOrToggleCommand(message)) { if (mService.isPowerOnOrTransient() && isPowerOffOrToggleCommand(message)) {
mService.standby(); mService.standby();
return true; return Constants.HANDLED;
} else if (mService.isPowerStandbyOrTransient() && isPowerOnOrToggleCommand(message)) { } else if (mService.isPowerStandbyOrTransient() && isPowerOnOrToggleCommand(message)) {
mService.wakeUp(); mService.wakeUp();
return true; return Constants.HANDLED;
} else if (mService.getHdmiCecVolumeControl() } else if (mService.getHdmiCecVolumeControl()
== HdmiControlManager.VOLUME_CONTROL_DISABLED && isVolumeOrMuteCommand( == HdmiControlManager.VOLUME_CONTROL_DISABLED && isVolumeOrMuteCommand(
message)) { message)) {
return false; return Constants.ABORT_REFUSED;
} }
if (isPowerOffOrToggleCommand(message) || isPowerOnOrToggleCommand(message)) { if (isPowerOffOrToggleCommand(message) || isPowerOnOrToggleCommand(message)) {
@@ -631,7 +662,7 @@ abstract class HdmiCecLocalDevice {
// keycode to Android keycode. // keycode to Android keycode.
// Do not <Feature Abort> as the local device should already be in the correct power // Do not <Feature Abort> as the local device should already be in the correct power
// state. // state.
return true; return Constants.HANDLED;
} }
final long downTime = SystemClock.uptimeMillis(); final long downTime = SystemClock.uptimeMillis();
@@ -653,15 +684,15 @@ abstract class HdmiCecLocalDevice {
mHandler.sendMessageDelayed( mHandler.sendMessageDelayed(
Message.obtain(mHandler, MSG_USER_CONTROL_RELEASE_TIMEOUT), Message.obtain(mHandler, MSG_USER_CONTROL_RELEASE_TIMEOUT),
FOLLOWER_SAFETY_TIMEOUT); FOLLOWER_SAFETY_TIMEOUT);
return true; return Constants.HANDLED;
} }
mService.maySendFeatureAbortCommand(message, Constants.ABORT_INVALID_OPERAND); return Constants.ABORT_INVALID_OPERAND;
return true;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleUserControlReleased() { @Constants.HandleMessageResult
protected int handleUserControlReleased() {
assertRunOnServiceThread(); assertRunOnServiceThread();
mHandler.removeMessages(MSG_USER_CONTROL_RELEASE_TIMEOUT); mHandler.removeMessages(MSG_USER_CONTROL_RELEASE_TIMEOUT);
mLastKeyRepeatCount = 0; mLastKeyRepeatCount = 0;
@@ -670,7 +701,7 @@ abstract class HdmiCecLocalDevice {
injectKeyEvent(upTime, KeyEvent.ACTION_UP, mLastKeycode, 0); injectKeyEvent(upTime, KeyEvent.ACTION_UP, mLastKeycode, 0);
mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE; mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE;
} }
return true; return Constants.HANDLED;
} }
static void injectKeyEvent(long time, int action, int keycode, int repeat) { static void injectKeyEvent(long time, int action, int keycode, int repeat) {
@@ -717,38 +748,45 @@ abstract class HdmiCecLocalDevice {
|| params[0] == HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION); || params[0] == HdmiCecKeycode.CEC_KEYCODE_RESTORE_VOLUME_FUNCTION);
} }
protected boolean handleTextViewOn(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleTextViewOn(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleImageViewOn(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleImageViewOn(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleSetStreamPath(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleSetStreamPath(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleGiveDevicePowerStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGiveDevicePowerStatus(HdmiCecMessage message) {
mService.sendCecCommand( mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportPowerStatus( HdmiCecMessageBuilder.buildReportPowerStatus(
mAddress, message.getSource(), mService.getPowerStatus())); mAddress, message.getSource(), mService.getPowerStatus()));
return true; return Constants.HANDLED;
} }
protected boolean handleMenuRequest(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleMenuRequest(HdmiCecMessage message) {
// Always report menu active to receive Remote Control. // Always report menu active to receive Remote Control.
mService.sendCecCommand( mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportMenuStatus( HdmiCecMessageBuilder.buildReportMenuStatus(
mAddress, message.getSource(), Constants.MENU_STATE_ACTIVATED)); mAddress, message.getSource(), Constants.MENU_STATE_ACTIVATED));
return true; return Constants.HANDLED;
} }
protected boolean handleMenuStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleMenuStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleVendorCommand(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleVendorCommand(HdmiCecMessage message) {
if (!mService.invokeVendorCommandListenersOnReceived( if (!mService.invokeVendorCommandListenersOnReceived(
mDeviceType, mDeviceType,
message.getSource(), message.getSource(),
@@ -757,57 +795,64 @@ abstract class HdmiCecLocalDevice {
false)) { false)) {
// Vendor command listener may not have been registered yet. Respond with // Vendor command listener may not have been registered yet. Respond with
// <Feature Abort> [Refused] so that the sender can try again later. // <Feature Abort> [Refused] so that the sender can try again later.
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
} }
return true; return Constants.HANDLED;
} }
protected boolean handleVendorCommandWithId(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleVendorCommandWithId(HdmiCecMessage message) {
byte[] params = message.getParams(); byte[] params = message.getParams();
int vendorId = HdmiUtils.threeBytesToInt(params); int vendorId = HdmiUtils.threeBytesToInt(params);
if (vendorId == mService.getVendorId()) { if (vendorId == mService.getVendorId()) {
if (!mService.invokeVendorCommandListenersOnReceived( if (!mService.invokeVendorCommandListenersOnReceived(
mDeviceType, message.getSource(), message.getDestination(), params, true)) { mDeviceType, message.getSource(), message.getDestination(), params, true)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
} }
} else if (message.getDestination() != Constants.ADDR_BROADCAST } else if (message.getDestination() != Constants.ADDR_BROADCAST
&& message.getSource() != Constants.ADDR_UNREGISTERED) { && message.getSource() != Constants.ADDR_UNREGISTERED) {
Slog.v(TAG, "Wrong direct vendor command. Replying with <Feature Abort>"); Slog.v(TAG, "Wrong direct vendor command. Replying with <Feature Abort>");
mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE); return Constants.ABORT_UNRECOGNIZED_OPCODE;
} else { } else {
Slog.v(TAG, "Wrong broadcast vendor command. Ignoring"); Slog.v(TAG, "Wrong broadcast vendor command. Ignoring");
} }
return true; return Constants.HANDLED;
} }
protected void sendStandby(int deviceId) { protected void sendStandby(int deviceId) {
// Do nothing. // Do nothing.
} }
protected boolean handleSetOsdName(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetOsdName(HdmiCecMessage message) {
// <Set OSD name> is also handled in HdmiCecNetwork to update the local network state // <Set OSD name> is also handled in HdmiCecNetwork to update the local network state
return true; return Constants.HANDLED;
} }
protected boolean handleRecordTvScreen(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRecordTvScreen(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleTimerClearedStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleTimerClearedStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleReportPowerStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleReportPowerStatus(HdmiCecMessage message) {
// <Report Power Status> is also handled in HdmiCecNetwork to update the local network state // <Report Power Status> is also handled in HdmiCecNetwork to update the local network state
return true; return Constants.HANDLED;
} }
protected boolean handleTimerStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleTimerStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
protected boolean handleRecordStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
return false; protected int handleRecordStatus(HdmiCecMessage message) {
return Constants.NOT_HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly

View File

@@ -316,7 +316,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleActiveSource(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int logicalAddress = message.getSource(); int logicalAddress = message.getSource();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
@@ -339,52 +340,56 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
mDelayedMessageBuffer.removeActiveSource(); mDelayedMessageBuffer.removeActiveSource();
return super.handleActiveSource(message); return super.handleActiveSource(message);
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleInitiateArc(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleInitiateArc(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// TODO(amyjojo): implement initiate arc handler // TODO(amyjojo): implement initiate arc handler
HdmiLogger.debug(TAG + "Stub handleInitiateArc"); HdmiLogger.debug(TAG + "Stub handleInitiateArc");
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleReportArcInitiate(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleReportArcInitiate(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// TODO(amyjojo): implement report arc initiate handler // TODO(amyjojo): implement report arc initiate handler
HdmiLogger.debug(TAG + "Stub handleReportArcInitiate"); HdmiLogger.debug(TAG + "Stub handleReportArcInitiate");
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleReportArcTermination(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleReportArcTermination(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// TODO(amyjojo): implement report arc terminate handler // TODO(amyjojo): implement report arc terminate handler
HdmiLogger.debug(TAG + "Stub handleReportArcTermination"); HdmiLogger.debug(TAG + "Stub handleReportArcTermination");
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGiveAudioStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGiveAudioStatus(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (isSystemAudioControlFeatureEnabled() && mService.getHdmiCecVolumeControl() if (isSystemAudioControlFeatureEnabled() && mService.getHdmiCecVolumeControl()
== HdmiControlManager.VOLUME_CONTROL_ENABLED) { == HdmiControlManager.VOLUME_CONTROL_ENABLED) {
reportAudioStatus(message.getSource()); reportAudioStatus(message.getSource());
} else { return Constants.HANDLED;
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
} }
return true; return Constants.ABORT_REFUSED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGiveSystemAudioModeStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGiveSystemAudioModeStatus(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// If the audio system is initiating the system audio mode on and TV asks the sam status at // If the audio system is initiating the system audio mode on and TV asks the sam status at
// the same time, respond with true. Since we know TV supports sam in this situation. // the same time, respond with true. Since we know TV supports sam in this situation.
@@ -399,52 +404,53 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
mService.sendCecCommand( mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportSystemAudioMode( HdmiCecMessageBuilder.buildReportSystemAudioMode(
mAddress, message.getSource(), isSystemAudioModeOnOrTurningOn)); mAddress, message.getSource(), isSystemAudioModeOnOrTurningOn));
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRequestArcInitiate(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRequestArcInitiate(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
removeAction(ArcInitiationActionFromAvr.class); removeAction(ArcInitiationActionFromAvr.class);
if (!mService.readBooleanSystemProperty(Constants.PROPERTY_ARC_SUPPORT, true)) { if (!mService.readBooleanSystemProperty(Constants.PROPERTY_ARC_SUPPORT, true)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE); return Constants.ABORT_UNRECOGNIZED_OPCODE;
} else if (!isDirectConnectToTv()) { } else if (!isDirectConnectToTv()) {
HdmiLogger.debug("AVR device is not directly connected with TV"); HdmiLogger.debug("AVR device is not directly connected with TV");
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE); return Constants.ABORT_NOT_IN_CORRECT_MODE;
} else { } else {
addAndStartAction(new ArcInitiationActionFromAvr(this)); addAndStartAction(new ArcInitiationActionFromAvr(this));
return Constants.HANDLED;
} }
return true;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRequestArcTermination(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRequestArcTermination(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) { if (!SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNRECOGNIZED_OPCODE); return Constants.ABORT_UNRECOGNIZED_OPCODE;
} else if (!isArcEnabled()) { } else if (!isArcEnabled()) {
HdmiLogger.debug("ARC is not established between TV and AVR device"); HdmiLogger.debug("ARC is not established between TV and AVR device");
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE); return Constants.ABORT_NOT_IN_CORRECT_MODE;
} else { } else {
removeAction(ArcTerminationActionFromAvr.class); removeAction(ArcTerminationActionFromAvr.class);
addAndStartAction(new ArcTerminationActionFromAvr(this)); addAndStartAction(new ArcTerminationActionFromAvr(this));
return Constants.HANDLED;
} }
return true;
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRequestShortAudioDescriptor(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRequestShortAudioDescriptor(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
HdmiLogger.debug(TAG + "Stub handleRequestShortAudioDescriptor"); HdmiLogger.debug(TAG + "Stub handleRequestShortAudioDescriptor");
if (!isSystemAudioControlFeatureEnabled()) { if (!isSystemAudioControlFeatureEnabled()) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
return true;
} }
if (!isSystemAudioActivated()) { if (!isSystemAudioActivated()) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE); return Constants.ABORT_NOT_IN_CORRECT_MODE;
return true;
} }
List<DeviceConfig> config = null; List<DeviceConfig> config = null;
@@ -468,21 +474,20 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
} else { } else {
AudioDeviceInfo deviceInfo = getSystemAudioDeviceInfo(); AudioDeviceInfo deviceInfo = getSystemAudioDeviceInfo();
if (deviceInfo == null) { if (deviceInfo == null) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_UNABLE_TO_DETERMINE); return Constants.ABORT_UNABLE_TO_DETERMINE;
return true;
} }
sadBytes = getSupportedShortAudioDescriptors(deviceInfo, audioFormatCodes); sadBytes = getSupportedShortAudioDescriptors(deviceInfo, audioFormatCodes);
} }
if (sadBytes.length == 0) { if (sadBytes.length == 0) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_INVALID_OPERAND); return Constants.ABORT_INVALID_OPERAND;
} else { } else {
mService.sendCecCommand( mService.sendCecCommand(
HdmiCecMessageBuilder.buildReportShortAudioDescriptor( HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
mAddress, message.getSource(), sadBytes)); mAddress, message.getSource(), sadBytes));
return Constants.HANDLED;
} }
return true;
} }
private byte[] getSupportedShortAudioDescriptors( private byte[] getSupportedShortAudioDescriptors(
@@ -624,7 +629,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSystemAudioModeRequest(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSystemAudioModeRequest(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
boolean systemAudioStatusOn = message.getParams().length != 0; boolean systemAudioStatusOn = message.getParams().length != 0;
// Check if the request comes from a non-TV device. // Check if the request comes from a non-TV device.
@@ -632,8 +638,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
// if non-TV device tries to turn on the feature // if non-TV device tries to turn on the feature
if (message.getSource() != Constants.ADDR_TV) { if (message.getSource() != Constants.ADDR_TV) {
if (systemAudioStatusOn) { if (systemAudioStatusOn) {
handleSystemAudioModeOnFromNonTvDevice(message); return handleSystemAudioModeOnFromNonTvDevice(message);
return true;
} }
} else { } else {
// If TV request the feature on // If TV request the feature on
@@ -644,8 +649,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
// If TV or Audio System does not support the feature, // If TV or Audio System does not support the feature,
// will send abort command. // will send abort command.
if (!checkSupportAndSetSystemAudioMode(systemAudioStatusOn)) { if (!checkSupportAndSetSystemAudioMode(systemAudioStatusOn)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
return true;
} }
mService.sendCecCommand( mService.sendCecCommand(
@@ -660,7 +664,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
if (HdmiUtils.getLocalPortFromPhysicalAddress( if (HdmiUtils.getLocalPortFromPhysicalAddress(
sourcePhysicalAddress, getDeviceInfo().getPhysicalAddress()) sourcePhysicalAddress, getDeviceInfo().getPhysicalAddress())
!= HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE) { != HdmiUtils.TARGET_NOT_UNDER_LOCAL_DEVICE) {
return true; return Constants.HANDLED;
} }
HdmiDeviceInfo safeDeviceInfoByPath = HdmiDeviceInfo safeDeviceInfoByPath =
mService.getHdmiCecNetwork().getSafeDeviceInfoByPath(sourcePhysicalAddress); mService.getHdmiCecNetwork().getSafeDeviceInfoByPath(sourcePhysicalAddress);
@@ -668,29 +672,31 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
switchInputOnReceivingNewActivePath(sourcePhysicalAddress); switchInputOnReceivingNewActivePath(sourcePhysicalAddress);
} }
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetSystemAudioMode(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!checkSupportAndSetSystemAudioMode( if (!checkSupportAndSetSystemAudioMode(
HdmiUtils.parseCommandParamSystemAudioStatus(message))) { HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSystemAudioModeStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSystemAudioModeStatus(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!checkSupportAndSetSystemAudioMode( if (!checkSupportAndSetSystemAudioMode(
HdmiUtils.parseCommandParamSystemAudioStatus(message))) { HdmiUtils.parseCommandParamSystemAudioStatus(message))) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
} }
return true; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
@@ -948,13 +954,13 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
/** /**
* Handler of System Audio Mode Request on from non TV device * Handler of System Audio Mode Request on from non TV device
*/ */
void handleSystemAudioModeOnFromNonTvDevice(HdmiCecMessage message) { @Constants.HandleMessageResult
int handleSystemAudioModeOnFromNonTvDevice(HdmiCecMessage message) {
if (!isSystemAudioControlFeatureEnabled()) { if (!isSystemAudioControlFeatureEnabled()) {
HdmiLogger.debug( HdmiLogger.debug(
"Cannot turn on" + "system audio mode " "Cannot turn on" + "system audio mode "
+ "because the System Audio Control feature is disabled."); + "because the System Audio Control feature is disabled.");
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
return;
} }
// Wake up device // Wake up device
mService.wakeUp(); mService.wakeUp();
@@ -967,7 +973,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
mService.sendCecCommand( mService.sendCecCommand(
HdmiCecMessageBuilder.buildSetSystemAudioMode( HdmiCecMessageBuilder.buildSetSystemAudioMode(
mAddress, Constants.ADDR_BROADCAST, true)); mAddress, Constants.ADDR_BROADCAST, true));
return; return Constants.HANDLED;
} }
// Check if TV supports System Audio Control. // Check if TV supports System Audio Control.
// Handle broadcasting setSystemAudioMode on or aborting message on callback. // Handle broadcasting setSystemAudioMode on or aborting message on callback.
@@ -983,6 +989,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
} }
} }
}); });
return Constants.HANDLED;
} }
void setTvSystemAudioModeSupport(boolean supported) { void setTvSystemAudioModeSupport(boolean supported) {

View File

@@ -251,7 +251,8 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleUserControlPressed(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleUserControlPressed(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
wakeUpIfActiveSource(); wakeUpIfActiveSource();
return super.handleUserControlPressed(message); return super.handleUserControlPressed(message);
@@ -270,10 +271,11 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSetMenuLanguage(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetMenuLanguage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!SET_MENU_LANGUAGE) { if (!SET_MENU_LANGUAGE) {
return false; return Constants.ABORT_UNRECOGNIZED_OPCODE;
} }
try { try {
@@ -283,7 +285,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
// Do not switch language if the new language is the same as the current one. // Do not switch language if the new language is the same as the current one.
// This helps avoid accidental country variant switching from en_US to en_AU // This helps avoid accidental country variant switching from en_US to en_AU
// due to the limitation of CEC. See the warning below. // due to the limitation of CEC. See the warning below.
return true; return Constants.HANDLED;
} }
// Don't use Locale.getAvailableLocales() since it returns a locale // Don't use Locale.getAvailableLocales() since it returns a locale
@@ -298,36 +300,38 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
// will always be mapped to en-AU among other variants like en-US, en-GB, // will always be mapped to en-AU among other variants like en-US, en-GB,
// an en-IN, which may not be the expected one. // an en-IN, which may not be the expected one.
LocalePicker.updateLocale(localeInfo.getLocale()); LocalePicker.updateLocale(localeInfo.getLocale());
return true; return Constants.HANDLED;
} }
} }
Slog.w(TAG, "Can't handle <Set Menu Language> of " + iso3Language); Slog.w(TAG, "Can't handle <Set Menu Language> of " + iso3Language);
return false; return Constants.ABORT_INVALID_OPERAND;
} catch (UnsupportedEncodingException e) { } catch (UnsupportedEncodingException e) {
Slog.w(TAG, "Can't handle <Set Menu Language>", e); Slog.w(TAG, "Can't handle <Set Menu Language>", e);
return false; return Constants.ABORT_INVALID_OPERAND;
} }
} }
@Override @Override
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetSystemAudioMode(HdmiCecMessage message) {
// System Audio Mode only turns on/off when Audio System broadcasts on/off message. // System Audio Mode only turns on/off when Audio System broadcasts on/off message.
// For device with type 4 and 5, it can set system audio mode on/off // For device with type 4 and 5, it can set system audio mode on/off
// when there is another audio system device connected into the system first. // when there is another audio system device connected into the system first.
if (message.getDestination() != Constants.ADDR_BROADCAST if (message.getDestination() != Constants.ADDR_BROADCAST
|| message.getSource() != Constants.ADDR_AUDIO_SYSTEM || message.getSource() != Constants.ADDR_AUDIO_SYSTEM
|| mService.audioSystem() != null) { || mService.audioSystem() != null) {
return true; return Constants.HANDLED;
} }
boolean setSystemAudioModeOn = HdmiUtils.parseCommandParamSystemAudioStatus(message); boolean setSystemAudioModeOn = HdmiUtils.parseCommandParamSystemAudioStatus(message);
if (mService.isSystemAudioActivated() != setSystemAudioModeOn) { if (mService.isSystemAudioActivated() != setSystemAudioModeOn) {
mService.setSystemAudioActivated(setSystemAudioModeOn); mService.setSystemAudioActivated(setSystemAudioModeOn);
} }
return true; return Constants.HANDLED;
} }
@Override @Override
protected boolean handleSystemAudioModeStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSystemAudioModeStatus(HdmiCecMessage message) {
// Only directly addressed System Audio Mode Status message can change internal // Only directly addressed System Audio Mode Status message can change internal
// system audio mode status. // system audio mode status.
if (message.getDestination() == mAddress if (message.getDestination() == mAddress
@@ -337,25 +341,27 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
mService.setSystemAudioActivated(setSystemAudioModeOn); mService.setSystemAudioActivated(setSystemAudioModeOn);
} }
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRoutingChange(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRoutingChange(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2);
handleRoutingChangeAndInformation(physicalAddress, message); handleRoutingChangeAndInformation(physicalAddress, message);
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRoutingInformation(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRoutingInformation(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
handleRoutingChangeAndInformation(physicalAddress, message); handleRoutingChangeAndInformation(physicalAddress, message);
return true; return Constants.HANDLED;
} }
@Override @Override

View File

@@ -203,7 +203,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
} }
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleActiveSource(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int logicalAddress = message.getSource(); int logicalAddress = message.getSource();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
@@ -215,20 +216,22 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
if (isRoutingControlFeatureEnabled()) { if (isRoutingControlFeatureEnabled()) {
switchInputOnReceivingNewActivePath(physicalAddress); switchInputOnReceivingNewActivePath(physicalAddress);
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRequestActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRequestActiveSource(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
maySendActiveSource(message.getSource()); maySendActiveSource(message.getSource());
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSetStreamPath(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetStreamPath(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
// If current device is the target path, set to Active Source. // If current device is the target path, set to Active Source.
@@ -242,12 +245,13 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleSetStreamPath()"); setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleSetStreamPath()");
} }
switchInputOnReceivingNewActivePath(physicalAddress); switchInputOnReceivingNewActivePath(physicalAddress);
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRoutingChange(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRoutingChange(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2);
if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) { if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) {
@@ -256,16 +260,16 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleRoutingChange()"); setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleRoutingChange()");
} }
if (!isRoutingControlFeatureEnabled()) { if (!isRoutingControlFeatureEnabled()) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
return true;
} }
handleRoutingChangeAndInformation(physicalAddress, message); handleRoutingChangeAndInformation(physicalAddress, message);
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRoutingInformation(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRoutingInformation(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) { if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) {
@@ -274,11 +278,10 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice {
setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleRoutingInformation()"); setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleRoutingInformation()");
} }
if (!isRoutingControlFeatureEnabled()) { if (!isRoutingControlFeatureEnabled()) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
return true;
} }
handleRoutingChangeAndInformation(physicalAddress, message); handleRoutingChangeAndInformation(physicalAddress, message);
return true; return Constants.HANDLED;
} }
// Method to switch Input with the new Active Path. // Method to switch Input with the new Active Path.

View File

@@ -47,6 +47,7 @@ import android.util.Slog;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
@@ -210,11 +211,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
boolean dispatchMessage(HdmiCecMessage message) { @VisibleForTesting
@Constants.HandleMessageResult
protected int dispatchMessage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (mService.isPowerStandby() && !mService.isWakeUpMessageReceived() if (mService.isPowerStandby() && !mService.isWakeUpMessageReceived()
&& mStandbyHandler.handleCommand(message)) { && mStandbyHandler.handleCommand(message)) {
return true; return Constants.HANDLED;
} }
return super.onMessage(message); return super.onMessage(message);
} }
@@ -409,7 +412,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleActiveSource(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int logicalAddress = message.getSource(); int logicalAddress = message.getSource();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
@@ -429,21 +433,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
HdmiLogger.debug("Input not ready for device: %X; buffering the command", info.getId()); HdmiLogger.debug("Input not ready for device: %X; buffering the command", info.getId());
mDelayedMessageBuffer.add(message); mDelayedMessageBuffer.add(message);
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleInactiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleInactiveSource(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Seq #10 // Seq #10
// Ignore <Inactive Source> from non-active source device. // Ignore <Inactive Source> from non-active source device.
if (getActiveSource().logicalAddress != message.getSource()) { if (getActiveSource().logicalAddress != message.getSource()) {
return true; return Constants.HANDLED;
} }
if (isProhibitMode()) { if (isProhibitMode()) {
return true; return Constants.HANDLED;
} }
int portId = getPrevPortId(); int portId = getPrevPortId();
if (portId != Constants.INVALID_PORT_ID) { if (portId != Constants.INVALID_PORT_ID) {
@@ -452,10 +457,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
HdmiDeviceInfo inactiveSource = mService.getHdmiCecNetwork().getCecDeviceInfo( HdmiDeviceInfo inactiveSource = mService.getHdmiCecNetwork().getCecDeviceInfo(
message.getSource()); message.getSource());
if (inactiveSource == null) { if (inactiveSource == null) {
return true; return Constants.HANDLED;
} }
if (mService.pathToPortId(inactiveSource.getPhysicalAddress()) == portId) { if (mService.pathToPortId(inactiveSource.getPhysicalAddress()) == portId) {
return true; return Constants.HANDLED;
} }
// TODO: Switch the TV freeze mode off // TODO: Switch the TV freeze mode off
@@ -468,29 +473,31 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
setActivePath(Constants.INVALID_PHYSICAL_ADDRESS); setActivePath(Constants.INVALID_PHYSICAL_ADDRESS);
mService.invokeInputChangeListener(HdmiDeviceInfo.INACTIVE_DEVICE); mService.invokeInputChangeListener(HdmiDeviceInfo.INACTIVE_DEVICE);
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRequestActiveSource(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRequestActiveSource(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Seq #19 // Seq #19
if (mAddress == getActiveSource().logicalAddress) { if (mAddress == getActiveSource().logicalAddress) {
mService.sendCecCommand( mService.sendCecCommand(
HdmiCecMessageBuilder.buildActiveSource(mAddress, getActivePath())); HdmiCecMessageBuilder.buildActiveSource(mAddress, getActivePath()));
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleGetMenuLanguage(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleGetMenuLanguage(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!broadcastMenuLanguage(mService.getLanguage())) { if (!broadcastMenuLanguage(mService.getLanguage())) {
Slog.w(TAG, "Failed to respond to <Get Menu Language>: " + message.toString()); Slog.w(TAG, "Failed to respond to <Get Menu Language>: " + message.toString());
} }
return true; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
@@ -506,7 +513,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
} }
@Override @Override
protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleReportPhysicalAddress(HdmiCecMessage message) {
super.handleReportPhysicalAddress(message); super.handleReportPhysicalAddress(message);
int path = HdmiUtils.twoBytesToInt(message.getParams()); int path = HdmiUtils.twoBytesToInt(message.getParams());
int address = message.getSource(); int address = message.getSource();
@@ -516,19 +524,21 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
handleNewDeviceAtTheTailOfActivePath(path); handleNewDeviceAtTheTailOfActivePath(path);
} }
startNewDeviceAction(ActiveSource.of(address, path), type); startNewDeviceAction(ActiveSource.of(address, path), type);
return true; return Constants.HANDLED;
} }
@Override @Override
protected boolean handleTimerStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleTimerStatus(HdmiCecMessage message) {
// Do nothing. // Do nothing.
return true; return Constants.HANDLED;
} }
@Override @Override
protected boolean handleRecordStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRecordStatus(HdmiCecMessage message) {
// Do nothing. // Do nothing.
return true; return Constants.HANDLED;
} }
void startNewDeviceAction(ActiveSource activeSource, int deviceType) { void startNewDeviceAction(ActiveSource activeSource, int deviceType) {
@@ -590,7 +600,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRoutingChange(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRoutingChange(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Seq #21 // Seq #21
byte[] params = message.getParams(); byte[] params = message.getParams();
@@ -601,27 +612,29 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
int newPath = HdmiUtils.twoBytesToInt(params, 2); int newPath = HdmiUtils.twoBytesToInt(params, 2);
addAndStartAction(new RoutingControlAction(this, newPath, true, null)); addAndStartAction(new RoutingControlAction(this, newPath, true, null));
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleReportAudioStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleReportAudioStatus(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (mService.getHdmiCecVolumeControl() if (mService.getHdmiCecVolumeControl()
== HdmiControlManager.VOLUME_CONTROL_DISABLED) { == HdmiControlManager.VOLUME_CONTROL_DISABLED) {
return false; return Constants.ABORT_REFUSED;
} }
boolean mute = HdmiUtils.isAudioStatusMute(message); boolean mute = HdmiUtils.isAudioStatusMute(message);
int volume = HdmiUtils.getAudioStatusVolume(message); int volume = HdmiUtils.getAudioStatusVolume(message);
setAudioStatus(mute, volume); setAudioStatus(mute, volume);
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleTextViewOn(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleTextViewOn(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Note that <Text View On> (and <Image View On>) command won't be handled here in // Note that <Text View On> (and <Image View On>) command won't be handled here in
@@ -634,12 +647,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (mService.isPowerStandbyOrTransient() && getAutoWakeup()) { if (mService.isPowerStandbyOrTransient() && getAutoWakeup()) {
mService.wakeUp(); mService.wakeUp();
} }
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleImageViewOn(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleImageViewOn(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
// Currently, it's the same as <Text View On>. // Currently, it's the same as <Text View On>.
return handleTextViewOn(message); return handleTextViewOn(message);
@@ -977,7 +991,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleInitiateArc(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleInitiateArc(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!canStartArcUpdateAction(message.getSource(), true)) { if (!canStartArcUpdateAction(message.getSource(), true)) {
@@ -985,13 +1000,12 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (avrDeviceInfo == null) { if (avrDeviceInfo == null) {
// AVR may not have been discovered yet. Delay the message processing. // AVR may not have been discovered yet. Delay the message processing.
mDelayedMessageBuffer.add(message); mDelayedMessageBuffer.add(message);
return true; return Constants.HANDLED;
} }
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED);
if (!isConnectedToArcPort(avrDeviceInfo.getPhysicalAddress())) { if (!isConnectedToArcPort(avrDeviceInfo.getPhysicalAddress())) {
displayOsd(OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT); displayOsd(OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT);
} }
return true; return Constants.ABORT_REFUSED;
} }
// In case where <Initiate Arc> is started by <Request ARC Initiation> // In case where <Initiate Arc> is started by <Request ARC Initiation>
@@ -1000,7 +1014,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(this, SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(this,
message.getSource(), true); message.getSource(), true);
addAndStartAction(action); addAndStartAction(action);
return true; return Constants.HANDLED;
} }
private boolean canStartArcUpdateAction(int avrAddress, boolean enabled) { private boolean canStartArcUpdateAction(int avrAddress, boolean enabled) {
@@ -1022,11 +1036,12 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleTerminateArc(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleTerminateArc(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (mService .isPowerStandbyOrTransient()) { if (mService .isPowerStandbyOrTransient()) {
setArcStatus(false); setArcStatus(false);
return true; return Constants.HANDLED;
} }
// Do not check ARC configuration since the AVR might have been already removed. // Do not check ARC configuration since the AVR might have been already removed.
// Clean up RequestArcTerminationAction in case <Terminate Arc> was started by // Clean up RequestArcTerminationAction in case <Terminate Arc> was started by
@@ -1035,12 +1050,13 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(this, SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(this,
message.getSource(), false); message.getSource(), false);
addAndStartAction(action); addAndStartAction(action);
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSetSystemAudioMode(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSetSystemAudioMode(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
boolean systemAudioStatus = HdmiUtils.parseCommandParamSystemAudioStatus(message); boolean systemAudioStatus = HdmiUtils.parseCommandParamSystemAudioStatus(message);
if (!isMessageForSystemAudio(message)) { if (!isMessageForSystemAudio(message)) {
@@ -1049,30 +1065,29 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
mDelayedMessageBuffer.add(message); mDelayedMessageBuffer.add(message);
} else { } else {
HdmiLogger.warning("Invalid <Set System Audio Mode> message:" + message); HdmiLogger.warning("Invalid <Set System Audio Mode> message:" + message);
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
} }
return true;
} else if (systemAudioStatus && !isSystemAudioControlFeatureEnabled()) { } else if (systemAudioStatus && !isSystemAudioControlFeatureEnabled()) {
HdmiLogger.debug("Ignoring <Set System Audio Mode> message " HdmiLogger.debug("Ignoring <Set System Audio Mode> message "
+ "because the System Audio Control feature is disabled: %s", message); + "because the System Audio Control feature is disabled: %s", message);
mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return Constants.ABORT_REFUSED;
return true;
} }
removeAction(SystemAudioAutoInitiationAction.class); removeAction(SystemAudioAutoInitiationAction.class);
SystemAudioActionFromAvr action = new SystemAudioActionFromAvr(this, SystemAudioActionFromAvr action = new SystemAudioActionFromAvr(this,
message.getSource(), systemAudioStatus, null); message.getSource(), systemAudioStatus, null);
addAndStartAction(action); addAndStartAction(action);
return true; return Constants.HANDLED;
} }
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleSystemAudioModeStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleSystemAudioModeStatus(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!isMessageForSystemAudio(message)) { if (!isMessageForSystemAudio(message)) {
HdmiLogger.warning("Invalid <System Audio Mode Status> message:" + message); HdmiLogger.warning("Invalid <System Audio Mode Status> message:" + message);
// Ignore this message. // Ignore this message.
return true; return Constants.HANDLED;
} }
boolean tvSystemAudioMode = isSystemAudioControlFeatureEnabled(); boolean tvSystemAudioMode = isSystemAudioControlFeatureEnabled();
boolean avrSystemAudioMode = HdmiUtils.parseCommandParamSystemAudioStatus(message); boolean avrSystemAudioMode = HdmiUtils.parseCommandParamSystemAudioStatus(message);
@@ -1089,13 +1104,14 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
setSystemAudioMode(tvSystemAudioMode); setSystemAudioMode(tvSystemAudioMode);
} }
return true; return Constants.HANDLED;
} }
// Seq #53 // Seq #53
@Override @Override
@ServiceThreadOnly @ServiceThreadOnly
protected boolean handleRecordTvScreen(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleRecordTvScreen(HdmiCecMessage message) {
List<OneTouchRecordAction> actions = getActions(OneTouchRecordAction.class); List<OneTouchRecordAction> actions = getActions(OneTouchRecordAction.class);
if (!actions.isEmpty()) { if (!actions.isEmpty()) {
// Assumes only one OneTouchRecordAction. // Assumes only one OneTouchRecordAction.
@@ -1107,25 +1123,21 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
} }
// The default behavior of <Record TV Screen> is replying <Feature Abort> with // The default behavior of <Record TV Screen> is replying <Feature Abort> with
// "Cannot provide source". // "Cannot provide source".
mService.maySendFeatureAbortCommand(message, Constants.ABORT_CANNOT_PROVIDE_SOURCE); return Constants.ABORT_CANNOT_PROVIDE_SOURCE;
return true;
} }
int recorderAddress = message.getSource(); int recorderAddress = message.getSource();
byte[] recordSource = mService.invokeRecordRequestListener(recorderAddress); byte[] recordSource = mService.invokeRecordRequestListener(recorderAddress);
int reason = startOneTouchRecord(recorderAddress, recordSource); return startOneTouchRecord(recorderAddress, recordSource);
if (reason != Constants.ABORT_NO_ERROR) {
mService.maySendFeatureAbortCommand(message, reason);
}
return true;
} }
@Override @Override
protected boolean handleTimerClearedStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleTimerClearedStatus(HdmiCecMessage message) {
byte[] params = message.getParams(); byte[] params = message.getParams();
int timerClearedStatusData = params[0] & 0xFF; int timerClearedStatusData = params[0] & 0xFF;
announceTimerRecordingResult(message.getSource(), timerClearedStatusData); announceTimerRecordingResult(message.getSource(), timerClearedStatusData);
return true; return Constants.HANDLED;
} }
void announceOneTouchRecordResult(int recorderAddress, int result) { void announceOneTouchRecordResult(int recorderAddress, int result) {
@@ -1337,6 +1349,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
// Seq #54 and #55 // Seq #54 and #55
@ServiceThreadOnly @ServiceThreadOnly
@Constants.HandleMessageResult
int startOneTouchRecord(int recorderAddress, byte[] recordSource) { int startOneTouchRecord(int recorderAddress, byte[] recordSource) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (!mService.isControlEnabled()) { if (!mService.isControlEnabled()) {
@@ -1362,7 +1375,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
addAndStartAction(new OneTouchRecordAction(this, recorderAddress, recordSource)); addAndStartAction(new OneTouchRecordAction(this, recorderAddress, recordSource));
Slog.i(TAG, "Start new [One Touch Record]-Target:" + recorderAddress + ", recordSource:" Slog.i(TAG, "Start new [One Touch Record]-Target:" + recorderAddress + ", recordSource:"
+ Arrays.toString(recordSource)); + Arrays.toString(recordSource));
return Constants.ABORT_NO_ERROR; return Constants.HANDLED;
} }
@ServiceThreadOnly @ServiceThreadOnly
@@ -1494,9 +1507,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
} }
@Override @Override
protected boolean handleMenuStatus(HdmiCecMessage message) { @Constants.HandleMessageResult
protected int handleMenuStatus(HdmiCecMessage message) {
// Do nothing and just return true not to prevent from responding <Feature Abort>. // Do nothing and just return true not to prevent from responding <Feature Abort>.
return true; return Constants.HANDLED;
} }
@Constants.RcProfile @Constants.RcProfile

View File

@@ -372,8 +372,7 @@ public class HdmiControlService extends SystemService {
private HdmiCecMessageValidator mMessageValidator; private HdmiCecMessageValidator mMessageValidator;
private final HdmiCecPowerStatusController mPowerStatusController = private HdmiCecPowerStatusController mPowerStatusController;
new HdmiCecPowerStatusController(this);
@ServiceThreadOnly @ServiceThreadOnly
private String mMenuLanguage = localeToMenuLanguage(Locale.getDefault()); private String mMenuLanguage = localeToMenuLanguage(Locale.getDefault());
@@ -427,7 +426,7 @@ public class HdmiControlService extends SystemService {
// Use getAtomWriter() instead of accessing directly, to allow dependency injection for testing. // Use getAtomWriter() instead of accessing directly, to allow dependency injection for testing.
private HdmiCecAtomWriter mAtomWriter = new HdmiCecAtomWriter(); private HdmiCecAtomWriter mAtomWriter = new HdmiCecAtomWriter();
private CecMessageBuffer mCecMessageBuffer = new CecMessageBuffer(this); private CecMessageBuffer mCecMessageBuffer;
private final SelectRequestBuffer mSelectRequestBuffer = new SelectRequestBuffer(); private final SelectRequestBuffer mSelectRequestBuffer = new SelectRequestBuffer();
@@ -493,6 +492,9 @@ public class HdmiControlService extends SystemService {
mIoLooper = mIoThread.getLooper(); mIoLooper = mIoThread.getLooper();
} }
if (mPowerStatusController == null) {
mPowerStatusController = new HdmiCecPowerStatusController(this);
}
mPowerStatusController.setPowerStatus(getInitialPowerStatus()); mPowerStatusController.setPowerStatus(getInitialPowerStatus());
mProhibitMode = false; mProhibitMode = false;
mHdmiControlEnabled = mHdmiCecConfig.getIntValue( mHdmiControlEnabled = mHdmiCecConfig.getIntValue(
@@ -501,6 +503,9 @@ public class HdmiControlService extends SystemService {
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)); HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE));
mMhlInputChangeEnabled = readBooleanSetting(Global.MHL_INPUT_SWITCHING_ENABLED, true); mMhlInputChangeEnabled = readBooleanSetting(Global.MHL_INPUT_SWITCHING_ENABLED, true);
if (mCecMessageBuffer == null) {
mCecMessageBuffer = new CecMessageBuffer(this);
}
if (mCecController == null) { if (mCecController == null) {
mCecController = HdmiCecController.create(this, getAtomWriter()); mCecController = HdmiCecController.create(this, getAtomWriter());
} }
@@ -948,11 +953,10 @@ public class HdmiControlService extends SystemService {
/** /**
* Returns {@link Looper} for IO operation. * Returns {@link Looper} for IO operation.
*
* <p>Declared as package-private.
*/ */
@Nullable @Nullable
Looper getIoLooper() { @VisibleForTesting
protected Looper getIoLooper() {
return mIoLooper; return mIoLooper;
} }
@@ -974,10 +978,9 @@ public class HdmiControlService extends SystemService {
/** /**
* Returns {@link Looper} of main thread. Use this {@link Looper} instance * Returns {@link Looper} of main thread. Use this {@link Looper} instance
* for tasks that are running on main service thread. * for tasks that are running on main service thread.
*
* <p>Declared as package-private.
*/ */
Looper getServiceLooper() { @VisibleForTesting
protected Looper getServiceLooper() {
return mHandler.getLooper(); return mHandler.getLooper();
} }
@@ -1015,8 +1018,9 @@ public class HdmiControlService extends SystemService {
/** /**
* Returns version of CEC. * Returns version of CEC.
*/ */
@VisibleForTesting
@HdmiControlManager.HdmiCecVersion @HdmiControlManager.HdmiCecVersion
int getCecVersion() { protected int getCecVersion() {
return mCecVersion; return mCecVersion;
} }
@@ -1087,23 +1091,30 @@ public class HdmiControlService extends SystemService {
} }
@ServiceThreadOnly @ServiceThreadOnly
boolean handleCecCommand(HdmiCecMessage message) { @VisibleForTesting
@Constants.HandleMessageResult
protected int handleCecCommand(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
int errorCode = mMessageValidator.isValid(message); int errorCode = mMessageValidator.isValid(message);
if (errorCode != HdmiCecMessageValidator.OK) { if (errorCode != HdmiCecMessageValidator.OK) {
// We'll not response on the messages with the invalid source or destination // We'll not response on the messages with the invalid source or destination
// or with parameter length shorter than specified in the standard. // or with parameter length shorter than specified in the standard.
if (errorCode == HdmiCecMessageValidator.ERROR_PARAMETER) { if (errorCode == HdmiCecMessageValidator.ERROR_PARAMETER) {
maySendFeatureAbortCommand(message, Constants.ABORT_INVALID_OPERAND); return Constants.ABORT_INVALID_OPERAND;
} }
return true; return Constants.HANDLED;
} }
getHdmiCecNetwork().handleCecMessage(message); getHdmiCecNetwork().handleCecMessage(message);
if (dispatchMessageToLocalDevice(message)) {
return true; @Constants.HandleMessageResult int handleMessageResult =
dispatchMessageToLocalDevice(message);
if (handleMessageResult == Constants.NOT_HANDLED
&& !mAddressAllocated
&& mCecMessageBuffer.bufferMessage(message)) {
return Constants.HANDLED;
} }
return (!mAddressAllocated) ? mCecMessageBuffer.bufferMessage(message) : false; return handleMessageResult;
} }
void enableAudioReturnChannel(int portId, boolean enabled) { void enableAudioReturnChannel(int portId, boolean enabled) {
@@ -1111,19 +1122,25 @@ public class HdmiControlService extends SystemService {
} }
@ServiceThreadOnly @ServiceThreadOnly
private boolean dispatchMessageToLocalDevice(HdmiCecMessage message) { @VisibleForTesting
@Constants.HandleMessageResult
protected int dispatchMessageToLocalDevice(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
for (HdmiCecLocalDevice device : mHdmiCecNetwork.getLocalDeviceList()) { for (HdmiCecLocalDevice device : mHdmiCecNetwork.getLocalDeviceList()) {
if (device.dispatchMessage(message) @Constants.HandleMessageResult int messageResult = device.dispatchMessage(message);
if (messageResult != Constants.NOT_HANDLED
&& message.getDestination() != Constants.ADDR_BROADCAST) { && message.getDestination() != Constants.ADDR_BROADCAST) {
return true; return messageResult;
} }
} }
if (message.getDestination() != Constants.ADDR_BROADCAST) { // We should never respond <Feature Abort> to a broadcast message
if (message.getDestination() == Constants.ADDR_BROADCAST) {
return Constants.HANDLED;
} else {
HdmiLogger.warning("Unhandled cec command:" + message); HdmiLogger.warning("Unhandled cec command:" + message);
return Constants.NOT_HANDLED;
} }
return false;
} }
/** /**
@@ -2970,7 +2987,7 @@ public class HdmiControlService extends SystemService {
} }
@VisibleForTesting @VisibleForTesting
boolean isStandbyMessageReceived() { protected boolean isStandbyMessageReceived() {
return mStandbyMessageReceived; return mStandbyMessageReceived;
} }

View File

@@ -107,7 +107,7 @@ public class ArcInitiationActionFromAvrTest {
} }
@Override @Override
Looper getServiceLooper() { protected Looper getServiceLooper() {
return mTestLooper.getLooper(); return mTestLooper.getLooper();
} }
}; };

View File

@@ -108,7 +108,7 @@ public class ArcTerminationActionFromAvrTest {
} }
@Override @Override
Looper getServiceLooper() { protected Looper getServiceLooper() {
return mTestLooper.getLooper(); return mTestLooper.getLooper();
} }
}; };

View File

@@ -91,7 +91,7 @@ public class DetectTvSystemAudioModeSupportActionTest {
} }
@Override @Override
Looper getServiceLooper() { protected Looper getServiceLooper() {
return mTestLooper.getLooper(); return mTestLooper.getLooper();
} }
}; };

View File

@@ -19,21 +19,35 @@ import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK; import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_PLAYBACK;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV; import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
import static com.android.server.hdmi.Constants.ABORT_REFUSED;
import static com.android.server.hdmi.Constants.ABORT_UNRECOGNIZED_OPCODE;
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM; import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_BACKUP_1; import static com.android.server.hdmi.Constants.ADDR_BACKUP_1;
import static com.android.server.hdmi.Constants.ADDR_BACKUP_2; import static com.android.server.hdmi.Constants.ADDR_BACKUP_2;
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; 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_PLAYBACK_2;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_3; import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_3;
import static com.android.server.hdmi.Constants.ADDR_SPECIFIC_USE; import static com.android.server.hdmi.Constants.ADDR_SPECIFIC_USE;
import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED; import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
import static com.android.server.hdmi.Constants.HANDLED;
import static com.android.server.hdmi.Constants.MESSAGE_STANDBY;
import static com.android.server.hdmi.Constants.NOT_HANDLED;
import static com.google.common.truth.Truth.assertThat;
import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertTrue;
import android.content.Context; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiControlManager;
import android.hardware.tv.cec.V1_0.SendMessageResult; import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Binder; import android.os.Binder;
@@ -44,6 +58,7 @@ import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry; import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.server.SystemService;
import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback; import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback;
import junit.framework.TestCase; import junit.framework.TestCase;
@@ -53,6 +68,7 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
import java.util.ArrayList;
import java.util.Optional; import java.util.Optional;
/** Tests for {@link com.android.server.hdmi.HdmiCecController} class. */ /** Tests for {@link com.android.server.hdmi.HdmiCecController} class. */
@@ -63,27 +79,7 @@ public class HdmiCecControllerTest {
private FakeNativeWrapper mNativeWrapper; private FakeNativeWrapper mNativeWrapper;
private class MyHdmiControlService extends HdmiControlService { private HdmiControlService mHdmiControlServiceSpy;
MyHdmiControlService(Context context) {
super(context);
}
@Override
Looper getIoLooper() {
return mMyLooper;
}
@Override
Looper getServiceLooper() {
return mMyLooper;
}
@Override
int getCecVersion() {
return mCecVersion;
}
}
private HdmiCecController mHdmiCecController; private HdmiCecController mHdmiCecController;
private int mCecVersion = HdmiControlManager.HDMI_CEC_VERSION_1_4_B; private int mCecVersion = HdmiControlManager.HDMI_CEC_VERSION_1_4_B;
@@ -101,12 +97,39 @@ public class HdmiCecControllerTest {
@Before @Before
public void SetUp() { public void SetUp() {
mMyLooper = mTestLooper.getLooper(); mMyLooper = mTestLooper.getLooper();
mMyLooper = mTestLooper.getLooper();
HdmiControlService hdmiControlService = new MyHdmiControlService( mHdmiControlServiceSpy = spy(new HdmiControlService(
InstrumentationRegistry.getTargetContext()); InstrumentationRegistry.getTargetContext()));
doReturn(mMyLooper).when(mHdmiControlServiceSpy).getIoLooper();
doReturn(mMyLooper).when(mHdmiControlServiceSpy).getServiceLooper();
doAnswer(__ -> mCecVersion).when(mHdmiControlServiceSpy).getCecVersion();
doNothing().when(mHdmiControlServiceSpy)
.writeStringSystemProperty(anyString(), anyString());
mNativeWrapper = new FakeNativeWrapper(); mNativeWrapper = new FakeNativeWrapper();
mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiCecController = HdmiCecController.createWithNativeWrapper(
hdmiControlService, mNativeWrapper, hdmiControlService.getAtomWriter()); mHdmiControlServiceSpy, mNativeWrapper, mHdmiControlServiceSpy.getAtomWriter());
}
/** Additional setup for tests for onMessage
* Adds a local playback device and allocates addresses
*/
public void setUpForOnMessageTest() {
mHdmiControlServiceSpy.setCecController(mHdmiCecController);
HdmiCecLocalDevicePlayback playbackDevice =
new HdmiCecLocalDevicePlayback(mHdmiControlServiceSpy);
playbackDevice.init();
ArrayList<HdmiCecLocalDevice> localDevices = new ArrayList<>();
localDevices.add(playbackDevice);
mHdmiControlServiceSpy.initService();
mHdmiControlServiceSpy.allocateLogicalAddress(localDevices,
HdmiControlService.INITIATED_BY_ENABLE_CEC);
mHdmiControlServiceSpy.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
mTestLooper.dispatchAll();
} }
/** Tests for {@link HdmiCecController#allocateLogicalAddress} */ /** Tests for {@link HdmiCecController#allocateLogicalAddress} */
@@ -119,7 +142,6 @@ public class HdmiCecControllerTest {
@Test @Test
public void testAllocateLogicalAddress_TvDeviceNonPreferredNotOccupied() { public void testAllocateLogicalAddress_TvDeviceNonPreferredNotOccupied() {
mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback); mHdmiCecController.allocateLogicalAddress(DEVICE_TV, ADDR_UNREGISTERED, mCallback);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertEquals(ADDR_TV, mLogicalAddress); assertEquals(ADDR_TV, mLogicalAddress);
@@ -308,4 +330,90 @@ public class HdmiCecControllerTest {
TestCase.assertEquals(Optional.of(callerUid), uidReadingRunnable.getWorkSourceUid()); TestCase.assertEquals(Optional.of(callerUid), uidReadingRunnable.getWorkSourceUid());
TestCase.assertEquals(runnerUid, Binder.getCallingWorkSourceUid()); TestCase.assertEquals(runnerUid, Binder.getCallingWorkSourceUid());
} }
@Test
public void onMessage_broadcastMessage_doesNotSendFeatureAbort() {
setUpForOnMessageTest();
doReturn(ABORT_UNRECOGNIZED_OPCODE).when(mHdmiControlServiceSpy).handleCecCommand(any());
HdmiCecMessage receivedMessage = HdmiCecMessageBuilder.buildStandby(
ADDR_TV, ADDR_BROADCAST);
mNativeWrapper.onCecMessage(receivedMessage);
mTestLooper.dispatchAll();
assertFalse("No <Feature Abort> messages should be sent",
mNativeWrapper.getResultMessages().stream().anyMatch(
message -> message.getOpcode() == Constants.MESSAGE_FEATURE_ABORT));
}
@Test
public void onMessage_notTheDestination_doesNotSendFeatureAbort() {
setUpForOnMessageTest();
doReturn(ABORT_UNRECOGNIZED_OPCODE).when(mHdmiControlServiceSpy).handleCecCommand(any());
HdmiCecMessage receivedMessage = HdmiCecMessageBuilder.buildStandby(
ADDR_TV, ADDR_AUDIO_SYSTEM);
mNativeWrapper.onCecMessage(receivedMessage);
mTestLooper.dispatchAll();
assertFalse("No <Feature Abort> messages should be sent",
mNativeWrapper.getResultMessages().stream().anyMatch(
message -> message.getOpcode() == Constants.MESSAGE_FEATURE_ABORT));
}
@Test
public void onMessage_handledMessage_doesNotSendFeatureAbort() {
setUpForOnMessageTest();
doReturn(HANDLED).when(mHdmiControlServiceSpy).handleCecCommand(any());
HdmiCecMessage receivedMessage = HdmiCecMessageBuilder.buildStandby(
ADDR_TV, ADDR_PLAYBACK_1);
mNativeWrapper.onCecMessage(receivedMessage);
mTestLooper.dispatchAll();
assertFalse("No <Feature Abort> messages should be sent",
mNativeWrapper.getResultMessages().stream().anyMatch(
message -> message.getOpcode() == Constants.MESSAGE_FEATURE_ABORT));
}
@Test
public void onMessage_unhandledMessage_sendsFeatureAbortUnrecognizedOpcode() {
setUpForOnMessageTest();
doReturn(NOT_HANDLED).when(mHdmiControlServiceSpy).handleCecCommand(any());
HdmiCecMessage receivedMessage = HdmiCecMessageBuilder.buildStandby(
ADDR_TV, ADDR_PLAYBACK_1);
mNativeWrapper.onCecMessage(receivedMessage);
mTestLooper.dispatchAll();
HdmiCecMessage featureAbort = HdmiCecMessageBuilder.buildFeatureAbortCommand(
DEVICE_PLAYBACK, DEVICE_TV, MESSAGE_STANDBY, ABORT_UNRECOGNIZED_OPCODE);
assertThat(mNativeWrapper.getResultMessages()).contains(featureAbort);
}
@Test
public void onMessage_sendsFeatureAbortWithRequestedOperand() {
setUpForOnMessageTest();
doReturn(ABORT_REFUSED).when(mHdmiControlServiceSpy).handleCecCommand(any());
HdmiCecMessage receivedMessage = HdmiCecMessageBuilder.buildStandby(
ADDR_TV, ADDR_PLAYBACK_1);
mNativeWrapper.onCecMessage(receivedMessage);
mTestLooper.dispatchAll();
HdmiCecMessage featureAbort = HdmiCecMessageBuilder.buildFeatureAbortCommand(
DEVICE_PLAYBACK, DEVICE_TV, MESSAGE_STANDBY, ABORT_REFUSED);
assertThat(mNativeWrapper.getResultMessages()).contains(featureAbort);
}
} }

View File

@@ -20,7 +20,6 @@ import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1;
import static com.android.server.hdmi.Constants.ADDR_TUNER_1; import static com.android.server.hdmi.Constants.ADDR_TUNER_1;
import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.MESSAGE_GIVE_AUDIO_STATUS;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
@@ -248,7 +247,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true); ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true);
HdmiCecMessage messageGive = HdmiCecMessage messageGive =
HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(messageGive))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@@ -262,45 +262,25 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessage messageGive = HdmiCecMessage messageGive =
HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
.isTrue(); .isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@Test @Test
public void handleRequestShortAudioDescriptor_featureDisabled() throws Exception { public void handleRequestShortAudioDescriptor_featureDisabled() throws Exception {
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildFeatureAbortCommand(
ADDR_AUDIO_SYSTEM,
ADDR_TV,
Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
Constants.ABORT_REFUSED);
mHdmiCecLocalDeviceAudioSystem.setSystemAudioControlFeatureEnabled(false); mHdmiCecLocalDeviceAudioSystem.setSystemAudioControlFeatureEnabled(false);
assertThat( assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
MESSAGE_REQUEST_SAD_LCPM)) MESSAGE_REQUEST_SAD_LCPM))
.isTrue(); .isEqualTo(Constants.ABORT_REFUSED);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@Test @Test
public void handleRequestShortAudioDescriptor_samOff() throws Exception { public void handleRequestShortAudioDescriptor_samOff() throws Exception {
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildFeatureAbortCommand(
ADDR_AUDIO_SYSTEM,
ADDR_TV,
Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
Constants.ABORT_NOT_IN_CORRECT_MODE);
mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false); mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
assertThat( assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
MESSAGE_REQUEST_SAD_LCPM)) MESSAGE_REQUEST_SAD_LCPM))
.isEqualTo(true); .isEqualTo(Constants.ABORT_NOT_IN_CORRECT_MODE);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
// Testing device has sadConfig.xml // Testing device has sadConfig.xml
@@ -315,10 +295,9 @@ public class HdmiCecLocalDeviceAudioSystemTest {
Constants.ABORT_UNABLE_TO_DETERMINE); Constants.ABORT_UNABLE_TO_DETERMINE);
mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true); mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
assertThat( assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
mHdmiCecLocalDeviceAudioSystem.handleRequestShortAudioDescriptor(
MESSAGE_REQUEST_SAD_LCPM)) MESSAGE_REQUEST_SAD_LCPM))
.isEqualTo(true); .isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@@ -335,17 +314,18 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessage expectedMessage = HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
.isTrue(); .isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
// Check if correctly turned on // Check if correctly turned on
mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages();
expectedMessage = expectedMessage =
HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true); HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, true);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleSetSystemAudioMode(messageSet))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
.isTrue(); .isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
assertThat(mMusicMute).isFalse(); assertThat(mMusicMute).isFalse();
@@ -365,7 +345,7 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessageBuilder.buildSetSystemAudioMode( HdmiCecMessageBuilder.buildSetSystemAudioMode(
ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false); ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff)) assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(messageRequestOff))
.isTrue(); .isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
@@ -373,7 +353,7 @@ public class HdmiCecLocalDeviceAudioSystemTest {
expectedMessage = expectedMessage =
HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); HdmiCecMessageBuilder.buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive)) assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveSystemAudioModeStatus(messageGive))
.isTrue(); .isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
assertThat(mMusicMute).isTrue(); assertThat(mMusicMute).isTrue();
@@ -441,7 +421,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
public void handleActiveSource_updateActiveSource() throws Exception { public void handleActiveSource_updateActiveSource() throws Exception {
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
ActiveSource expectedActiveSource = new ActiveSource(ADDR_TV, 0x0000); ActiveSource expectedActiveSource = new ActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource)) assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource().equals(expectedActiveSource))
.isTrue(); .isTrue();
@@ -513,17 +494,10 @@ public class HdmiCecLocalDeviceAudioSystemTest {
public void handleRequestArcInitiate_isNotDirectConnectedToTv() throws Exception { public void handleRequestArcInitiate_isNotDirectConnectedToTv() throws Exception {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildFeatureAbortCommand(
ADDR_AUDIO_SYSTEM,
ADDR_TV,
Constants.MESSAGE_REQUEST_ARC_INITIATION,
Constants.ABORT_NOT_IN_CORRECT_MODE);
mNativeWrapper.setPhysicalAddress(0x1100); mNativeWrapper.setPhysicalAddress(0x1100);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message))
mTestLooper.dispatchAll(); .isEqualTo(Constants.ABORT_NOT_IN_CORRECT_MODE);
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
} }
@Test @Test
@@ -533,7 +507,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
mNativeWrapper.setPhysicalAddress(0x1000); mNativeWrapper.setPhysicalAddress(0x1000);
mHdmiCecLocalDeviceAudioSystem.removeAction(ArcInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.removeAction(ArcInitiationActionFromAvr.class);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcInitiationActionFromAvr.class)) assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcInitiationActionFromAvr.class))
.isNotEmpty(); .isNotEmpty();
@@ -548,7 +523,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessageBuilder.buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM); HdmiCecMessageBuilder.buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM);
mHdmiCecLocalDeviceAudioSystem.removeAction(ArcTerminationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.removeAction(ArcTerminationActionFromAvr.class);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcTerminationActionFromAvr.class)) assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(ArcTerminationActionFromAvr.class))
.isNotEmpty(); .isNotEmpty();
@@ -567,7 +543,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
Constants.MESSAGE_REQUEST_ARC_TERMINATION, Constants.MESSAGE_REQUEST_ARC_TERMINATION,
Constants.ABORT_NOT_IN_CORRECT_MODE); Constants.ABORT_NOT_IN_CORRECT_MODE);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
} }
@@ -576,17 +553,10 @@ public class HdmiCecLocalDeviceAudioSystemTest {
public void handleRequestArcInit_arcIsNotSupported() throws Exception { public void handleRequestArcInit_arcIsNotSupported() throws Exception {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); HdmiCecMessageBuilder.buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildFeatureAbortCommand(
ADDR_AUDIO_SYSTEM,
ADDR_TV,
Constants.MESSAGE_REQUEST_ARC_INITIATION,
Constants.ABORT_UNRECOGNIZED_OPCODE);
mArcSupport = false; mArcSupport = false;
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message))
mTestLooper.dispatchAll(); .isEqualTo(Constants.ABORT_UNRECOGNIZED_OPCODE);
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@Test @Test
@@ -612,7 +582,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST, Constants.MESSAGE_SYSTEM_AUDIO_MODE_REQUEST,
Constants.ABORT_REFUSED); Constants.ABORT_REFUSED);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message))
.isEqualTo(Constants.ABORT_UNRECOGNIZED_OPCODE);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@@ -629,7 +600,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
mHdmiCecLocalDeviceAudioSystem.setTvSystemAudioModeSupport(true); mHdmiCecLocalDeviceAudioSystem.setTvSystemAudioModeSupport(true);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleSystemAudioModeRequest(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@@ -642,7 +614,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
ActiveSource expectedActiveSource = ActiveSource.of(ADDR_TV, 0x0000); ActiveSource expectedActiveSource = ActiveSource.of(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource()) assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource())
.isEqualTo(expectedActiveSource); .isEqualTo(expectedActiveSource);
@@ -659,7 +632,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
ActiveSource expectedActiveSource = ActiveSource.of(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS); ActiveSource expectedActiveSource = ActiveSource.of(ADDR_PLAYBACK_1, SELF_PHYSICAL_ADDRESS);
int expectedLocalActivePort = Constants.CEC_SWITCH_HOME; int expectedLocalActivePort = Constants.CEC_SWITCH_HOME;
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource()) assertThat(mHdmiCecLocalDeviceAudioSystem.getActiveSource())
.isEqualTo(expectedActiveSource); .isEqualTo(expectedActiveSource);
@@ -677,7 +651,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessageBuilder.buildRoutingInformation( HdmiCecMessageBuilder.buildRoutingInformation(
ADDR_AUDIO_SYSTEM, HDMI_1_PHYSICAL_ADDRESS); ADDR_AUDIO_SYSTEM, HDMI_1_PHYSICAL_ADDRESS);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage); assertThat(mNativeWrapper.getOnlyResultMessage()).isEqualTo(expectedMessage);
} }
@@ -691,7 +666,8 @@ public class HdmiCecLocalDeviceAudioSystemTest {
HdmiCecMessage expectedMessage = HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, 0x2000); HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, 0x2000);
assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDeviceAudioSystem.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
} }
@@ -727,18 +703,15 @@ public class HdmiCecLocalDeviceAudioSystemTest {
int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume); int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume);
HdmiCecMessage expected = HdmiCecMessageBuilder.buildReportAudioStatus(ADDR_AUDIO_SYSTEM, HdmiCecMessage expected = HdmiCecMessageBuilder.buildReportAudioStatus(ADDR_AUDIO_SYSTEM,
ADDR_TV, scaledVolume, mute); ADDR_TV, scaledVolume, mute);
HdmiCecMessage featureAbort = HdmiCecMessageBuilder.buildFeatureAbortCommand(
ADDR_AUDIO_SYSTEM, ADDR_TV, MESSAGE_GIVE_AUDIO_STATUS, Constants.ABORT_REFUSED);
HdmiCecMessage giveAudioStatus = HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV, HdmiCecMessage giveAudioStatus = HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV,
ADDR_AUDIO_SYSTEM); ADDR_AUDIO_SYSTEM);
mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages();
boolean handled = mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(giveAudioStatus); assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(giveAudioStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected); assertThat(mNativeWrapper.getResultMessages()).contains(expected);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(featureAbort);
assertThat(handled).isTrue();
} }
@Test @Test
@@ -758,18 +731,15 @@ public class HdmiCecLocalDeviceAudioSystemTest {
int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume); int scaledVolume = VolumeControlAction.scaleToCecVolume(volume, maxVolume);
HdmiCecMessage unexpected = HdmiCecMessageBuilder.buildReportAudioStatus(ADDR_AUDIO_SYSTEM, HdmiCecMessage unexpected = HdmiCecMessageBuilder.buildReportAudioStatus(ADDR_AUDIO_SYSTEM,
ADDR_TV, scaledVolume, mute); ADDR_TV, scaledVolume, mute);
HdmiCecMessage featureAbort = HdmiCecMessageBuilder.buildFeatureAbortCommand(
ADDR_AUDIO_SYSTEM, ADDR_TV, MESSAGE_GIVE_AUDIO_STATUS, Constants.ABORT_REFUSED);
HdmiCecMessage giveAudioStatus = HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV, HdmiCecMessage giveAudioStatus = HdmiCecMessageBuilder.buildGiveAudioStatus(ADDR_TV,
ADDR_AUDIO_SYSTEM); ADDR_AUDIO_SYSTEM);
mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages();
boolean handled = mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(giveAudioStatus); assertThat(mHdmiCecLocalDeviceAudioSystem.handleGiveAudioStatus(giveAudioStatus))
.isEqualTo(Constants.ABORT_REFUSED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(featureAbort);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpected); assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpected);
assertThat(handled).isTrue();
} }
@Test @Test

View File

@@ -113,7 +113,7 @@ public class HdmiCecLocalDevicePlaybackTest {
} }
@Override @Override
boolean isStandbyMessageReceived() { protected boolean isStandbyMessageReceived() {
return mStandby; return mStandby;
} }
@@ -184,7 +184,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isFalse(); assertThat(mWokenUp).isFalse();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
@@ -205,7 +206,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isFalse(); assertThat(mWokenUp).isFalse();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
@@ -226,7 +228,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isTrue(); assertThat(mWokenUp).isTrue();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
@@ -247,7 +250,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isTrue(); assertThat(mWokenUp).isTrue();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
@@ -270,7 +274,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isTrue(); assertThat(mWokenUp).isTrue();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
@@ -293,7 +298,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isTrue(); assertThat(mWokenUp).isTrue();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
@@ -309,7 +315,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x5000); 0x5000);
@@ -329,7 +336,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
@@ -349,7 +357,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
@@ -368,7 +377,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isTrue(); assertThat(mStandby).isTrue();
} }
@@ -383,7 +393,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
} }
@@ -399,7 +410,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
} }
@@ -461,7 +473,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x5000); 0x5000);
@@ -481,7 +494,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
@@ -501,7 +515,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
@@ -520,7 +535,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isTrue(); assertThat(mStandby).isTrue();
} }
@@ -535,7 +551,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
} }
@@ -551,7 +568,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
} }
@@ -606,7 +624,8 @@ public class HdmiCecLocalDevicePlaybackTest {
public void handleSetStreamPath() { public void handleSetStreamPath() {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x2100); HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x2100);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
} }
@Test @Test
@@ -616,7 +635,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetSystemAudioMode( HdmiCecMessageBuilder.buildSetSystemAudioMode(
Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_BROADCAST, true); Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_BROADCAST, true);
assertThat(mHdmiCecLocalDevicePlayback.handleSetSystemAudioMode(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSetSystemAudioMode(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
} }
@@ -629,7 +649,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetSystemAudioMode( HdmiCecMessageBuilder.buildSetSystemAudioMode(
Constants.ADDR_AUDIO_SYSTEM, mHdmiCecLocalDevicePlayback.mAddress, false); Constants.ADDR_AUDIO_SYSTEM, mHdmiCecLocalDevicePlayback.mAddress, false);
assertThat(mHdmiCecLocalDevicePlayback.handleSetSystemAudioMode(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSetSystemAudioMode(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
} }
@@ -640,7 +661,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildReportSystemAudioMode( HdmiCecMessageBuilder.buildReportSystemAudioMode(
Constants.ADDR_AUDIO_SYSTEM, mHdmiCecLocalDevicePlayback.mAddress, true); Constants.ADDR_AUDIO_SYSTEM, mHdmiCecLocalDevicePlayback.mAddress, true);
assertThat(mHdmiCecLocalDevicePlayback.handleSystemAudioModeStatus(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSystemAudioModeStatus(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
} }
@@ -883,7 +905,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
@@ -900,7 +923,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE); HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
@@ -918,7 +942,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress, HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress); mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
@@ -931,7 +956,8 @@ public class HdmiCecLocalDevicePlaybackTest {
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW); HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mStandby).isTrue(); assertThat(mStandby).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
@@ -996,12 +1022,14 @@ public class HdmiCecLocalDevicePlaybackTest {
// 1. DUT is <AS>. // 1. DUT is <AS>.
HdmiCecMessage message1 = HdmiCecMessageBuilder.buildActiveSource( HdmiCecMessage message1 = HdmiCecMessageBuilder.buildActiveSource(
mHdmiCecLocalDevicePlayback.mAddress, mPlaybackPhysicalAddress); mHdmiCecLocalDevicePlayback.mAddress, mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message1)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message1))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
// 2. DUT loses <AS> and goes to sleep. // 2. DUT loses <AS> and goes to sleep.
HdmiCecMessage message2 = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); HdmiCecMessage message2 = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message2)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message2))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isTrue(); assertThat(mStandby).isTrue();
// 3. DUT becomes <AS> again. // 3. DUT becomes <AS> again.
@@ -1271,7 +1299,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x5000); 0x5000);
@@ -1290,7 +1319,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isTrue(); assertThat(mStandby).isTrue();
} }
@@ -1305,7 +1335,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mStandby = false; mStandby = false;
HdmiCecMessage message = HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mStandby).isFalse(); assertThat(mStandby).isFalse();
} }
@@ -1492,7 +1523,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mHdmiControlService.toggleAndFollowTvPower(); mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV, HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON); mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildStandby( HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildStandby(
@@ -1510,7 +1542,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mHdmiControlService.toggleAndFollowTvPower(); mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV, HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON); mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildStandby( HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildStandby(
@@ -1525,7 +1558,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mHdmiControlService.toggleAndFollowTvPower(); mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV, HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_STANDBY); mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_STANDBY);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress, HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
@@ -1543,7 +1577,8 @@ public class HdmiCecLocalDevicePlaybackTest {
mHdmiControlService.toggleAndFollowTvPower(); mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV, HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_UNKNOWN); mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_UNKNOWN);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed( HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed(

View File

@@ -198,8 +198,8 @@ public class HdmiCecLocalDeviceTest {
ADDR_PLAYBACK_1, ADDR_PLAYBACK_1,
Constants.MESSAGE_CEC_VERSION, Constants.MESSAGE_CEC_VERSION,
HdmiCecMessage.EMPTY_PARAM); HdmiCecMessage.EMPTY_PARAM);
boolean handleResult = mHdmiLocalDevice.dispatchMessage(msg); @Constants.HandleMessageResult int handleResult = mHdmiLocalDevice.dispatchMessage(msg);
assertFalse(handleResult); assertEquals(Constants.NOT_HANDLED, handleResult);
} }
@Test @Test
@@ -213,7 +213,7 @@ public class HdmiCecLocalDeviceTest {
(byte) (DEVICE_TV & 0xFF) (byte) (DEVICE_TV & 0xFF)
}; };
callbackResult = -1; callbackResult = -1;
boolean handleResult = @Constants.HandleMessageResult int handleResult =
mHdmiLocalDevice.handleGivePhysicalAddress( mHdmiLocalDevice.handleGivePhysicalAddress(
(int finalResult) -> callbackResult = finalResult); (int finalResult) -> callbackResult = finalResult);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
@@ -221,7 +221,7 @@ public class HdmiCecLocalDeviceTest {
* Test if CecMessage is sent successfully SendMessageResult#SUCCESS is defined in HAL as 0 * Test if CecMessage is sent successfully SendMessageResult#SUCCESS is defined in HAL as 0
*/ */
assertEquals(0, callbackResult); assertEquals(0, callbackResult);
assertTrue(handleResult); assertEquals(Constants.HANDLED, handleResult);
} }
@Test @Test
@@ -251,85 +251,85 @@ public class HdmiCecLocalDeviceTest {
public void handleUserControlPressed_volumeUp() { public void handleUserControlPressed_volumeUp() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP)); HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP));
assertTrue(result); assertEquals(Constants.HANDLED, result);
} }
@Test @Test
public void handleUserControlPressed_volumeDown() { public void handleUserControlPressed_volumeDown() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_DOWN)); HdmiCecKeycode.CEC_KEYCODE_VOLUME_DOWN));
assertTrue(result); assertEquals(Constants.HANDLED, result);
} }
@Test @Test
public void handleUserControlPressed_volumeMute() { public void handleUserControlPressed_volumeMute() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_MUTE)); HdmiCecKeycode.CEC_KEYCODE_MUTE));
assertTrue(result); assertEquals(Constants.HANDLED, result);
} }
@Test @Test
public void handleUserControlPressed_volumeUp_disabled() { public void handleUserControlPressed_volumeUp_disabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP)); HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP));
assertFalse(result); assertThat(result).isEqualTo(Constants.ABORT_REFUSED);
} }
@Test @Test
public void handleUserControlPressed_volumeDown_disabled() { public void handleUserControlPressed_volumeDown_disabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_DOWN)); HdmiCecKeycode.CEC_KEYCODE_VOLUME_DOWN));
assertFalse(result); assertThat(result).isEqualTo(Constants.ABORT_REFUSED);
} }
@Test @Test
public void handleUserControlPressed_volumeMute_disabled() { public void handleUserControlPressed_volumeMute_disabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_PLAYBACK_1, ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_MUTE)); HdmiCecKeycode.CEC_KEYCODE_MUTE));
assertFalse(result); assertThat(result).isEqualTo(Constants.ABORT_REFUSED);
} }
@Test @Test
public void handleCecVersion_isHandled() { public void handleCecVersion_isHandled() {
boolean result = mHdmiLocalDevice.onMessage( @Constants.HandleMessageResult int result = mHdmiLocalDevice.onMessage(
HdmiCecMessageBuilder.buildCecVersion(ADDR_PLAYBACK_1, mHdmiLocalDevice.mAddress, HdmiCecMessageBuilder.buildCecVersion(ADDR_PLAYBACK_1, mHdmiLocalDevice.mAddress,
HdmiControlManager.HDMI_CEC_VERSION_1_4_B)); HdmiControlManager.HDMI_CEC_VERSION_1_4_B));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
} }
@Test @Test
public void handleUserControlPressed_power_localDeviceInStandby_shouldTurnOn() { public void handleUserControlPressed_power_localDeviceInStandby_shouldTurnOn() {
mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER)); HdmiCecKeycode.CEC_KEYCODE_POWER));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isTrue(); assertThat(mWakeupMessageReceived).isTrue();
assertThat(mStandbyMessageReceived).isFalse(); assertThat(mStandbyMessageReceived).isFalse();
} }
@@ -337,11 +337,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_power_localDeviceOn_shouldNotChangePowerStatus() { public void handleUserControlPressed_power_localDeviceOn_shouldNotChangePowerStatus() {
mPowerStatus = HdmiControlManager.POWER_STATUS_ON; mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER)); HdmiCecKeycode.CEC_KEYCODE_POWER));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isFalse(); assertThat(mWakeupMessageReceived).isFalse();
assertThat(mStandbyMessageReceived).isFalse(); assertThat(mStandbyMessageReceived).isFalse();
} }
@@ -349,11 +349,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_powerToggleFunction_localDeviceInStandby_shouldTurnOn() { public void handleUserControlPressed_powerToggleFunction_localDeviceInStandby_shouldTurnOn() {
mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION)); HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isTrue(); assertThat(mWakeupMessageReceived).isTrue();
assertThat(mStandbyMessageReceived).isFalse(); assertThat(mStandbyMessageReceived).isFalse();
} }
@@ -361,11 +361,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_powerToggleFunction_localDeviceOn_shouldTurnOff() { public void handleUserControlPressed_powerToggleFunction_localDeviceOn_shouldTurnOff() {
mPowerStatus = HdmiControlManager.POWER_STATUS_ON; mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION)); HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isFalse(); assertThat(mWakeupMessageReceived).isFalse();
assertThat(mStandbyMessageReceived).isTrue(); assertThat(mStandbyMessageReceived).isTrue();
} }
@@ -373,11 +373,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_powerOnFunction_localDeviceInStandby_shouldTurnOn() { public void handleUserControlPressed_powerOnFunction_localDeviceInStandby_shouldTurnOn() {
mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION)); HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isTrue(); assertThat(mWakeupMessageReceived).isTrue();
assertThat(mStandbyMessageReceived).isFalse(); assertThat(mStandbyMessageReceived).isFalse();
} }
@@ -385,11 +385,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_powerOnFunction_localDeviceOn_noPowerStatusChange() { public void handleUserControlPressed_powerOnFunction_localDeviceOn_noPowerStatusChange() {
mPowerStatus = HdmiControlManager.POWER_STATUS_ON; mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION)); HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isFalse(); assertThat(mWakeupMessageReceived).isFalse();
assertThat(mStandbyMessageReceived).isFalse(); assertThat(mStandbyMessageReceived).isFalse();
} }
@@ -397,11 +397,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_powerOffFunction_localDeviceStandby_noPowerStatusChange() { public void handleUserControlPressed_powerOffFunction_localDeviceStandby_noPowerStatusChange() {
mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION)); HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isFalse(); assertThat(mWakeupMessageReceived).isFalse();
assertThat(mStandbyMessageReceived).isFalse(); assertThat(mStandbyMessageReceived).isFalse();
} }
@@ -409,11 +409,11 @@ public class HdmiCecLocalDeviceTest {
@Test @Test
public void handleUserControlPressed_powerOffFunction_localDeviceOn_shouldTurnOff() { public void handleUserControlPressed_powerOffFunction_localDeviceOn_shouldTurnOff() {
mPowerStatus = HdmiControlManager.POWER_STATUS_ON; mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
boolean result = mHdmiLocalDevice.handleUserControlPressed( @Constants.HandleMessageResult int result = mHdmiLocalDevice.handleUserControlPressed(
HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION)); HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION));
assertThat(result).isTrue(); assertEquals(Constants.HANDLED, result);
assertThat(mWakeupMessageReceived).isFalse(); assertThat(mWakeupMessageReceived).isFalse();
assertThat(mStandbyMessageReceived).isTrue(); assertThat(mStandbyMessageReceived).isTrue();
} }

View File

@@ -233,7 +233,7 @@ public class HdmiCecLocalDeviceTvTest {
mWokenUp = false; mWokenUp = false;
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(ADDR_PLAYBACK_1, HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(ADDR_PLAYBACK_1,
mTvLogicalAddress); mTvLogicalAddress);
assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(textViewOn)).isTrue(); assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(textViewOn)).isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isTrue(); assertThat(mWokenUp).isTrue();
} }
@@ -247,7 +247,7 @@ public class HdmiCecLocalDeviceTvTest {
mWokenUp = false; mWokenUp = false;
HdmiCecMessage imageViewOn = new HdmiCecMessage(ADDR_PLAYBACK_1, mTvLogicalAddress, HdmiCecMessage imageViewOn = new HdmiCecMessage(ADDR_PLAYBACK_1, mTvLogicalAddress,
Constants.MESSAGE_IMAGE_VIEW_ON, HdmiCecMessage.EMPTY_PARAM); Constants.MESSAGE_IMAGE_VIEW_ON, HdmiCecMessage.EMPTY_PARAM);
assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(imageViewOn)).isTrue(); assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(imageViewOn)).isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isTrue(); assertThat(mWokenUp).isTrue();
} }
@@ -261,7 +261,7 @@ public class HdmiCecLocalDeviceTvTest {
mWokenUp = false; mWokenUp = false;
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(ADDR_PLAYBACK_1, HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(ADDR_PLAYBACK_1,
mTvLogicalAddress); mTvLogicalAddress);
assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(textViewOn)).isTrue(); assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(textViewOn)).isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isFalse(); assertThat(mWokenUp).isFalse();
} }
@@ -275,7 +275,7 @@ public class HdmiCecLocalDeviceTvTest {
mWokenUp = false; mWokenUp = false;
HdmiCecMessage imageViewOn = new HdmiCecMessage(ADDR_PLAYBACK_1, mTvLogicalAddress, HdmiCecMessage imageViewOn = new HdmiCecMessage(ADDR_PLAYBACK_1, mTvLogicalAddress,
Constants.MESSAGE_IMAGE_VIEW_ON, HdmiCecMessage.EMPTY_PARAM); Constants.MESSAGE_IMAGE_VIEW_ON, HdmiCecMessage.EMPTY_PARAM);
assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(imageViewOn)).isTrue(); assertThat(mHdmiCecLocalDeviceTv.dispatchMessage(imageViewOn)).isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mWokenUp).isFalse(); assertThat(mWokenUp).isFalse();
} }

View File

@@ -28,6 +28,9 @@ import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertEquals;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -68,7 +71,7 @@ import java.util.Optional;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class HdmiControlServiceTest { public class HdmiControlServiceTest {
private class MockPlaybackDevice extends HdmiCecLocalDevicePlayback { protected static class MockPlaybackDevice extends HdmiCecLocalDevicePlayback {
private boolean mCanGoToStandby; private boolean mCanGoToStandby;
private boolean mIsStandby; private boolean mIsStandby;
@@ -118,7 +121,7 @@ public class HdmiControlServiceTest {
mCanGoToStandby = canGoToStandby; mCanGoToStandby = canGoToStandby;
} }
} }
private class MockAudioSystemDevice extends HdmiCecLocalDeviceAudioSystem { protected static class MockAudioSystemDevice extends HdmiCecLocalDeviceAudioSystem {
private boolean mCanGoToStandby; private boolean mCanGoToStandby;
private boolean mIsStandby; private boolean mIsStandby;
@@ -171,15 +174,14 @@ public class HdmiControlServiceTest {
private static final String TAG = "HdmiControlServiceTest"; private static final String TAG = "HdmiControlServiceTest";
private Context mContextSpy; private Context mContextSpy;
private HdmiControlService mHdmiControlService; private HdmiControlService mHdmiControlServiceSpy;
private HdmiCecController mHdmiCecController; private HdmiCecController mHdmiCecController;
private MockAudioSystemDevice mAudioSystemDevice; private MockAudioSystemDevice mAudioSystemDeviceSpy;
private MockPlaybackDevice mPlaybackDevice; private MockPlaybackDevice mPlaybackDeviceSpy;
private FakeNativeWrapper mNativeWrapper; private FakeNativeWrapper mNativeWrapper;
private Looper mMyLooper; private Looper mMyLooper;
private TestLooper mTestLooper = new TestLooper(); private TestLooper mTestLooper = new TestLooper();
private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
private boolean mStandbyMessageReceived;
private HdmiPortInfo[] mHdmiPortInfo; private HdmiPortInfo[] mHdmiPortInfo;
@Mock private IPowerManager mIPowerManagerMock; @Mock private IPowerManager mIPowerManagerMock;
@@ -199,36 +201,32 @@ public class HdmiControlServiceTest {
HdmiCecConfig hdmiCecConfig = new FakeHdmiCecConfig(mContextSpy); HdmiCecConfig hdmiCecConfig = new FakeHdmiCecConfig(mContextSpy);
mHdmiControlService = new HdmiControlService(mContextSpy) { mHdmiControlServiceSpy = spy(new HdmiControlService(mContextSpy));
@Override doNothing().when(mHdmiControlServiceSpy)
boolean isStandbyMessageReceived() { .writeStringSystemProperty(anyString(), anyString());
return mStandbyMessageReceived;
}
@Override
protected void writeStringSystemProperty(String key, String value) {
}
};
mMyLooper = mTestLooper.getLooper(); mMyLooper = mTestLooper.getLooper();
mAudioSystemDevice = new MockAudioSystemDevice(mHdmiControlService); mAudioSystemDeviceSpy = spy(new MockAudioSystemDevice(mHdmiControlServiceSpy));
mPlaybackDevice = new MockPlaybackDevice(mHdmiControlService); mPlaybackDeviceSpy = spy(new MockPlaybackDevice(mHdmiControlServiceSpy));
mAudioSystemDevice.init(); mAudioSystemDeviceSpy.init();
mPlaybackDevice.init(); mPlaybackDeviceSpy.init();
mHdmiControlService.setIoLooper(mMyLooper); mHdmiControlServiceSpy.setIoLooper(mMyLooper);
mHdmiControlService.setHdmiCecConfig(hdmiCecConfig); mHdmiControlServiceSpy.setHdmiCecConfig(hdmiCecConfig);
mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); mHdmiControlServiceSpy.onBootPhase(PHASE_SYSTEM_SERVICES_READY);
mNativeWrapper = new FakeNativeWrapper(); mNativeWrapper = new FakeNativeWrapper();
mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); mHdmiControlServiceSpy, mNativeWrapper, mHdmiControlServiceSpy.getAtomWriter());
mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlServiceSpy.setCecController(mHdmiCecController);
mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mHdmiControlServiceSpy.setHdmiMhlController(HdmiMhlControllerStub.create(
mHdmiControlService.setMessageValidator(new HdmiCecMessageValidator(mHdmiControlService)); mHdmiControlServiceSpy));
mHdmiControlServiceSpy.setMessageValidator(new HdmiCecMessageValidator(
mHdmiControlServiceSpy));
mLocalDevices.add(mAudioSystemDevice); mLocalDevices.add(mAudioSystemDeviceSpy);
mLocalDevices.add(mPlaybackDevice); mLocalDevices.add(mPlaybackDeviceSpy);
mHdmiPortInfo = new HdmiPortInfo[4]; mHdmiPortInfo = new HdmiPortInfo[4];
mHdmiPortInfo[0] = mHdmiPortInfo[0] =
new HdmiPortInfo(1, HdmiPortInfo.PORT_INPUT, 0x2100, true, false, false); new HdmiPortInfo(1, HdmiPortInfo.PORT_INPUT, 0x2100, true, false, false);
@@ -239,80 +237,81 @@ public class HdmiControlServiceTest {
mHdmiPortInfo[3] = mHdmiPortInfo[3] =
new HdmiPortInfo(4, HdmiPortInfo.PORT_INPUT, 0x3000, true, false, false); new HdmiPortInfo(4, HdmiPortInfo.PORT_INPUT, 0x3000, true, false, false);
mNativeWrapper.setPortInfo(mHdmiPortInfo); mNativeWrapper.setPortInfo(mHdmiPortInfo);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mHdmiControlService.initService(); mHdmiControlServiceSpy.initService();
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlServiceSpy.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
} }
@Test @Test
public void onStandby_notByCec_cannotGoToStandby() { public void onStandby_notByCec_cannotGoToStandby() {
mStandbyMessageReceived = false; doReturn(false).when(mHdmiControlServiceSpy).isStandbyMessageReceived();
mPlaybackDevice.setCanGoToStandby(false);
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); mPlaybackDeviceSpy.setCanGoToStandby(false);
assertTrue(mPlaybackDevice.isStandby());
assertTrue(mAudioSystemDevice.isStandby()); mHdmiControlServiceSpy.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
assertFalse(mPlaybackDevice.isDisabled()); assertTrue(mPlaybackDeviceSpy.isStandby());
assertFalse(mAudioSystemDevice.isDisabled()); assertTrue(mAudioSystemDeviceSpy.isStandby());
assertFalse(mPlaybackDeviceSpy.isDisabled());
assertFalse(mAudioSystemDeviceSpy.isDisabled());
} }
@Test @Test
public void onStandby_byCec() { public void onStandby_byCec() {
mStandbyMessageReceived = true; doReturn(true).when(mHdmiControlServiceSpy).isStandbyMessageReceived();
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); mHdmiControlServiceSpy.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
assertTrue(mPlaybackDevice.isStandby()); assertTrue(mPlaybackDeviceSpy.isStandby());
assertTrue(mAudioSystemDevice.isStandby()); assertTrue(mAudioSystemDeviceSpy.isStandby());
assertTrue(mPlaybackDevice.isDisabled()); assertTrue(mPlaybackDeviceSpy.isDisabled());
assertTrue(mAudioSystemDevice.isDisabled()); assertTrue(mAudioSystemDeviceSpy.isDisabled());
} }
@Test @Test
public void initialPowerStatus_normalBoot_isTransientToStandby() { public void initialPowerStatus_normalBoot_isTransientToStandby() {
assertThat(mHdmiControlService.getInitialPowerStatus()).isEqualTo( assertThat(mHdmiControlServiceSpy.getInitialPowerStatus()).isEqualTo(
HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY); HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY);
} }
@Test @Test
public void initialPowerStatus_quiescentBoot_isTransientToStandby() throws RemoteException { public void initialPowerStatus_quiescentBoot_isTransientToStandby() throws RemoteException {
when(mIPowerManagerMock.isInteractive()).thenReturn(false); when(mIPowerManagerMock.isInteractive()).thenReturn(false);
assertThat(mHdmiControlService.getInitialPowerStatus()).isEqualTo( assertThat(mHdmiControlServiceSpy.getInitialPowerStatus()).isEqualTo(
HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY); HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY);
} }
@Test @Test
public void powerStatusAfterBootComplete_normalBoot_isOn() { public void powerStatusAfterBootComplete_normalBoot_isOn() {
mHdmiControlService.setPowerStatus(HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON); mHdmiControlServiceSpy.setPowerStatus(HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON);
mHdmiControlService.onBootPhase(PHASE_BOOT_COMPLETED); mHdmiControlServiceSpy.onBootPhase(PHASE_BOOT_COMPLETED);
assertThat(mHdmiControlService.getPowerStatus()).isEqualTo( assertThat(mHdmiControlServiceSpy.getPowerStatus()).isEqualTo(
HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON); HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON);
} }
@Test @Test
public void powerStatusAfterBootComplete_quiescentBoot_isStandby() throws RemoteException { public void powerStatusAfterBootComplete_quiescentBoot_isStandby() throws RemoteException {
when(mIPowerManagerMock.isInteractive()).thenReturn(false); when(mIPowerManagerMock.isInteractive()).thenReturn(false);
mHdmiControlService.onBootPhase(PHASE_BOOT_COMPLETED); mHdmiControlServiceSpy.onBootPhase(PHASE_BOOT_COMPLETED);
assertThat(mHdmiControlService.getPowerStatus()).isEqualTo( assertThat(mHdmiControlServiceSpy.getPowerStatus()).isEqualTo(
HdmiControlManager.POWER_STATUS_STANDBY); HdmiControlManager.POWER_STATUS_STANDBY);
} }
@Test @Test
public void initialPowerStatus_normalBoot_goToStandby_doesNotBroadcastsPowerStatus_1_4() { public void initialPowerStatus_normalBoot_goToStandby_doesNotBroadcastsPowerStatus_1_4() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages();
assertThat(mHdmiControlService.getInitialPowerStatus()).isEqualTo( assertThat(mHdmiControlServiceSpy.getInitialPowerStatus()).isEqualTo(
HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY); HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY);
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); mHdmiControlServiceSpy.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
HdmiCecMessage reportPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus( HdmiCecMessage reportPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_PLAYBACK_1, Constants.ADDR_BROADCAST, Constants.ADDR_PLAYBACK_1, Constants.ADDR_BROADCAST,
@@ -322,21 +321,21 @@ public class HdmiControlServiceTest {
@Test @Test
public void initialPowerStatus_normalBoot_goToStandby_broadcastsPowerStatus_2_0() { public void initialPowerStatus_normalBoot_goToStandby_broadcastsPowerStatus_2_0() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages();
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlServiceSpy.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getInitialPowerStatus()).isEqualTo( assertThat(mHdmiControlServiceSpy.getInitialPowerStatus()).isEqualTo(
HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY); HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY);
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); mHdmiControlServiceSpy.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage reportPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus( HdmiCecMessage reportPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(
@@ -347,53 +346,53 @@ public class HdmiControlServiceTest {
@Test @Test
public void setAndGetCecVolumeControlEnabled_isApi() { public void setAndGetCecVolumeControlEnabled_isApi() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( assertThat(mHdmiControlServiceSpy.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( assertThat(mHdmiControlServiceSpy.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
} }
@Test @Test
public void setAndGetCecVolumeControlEnabled_changesSetting() { public void setAndGetCecVolumeControlEnabled_changesSetting() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
assertThat(mHdmiControlService.readIntSetting( assertThat(mHdmiControlServiceSpy.readIntSetting(
Settings.Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED, -1)).isEqualTo( Settings.Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED, -1)).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
assertThat(mHdmiControlService.readIntSetting( assertThat(mHdmiControlServiceSpy.readIntSetting(
Settings.Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED, -1)).isEqualTo( Settings.Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED, -1)).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
} }
@Test @Test
public void setAndGetCecVolumeControlEnabledInternal_doesNotChangeSetting() { public void setAndGetCecVolumeControlEnabledInternal_doesNotChangeSetting() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( assertThat(mHdmiControlServiceSpy.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( assertThat(mHdmiControlServiceSpy.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
} }
@@ -401,60 +400,61 @@ public class HdmiControlServiceTest {
@Test @Test
public void disableAndReenableCec_volumeControlReturnsToOriginalValue_enabled() { public void disableAndReenableCec_volumeControlReturnsToOriginalValue_enabled() {
int volumeControlEnabled = HdmiControlManager.VOLUME_CONTROL_ENABLED; int volumeControlEnabled = HdmiControlManager.VOLUME_CONTROL_ENABLED;
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(volumeControlEnabled); mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(volumeControlEnabled);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
assertThat(mHdmiControlService.getHdmiCecVolumeControl()).isEqualTo( assertThat(mHdmiControlServiceSpy.getHdmiCecVolumeControl()).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(mHdmiControlService.getHdmiCecVolumeControl()).isEqualTo(volumeControlEnabled); assertThat(mHdmiControlServiceSpy.getHdmiCecVolumeControl())
.isEqualTo(volumeControlEnabled);
} }
@Test @Test
public void disableAndReenableCec_volumeControlReturnsToOriginalValue_disabled() { public void disableAndReenableCec_volumeControlReturnsToOriginalValue_disabled() {
int volumeControlEnabled = HdmiControlManager.VOLUME_CONTROL_DISABLED; int volumeControlEnabled = HdmiControlManager.VOLUME_CONTROL_DISABLED;
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, volumeControlEnabled); HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, volumeControlEnabled);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( assertThat(mHdmiControlServiceSpy.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo(
volumeControlEnabled); volumeControlEnabled);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( assertThat(mHdmiControlServiceSpy.getHdmiCecConfig().getIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo(
volumeControlEnabled); volumeControlEnabled);
} }
@Test @Test
public void disableAndReenableCec_volumeControlFeatureListenersNotified() { public void disableAndReenableCec_volumeControlFeatureListenersNotified() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE,
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback();
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
assertThat(callback.mCallbackReceived).isTrue(); assertThat(callback.mCallbackReceived).isTrue();
assertThat(callback.mVolumeControlEnabled).isEqualTo( assertThat(callback.mVolumeControlEnabled).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(callback.mVolumeControlEnabled).isEqualTo( assertThat(callback.mVolumeControlEnabled).isEqualTo(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
} }
@Test @Test
public void addHdmiCecVolumeControlFeatureListener_emitsCurrentState_enabled() { public void addHdmiCecVolumeControlFeatureListener_emitsCurrentState_enabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback();
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(callback.mCallbackReceived).isTrue(); assertThat(callback.mCallbackReceived).isTrue();
@@ -464,11 +464,11 @@ public class HdmiControlServiceTest {
@Test @Test
public void addHdmiCecVolumeControlFeatureListener_emitsCurrentState_disabled() { public void addHdmiCecVolumeControlFeatureListener_emitsCurrentState_disabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback();
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(callback.mCallbackReceived).isTrue(); assertThat(callback.mCallbackReceived).isTrue();
@@ -478,13 +478,13 @@ public class HdmiControlServiceTest {
@Test @Test
public void addHdmiCecVolumeControlFeatureListener_notifiesStateUpdate() { public void addHdmiCecVolumeControlFeatureListener_notifiesStateUpdate() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback();
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback);
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
@@ -495,15 +495,15 @@ public class HdmiControlServiceTest {
@Test @Test
public void addHdmiCecVolumeControlFeatureListener_honorsUnregistration() { public void addHdmiCecVolumeControlFeatureListener_honorsUnregistration() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback();
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mHdmiControlService.removeHdmiControlVolumeControlStatusChangeListener(callback); mHdmiControlServiceSpy.removeHdmiControlVolumeControlStatusChangeListener(callback);
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
@@ -514,16 +514,16 @@ public class HdmiControlServiceTest {
@Test @Test
public void addHdmiCecVolumeControlFeatureListener_notifiesStateUpdate_multiple() { public void addHdmiCecVolumeControlFeatureListener_notifiesStateUpdate_multiple() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED); HdmiControlManager.VOLUME_CONTROL_DISABLED);
VolumeControlFeatureCallback callback1 = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback1 = new VolumeControlFeatureCallback();
VolumeControlFeatureCallback callback2 = new VolumeControlFeatureCallback(); VolumeControlFeatureCallback callback2 = new VolumeControlFeatureCallback();
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback1); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback1);
mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback2); mHdmiControlServiceSpy.addHdmiCecVolumeControlFeatureListener(callback2);
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal( mHdmiControlServiceSpy.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED); HdmiControlManager.VOLUME_CONTROL_ENABLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
@@ -537,47 +537,48 @@ public class HdmiControlServiceTest {
@Test @Test
public void getCecVersion_1_4() { public void getCecVersion_1_4() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
} }
@Test @Test
public void getCecVersion_2_0() { public void getCecVersion_2_0() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
} }
@Test @Test
public void getCecVersion_change() { public void getCecVersion_change() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
} }
@Test @Test
public void handleGiveFeatures_cec14_featureAbort() { public void handleGiveFeatures_cec14_featureAbort() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mHdmiControlServiceSpy.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.onCecMessage(HdmiCecMessageBuilder.buildGiveFeatures(Constants.ADDR_TV, mNativeWrapper.onCecMessage(HdmiCecMessageBuilder.buildGiveFeatures(Constants.ADDR_TV,
@@ -592,11 +593,11 @@ public class HdmiControlServiceTest {
@Test @Test
public void handleGiveFeatures_cec20_reportsFeatures() { public void handleGiveFeatures_cec20_reportsFeatures() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlServiceSpy.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mNativeWrapper.onCecMessage(HdmiCecMessageBuilder.buildGiveFeatures(Constants.ADDR_TV, mNativeWrapper.onCecMessage(HdmiCecMessageBuilder.buildGiveFeatures(Constants.ADDR_TV,
@@ -606,43 +607,43 @@ public class HdmiControlServiceTest {
HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures( HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures(
Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0, Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0,
Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM), Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM),
mPlaybackDevice.getRcProfile(), mPlaybackDevice.getRcFeatures(), mPlaybackDeviceSpy.getRcProfile(), mPlaybackDeviceSpy.getRcFeatures(),
mPlaybackDevice.getDeviceFeatures()); mPlaybackDeviceSpy.getDeviceFeatures());
assertThat(mNativeWrapper.getResultMessages()).contains(reportFeatures); assertThat(mNativeWrapper.getResultMessages()).contains(reportFeatures);
} }
@Test @Test
public void initializeCec_14_doesNotBroadcastReportFeatures() { public void initializeCec_14_doesNotBroadcastReportFeatures() {
mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages();
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlServiceSpy.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures( HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures(
Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0, Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0,
Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM), Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM),
mPlaybackDevice.getRcProfile(), mPlaybackDevice.getRcFeatures(), mPlaybackDeviceSpy.getRcProfile(), mPlaybackDeviceSpy.getRcFeatures(),
mPlaybackDevice.getDeviceFeatures()); mPlaybackDeviceSpy.getDeviceFeatures());
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(reportFeatures); assertThat(mNativeWrapper.getResultMessages()).doesNotContain(reportFeatures);
} }
@Test @Test
public void initializeCec_20_reportsFeaturesBroadcast() { public void initializeCec_20_reportsFeaturesBroadcast() {
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlServiceSpy.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiControlServiceSpy.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures( HdmiCecMessage reportFeatures = HdmiCecMessageBuilder.buildReportFeatures(
Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0, Constants.ADDR_PLAYBACK_1, HdmiControlManager.HDMI_CEC_VERSION_2_0,
Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM), Arrays.asList(DEVICE_PLAYBACK, DEVICE_AUDIO_SYSTEM),
mPlaybackDevice.getRcProfile(), mPlaybackDevice.getRcFeatures(), mPlaybackDeviceSpy.getRcProfile(), mPlaybackDeviceSpy.getRcFeatures(),
mPlaybackDevice.getDeviceFeatures()); mPlaybackDeviceSpy.getDeviceFeatures());
assertThat(mNativeWrapper.getResultMessages()).contains(reportFeatures); assertThat(mNativeWrapper.getResultMessages()).contains(reportFeatures);
} }
@@ -653,7 +654,7 @@ public class HdmiControlServiceTest {
Binder.setCallingWorkSourceUid(callerUid); Binder.setCallingWorkSourceUid(callerUid);
WorkSourceUidReadingRunnable uidReadingRunnable = new WorkSourceUidReadingRunnable(); WorkSourceUidReadingRunnable uidReadingRunnable = new WorkSourceUidReadingRunnable();
mHdmiControlService.runOnServiceThread(uidReadingRunnable); mHdmiControlServiceSpy.runOnServiceThread(uidReadingRunnable);
Binder.setCallingWorkSourceUid(runnerUid); Binder.setCallingWorkSourceUid(runnerUid);
@@ -666,36 +667,36 @@ public class HdmiControlServiceTest {
@Test @Test
public void initCecVersion_limitToMinimumSupportedVersion() { public void initCecVersion_limitToMinimumSupportedVersion() {
mNativeWrapper.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_1_4_B); mNativeWrapper.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
} }
@Test @Test
public void initCecVersion_limitToAtLeast1_4() { public void initCecVersion_limitToAtLeast1_4() {
mNativeWrapper.setCecVersion(0x0); mNativeWrapper.setCecVersion(0x0);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_1_4_B); HdmiControlManager.HDMI_CEC_VERSION_1_4_B);
} }
@Test @Test
public void initCecVersion_useHighestMatchingVersion() { public void initCecVersion_useHighestMatchingVersion() {
mNativeWrapper.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_2_0); mNativeWrapper.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_2_0);
mHdmiControlService.getHdmiCecConfig().setIntValue( mHdmiControlServiceSpy.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION,
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getCecVersion()).isEqualTo( assertThat(mHdmiControlServiceSpy.getCecVersion()).isEqualTo(
HdmiControlManager.HDMI_CEC_VERSION_2_0); HdmiControlManager.HDMI_CEC_VERSION_2_0);
} }
@@ -710,4 +711,140 @@ public class HdmiControlServiceTest {
this.mVolumeControlEnabled = enabled; this.mVolumeControlEnabled = enabled;
} }
} }
@Test
public void handleCecCommand_errorParameter_returnsAbortInvalidOperand() {
// Validity ERROR_PARAMETER. Taken from HdmiCecMessageValidatorTest#isValid_menuStatus
HdmiCecMessage message = HdmiUtils.buildMessage("40:8D:03");
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.ABORT_INVALID_OPERAND);
}
@Test
public void handleCecCommand_errorSource_returnsHandled() {
// Validity ERROR_SOURCE. Taken from HdmiCecMessageValidatorTest#isValid_menuStatus
HdmiCecMessage message = HdmiUtils.buildMessage("F0:8E");
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void handleCecCommand_errorDestination_returnsHandled() {
// Validity ERROR_DESTINATION. Taken from HdmiCecMessageValidatorTest#isValid_menuStatus
HdmiCecMessage message = HdmiUtils.buildMessage("0F:8E:00");
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void handleCecCommand_errorParameterShort_returnsHandled() {
// Validity ERROR_PARAMETER_SHORT
// Taken from HdmiCecMessageValidatorTest#isValid_menuStatus
HdmiCecMessage message = HdmiUtils.buildMessage("40:8E");
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void handleCecCommand_notHandledByLocalDevice_returnsNotHandled() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV,
Constants.ADDR_PLAYBACK_1,
HdmiControlManager.POWER_STATUS_ON);
doReturn(Constants.NOT_HANDLED).when(mHdmiControlServiceSpy)
.dispatchMessageToLocalDevice(message);
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.NOT_HANDLED);
}
@Test
public void handleCecCommand_handledByLocalDevice_returnsHandled() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV,
Constants.ADDR_PLAYBACK_1,
HdmiControlManager.POWER_STATUS_ON);
doReturn(Constants.HANDLED).when(mHdmiControlServiceSpy)
.dispatchMessageToLocalDevice(message);
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void handleCecCommand_localDeviceReturnsFeatureAbort_returnsFeatureAbort() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV,
Constants.ADDR_PLAYBACK_1,
HdmiControlManager.POWER_STATUS_ON);
doReturn(Constants.ABORT_REFUSED).when(mHdmiControlServiceSpy)
.dispatchMessageToLocalDevice(message);
assertThat(mHdmiControlServiceSpy.handleCecCommand(message))
.isEqualTo(Constants.ABORT_REFUSED);
}
@Test
public void dispatchMessageToLocalDevice_broadcastMessage_returnsHandled() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildStandby(
Constants.ADDR_TV,
Constants.ADDR_BROADCAST);
doReturn(Constants.ABORT_REFUSED).when(mPlaybackDeviceSpy).dispatchMessage(message);
doReturn(Constants.ABORT_NOT_IN_CORRECT_MODE)
.when(mAudioSystemDeviceSpy).dispatchMessage(message);
assertThat(mHdmiControlServiceSpy.dispatchMessageToLocalDevice(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void dispatchMessageToLocalDevice_localDevicesDoNotHandleMessage_returnsUnhandled() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildStandby(
Constants.ADDR_TV,
Constants.ADDR_PLAYBACK_1);
doReturn(Constants.NOT_HANDLED).when(mPlaybackDeviceSpy).dispatchMessage(message);
doReturn(Constants.NOT_HANDLED)
.when(mAudioSystemDeviceSpy).dispatchMessage(message);
assertThat(mHdmiControlServiceSpy.dispatchMessageToLocalDevice(message))
.isEqualTo(Constants.NOT_HANDLED);
}
@Test
public void dispatchMessageToLocalDevice_localDeviceHandlesMessage_returnsHandled() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildStandby(
Constants.ADDR_TV,
Constants.ADDR_PLAYBACK_1);
doReturn(Constants.NOT_HANDLED).when(mPlaybackDeviceSpy).dispatchMessage(message);
doReturn(Constants.HANDLED)
.when(mAudioSystemDeviceSpy).dispatchMessage(message);
assertThat(mHdmiControlServiceSpy.dispatchMessageToLocalDevice(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void dispatchMessageToLocalDevice_localDeviceReturnsFeatureAbort_returnsFeatureAbort() {
HdmiCecMessage message = HdmiCecMessageBuilder.buildStandby(
Constants.ADDR_TV,
Constants.ADDR_PLAYBACK_1);
doReturn(Constants.NOT_HANDLED).when(mPlaybackDeviceSpy).dispatchMessage(message);
doReturn(Constants.ABORT_REFUSED)
.when(mAudioSystemDeviceSpy).dispatchMessage(message);
assertThat(mHdmiControlServiceSpy.dispatchMessageToLocalDevice(message))
.isEqualTo(Constants.ABORT_REFUSED);
}
} }