From e672a8809f04b4fbc668099b0cf0ee8238865374 Mon Sep 17 00:00:00 2001 From: Marvin Ramin Date: Mon, 30 Nov 2020 11:45:31 +0100 Subject: [PATCH] Migrate CEC enabled value to CEC configuration Read value whether HDMI CEC is enabled from HdmiCecConfig and cache it in HdmiControlService. This changes the type from boolean to int. Adapt the @hide listener for a change of this value to return integers instead of booleans as well. Bug: 171870477 Test: atest com.android.server.hdmi Change-Id: I6275fe1b3e1ca62c210019e1df216f8731a0b5ab --- .../hardware/hdmi/HdmiControlManager.java | 5 ++- .../IHdmiControlStatusChangeListener.aidl | 6 +-- .../android/server/audio/AudioService.java | 6 ++- .../server/hdmi/HdmiControlService.java | 38 ++++++++++--------- .../hdmi/ArcInitiationActionFromAvrTest.java | 4 ++ .../hdmi/ArcTerminationActionFromAvrTest.java | 4 ++ .../server/hdmi/HdmiControlServiceTest.java | 38 ++++++++++--------- ...ystemAudioInitiationActionFromAvrTest.java | 4 ++ 8 files changed, 63 insertions(+), 42 deletions(-) diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index dddf7352424b2..78584990e75e2 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -1110,7 +1110,8 @@ public final class HdmiControlManager { * * Note: Value of isCecAvailable is only valid when isCecEnabled is true. **/ - void onStatusChange(boolean isCecEnabled, boolean isCecAvailable); + void onStatusChange(@HdmiControlManager.HdmiCecControl int isCecEnabled, + boolean isCecAvailable); } private final ArrayMap @@ -1351,7 +1352,7 @@ public final class HdmiControlManager { Executor executor, final HdmiControlStatusChangeListener listener) { return new IHdmiControlStatusChangeListener.Stub() { @Override - public void onStatusChange(boolean isCecEnabled, boolean isCecAvailable) { + public void onStatusChange(@HdmiCecControl int isCecEnabled, boolean isCecAvailable) { final long token = Binder.clearCallingIdentity(); try { executor.execute(() -> listener.onStatusChange(isCecEnabled, isCecAvailable)); diff --git a/core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl b/core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl index 889d3fe1fae10..d61ab6ac2da70 100644 --- a/core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl +++ b/core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl @@ -28,11 +28,11 @@ oneway interface IHdmiControlStatusChangeListener { * Called when HDMI Control (CEC) is enabled/disabled. * * @param isCecEnabled status of HDMI Control - * {@link android.provider.Settings.Global#HDMI_CONTROL_ENABLED}: {@code true} if enabled. + * {@link android.hardware.hdmi.HdmiControlManager#CEC_SETTING_NAME_HDMI_CEC_ENABLED}: {@link android.hardware.hdmi.HdmiControlManager#HDMI_CEC_CONTROL_ENABLED} if enabled. * @param isCecAvailable status of CEC support of the connected display (the TV). * {@code true} if supported. * - * Note: Value of isCecAvailable is only valid when isCecEnabled is true. + * Note: Value of isCecAvailable is only valid when isCecEnabled is {@link android.hardware.hdmi.HdmiControlManager#HDMI_CEC_CONTROL_ENABLED}. **/ - void onStatusChange(boolean isCecEnabled, boolean isCecAvailable); + void onStatusChange(int isCecEnabled, boolean isCecAvailable); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index e13d6af99231d..7115c9ad5a05f 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -7724,10 +7724,12 @@ public class AudioService extends IAudioService.Stub private class MyHdmiControlStatusChangeListenerCallback implements HdmiControlManager.HdmiControlStatusChangeListener { - public void onStatusChange(boolean isCecEnabled, boolean isCecAvailable) { + public void onStatusChange(@HdmiControlManager.HdmiCecControl int isCecEnabled, + boolean isCecAvailable) { synchronized (mHdmiClientLock) { if (mHdmiManager == null) return; - updateHdmiCecSinkLocked(isCecEnabled ? isCecAvailable : false); + boolean cecEnabled = isCecEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED; + updateHdmiCecSinkLocked(cecEnabled ? isCecAvailable : false); } } }; diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index beaf6d53370d1..9b194ae84a378 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -18,6 +18,7 @@ package com.android.server.hdmi; import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_ADD_DEVICE; import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE; +import static android.hardware.hdmi.HdmiControlManager.HDMI_CEC_CONTROL_ENABLED; import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED; import static com.android.server.hdmi.Constants.DISABLED; @@ -325,7 +326,8 @@ public class HdmiControlService extends SystemService { // Set to true while HDMI control is enabled. If set to false, HDMI-CEC/MHL protocol // handling will be disabled and no request will be handled. @GuardedBy("mLock") - private boolean mHdmiControlEnabled; + @HdmiControlManager.HdmiCecControl + private int mHdmiControlEnabled; // Set to true while the service is in normal mode. While set to false, no input change is // allowed. Used for situations where input change can confuse users such as channel auto-scan, @@ -477,8 +479,7 @@ public class HdmiControlService extends SystemService { mPowerStatusController.setPowerStatus(getInitialPowerStatus()); mProhibitMode = false; mHdmiControlEnabled = mHdmiCecConfig.getIntValue( - HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED) - == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED; + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED); setHdmiCecVolumeControlEnabledInternal(getHdmiCecConfig().getIntValue( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)); mMhlInputChangeEnabled = readBooleanSetting(Global.MHL_INPUT_SWITCHING_ENABLED, true); @@ -497,7 +498,7 @@ public class HdmiControlService extends SystemService { Slog.i(TAG, "Device does not support MHL-control."); } mHdmiCecNetwork = new HdmiCecNetwork(this, mCecController, mMhlController); - if (mHdmiControlEnabled) { + if (mHdmiControlEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) { initializeCec(INITIATED_BY_BOOT_UP); } else { mCecController.setOption(OptionKey.ENABLE_CEC, false); @@ -513,9 +514,8 @@ public class HdmiControlService extends SystemService { new HdmiCecConfig.SettingChangeListener() { @Override public void onChange(String setting) { - boolean enabled = mHdmiCecConfig.getIntValue( - HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED) - == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED; + @HdmiControlManager.HdmiCecControl int enabled = mHdmiCecConfig.getIntValue( + HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED); setControlEnabled(enabled); } }); @@ -630,7 +630,7 @@ public class HdmiControlService extends SystemService { } if (reason != -1) { invokeVendorCommandListenersOnControlStateChanged(true, reason); - announceHdmiControlStatusChange(true); + announceHdmiControlStatusChange(HDMI_CEC_CONTROL_ENABLED); } } @@ -2193,7 +2193,6 @@ public class HdmiControlService extends SystemService { // System settings pw.println("System_settings:"); pw.increaseIndent(); - pw.println("mHdmiControlEnabled: " + mHdmiControlEnabled); pw.println("mMhlInputChangeEnabled: " + mMhlInputChangeEnabled); pw.println("mSystemAudioActivated: " + isSystemAudioActivated()); pw.println("mHdmiCecVolumeControlEnabled: " + mHdmiCecVolumeControl); @@ -2773,7 +2772,7 @@ public class HdmiControlService extends SystemService { } } - private void announceHdmiControlStatusChange(boolean isEnabled) { + private void announceHdmiControlStatusChange(@HdmiControlManager.HdmiCecControl int isEnabled) { assertRunOnServiceThread(); synchronized (mLock) { List listeners = new ArrayList<>( @@ -2787,16 +2786,18 @@ public class HdmiControlService extends SystemService { } private void invokeHdmiControlStatusChangeListenerLocked( - IHdmiControlStatusChangeListener listener, boolean isEnabled) { + IHdmiControlStatusChangeListener listener, + @HdmiControlManager.HdmiCecControl int isEnabled) { invokeHdmiControlStatusChangeListenerLocked(Collections.singletonList(listener), isEnabled); } private void invokeHdmiControlStatusChangeListenerLocked( - Collection listeners, boolean isEnabled) { + Collection listeners, + @HdmiControlManager.HdmiCecControl int isEnabled) { if (listeners.isEmpty()) { return; } - if (isEnabled) { + if (isEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) { queryDisplayStatus(new IHdmiControlCallback.Stub() { public void onComplete(int status) { boolean isAvailable = true; @@ -2814,7 +2815,8 @@ public class HdmiControlService extends SystemService { } private void invokeHdmiControlStatusChangeListenerLocked( - Collection listeners, boolean isEnabled, + Collection listeners, + @HdmiControlManager.HdmiCecControl int isEnabled, boolean isCecAvailable) { for (IHdmiControlStatusChangeListener listener : listeners) { try { @@ -2881,7 +2883,7 @@ public class HdmiControlService extends SystemService { boolean isControlEnabled() { synchronized (mLock) { - return mHdmiControlEnabled; + return mHdmiControlEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED; } } @@ -2955,7 +2957,7 @@ public class HdmiControlService extends SystemService { mPowerStatusController.setPowerStatus(HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON, false); if (mCecController != null) { - if (mHdmiControlEnabled) { + if (mHdmiControlEnabled == HDMI_CEC_CONTROL_ENABLED) { int startReason = -1; switch (wakeUpAction) { case WAKE_UP_SCREEN_ON: @@ -3224,14 +3226,14 @@ public class HdmiControlService extends SystemService { } @ServiceThreadOnly - void setControlEnabled(boolean enabled) { + void setControlEnabled(@HdmiControlManager.HdmiCecControl int enabled) { assertRunOnServiceThread(); synchronized (mLock) { mHdmiControlEnabled = enabled; } - if (enabled) { + if (enabled == HDMI_CEC_CONTROL_ENABLED) { enableHdmiControlService(); setHdmiCecVolumeControlEnabledInternal(getHdmiCecConfig().getIntValue( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)); 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 6e4d994bd416c..44418ce1e9c4e 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java @@ -104,6 +104,10 @@ public class ArcInitiationActionFromAvrTest { return true; } + @Override + protected void writeStringSystemProperty(String key, String value) { + } + @Override Looper getServiceLooper() { return mTestLooper.getLooper(); 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 bbe1156c5d616..d454d8771e153 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ArcTerminationActionFromAvrTest.java @@ -105,6 +105,10 @@ public class ArcTerminationActionFromAvrTest { return true; } + @Override + protected void writeStringSystemProperty(String key, String value) { + } + @Override Looper getServiceLooper() { return mTestLooper.getLooper(); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index dbb03cb6dbdc4..be584d7b45914 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -153,6 +153,10 @@ public class HdmiControlServiceTest { return mStandbyMessageReceived; } + @Override + protected void writeStringSystemProperty(String key, String value) { + } + @Override protected HdmiCecConfig getHdmiCecConfig() { return hdmiCecConfig; @@ -251,7 +255,7 @@ public class HdmiControlServiceTest { HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_1_4_B); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mNativeWrapper.clearResultMessages(); assertThat(mHdmiControlService.getInitialPowerStatus()).isEqualTo( @@ -271,7 +275,7 @@ public class HdmiControlServiceTest { HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_2_0); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mNativeWrapper.clearResultMessages(); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); @@ -347,11 +351,11 @@ public class HdmiControlServiceTest { int volumeControlEnabled = HdmiControlManager.VOLUME_CONTROL_ENABLED; mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(volumeControlEnabled); - mHdmiControlService.setControlEnabled(false); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); assertThat(mHdmiControlService.getHdmiCecVolumeControl()).isEqualTo( HdmiControlManager.VOLUME_CONTROL_DISABLED); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getHdmiCecVolumeControl()).isEqualTo(volumeControlEnabled); } @@ -361,12 +365,12 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE, volumeControlEnabled); - mHdmiControlService.setControlEnabled(false); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( volumeControlEnabled); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getHdmiCecConfig().getIntValue( HdmiControlManager.CEC_SETTING_NAME_VOLUME_CONTROL_MODE)).isEqualTo( volumeControlEnabled); @@ -381,13 +385,13 @@ public class HdmiControlServiceTest { VolumeControlFeatureCallback callback = new VolumeControlFeatureCallback(); mHdmiControlService.addHdmiCecVolumeControlFeatureListener(callback); - mHdmiControlService.setControlEnabled(false); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_DISABLED); assertThat(callback.mCallbackReceived).isTrue(); assertThat(callback.mVolumeControlEnabled).isEqualTo( HdmiControlManager.VOLUME_CONTROL_DISABLED); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(callback.mVolumeControlEnabled).isEqualTo( HdmiControlManager.VOLUME_CONTROL_ENABLED); } @@ -485,7 +489,7 @@ public class HdmiControlServiceTest { Settings.Global.putString(mContextSpy.getContentResolver(), Settings.Global.HDMI_CEC_VERSION, null); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getCecVersion()).isEqualTo( HdmiControlManager.HDMI_CEC_VERSION_1_4_B); } @@ -495,7 +499,7 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_1_4_B); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getCecVersion()).isEqualTo( HdmiControlManager.HDMI_CEC_VERSION_1_4_B); } @@ -505,7 +509,7 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_2_0); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getCecVersion()).isEqualTo( HdmiControlManager.HDMI_CEC_VERSION_2_0); } @@ -515,14 +519,14 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_1_4_B); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getCecVersion()).isEqualTo( HdmiControlManager.HDMI_CEC_VERSION_1_4_B); mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_2_0); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); assertThat(mHdmiControlService.getCecVersion()).isEqualTo( HdmiControlManager.HDMI_CEC_VERSION_2_0); } @@ -532,7 +536,7 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_1_4_B); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mTestLooper.dispatchAll(); mNativeWrapper.onCecMessage(HdmiCecMessageBuilder.buildGiveFeatures(Constants.ADDR_TV, @@ -550,7 +554,7 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_2_0); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); @@ -572,7 +576,7 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_1_4_B); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); @@ -589,7 +593,7 @@ public class HdmiControlServiceTest { mHdmiControlService.getHdmiCecConfig().setIntValue( HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_VERSION, HdmiControlManager.HDMI_CEC_VERSION_2_0); - mHdmiControlService.setControlEnabled(true); + mHdmiControlService.setControlEnabled(HdmiControlManager.HDMI_CEC_CONTROL_ENABLED); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java index f80b5737d27b1..f9160abcbfbf8 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java @@ -137,6 +137,10 @@ public class SystemAudioInitiationActionFromAvrTest { return true; } + @Override + protected void writeStringSystemProperty(String key, String value) { + } + @Override void wakeUp() {}