From 3cdd81848926a339bcc23bc37a34630b4bbe31d7 Mon Sep 17 00:00:00 2001 From: "Venkatarama NG. Avadhani" Date: Mon, 22 Nov 2021 16:18:07 +0530 Subject: [PATCH 1/2] Add onBootPhase call to tests that use AudioDevice Audio Device now checks for the screen on status when logical address allocation completes. Any test that depends on this feature will have to make sure that the onBootPhase is called so that mDisplayManager is not null in isScreenOff() of HdmiControlService Bug: 194790930 Test: atest com.android.server.hdmi Change-Id: I7137f4e5d9978a4bc997a0ab6b03621ec3f2bb25 --- .../src/com/android/server/hdmi/ActiveSourceActionTest.java | 2 ++ .../com/android/server/hdmi/ArcInitiationActionFromAvrTest.java | 2 ++ .../android/server/hdmi/ArcTerminationActionFromAvrTest.java | 2 ++ .../android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java | 2 ++ 4 files changed, 8 insertions(+) diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java index cf4bdf60c34a0..b588db66a08f0 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java @@ -16,6 +16,7 @@ package com.android.server.hdmi; +import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; @@ -153,6 +154,7 @@ public class ActiveSourceActionTest { mHdmiControlService); audioDevice.init(); mLocalDevices.add(audioDevice); + mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java index 4ff7c6694aaee..ff01cb1a3a1dd 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java @@ -15,6 +15,7 @@ */ package com.android.server.hdmi; +import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.google.common.truth.Truth.assertThat; @@ -115,6 +116,7 @@ public class ArcInitiationActionFromAvrTest { mAction = new ArcInitiationActionFromAvr(mHdmiCecLocalDeviceAudioSystem); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); + hdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); hdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java index c6bb9144b983b..a44a5cde0276b 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java @@ -15,6 +15,7 @@ */ package com.android.server.hdmi; +import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.google.common.truth.Truth.assertThat; @@ -114,6 +115,7 @@ public class ArcTerminationActionFromAvrTest { mAction = new ArcTerminationActionFromAvr(mHdmiCecLocalDeviceAudioSystem); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); + hdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); hdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mHdmiCecLocalDeviceAudioSystem.setArcStatus(true); mTestLooper.dispatchAll(); 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 17f827da1ae7e..a4113924294bd 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java @@ -15,6 +15,7 @@ */ package com.android.server.hdmi; +import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; 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_PLAYBACK_1; @@ -206,6 +207,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { 4, HdmiPortInfo.PORT_INPUT, HDMI_3_PHYSICAL_ADDRESS, true, false, false); mNativeWrapper.setPortInfo(mHdmiPortInfo); mHdmiControlService.initService(); + mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY); mPowerManager = new FakePowerManagerWrapper(context); mHdmiControlService.setPowerManager(mPowerManager); // No TV device interacts with AVR so system audio control won't be turned on here From 4cc7739c0b7c4ca898cf0683ca9bbe1f0edf4721 Mon Sep 17 00:00:00 2001 From: "Venkatarama NG. Avadhani" Date: Thu, 29 Jul 2021 18:49:21 +0530 Subject: [PATCH 2/2] CEC: Do not wake device on quiescent boot In audio system, try to turn on the system audio mode only if device is not in quiescent state. Bug: 194790930 Test: cts-tradefed run commandAndExit cts -m CtsOsHostTestCases --test android.os.cts.QuiescentBootTests Change-Id: Ic5a4bb74e04990edcf42cc3dd066ae1f8b6c3ee6 --- .../hdmi/HdmiCecLocalDeviceAudioSystem.java | 21 ++++++++++++------- .../server/hdmi/HdmiControlService.java | 11 ++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 1fa6241e8b94c..7e71589302f14 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -265,13 +265,20 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { // to request Short Audio Descriptor. Since ARC and SAM are independent, // we can turn on ARC anyways when audio system device just boots up. initArcOnFromAvr(); - int systemAudioControlOnPowerOnProp = - SystemProperties.getInt( - PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, - ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON); - boolean lastSystemAudioControlStatus = - SystemProperties.getBoolean(Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, true); - systemAudioControlOnPowerOn(systemAudioControlOnPowerOnProp, lastSystemAudioControlStatus); + + // This prevents turning on of System Audio Mode during a quiescent boot. If the quiescent + // boot is exited just after this check, this code will be executed only at the next + // wake-up. + if (!mService.isScreenOff()) { + int systemAudioControlOnPowerOnProp = + SystemProperties.getInt( + PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, + ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON); + boolean lastSystemAudioControlStatus = + SystemProperties.getBoolean(Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, true); + systemAudioControlOnPowerOn( + systemAudioControlOnPowerOnProp, lastSystemAudioControlStatus); + } mService.getHdmiCecNetwork().clearDeviceList(); launchDeviceDiscovery(); startQueuedActions(); diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 69f7af23fe4cb..b0f640a7f6cbf 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -37,6 +37,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObserver; +import android.hardware.display.DisplayManager; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiHotplugEvent; @@ -81,6 +82,7 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.Slog; import android.util.SparseArray; +import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -410,6 +412,9 @@ public class HdmiControlService extends SystemService { @Nullable private Looper mIoLooper; + @Nullable + private DisplayManager mDisplayManager; + @HdmiControlManager.HdmiCecVersion private int mCecVersion; @@ -676,6 +681,11 @@ public class HdmiControlService extends SystemService { }, mServiceThreadExecutor); } + /** Returns true if the device screen is off */ + boolean isScreenOff() { + return mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() == Display.STATE_OFF; + } + private void bootCompleted() { // on boot, if device is interactive, set HDMI CEC state as powered on as well if (mPowerManager.isInteractive() && isPowerStandbyOrTransient()) { @@ -731,6 +741,7 @@ public class HdmiControlService extends SystemService { @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { + mDisplayManager = getContext().getSystemService(DisplayManager.class); mTvInputManager = (TvInputManager) getContext().getSystemService( Context.TV_INPUT_SERVICE); mPowerManager = new PowerManagerWrapper(getContext());