[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
This commit is contained in:
Michal Olech
2020-11-11 11:58:27 +01:00
parent 972597d9d4
commit 56ed615d09
5 changed files with 57 additions and 17 deletions

View File

@@ -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.");

View File

@@ -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());

View File

@@ -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) {

View File

@@ -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));
}
}

View File

@@ -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);