summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nathalie Le Clair <lcnathalie@google.com> 2022-06-28 06:25:58 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-06-28 06:25:58 +0000
commitca29d4cbff8ed24dd3ad301f21c95cf2cc7f9cbe (patch)
tree1559596314e51340724bece60bdeaa58003b1a17
parent6b8d265575fee5cd39e15d10491117cb3b70b5b2 (diff)
parent78b3dd9f9bc6b9f556b3daf6a5f5b578ba74b360 (diff)
Merge changes I8715af82,I547c47a3
* changes: Only wake up at the start of OneTouchPlayAction Remove ActiveSourceAction immediately on standby
-rwxr-xr-xservices/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java1
-rw-r--r--services/core/java/com/android/server/hdmi/OneTouchPlayAction.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java40
3 files changed, 57 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 16bffd9a597b..1de1a7a5e1e5 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -1262,6 +1262,7 @@ abstract class HdmiCecLocalDevice {
boolean initiatedByCec, final PendingActionClearedCallback originalCallback) {
removeAction(AbsoluteVolumeAudioStatusAction.class);
removeAction(SetAudioVolumeLevelDiscoveryAction.class);
+ removeAction(ActiveSourceAction.class);
mPendingActionClearedCallback =
new PendingActionClearedCallback() {
diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
index 3dcf72eb38d6..30a4f3134ffd 100644
--- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
+++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
@@ -91,7 +91,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
boolean is20TargetOnBefore = mIsCec20 && getTargetDevicePowerStatus(mSource, mTargetAddress,
HdmiControlManager.POWER_STATUS_UNKNOWN) == HdmiControlManager.POWER_STATUS_ON;
- broadcastActiveSource();
+ // Make the device the active source.
+ setAndBroadcastActiveSource();
// If the device is not an audio system itself, request the connected audio system to
// turn on.
if (shouldTurnOnConnectedAudioSystem()) {
@@ -108,9 +109,11 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
queryDevicePowerStatus();
} else if (targetPowerStatus == HdmiControlManager.POWER_STATUS_ON) {
if (!is20TargetOnBefore) {
+ // If the device is still the active source, send the <Active Source> message
+ // again.
// Suppress 2nd <Active Source> message if the target device was already on when
// the 1st one was sent.
- broadcastActiveSource();
+ maySendActiveSource();
}
finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
return true;
@@ -121,7 +124,9 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
return true;
}
- private void broadcastActiveSource() {
+ private void setAndBroadcastActiveSource() {
+ // If the device wasn´t the active source yet,
+ // this makes it the active source and wakes it up.
mSource.mService.setAndBroadcastActiveSourceFromOneDeviceType(
mTargetAddress, getSourcePath(), "OneTouchPlayAction#broadcastActiveSource()");
// When OneTouchPlay is called, client side should be responsible to send out the intent
@@ -135,6 +140,11 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
mSource.setLocalActivePort(Constants.CEC_SWITCH_HOME);
}
+ private void maySendActiveSource() {
+ // Only send <Active Source> if the device is already the active source at this time.
+ mSource.maySendActiveSource(mTargetAddress);
+ }
+
private void queryDevicePowerStatus() {
sendCommand(HdmiCecMessageBuilder.buildGiveDevicePowerStatus(getSourceAddress(),
mTargetAddress));
@@ -149,7 +159,9 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction {
if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) {
int status = cmd.getParams()[0];
if (status == HdmiControlManager.POWER_STATUS_ON) {
- broadcastActiveSource();
+ // If the device is still the active source, send the <Active Source> message
+ // again.
+ maySendActiveSource();
finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
}
return true;
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java
index 46a4e862c300..1fa3871347f8 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java
@@ -628,6 +628,46 @@ public class OneTouchPlayActionTest {
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessage);
}
+ @Test
+ public void noWakeUpOnReportPowerStatus() throws Exception {
+ setUp(true);
+
+ HdmiCecLocalDevicePlayback playbackDevice = new HdmiCecLocalDevicePlayback(
+ mHdmiControlService);
+ playbackDevice.init();
+ mLocalDevices.add(playbackDevice);
+ mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
+ mTestLooper.dispatchAll();
+
+ mNativeWrapper.setPollAddressResponse(ADDR_TV, SendMessageResult.SUCCESS);
+ mHdmiControlService.getHdmiCecNetwork().addCecDevice(INFO_TV);
+ mTestLooper.dispatchAll();
+ mNativeWrapper.clearResultMessages();
+
+ TestActionTimer actionTimer = new TestActionTimer();
+ TestCallback callback = new TestCallback();
+ OneTouchPlayAction action = createOneTouchPlayAction(playbackDevice, actionTimer, callback,
+ false);
+ playbackDevice.addAndStartAction(action);
+ mTestLooper.dispatchAll();
+
+ assertThat(mPowerManager.isInteractive()).isTrue();
+ mPowerManager.setInteractive(false);
+ mTestLooper.dispatchAll();
+
+ HdmiCecMessage reportPowerStatusOn =
+ HdmiCecMessage.build(
+ ADDR_TV,
+ playbackDevice.getDeviceInfo().getLogicalAddress(),
+ Constants.MESSAGE_REPORT_POWER_STATUS,
+ POWER_ON);
+ action.processCommand(reportPowerStatusOn);
+ mTestLooper.dispatchAll();
+
+ assertThat(mPowerManager.isInteractive()).isFalse();
+ assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS);
+ }
+
private static class TestActionTimer implements ActionTimer {
private int mState;