diff options
3 files changed, 31 insertions, 13 deletions
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 52ba39810c98..80ec6f863ae9 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -49,6 +49,7 @@ public final class HdmiControlManager { public static final int RESULT_ALREADY_IN_PROGRESS = 4; public static final int RESULT_EXCEPTION = 5; public static final int RESULT_INCORRECT_MODE = 6; + public static final int RESULT_COMMUNICATION_FAILED = 7; // True if we have a logical device of type playback hosted in the system. private final boolean mHasPlaybackDevice; diff --git a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java index 01a5a090a1ee..47386a25749b 100644 --- a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java +++ b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java @@ -23,6 +23,8 @@ import android.hardware.hdmi.IHdmiControlCallback; import android.os.RemoteException; import android.util.Slog; +import com.android.server.hdmi.HdmiControlService.SendMessageCallback; + /** * Handles an action that selects a logical device as a new active source. * @@ -66,6 +68,7 @@ final class DeviceSelectAction extends FeatureAction { private final HdmiCecDeviceInfo mTarget; private final IHdmiControlCallback mCallback; + private final HdmiCecMessage mGivePowerStatus; private int mPowerStatusCounter = 0; @@ -81,25 +84,39 @@ final class DeviceSelectAction extends FeatureAction { super(source); mCallback = callback; mTarget = target; + mGivePowerStatus = HdmiCecMessageBuilder.buildGiveDevicePowerStatus( + getSourceAddress(), getTargetAddress()); + } + + int getTargetAddress() { + return mTarget.getLogicalAddress(); } @Override public boolean start() { - // TODO: Call the logic that display a banner saying the select action got started. + // Seq #9 queryDevicePowerStatus(); return true; } private void queryDevicePowerStatus() { - sendCommand(HdmiCecMessageBuilder.buildGiveDevicePowerStatus( - getSourceAddress(), mTarget.getLogicalAddress())); + sendCommand(mGivePowerStatus, new SendMessageCallback() { + @Override + public void onSendCompleted(int error) { + if (error == Constants.SEND_RESULT_NAK) { + invokeCallback(HdmiControlManager.RESULT_COMMUNICATION_FAILED); + finish(); + return; + } + } + }); mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; addTimer(mState, TIMEOUT_MS); } @Override public boolean processCommand(HdmiCecMessage cmd) { - if (cmd.getSource() != mTarget.getLogicalAddress()) { + if (cmd.getSource() != getTargetAddress()) { return false; } int opcode = cmd.getOpcode(); @@ -128,9 +145,6 @@ final class DeviceSelectAction extends FeatureAction { } private boolean handleReportPowerStatus(int powerStatus) { - // TODO: Check TV's own status which might have been updated during the action. - // If in 'Standby' or 'Transit to standby', remove the banner - // and stop this action. Otherwise, send <Set Stream Path> switch (powerStatus) { case HdmiControlManager.POWER_STATUS_ON: sendSetStreamPath(); @@ -186,6 +200,11 @@ final class DeviceSelectAction extends FeatureAction { } switch (mState) { case STATE_WAIT_FOR_REPORT_POWER_STATUS: + if (tv().isPowerStandbyOrTransient()) { + invokeCallback(HdmiControlManager.RESULT_INCORRECT_MODE); + finish(); + return; + } sendSetStreamPath(); break; case STATE_WAIT_FOR_DEVICE_TO_TRANSIT_TO_STANDBY: @@ -194,8 +213,6 @@ final class DeviceSelectAction extends FeatureAction { queryDevicePowerStatus(); break; case STATE_WAIT_FOR_ACTIVE_SOURCE: - // TODO: Remove the banner - // Display banner "Communication failed. Please check your cable or connection" invokeCallback(HdmiControlManager.RESULT_TIMEOUT); finish(); break; @@ -212,8 +229,4 @@ final class DeviceSelectAction extends FeatureAction { Slog.e(TAG, "Callback failed:" + e); } } - - int getTargetAddress() { - return mTarget.getLogicalAddress(); - } } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 45ee89fc339c..223deabe2d14 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -1076,4 +1076,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { boolean isProhibitMode() { return mService.isProhibitMode(); } + + boolean isPowerStandbyOrTransient() { + return mService.isPowerStandbyOrTransient(); + } } |