Handle atom power off.
Test: local tested on atom.
Change-Id: I3a682fecf5dfcf9a78e53afb3c4550068fcf299d
Bug: 80296334, 80295616
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 37516d0..9c214b4 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -49,6 +49,18 @@
@Override
@ServiceThreadOnly
+ protected void onStandby(boolean initiatedByCec, int standbyAction) {
+ assertRunOnServiceThread();
+ if (setSystemAudioMode(false)) {
+ mService.sendCecCommand(
+ HdmiCecMessageBuilder.buildSetSystemAudioMode(
+ mAddress, Constants.ADDR_BROADCAST, false)
+ );
+ }
+ }
+
+ @Override
+ @ServiceThreadOnly
protected void onAddressAllocated(int logicalAddress, int reason) {
assertRunOnServiceThread();
mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 16d346a..71ba03a 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -2041,6 +2041,10 @@
return mLocalDevices.contains(HdmiDeviceInfo.DEVICE_TV);
}
+ boolean isAudioSystemDevice() {
+ return mLocalDevices.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
+ }
+
boolean isTvDeviceEnabled() {
return isTvDevice() && tv() != null;
}
@@ -2229,8 +2233,10 @@
device.onStandby(mStandbyMessageReceived, standbyAction);
}
mStandbyMessageReceived = false;
- mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, false);
- mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, DISABLED);
+ if (!isAudioSystemDevice()) {
+ mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, false);
+ mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, DISABLED);
+ }
}
private void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType) {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
index 0c86eb3..40847a5 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -19,6 +19,7 @@
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
+import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertEquals;
@@ -41,6 +42,7 @@
*/
public class HdmiCecLocalDeviceAudioSystemTest {
+ private static final String TAG = "HdmiCecLocalDeviceAudioSystemTest";
private HdmiControlService mHdmiControlService;
private HdmiCecController mHdmiCecController;
private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem;
@@ -237,4 +239,18 @@
assertEquals(expectMessage, mNativeWrapper.getResultMessage());
assertTrue(mMusicMute);
}
+
+ @Test
+ public void onStandbyAudioSystem_currentSystemAudioControlOn() {
+ // Set system audio control on first
+ mHdmiCecLocalDeviceAudioSystem.setSystemAudioMode(true);
+
+ // Check if standby correctly turns off the feature
+ mHdmiCecLocalDeviceAudioSystem.onStandby(false, STANDBY_SCREEN_OFF);
+ mTestLooper.dispatchAll();
+ HdmiCecMessage expectMessage = HdmiCecMessageBuilder
+ .buildSetSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_BROADCAST, false);
+ assertEquals(expectMessage, mNativeWrapper.getResultMessage());
+ assertTrue(mMusicMute);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
index ccbecf0..833ffa6 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
@@ -16,6 +16,7 @@
package com.android.server.hdmi;
import static android.hardware.hdmi.HdmiDeviceInfo.DEVICE_TV;
+import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
@@ -25,7 +26,9 @@
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
+import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiPortInfo;
+import android.os.PowerManager;
import android.os.test.TestLooper;
import android.support.test.filters.SmallTest;
import android.os.MessageQueue;
@@ -91,10 +94,29 @@
private int callbackResult;
private HdmiCecMessageValidator mMessageValidator;
private static byte[] param;
+ private boolean mStandbyMessageReceived;
+ private boolean isControlEnabled;
+ private int mPowerStatus;
@Before
public void SetUp() {
- mHdmiControlService = new HdmiControlService(null);
+ mHdmiControlService = new HdmiControlService(null) {
+ @Override
+ boolean isControlEnabled() {
+ return isControlEnabled;
+ }
+
+ @Override
+ boolean isPowerOnOrTransient() {
+ return mPowerStatus == HdmiControlManager.POWER_STATUS_ON
+ || mPowerStatus == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON;
+ }
+
+ @Override
+ void standby() {
+ mStandbyMessageReceived = true;
+ }
+ };
mHdmiControlService.setIoLooper(mTestLooper.getLooper());
mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlService, new FakeNativeWrapper());
@@ -155,4 +177,14 @@
mTestLooper.dispatchAll();
assertEquals(0, callbackResult);
}
+
+ @Test
+ public void handleStandby_isPowerOn() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
+ isControlEnabled = true;
+ assertFalse(mStandbyMessageReceived);
+ mHdmiLocalDevice.handleStandby(
+ HdmiCecMessageBuilder.buildStandby(ADDR_TV, ADDR_AUDIO_SYSTEM));
+ assertTrue(mStandbyMessageReceived);
+ }
}