Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -919,15 +919,17 @@ class CallActivity : CallBaseActivity() {
fun setDefaultAudioOutputChannel(selectedAudioDevice: AudioDevice?) {
if (audioManager != null) {
audioManager!!.setDefaultAudioDevice(selectedAudioDevice)
updateAudioOutputButton(audioManager!!.currentAudioDevice)
updateAudioOutputButton(audioManager!!.audioDeviceForUi)
}
}

fun setAudioOutputChannel(selectedAudioDevice: AudioDevice?) {
if (audioManager != null) {
audioManager!!.selectAudioDevice(selectedAudioDevice)
updateAudioOutputButton(audioManager!!.currentAudioDevice)
fun setAudioOutputChannel(selectedAudioDevice: AudioDevice?): Boolean {
val activeAudioManager = audioManager ?: return false
val accepted = activeAudioManager.selectAudioDevice(selectedAudioDevice)
if (accepted) {
updateAudioOutputButton(activeAudioManager.audioDeviceForUi)
}
return accepted
}

private fun updateAudioOutputButton(activeAudioDevice: AudioDevice) {
Expand Down Expand Up @@ -1142,7 +1144,7 @@ class CallActivity : CallBaseActivity() {
if (audioOutputDialog != null) {
audioOutputDialog!!.updateOutputDeviceList()
}
updateAudioOutputButton(currentDevice)
updateAudioOutputButton(audioManager?.audioDeviceForUi ?: currentDevice)
}

private fun cameraInitialization() {
Expand Down
27 changes: 16 additions & 11 deletions app/src/main/java/com/nextcloud/talk/ui/dialog/AudioOutputDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,25 +44,26 @@ class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(call
}

fun updateOutputDeviceList() {
if (callActivity.audioManager?.audioDevices?.contains(WebRtcAudioManager.AudioDevice.BLUETOOTH) == false) {
val activeAudioManager = callActivity.audioManager
if (activeAudioManager?.audioDevices?.contains(WebRtcAudioManager.AudioDevice.BLUETOOTH) != true) {
dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.GONE
} else {
dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.VISIBLE
}

if (callActivity.audioManager?.audioDevices?.contains(WebRtcAudioManager.AudioDevice.EARPIECE) == false) {
if (activeAudioManager?.audioDevices?.contains(WebRtcAudioManager.AudioDevice.EARPIECE) != true) {
dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.GONE
} else {
dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.VISIBLE
}

if (callActivity.audioManager?.audioDevices?.contains(WebRtcAudioManager.AudioDevice.SPEAKER_PHONE) == false) {
if (activeAudioManager?.audioDevices?.contains(WebRtcAudioManager.AudioDevice.SPEAKER_PHONE) != true) {
dialogAudioOutputBinding.audioOutputSpeaker.visibility = View.GONE
} else {
dialogAudioOutputBinding.audioOutputSpeaker.visibility = View.VISIBLE
}

if (callActivity.audioManager?.currentAudioDevice?.equals(
if (activeAudioManager?.currentAudioDevice?.equals(
WebRtcAudioManager.AudioDevice.WIRED_HEADSET
) == true
) {
Expand All @@ -77,7 +78,8 @@ class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(call
}

private fun highlightActiveOutputChannel() {
when (callActivity.audioManager?.currentAudioDevice) {
viewThemeUtils.platform.themeDialogDark(dialogAudioOutputBinding.root)
when (callActivity.audioManager?.audioDeviceForUi) {
WebRtcAudioManager.AudioDevice.BLUETOOTH -> {
viewThemeUtils.platform.colorImageView(
dialogAudioOutputBinding.audioOutputBluetoothIcon,
Expand Down Expand Up @@ -118,18 +120,21 @@ class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(call

private fun initClickListeners() {
dialogAudioOutputBinding.audioOutputBluetooth.setOnClickListener {
callActivity.setAudioOutputChannel(WebRtcAudioManager.AudioDevice.BLUETOOTH)
dismiss()
if (callActivity.setAudioOutputChannel(WebRtcAudioManager.AudioDevice.BLUETOOTH)) {
dismiss()
}
}

dialogAudioOutputBinding.audioOutputSpeaker.setOnClickListener {
callActivity.setAudioOutputChannel(WebRtcAudioManager.AudioDevice.SPEAKER_PHONE)
dismiss()
if (callActivity.setAudioOutputChannel(WebRtcAudioManager.AudioDevice.SPEAKER_PHONE)) {
dismiss()
}
}

dialogAudioOutputBinding.audioOutputEarspeaker.setOnClickListener {
callActivity.setAudioOutputChannel(WebRtcAudioManager.AudioDevice.EARPIECE)
dismiss()
if (callActivity.setAudioOutputChannel(WebRtcAudioManager.AudioDevice.EARPIECE)) {
dismiss()
}
}
}

Expand Down
64 changes: 64 additions & 0 deletions app/src/main/java/com/nextcloud/talk/webrtc/AudioRoutePolicy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Nextcloud Talk - Android Client
*
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.nextcloud.talk.webrtc;

import java.util.Set;

final class AudioRoutePolicy {
private AudioRoutePolicy() {
}

static WebRtcAudioManager.AudioDevice selectAudioDevice(
Set<WebRtcAudioManager.AudioDevice> availableDevices,
WebRtcAudioManager.AudioDevice userSelectedDevice,
WebRtcAudioManager.AudioDevice defaultDevice,
boolean hasWiredHeadset,
boolean bluetoothConnected) {
if (bluetoothConnected) {
return WebRtcAudioManager.AudioDevice.BLUETOOTH;
}

if (hasWiredHeadset) {
return WebRtcAudioManager.AudioDevice.WIRED_HEADSET;
}

if (userSelectedDevice != WebRtcAudioManager.AudioDevice.NONE
&& userSelectedDevice != WebRtcAudioManager.AudioDevice.BLUETOOTH
&& availableDevices.contains(userSelectedDevice)) {
return userSelectedDevice;
}

if (defaultDevice != WebRtcAudioManager.AudioDevice.NONE && availableDevices.contains(defaultDevice)) {
return defaultDevice;
}

if (availableDevices.contains(WebRtcAudioManager.AudioDevice.EARPIECE)) {
return WebRtcAudioManager.AudioDevice.EARPIECE;
}
if (availableDevices.contains(WebRtcAudioManager.AudioDevice.SPEAKER_PHONE)) {
return WebRtcAudioManager.AudioDevice.SPEAKER_PHONE;
}
return WebRtcAudioManager.AudioDevice.NONE;
}

static boolean shouldPreferBluetooth(
WebRtcAudioManager.AudioDevice userSelectedDevice,
boolean bluetoothCurrentlyPreferred,
boolean bluetoothExpected,
boolean bluetoothUnavailable) {
if (userSelectedDevice == WebRtcAudioManager.AudioDevice.BLUETOOTH) {
return true;
}
if (userSelectedDevice != WebRtcAudioManager.AudioDevice.NONE) {
return false;
}
if (bluetoothExpected) {
return true;
}
return bluetoothCurrentlyPreferred && !bluetoothUnavailable;
}
}
Loading
Loading