Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2002bdad authored by Paul Colta's avatar Paul Colta
Browse files

HDMI: Add listener for SOUNDBAR_MODE DeviceConfig property

Enable the flag for all unit tests.

Bug: 260087251
Bug: 263847994
Test: make && atest com.android.server.hdmi
Change-Id: Ic1727761011be46033fbb5de36a7db20928df320
parent 425847b9
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -619,6 +619,8 @@ final class Constants {
    })
    })
    @interface HpdSignalType {}
    @interface HpdSignalType {}


    static final String DEVICE_CONFIG_FEATURE_FLAG_SOUNDBAR_MODE = "soundbar_mode";

    private Constants() {
    private Constants() {
        /* cannot be instantiated */
        /* cannot be instantiated */
    }
    }
+38 −0
Original line number Original line 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);
    }
}
+50 −10
Original line number Original line Diff line number Diff line
@@ -86,6 +86,7 @@ import android.os.ShellCallback;
import android.os.SystemClock;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings.Global;
import android.provider.Settings.Global;
import android.sysprop.HdmiProperties;
import android.sysprop.HdmiProperties;
import android.text.TextUtils;
import android.text.TextUtils;
@@ -449,6 +450,9 @@ public class HdmiControlService extends SystemService {
    @ServiceThreadOnly
    @ServiceThreadOnly
    private boolean mWakeUpMessageReceived = false;
    private boolean mWakeUpMessageReceived = false;


    @ServiceThreadOnly
    private boolean mSoundbarModeFeatureFlagEnabled = false;

    @ServiceThreadOnly
    @ServiceThreadOnly
    private int mActivePortId = Constants.INVALID_PORT_ID;
    private int mActivePortId = Constants.INVALID_PORT_ID;


@@ -470,6 +474,9 @@ public class HdmiControlService extends SystemService {
    @Nullable
    @Nullable
    private TvInputManager mTvInputManager;
    private TvInputManager mTvInputManager;


    @Nullable
    private DeviceConfigWrapper mDeviceConfig;

    @Nullable
    @Nullable
    private PowerManagerWrapper mPowerManager;
    private PowerManagerWrapper mPowerManager;


@@ -525,6 +532,7 @@ public class HdmiControlService extends SystemService {
        mCecLocalDevices = deviceTypes;
        mCecLocalDevices = deviceTypes;
        mSettingsObserver = new SettingsObserver(mHandler);
        mSettingsObserver = new SettingsObserver(mHandler);
        mHdmiCecConfig = new HdmiCecConfig(context);
        mHdmiCecConfig = new HdmiCecConfig(context);
        mDeviceConfig = new DeviceConfigWrapper();
        mAudioDeviceVolumeManager = audioDeviceVolumeManager;
        mAudioDeviceVolumeManager = audioDeviceVolumeManager;
    }
    }


@@ -533,6 +541,7 @@ public class HdmiControlService extends SystemService {
        mCecLocalDevices = readDeviceTypes();
        mCecLocalDevices = readDeviceTypes();
        mSettingsObserver = new SettingsObserver(mHandler);
        mSettingsObserver = new SettingsObserver(mHandler);
        mHdmiCecConfig = new HdmiCecConfig(context);
        mHdmiCecConfig = new HdmiCecConfig(context);
        mDeviceConfig = new DeviceConfigWrapper();
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -763,14 +772,6 @@ public class HdmiControlService extends SystemService {
                        }
                        }
                    }
                    }
                }, mServiceThreadExecutor);
                }, 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(
        mHdmiCecConfig.registerChangeListener(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL,
                new HdmiCecConfig.SettingChangeListener() {
                new HdmiCecConfig.SettingChangeListener() {
@@ -819,9 +820,38 @@ public class HdmiControlService extends SystemService {
                                HdmiControlManager.SETTING_NAME_EARC_ENABLED);
                                HdmiControlManager.SETTING_NAME_EARC_ENABLED);
                        setEarcEnabled(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);
                }, mServiceThreadExecutor);
    }
    }

    /** Returns true if the device screen is off */
    /** Returns true if the device screen is off */
    boolean isScreenOff() {
    boolean isScreenOff() {
        return mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() == Display.STATE_OFF;
        return mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() == Display.STATE_OFF;
@@ -919,6 +949,11 @@ public class HdmiControlService extends SystemService {
        mTvInputManager.unregisterCallback(callback);
        mTvInputManager.unregisterCallback(callback);
    }
    }


    @VisibleForTesting
    void setDeviceConfig(DeviceConfigWrapper deviceConfig) {
        mDeviceConfig = deviceConfig;
    }

    @VisibleForTesting
    @VisibleForTesting
    void setPowerManager(PowerManagerWrapper powerManager) {
    void setPowerManager(PowerManagerWrapper powerManager) {
        mPowerManager = powerManager;
        mPowerManager = powerManager;
@@ -929,6 +964,10 @@ public class HdmiControlService extends SystemService {
        mPowerManagerInternal = powerManagerInternal;
        mPowerManagerInternal = powerManagerInternal;
    }
    }


    DeviceConfigWrapper getDeviceConfig() {
        return mDeviceConfig;
    }

    PowerManagerWrapper getPowerManager() {
    PowerManagerWrapper getPowerManager() {
        return mPowerManager;
        return mPowerManager;
    }
    }
@@ -1151,7 +1190,8 @@ public class HdmiControlService extends SystemService {
        if (mHdmiCecConfig.getIntValue(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE)
        if (mHdmiCecConfig.getIntValue(HdmiControlManager.CEC_SETTING_NAME_SOUNDBAR_MODE)
                == SOUNDBAR_MODE_ENABLED
                == SOUNDBAR_MODE_ENABLED
                && !allLocalDeviceTypes.contains(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM)
                && !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);
            allLocalDeviceTypes.add(HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
        }
        }
        return allLocalDeviceTypes;
        return allLocalDeviceTypes;
+1 −0
Original line number Original line Diff line number Diff line
@@ -88,6 +88,7 @@ public class ActiveSourceActionTest {
        Looper looper = mTestLooper.getLooper();
        Looper looper = mTestLooper.getLooper();
        mHdmiControlService.setIoLooper(looper);
        mHdmiControlService.setIoLooper(looper);
        mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy));
        mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy));
        mHdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper());
        mNativeWrapper = new FakeNativeWrapper();
        mNativeWrapper = new FakeNativeWrapper();
        HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper(
        HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper(
                this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
                this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
+1 −0
Original line number Original line Diff line number Diff line
@@ -105,6 +105,7 @@ public class ArcInitiationActionFromAvrTest {
        Looper looper = mTestLooper.getLooper();
        Looper looper = mTestLooper.getLooper();
        hdmiControlService.setIoLooper(looper);
        hdmiControlService.setIoLooper(looper);
        hdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy));
        hdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy));
        hdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper());
        mNativeWrapper = new FakeNativeWrapper();
        mNativeWrapper = new FakeNativeWrapper();
        HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper(
        HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper(
                hdmiControlService, mNativeWrapper, hdmiControlService.getAtomWriter());
                hdmiControlService, mNativeWrapper, hdmiControlService.getAtomWriter());
Loading