Loading services/core/java/com/android/server/hdmi/Constants.java +11 −1 Original line number Diff line number Diff line Loading @@ -236,13 +236,23 @@ final class Constants { static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake"; // TODO(UI): Set this from UI to decide if turn on System Audio Mode when power on the device /** Property to decide if turn on the system audio control when power on the device /** * Property to decide if turn on the system audio control when power on the device. * Default is always turn on. * State must be a valid {@link SystemAudioControlOnPowerOn} int. */ static final String PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = "persist.sys.hdmi.system_audio_control_on_power_on"; /** * Property to record last state of system audio control before device powered off. * When {@link #PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON} is set to * {@link #USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON}, restoring this state on power on. * State must be true or false. Default true. */ static final String PROPERTY_LAST_SYSTEM_AUDIO_CONTROL = "persist.sys.hdmi.last_system_audio_control"; static final int RECORDING_TYPE_DIGITAL_RF = 1; static final int RECORDING_TYPE_ANALOGUE_RF = 2; static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3; Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +32 −6 Original line number Diff line number Diff line Loading @@ -15,10 +15,17 @@ */ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON; import static com.android.server.hdmi.Constants.PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON; import static com.android.server.hdmi.Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON; import android.hardware.hdmi.HdmiDeviceInfo; import android.media.AudioManager; import android.os.SystemProperties; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; /** Loading Loading @@ -51,11 +58,15 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { @ServiceThreadOnly protected void onStandby(boolean initiatedByCec, int standbyAction) { assertRunOnServiceThread(); // Record the last state of System Audio Control before going to standby synchronized (mLock) { SystemProperties.set(Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, mSystemAudioActivated ? "true" : "false"); } if (setSystemAudioMode(false)) { mService.sendCecCommand( HdmiCecMessageBuilder.buildSetSystemAudioMode( mAddress, Constants.ADDR_BROADCAST, false) ); mAddress, Constants.ADDR_BROADCAST, false)); } } Loading @@ -67,11 +78,26 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { mAddress, mService.getPhysicalAddress(), mDeviceType)); mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); // TODO(amyjojo): check PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON to decide the action addAndStartAction(new SystemAudioInitiationActionFromAvr(this)); int systemAudioControlOnPowerOnProp = SystemProperties.getInt( PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON); boolean lastSystemAudioControlStatus = SystemProperties.getBoolean( Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, true); systemAudioControlOnPowerOn(systemAudioControlOnPowerOnProp, lastSystemAudioControlStatus); startQueuedActions(); } @VisibleForTesting protected void systemAudioControlOnPowerOn( int systemAudioOnPowerOnProp, boolean lastSystemAudioControlStatus) { if ((systemAudioOnPowerOnProp == ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON) || ((systemAudioOnPowerOnProp == USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON) && lastSystemAudioControlStatus)) { addAndStartAction(new SystemAudioInitiationActionFromAvr(this)); } } @Override @ServiceThreadOnly protected int getPreferredAddress() { Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +45 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.server.hdmi.Constants.ADDR_BROADCAST; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertEquals; Loading Loading @@ -111,7 +112,6 @@ public class HdmiCecLocalDeviceAudioSystemTest { void wakeUp() { isAwake = true; } }; mMyLooper = mTestLooper.getLooper(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService); Loading Loading @@ -253,4 +253,48 @@ public class HdmiCecLocalDeviceAudioSystemTest { assertEquals(expectMessage, mNativeWrapper.getResultMessage()); assertTrue(mMusicMute); } @Test public void systemAudioControlOnPowerOn_alwaysOn() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isNotEmpty(); } @Test public void systemAudioControlOnPowerOn_neverOn() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isEmpty(); } @Test public void systemAudioControlOnPowerOn_useLastState_off() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isEmpty(); } @Test public void systemAudioControlOnPowerOn_useLastState_on() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isNotEmpty(); } } Loading
services/core/java/com/android/server/hdmi/Constants.java +11 −1 Original line number Diff line number Diff line Loading @@ -236,13 +236,23 @@ final class Constants { static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake"; // TODO(UI): Set this from UI to decide if turn on System Audio Mode when power on the device /** Property to decide if turn on the system audio control when power on the device /** * Property to decide if turn on the system audio control when power on the device. * Default is always turn on. * State must be a valid {@link SystemAudioControlOnPowerOn} int. */ static final String PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON = "persist.sys.hdmi.system_audio_control_on_power_on"; /** * Property to record last state of system audio control before device powered off. * When {@link #PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON} is set to * {@link #USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON}, restoring this state on power on. * State must be true or false. Default true. */ static final String PROPERTY_LAST_SYSTEM_AUDIO_CONTROL = "persist.sys.hdmi.last_system_audio_control"; static final int RECORDING_TYPE_DIGITAL_RF = 1; static final int RECORDING_TYPE_ANALOGUE_RF = 2; static final int RECORDING_TYPE_EXTERNAL_PHYSICAL_ADDRESS = 3; Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +32 −6 Original line number Diff line number Diff line Loading @@ -15,10 +15,17 @@ */ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON; import static com.android.server.hdmi.Constants.PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON; import static com.android.server.hdmi.Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON; import android.hardware.hdmi.HdmiDeviceInfo; import android.media.AudioManager; import android.os.SystemProperties; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; /** Loading Loading @@ -51,11 +58,15 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { @ServiceThreadOnly protected void onStandby(boolean initiatedByCec, int standbyAction) { assertRunOnServiceThread(); // Record the last state of System Audio Control before going to standby synchronized (mLock) { SystemProperties.set(Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, mSystemAudioActivated ? "true" : "false"); } if (setSystemAudioMode(false)) { mService.sendCecCommand( HdmiCecMessageBuilder.buildSetSystemAudioMode( mAddress, Constants.ADDR_BROADCAST, false) ); mAddress, Constants.ADDR_BROADCAST, false)); } } Loading @@ -67,11 +78,26 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { mAddress, mService.getPhysicalAddress(), mDeviceType)); mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); // TODO(amyjojo): check PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON to decide the action addAndStartAction(new SystemAudioInitiationActionFromAvr(this)); int systemAudioControlOnPowerOnProp = SystemProperties.getInt( PROPERTY_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON); boolean lastSystemAudioControlStatus = SystemProperties.getBoolean( Constants.PROPERTY_LAST_SYSTEM_AUDIO_CONTROL, true); systemAudioControlOnPowerOn(systemAudioControlOnPowerOnProp, lastSystemAudioControlStatus); startQueuedActions(); } @VisibleForTesting protected void systemAudioControlOnPowerOn( int systemAudioOnPowerOnProp, boolean lastSystemAudioControlStatus) { if ((systemAudioOnPowerOnProp == ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON) || ((systemAudioOnPowerOnProp == USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON) && lastSystemAudioControlStatus)) { addAndStartAction(new SystemAudioInitiationActionFromAvr(this)); } } @Override @ServiceThreadOnly protected int getPreferredAddress() { Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +45 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static com.android.server.hdmi.Constants.ADDR_BROADCAST; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertEquals; Loading Loading @@ -111,7 +112,6 @@ public class HdmiCecLocalDeviceAudioSystemTest { void wakeUp() { isAwake = true; } }; mMyLooper = mTestLooper.getLooper(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService); Loading Loading @@ -253,4 +253,48 @@ public class HdmiCecLocalDeviceAudioSystemTest { assertEquals(expectMessage, mNativeWrapper.getResultMessage()); assertTrue(mMusicMute); } @Test public void systemAudioControlOnPowerOn_alwaysOn() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isNotEmpty(); } @Test public void systemAudioControlOnPowerOn_neverOn() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.NEVER_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isEmpty(); } @Test public void systemAudioControlOnPowerOn_useLastState_off() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, false); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isEmpty(); } @Test public void systemAudioControlOnPowerOn_useLastState_on() { mHdmiCecLocalDeviceAudioSystem.removeAction( SystemAudioInitiationActionFromAvr.class); mHdmiCecLocalDeviceAudioSystem.systemAudioControlOnPowerOn( Constants.USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON, true); assertThat(mHdmiCecLocalDeviceAudioSystem .getActions(SystemAudioInitiationActionFromAvr.class)).isNotEmpty(); } }