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

Commit 56ed615d authored by Michal Olech's avatar Michal Olech
Browse files

[CEC Configuration] Port 'system_audio_mode_muting'

1. Make use of the API in framework code
2. Store the setting in SharedPreferences under the hood

Bug: 171870169
Bug: 171958586
Test: atest HdmiCecLocalDevicePlaybackTest HdmiCecConfigTest
Change-Id: I80c48ee1f19f07b412b24e3d27bc8f963e7b423d
parent 972597d9
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -83,12 +83,6 @@ public class HdmiCecConfig {
    })
    private @interface ValueType {}

    /**
     * System property key for Audio Mode Muting.
     */
    public static final String SYSPROP_SYSTEM_AUDIO_MODE_MUTING =
            "ro.hdmi.cec.audio.system_audio_mode_muting.enabled";

    @NonNull private final Context mContext;
    @NonNull private final StorageAdapter mStorageAdapter;
    @Nullable private final CecSettings mSystemConfig;
@@ -264,7 +258,7 @@ public class HdmiCecConfig {
            case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
                return STORAGE_SHARED_PREFS;
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
                return STORAGE_SYSPROPS;
                return STORAGE_SHARED_PREFS;
            default:
                throw new RuntimeException("Invalid CEC setting '" + setting.getName()
                        + "' storage.");
@@ -282,7 +276,7 @@ public class HdmiCecConfig {
            case HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST:
                return setting.getName();
            case HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING:
                return SYSPROP_SYSTEM_AUDIO_MODE_MUTING;
                return setting.getName();
            default:
                throw new RuntimeException("Invalid CEC setting '" + setting.getName()
                    + "' storage key.");
+6 −3
Original line number Diff line number Diff line
@@ -778,11 +778,14 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
            switchToAudioInput();
        }
        // Mute device when feature is turned off and unmute device when feature is turned on.
        // PROPERTY_SYSTEM_AUDIO_MODE_MUTING_ENABLE is false when device never needs to be muted.
        // CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING is false when device never needs to be muted.
        boolean systemAudioModeMutingEnabled = mService.getHdmiCecConfig().getIntValue(
                    HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING)
                        == HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED;
        boolean currentMuteStatus =
                mService.getAudioManager().isStreamMute(AudioManager.STREAM_MUSIC);
        if (currentMuteStatus == newSystemAudioMode) {
            if (HdmiProperties.system_audio_mode_muting().orElse(true) || newSystemAudioMode) {
            if (systemAudioModeMutingEnabled || newSystemAudioMode) {
                mService.getAudioManager()
                        .adjustStreamVolume(
                                AudioManager.STREAM_MUSIC,
@@ -806,7 +809,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
        // Audio Mode is off even without terminating the ARC. This can stop the current
        // audio device from playing audio when system audio mode is off.
        if (mArcIntentUsed
                && !HdmiProperties.system_audio_mode_muting().orElse(true)
                && !systemAudioModeMutingEnabled
                && !newSystemAudioMode
                && getLocalActivePort() == Constants.CEC_SWITCH_ARC) {
            routeToInputFromPortId(getRoutingPort());
+9 −0
Original line number Diff line number Diff line
@@ -68,6 +68,15 @@ final class FakeHdmiCecConfig extends HdmiCecConfig {
                    + "    </allowed-values>"
                    + "    <default-value int-value=\"0x05\" />"
                    + "  </setting>"
                    + "  <setting name=\"system_audio_mode_muting\""
                    + "           value-type=\"int\""
                    + "           user-configurable=\"true\">"
                    + "    <allowed-values>"
                    + "      <value int-value=\"0\" />"
                    + "      <value int-value=\"1\" />"
                    + "    </allowed-values>"
                    + "    <default-value int-value=\"1\" />"
                    + "  </setting>"
                    + "</cec-settings>";

    FakeHdmiCecConfig(@NonNull Context context) {
+6 −6
Original line number Diff line number Diff line
@@ -750,9 +750,9 @@ public final class HdmiCecConfigTest {
    }

    @Test
    public void getIntValue_SystemProperty_BasicSanity() {
        when(mStorageAdapter.retrieveSystemProperty(
                  HdmiCecConfig.SYSPROP_SYSTEM_AUDIO_MODE_MUTING,
    public void getIntValue_SharedPref_BasicSanity() {
        when(mStorageAdapter.retrieveSharedPref(
                  HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                  Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED)))
                .thenReturn(Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED));
        HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
@@ -997,7 +997,7 @@ public final class HdmiCecConfigTest {
    }

    @Test
    public void setIntValue_SystemProperty_BasicSanity() {
    public void setIntValue_SharedPref_BasicSanity() {
        HdmiCecConfig hdmiCecConfig = HdmiCecConfig.createFromStrings(
                mContext, mStorageAdapter,
                "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"
@@ -1015,8 +1015,8 @@ public final class HdmiCecConfigTest {
        hdmiCecConfig.setIntValue(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
        verify(mStorageAdapter).storeSystemProperty(
                HdmiCecConfig.SYSPROP_SYSTEM_AUDIO_MODE_MUTING,
        verify(mStorageAdapter).storeSharedPref(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                Integer.toString(HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED));
    }
}
+34 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF;
import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.HdmiPortInfo;
import android.hardware.hdmi.IHdmiControlCallback;
@@ -451,6 +452,39 @@ public class HdmiCecLocalDeviceAudioSystemTest {
            .isTrue();
    }

    @Test
    public void systemAudioModeMuting_enabled() {
        mHdmiControlService.getHdmiCecConfig().setIntValue(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED);
        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
                AudioManager.STREAM_MUSIC)).isFalse();
        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
                AudioManager.STREAM_MUSIC)).isTrue();
    }

    @Test
    public void systemAudioModeMuting_disabled() {
        mHdmiControlService.getHdmiCecConfig().setIntValue(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_DISABLED);
        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(true);
        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isTrue();
        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
                AudioManager.STREAM_MUSIC)).isFalse();
        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);
        assertThat(mHdmiCecLocalDeviceAudioSystem.isSystemAudioActivated()).isFalse();
        assertThat(mHdmiControlService.getAudioManager().isStreamMute(
                AudioManager.STREAM_MUSIC)).isFalse();
        mHdmiControlService.getHdmiCecConfig().setIntValue(
                HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_MODE_MUTING,
                HdmiControlManager.SYSTEM_AUDIO_MODE_MUTING_ENABLED);
    }

    @Test
    public void terminateSystemAudioMode_systemAudioModeOff() throws Exception {
        mHdmiCecLocalDeviceAudioSystem.checkSupportAndSetSystemAudioMode(false);