Loading packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +17 −5 Original line number Original line Diff line number Diff line Loading @@ -165,6 +165,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa private boolean mShowSafetyWarning; private boolean mShowSafetyWarning; private long mLastToggledRingerOn; private long mLastToggledRingerOn; private boolean mDeviceInteractive = true; private boolean mDeviceInteractive = true; boolean mInAudioSharing = false; private VolumePolicy mVolumePolicy; private VolumePolicy mVolumePolicy; @GuardedBy("this") @GuardedBy("this") Loading Loading @@ -295,6 +296,9 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mJavaAdapter.alwaysCollectFlow( mJavaAdapter.alwaysCollectFlow( mAudioSharingInteractor.getVolume(), mAudioSharingInteractor.getVolume(), this::handleAudioSharingStreamVolumeChanges); this::handleAudioSharingStreamVolumeChanges); mJavaAdapter.alwaysCollectFlow( mAudioSharingInteractor.isInAudioSharing(), inSharing -> mInAudioSharing = inSharing); } } } } Loading Loading @@ -510,11 +514,18 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa // Since their values overlap with DEVICE_OUT_EARPIECE and DEVICE_OUT_SPEAKER. // Since their values overlap with DEVICE_OUT_EARPIECE and DEVICE_OUT_SPEAKER. // Anyway, we can check BLE devices by using just DEVICE_OUT_BLE_HEADSET. // Anyway, we can check BLE devices by using just DEVICE_OUT_BLE_HEADSET. final boolean routedToBluetooth = final boolean routedToBluetooth = (mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) & // TODO(b/359737651): Need audio support to return broadcast mask. (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP | // For now, mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) will return AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | // AudioManager.DEVICE_NONE, so we also need to check if the device is in audio AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | // sharing here. AudioManager.DEVICE_OUT_BLE_HEADSET)) != 0; mInAudioSharing || (mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) & (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP | AudioManager .DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | AudioManager.DEVICE_OUT_BLE_HEADSET)) != 0; changed |= updateStreamRoutedToBluetoothW(stream, routedToBluetooth); changed |= updateStreamRoutedToBluetoothW(stream, routedToBluetooth); } else if (stream == AudioManager.STREAM_VOICE_CALL) { } else if (stream == AudioManager.STREAM_VOICE_CALL) { final boolean routedToBluetooth = final boolean routedToBluetooth = Loading Loading @@ -813,6 +824,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa ss.dynamic = true; ss.dynamic = true; ss.levelMin = mAudioSharingInteractor.getVolumeMin(); ss.levelMin = mAudioSharingInteractor.getVolumeMin(); ss.levelMax = mAudioSharingInteractor.getVolumeMax(); ss.levelMax = mAudioSharingInteractor.getVolumeMax(); ss.routedToBluetooth = true; if (ss.level != volume) { if (ss.level != volume) { ss.level = volume; ss.level = volume; } } Loading packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -1892,8 +1892,8 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, .equals(ss.remoteLabel)) { .equals(ss.remoteLabel)) { addRow( addRow( stream, stream, R.drawable.ic_volume_media, R.drawable.ic_volume_media_bt, R.drawable.ic_volume_media_mute, R.drawable.ic_volume_media_bt_mute, true, true, false, false, true); true); Loading packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java +26 −0 Original line number Original line Diff line number Diff line Loading @@ -228,6 +228,32 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { verify(mCallback, never()).onStateChanged(any()); verify(mCallback, never()).onStateChanged(any()); } } @Test public void testVolumeChangeW_inAudioSharing_doStateChanged() { ArgumentCaptor<VolumeDialogController.State> stateCaptor = ArgumentCaptor.forClass(VolumeDialogController.State.class); mVolumeController.setDeviceInteractive(false); when(mWakefullnessLifcycle.getWakefulness()) .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE); // For now, mAudioManager.getDevicesForStream returns DEVICE_NONE during audio sharing when(mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC)) .thenReturn(AudioManager.DEVICE_NONE); mVolumeController.mInAudioSharing = true; mVolumeController.onVolumeChangedW(AudioManager.STREAM_MUSIC, AudioManager.FLAG_SHOW_UI); verify(mCallback).onStateChanged(stateCaptor.capture()); assertThat(stateCaptor.getValue().states.contains(AudioManager.STREAM_MUSIC)).isTrue(); assertThat(stateCaptor.getValue().states.get(AudioManager.STREAM_MUSIC).routedToBluetooth) .isTrue(); mVolumeController.mInAudioSharing = false; mVolumeController.onVolumeChangedW(AudioManager.STREAM_MUSIC, AudioManager.FLAG_SHOW_UI); verify(mCallback, times(2)).onStateChanged(stateCaptor.capture()); assertThat(stateCaptor.getValue().states.contains(AudioManager.STREAM_MUSIC)).isTrue(); assertThat(stateCaptor.getValue().states.get(AudioManager.STREAM_MUSIC).routedToBluetooth) .isFalse(); } @Test @Test public void testOnRemoteVolumeChanged_newStream_noNullPointer() { public void testOnRemoteVolumeChanged_newStream_noNullPointer() { MediaSession.Token token = new MediaSession.Token(Process.myUid(), null); MediaSession.Token token = new MediaSession.Token(Process.myUid(), null); Loading Loading
packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +17 −5 Original line number Original line Diff line number Diff line Loading @@ -165,6 +165,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa private boolean mShowSafetyWarning; private boolean mShowSafetyWarning; private long mLastToggledRingerOn; private long mLastToggledRingerOn; private boolean mDeviceInteractive = true; private boolean mDeviceInteractive = true; boolean mInAudioSharing = false; private VolumePolicy mVolumePolicy; private VolumePolicy mVolumePolicy; @GuardedBy("this") @GuardedBy("this") Loading Loading @@ -295,6 +296,9 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mJavaAdapter.alwaysCollectFlow( mJavaAdapter.alwaysCollectFlow( mAudioSharingInteractor.getVolume(), mAudioSharingInteractor.getVolume(), this::handleAudioSharingStreamVolumeChanges); this::handleAudioSharingStreamVolumeChanges); mJavaAdapter.alwaysCollectFlow( mAudioSharingInteractor.isInAudioSharing(), inSharing -> mInAudioSharing = inSharing); } } } } Loading Loading @@ -510,11 +514,18 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa // Since their values overlap with DEVICE_OUT_EARPIECE and DEVICE_OUT_SPEAKER. // Since their values overlap with DEVICE_OUT_EARPIECE and DEVICE_OUT_SPEAKER. // Anyway, we can check BLE devices by using just DEVICE_OUT_BLE_HEADSET. // Anyway, we can check BLE devices by using just DEVICE_OUT_BLE_HEADSET. final boolean routedToBluetooth = final boolean routedToBluetooth = (mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) & // TODO(b/359737651): Need audio support to return broadcast mask. (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP | // For now, mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) will return AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | // AudioManager.DEVICE_NONE, so we also need to check if the device is in audio AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | // sharing here. AudioManager.DEVICE_OUT_BLE_HEADSET)) != 0; mInAudioSharing || (mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) & (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP | AudioManager .DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | AudioManager.DEVICE_OUT_BLE_HEADSET)) != 0; changed |= updateStreamRoutedToBluetoothW(stream, routedToBluetooth); changed |= updateStreamRoutedToBluetoothW(stream, routedToBluetooth); } else if (stream == AudioManager.STREAM_VOICE_CALL) { } else if (stream == AudioManager.STREAM_VOICE_CALL) { final boolean routedToBluetooth = final boolean routedToBluetooth = Loading Loading @@ -813,6 +824,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa ss.dynamic = true; ss.dynamic = true; ss.levelMin = mAudioSharingInteractor.getVolumeMin(); ss.levelMin = mAudioSharingInteractor.getVolumeMin(); ss.levelMax = mAudioSharingInteractor.getVolumeMax(); ss.levelMax = mAudioSharingInteractor.getVolumeMax(); ss.routedToBluetooth = true; if (ss.level != volume) { if (ss.level != volume) { ss.level = volume; ss.level = volume; } } Loading
packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -1892,8 +1892,8 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, .equals(ss.remoteLabel)) { .equals(ss.remoteLabel)) { addRow( addRow( stream, stream, R.drawable.ic_volume_media, R.drawable.ic_volume_media_bt, R.drawable.ic_volume_media_mute, R.drawable.ic_volume_media_bt_mute, true, true, false, false, true); true); Loading
packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java +26 −0 Original line number Original line Diff line number Diff line Loading @@ -228,6 +228,32 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { verify(mCallback, never()).onStateChanged(any()); verify(mCallback, never()).onStateChanged(any()); } } @Test public void testVolumeChangeW_inAudioSharing_doStateChanged() { ArgumentCaptor<VolumeDialogController.State> stateCaptor = ArgumentCaptor.forClass(VolumeDialogController.State.class); mVolumeController.setDeviceInteractive(false); when(mWakefullnessLifcycle.getWakefulness()) .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE); // For now, mAudioManager.getDevicesForStream returns DEVICE_NONE during audio sharing when(mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC)) .thenReturn(AudioManager.DEVICE_NONE); mVolumeController.mInAudioSharing = true; mVolumeController.onVolumeChangedW(AudioManager.STREAM_MUSIC, AudioManager.FLAG_SHOW_UI); verify(mCallback).onStateChanged(stateCaptor.capture()); assertThat(stateCaptor.getValue().states.contains(AudioManager.STREAM_MUSIC)).isTrue(); assertThat(stateCaptor.getValue().states.get(AudioManager.STREAM_MUSIC).routedToBluetooth) .isTrue(); mVolumeController.mInAudioSharing = false; mVolumeController.onVolumeChangedW(AudioManager.STREAM_MUSIC, AudioManager.FLAG_SHOW_UI); verify(mCallback, times(2)).onStateChanged(stateCaptor.capture()); assertThat(stateCaptor.getValue().states.contains(AudioManager.STREAM_MUSIC)).isTrue(); assertThat(stateCaptor.getValue().states.get(AudioManager.STREAM_MUSIC).routedToBluetooth) .isFalse(); } @Test @Test public void testOnRemoteVolumeChanged_newStream_noNullPointer() { public void testOnRemoteVolumeChanged_newStream_noNullPointer() { MediaSession.Token token = new MediaSession.Token(Process.myUid(), null); MediaSession.Token token = new MediaSession.Token(Process.myUid(), null); Loading