Loading services/core/java/com/android/server/hdmi/Constants.java +2 −0 Original line number Diff line number Diff line Loading @@ -619,6 +619,8 @@ final class Constants { }) @interface HpdSignalType {} static final String DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE = "soundbar_mode"; private Constants() { /* cannot be instantiated */ } Loading services/core/java/com/android/server/hdmi/DeviceConfigWrapper.java 0 → 100644 +38 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.hdmi; import android.provider.DeviceConfig; import java.util.concurrent.Executor; /** * Abstraction around {@link DeviceConfig} to allow faking DeviceConfig in tests. */ public class DeviceConfigWrapper { private static final String TAG = "DeviceConfigWrapper"; boolean getBoolean(String name, boolean defaultValue) { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_HDMI_CONTROL, name, defaultValue); } void addOnPropertiesChangedListener(Executor mainExecutor, DeviceConfig.OnPropertiesChangedListener onPropertiesChangedListener) { DeviceConfig.addOnPropertiesChangedListener( DeviceConfig.NAMESPACE_HDMI_CONTROL, mainExecutor, onPropertiesChangedListener); } } services/core/java/com/android/server/hdmi/HdmiControlService.java +50 −10 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ import android.os.ShellCallback; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings.Global; import android.sysprop.HdmiProperties; import android.text.TextUtils; Loading Loading @@ -449,6 +450,9 @@ public class HdmiControlService extends SystemService { @ServiceThreadOnly private boolean mWakeUpMessageReceived = false; @ServiceThreadOnly private boolean mSoundbarModeFeatureFlagEnabled = false; @ServiceThreadOnly private int mActivePortId = Constants.INVALID_PORT_ID; Loading @@ -470,6 +474,9 @@ public class HdmiControlService extends SystemService { @Nullable private TvInputManager mTvInputManager; @Nullable private DeviceConfigWrapper mDeviceConfig; @Nullable private PowerManagerWrapper mPowerManager; Loading Loading @@ -525,6 +532,7 @@ public class HdmiControlService extends SystemService { mCecLocalDevices = deviceTypes; mSettingsObserver = new SettingsObserver(mHandler); mHdmiCecConfig = new HdmiCecConfig(context); mDeviceConfig = new DeviceConfigWrapper(); mAudioDeviceVolumeManager = audioDeviceVolumeManager; } Loading @@ -533,6 +541,7 @@ public class HdmiControlService extends SystemService { mCecLocalDevices = readDeviceTypes(); mSettingsObserver = new SettingsObserver(mHandler); mHdmiCecConfig = new HdmiCecConfig(context); mDeviceConfig = new DeviceConfigWrapper(); } @VisibleForTesting Loading Loading @@ -763,14 +772,6 @@ public class HdmiControlService extends SystemService { } } }, mServiceThreadExecutor); mHdmiCecConfig.registerChangeListener(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE, new HdmiCecConfig.SettingChangeListener() { @Override public void onChange(String setting) { setSoundbarMode(mHdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE)); } }, mServiceThreadExecutor); mHdmiCecConfig.registerChangeListener( HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL, new HdmiCecConfig.SettingChangeListener() { Loading Loading @@ -819,9 +820,38 @@ public class HdmiControlService extends SystemService { HdmiControlManager.SETTING_NAME_EARC_ENABLED); setEarcEnabled(enabled); } }, mServiceThreadExecutor); mSoundbarModeFeatureFlagEnabled = mDeviceConfig.getBoolean( Constants.DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE, false); mDeviceConfig.addOnPropertiesChangedListener(getContext().getMainExecutor(), new DeviceConfig.OnPropertiesChangedListener() { @Override public void onPropertiesChanged(DeviceConfig.Properties properties) { mSoundbarModeFeatureFlagEnabled = properties.getBoolean( Constants.DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE, false); boolean soundbarModeSetting = mHdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE) == SOUNDBAR_MODE_ENABLED; setSoundbarMode(soundbarModeSetting && mSoundbarModeFeatureFlagEnabled ? SOUNDBAR_MODE_ENABLED : SOUNDBAR_MODE_DISABLED); } }); mHdmiCecConfig.registerChangeListener(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE, new HdmiCecConfig.SettingChangeListener() { @Override public void onChange(String setting) { boolean soundbarModeSetting = mHdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE) == SOUNDBAR_MODE_ENABLED; setSoundbarMode(soundbarModeSetting && mSoundbarModeFeatureFlagEnabled ? SOUNDBAR_MODE_ENABLED : SOUNDBAR_MODE_DISABLED); } }, mServiceThreadExecutor); } /** Returns true if the device screen is off */ boolean isScreenOff() { return mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() == Display.STATE_OFF; Loading Loading @@ -919,6 +949,11 @@ public class HdmiControlService extends SystemService { mTvInputManager.unregisterCallback(callback); } @VisibleForTesting void setDeviceConfig(DeviceConfigWrapper deviceConfig) { mDeviceConfig = deviceConfig; } @VisibleForTesting void setPowerManager(PowerManagerWrapper powerManager) { mPowerManager = powerManager; Loading @@ -929,6 +964,10 @@ public class HdmiControlService extends SystemService { mPowerManagerInternal = powerManagerInternal; } DeviceConfigWrapper getDeviceConfig() { return mDeviceConfig; } PowerManagerWrapper getPowerManager() { return mPowerManager; } Loading Loading @@ -1151,7 +1190,8 @@ public class HdmiControlService extends SystemService { if (mHdmiCecConfig.getIntValue(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE) == SOUNDBAR_MODE_ENABLED && !allLocalDeviceTypes.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) && SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) { && SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true) && mSoundbarModeFeatureFlagEnabled) { allLocalDeviceTypes.add(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM); } return allLocalDeviceTypes; Loading services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ public class ActiveSourceActionTest { Looper looper = mTestLooper.getLooper(); mHdmiControlService.setIoLooper(looper); mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); mHdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper()); mNativeWrapper = new FakeNativeWrapper(); HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); Loading services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ public class ArcInitiationActionFromAvrTest { Looper looper = mTestLooper.getLooper(); hdmiControlService.setIoLooper(looper); hdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); hdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper()); mNativeWrapper = new FakeNativeWrapper(); HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( hdmiControlService, mNativeWrapper, hdmiControlService.getAtomWriter()); Loading Loading
services/core/java/com/android/server/hdmi/Constants.java +2 −0 Original line number Diff line number Diff line Loading @@ -619,6 +619,8 @@ final class Constants { }) @interface HpdSignalType {} static final String DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE = "soundbar_mode"; private Constants() { /* cannot be instantiated */ } Loading
services/core/java/com/android/server/hdmi/DeviceConfigWrapper.java 0 → 100644 +38 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.hdmi; import android.provider.DeviceConfig; import java.util.concurrent.Executor; /** * Abstraction around {@link DeviceConfig} to allow faking DeviceConfig in tests. */ public class DeviceConfigWrapper { private static final String TAG = "DeviceConfigWrapper"; boolean getBoolean(String name, boolean defaultValue) { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_HDMI_CONTROL, name, defaultValue); } void addOnPropertiesChangedListener(Executor mainExecutor, DeviceConfig.OnPropertiesChangedListener onPropertiesChangedListener) { DeviceConfig.addOnPropertiesChangedListener( DeviceConfig.NAMESPACE_HDMI_CONTROL, mainExecutor, onPropertiesChangedListener); } }
services/core/java/com/android/server/hdmi/HdmiControlService.java +50 −10 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ import android.os.ShellCallback; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings.Global; import android.sysprop.HdmiProperties; import android.text.TextUtils; Loading Loading @@ -449,6 +450,9 @@ public class HdmiControlService extends SystemService { @ServiceThreadOnly private boolean mWakeUpMessageReceived = false; @ServiceThreadOnly private boolean mSoundbarModeFeatureFlagEnabled = false; @ServiceThreadOnly private int mActivePortId = Constants.INVALID_PORT_ID; Loading @@ -470,6 +474,9 @@ public class HdmiControlService extends SystemService { @Nullable private TvInputManager mTvInputManager; @Nullable private DeviceConfigWrapper mDeviceConfig; @Nullable private PowerManagerWrapper mPowerManager; Loading Loading @@ -525,6 +532,7 @@ public class HdmiControlService extends SystemService { mCecLocalDevices = deviceTypes; mSettingsObserver = new SettingsObserver(mHandler); mHdmiCecConfig = new HdmiCecConfig(context); mDeviceConfig = new DeviceConfigWrapper(); mAudioDeviceVolumeManager = audioDeviceVolumeManager; } Loading @@ -533,6 +541,7 @@ public class HdmiControlService extends SystemService { mCecLocalDevices = readDeviceTypes(); mSettingsObserver = new SettingsObserver(mHandler); mHdmiCecConfig = new HdmiCecConfig(context); mDeviceConfig = new DeviceConfigWrapper(); } @VisibleForTesting Loading Loading @@ -763,14 +772,6 @@ public class HdmiControlService extends SystemService { } } }, mServiceThreadExecutor); mHdmiCecConfig.registerChangeListener(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE, new HdmiCecConfig.SettingChangeListener() { @Override public void onChange(String setting) { setSoundbarMode(mHdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE)); } }, mServiceThreadExecutor); mHdmiCecConfig.registerChangeListener( HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL, new HdmiCecConfig.SettingChangeListener() { Loading Loading @@ -819,9 +820,38 @@ public class HdmiControlService extends SystemService { HdmiControlManager.SETTING_NAME_EARC_ENABLED); setEarcEnabled(enabled); } }, mServiceThreadExecutor); mSoundbarModeFeatureFlagEnabled = mDeviceConfig.getBoolean( Constants.DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE, false); mDeviceConfig.addOnPropertiesChangedListener(getContext().getMainExecutor(), new DeviceConfig.OnPropertiesChangedListener() { @Override public void onPropertiesChanged(DeviceConfig.Properties properties) { mSoundbarModeFeatureFlagEnabled = properties.getBoolean( Constants.DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE, false); boolean soundbarModeSetting = mHdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE) == SOUNDBAR_MODE_ENABLED; setSoundbarMode(soundbarModeSetting && mSoundbarModeFeatureFlagEnabled ? SOUNDBAR_MODE_ENABLED : SOUNDBAR_MODE_DISABLED); } }); mHdmiCecConfig.registerChangeListener(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE, new HdmiCecConfig.SettingChangeListener() { @Override public void onChange(String setting) { boolean soundbarModeSetting = mHdmiCecConfig.getIntValue( HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE) == SOUNDBAR_MODE_ENABLED; setSoundbarMode(soundbarModeSetting && mSoundbarModeFeatureFlagEnabled ? SOUNDBAR_MODE_ENABLED : SOUNDBAR_MODE_DISABLED); } }, mServiceThreadExecutor); } /** Returns true if the device screen is off */ boolean isScreenOff() { return mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() == Display.STATE_OFF; Loading Loading @@ -919,6 +949,11 @@ public class HdmiControlService extends SystemService { mTvInputManager.unregisterCallback(callback); } @VisibleForTesting void setDeviceConfig(DeviceConfigWrapper deviceConfig) { mDeviceConfig = deviceConfig; } @VisibleForTesting void setPowerManager(PowerManagerWrapper powerManager) { mPowerManager = powerManager; Loading @@ -929,6 +964,10 @@ public class HdmiControlService extends SystemService { mPowerManagerInternal = powerManagerInternal; } DeviceConfigWrapper getDeviceConfig() { return mDeviceConfig; } PowerManagerWrapper getPowerManager() { return mPowerManager; } Loading Loading @@ -1151,7 +1190,8 @@ public class HdmiControlService extends SystemService { if (mHdmiCecConfig.getIntValue(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE) == SOUNDBAR_MODE_ENABLED && !allLocalDeviceTypes.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) && SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)) { && SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true) && mSoundbarModeFeatureFlagEnabled) { allLocalDeviceTypes.add(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM); } return allLocalDeviceTypes; Loading
services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ public class ActiveSourceActionTest { Looper looper = mTestLooper.getLooper(); mHdmiControlService.setIoLooper(looper); mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); mHdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper()); mNativeWrapper = new FakeNativeWrapper(); HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); Loading
services/tests/servicestests/src/com/android/server/hdmi/ArcInitiationActionFromAvrTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ public class ArcInitiationActionFromAvrTest { Looper looper = mTestLooper.getLooper(); hdmiControlService.setIoLooper(looper); hdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); hdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper()); mNativeWrapper = new FakeNativeWrapper(); HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( hdmiControlService, mNativeWrapper, hdmiControlService.getAtomWriter()); Loading