From 338f06dda125b752a61da319b9888389dde25653 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 1 Feb 2022 17:03:15 +0100 Subject: [PATCH] update UI if audio output device changed Signed-off-by: Marcel Hibbe --- .../talk/activities/CallActivity.java | 38 ++++++++++--------- .../talk/ui/dialog/AudioOutputDialog.kt | 9 ++++- .../talk/webrtc/MagicAudioManager.java | 16 ++++---- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index d85a978ca..4929df393 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -158,7 +158,7 @@ import okhttp3.Cache; import pub.devrel.easypermissions.AfterPermissionGranted; @AutoInjector(NextcloudTalkApplication.class) -public class CallActivity extends CallBaseActivity implements MagicAudioManager.AudioManagerEvents { +public class CallActivity extends CallBaseActivity { @Inject NcApi ncApi; @@ -256,10 +256,7 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. private CallActivityBinding binding; - @Override - public void onAudioDeviceChanged(MagicAudioManager.AudioDevice selectedAudioDevice, Set availableAudioDevices) { - setAudioOutputChannel(selectedAudioDevice); - } + private AudioOutputDialog audioOutputDialog; @Parcel public enum CallStatus { @@ -336,9 +333,10 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. private void initClickListeners() { binding.pictureInPictureButton.setOnClickListener(l -> enterPipMode()); - binding.audioOutputButton.setOnClickListener(v -> new AudioOutputDialog( - this - ).show()); + binding.audioOutputButton.setOnClickListener(v -> { + audioOutputDialog = new AudioOutputDialog(this); + audioOutputDialog.show(); + }); binding.microphoneButton.setOnClickListener(l -> onMicrophoneClick()); binding.microphoneButton.setOnLongClickListener(l -> { @@ -457,13 +455,14 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. } public void setAudioOutputChannel(MagicAudioManager.AudioDevice selectedAudioDevice) { - if (audioManager == null) { - return; + if (audioManager != null) { + audioManager.selectAudioDevice(selectedAudioDevice); + updateAudioOutputButton(audioManager.getResultingAudioDevice()); } + } - audioManager.selectAudioDevice(selectedAudioDevice); - - switch (audioManager.getResultingAudioDevice()) { + private void updateAudioOutputButton(MagicAudioManager.AudioDevice activeAudioDevice) { + switch (activeAudioDevice) { case BLUETOOTH: binding.audioOutputButton.getHierarchy().setPlaceholderImage( AppCompatResources.getDrawable(context, R.drawable.ic_baseline_bluetooth_audio_24)); @@ -749,7 +748,7 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. final MagicAudioManager.AudioDevice device, final Set availableDevices) { Log.d(TAG, "onAudioManagerDevicesChanged: " + availableDevices + ", " - + "selected: " + device); + + "result: " + device); final boolean shouldDisableProximityLock = (device.equals(MagicAudioManager.AudioDevice.WIRED_HEADSET) || device.equals(MagicAudioManager.AudioDevice.SPEAKER_PHONE) @@ -760,6 +759,11 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. } else { powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.WITH_PROXIMITY_SENSOR_LOCK); } + + if (audioOutputDialog != null){ + audioOutputDialog.updateOutputDeviceList(); + } + updateAudioOutputButton(device); } @@ -1675,10 +1679,10 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. Log.d(TAG, " currentSessionId is " + currentSessionId); for (HashMap participant : users) { - long inCallFlag = (long)participant.get("inCall"); + long inCallFlag = (long) participant.get("inCall"); if (!participant.get("sessionId").equals(currentSessionId)) { boolean isNewSession; - Log.d(TAG, " inCallFlag of participant " + participant.get("sessionId").toString().substring(0,4) + " : " + inCallFlag); + Log.d(TAG, " inCallFlag of participant " + participant.get("sessionId").toString().substring(0, 4) + " : " + inCallFlag); isNewSession = inCallFlag != 0; if (isNewSession) { @@ -1688,7 +1692,7 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager. } } else { Log.d(TAG, " inCallFlag of currentSessionId: " + inCallFlag); - if (inCallFlag == 0){ + if (inCallFlag == 0) { Log.d(TAG, "Most probably a moderator ended the call for all."); hangup(true); } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt index 6fdbf8750..9826d753a 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt @@ -42,17 +42,22 @@ class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(call setContentView(dialogAudioOutputBinding.root) window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) - hideUnavailableOutputChannels() + updateOutputDeviceList() highlightActiveOutputChannel() initClickListeners() } - private fun hideUnavailableOutputChannels() { + fun updateOutputDeviceList() { if (callActivity.audioManager?.audioDevices?.contains(MagicAudioManager.AudioDevice.BLUETOOTH) == false){ dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.GONE + } else { + dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.VISIBLE } + if (callActivity.audioManager?.audioDevices?.contains(MagicAudioManager.AudioDevice.EARPIECE) == false){ dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.GONE + } else { + dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.VISIBLE } } diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java index 7d640591f..0dbd54fbf 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicAudioManager.java @@ -59,7 +59,7 @@ public class MagicAudioManager { private final MagicBluetoothManager bluetoothManager; private boolean controlSpeakerByProximitySensor; private AudioManager audioManager; - private AudioManagerEvents audioManagerEvents; + private AudioManagerListener audioManagerListener; private AudioManagerState amState; private int savedAudioMode = AudioManager.MODE_INVALID; private boolean savedIsSpeakerPhoneOn = false; @@ -147,7 +147,7 @@ public class MagicAudioManager { } @SuppressLint("WrongConstant") - public void start(AudioManagerEvents audioManagerEvents) { + public void start(AudioManagerListener audioManagerListener) { Log.d(TAG, "start"); ThreadUtils.checkIsOnMainThread(); if (amState == AudioManagerState.RUNNING) { @@ -157,7 +157,7 @@ public class MagicAudioManager { // TODO(henrika): perhaps call new method called preInitAudio() here if UNINITIALIZED. Log.d(TAG, "AudioManager starts..."); - this.audioManagerEvents = audioManagerEvents; + this.audioManagerListener = audioManagerListener; amState = AudioManagerState.RUNNING; // Store current audio state so we can restore it when stop() is called. @@ -276,7 +276,7 @@ public class MagicAudioManager { powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.IDLE); - audioManagerEvents = null; + audioManagerListener = null; Log.d(TAG, "AudioManager stopped"); } @@ -462,7 +462,7 @@ public class MagicAudioManager { // Correct user selected audio devices if needed. if (userSelectedAudioDevice == AudioDevice.BLUETOOTH && bluetoothManager.getState() == MagicBluetoothManager.State.HEADSET_UNAVAILABLE) { - userSelectedAudioDevice = AudioDevice.NONE; + userSelectedAudioDevice = AudioDevice.SPEAKER_PHONE; } if (userSelectedAudioDevice == AudioDevice.SPEAKER_PHONE && hasWiredHeadset) { userSelectedAudioDevice = AudioDevice.WIRED_HEADSET; @@ -539,9 +539,9 @@ public class MagicAudioManager { Log.d(TAG, "New device status: " + "available=" + audioDevices + ", " + "resulting(new)=" + newResultingAudioDevice); - if (audioManagerEvents != null) { + if (audioManagerListener != null) { // Notify a listening client that audio device has been changed. - audioManagerEvents.onAudioDeviceChanged(resultingAudioDevice, audioDevices); + audioManagerListener.onAudioDeviceChanged(resultingAudioDevice, audioDevices); } } Log.d(TAG, "--- updateAudioDeviceState done"); @@ -567,7 +567,7 @@ public class MagicAudioManager { /** * Selected audio device change event. */ - public static interface AudioManagerEvents { + public static interface AudioManagerListener { // Callback fired once audio device is changed or list of available audio devices changed. void onAudioDeviceChanged( AudioDevice selectedAudioDevice, Set availableAudioDevices);