update UI if audio output device changed

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2022-02-01 17:03:15 +01:00
parent 3587fe6e12
commit 338f06dda1
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
3 changed files with 36 additions and 27 deletions

View File

@ -158,7 +158,7 @@ import okhttp3.Cache;
import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.AfterPermissionGranted;
@AutoInjector(NextcloudTalkApplication.class) @AutoInjector(NextcloudTalkApplication.class)
public class CallActivity extends CallBaseActivity implements MagicAudioManager.AudioManagerEvents { public class CallActivity extends CallBaseActivity {
@Inject @Inject
NcApi ncApi; NcApi ncApi;
@ -256,10 +256,7 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager.
private CallActivityBinding binding; private CallActivityBinding binding;
@Override private AudioOutputDialog audioOutputDialog;
public void onAudioDeviceChanged(MagicAudioManager.AudioDevice selectedAudioDevice, Set<MagicAudioManager.AudioDevice> availableAudioDevices) {
setAudioOutputChannel(selectedAudioDevice);
}
@Parcel @Parcel
public enum CallStatus { public enum CallStatus {
@ -336,9 +333,10 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager.
private void initClickListeners() { private void initClickListeners() {
binding.pictureInPictureButton.setOnClickListener(l -> enterPipMode()); binding.pictureInPictureButton.setOnClickListener(l -> enterPipMode());
binding.audioOutputButton.setOnClickListener(v -> new AudioOutputDialog( binding.audioOutputButton.setOnClickListener(v -> {
this audioOutputDialog = new AudioOutputDialog(this);
).show()); audioOutputDialog.show();
});
binding.microphoneButton.setOnClickListener(l -> onMicrophoneClick()); binding.microphoneButton.setOnClickListener(l -> onMicrophoneClick());
binding.microphoneButton.setOnLongClickListener(l -> { binding.microphoneButton.setOnLongClickListener(l -> {
@ -457,13 +455,14 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager.
} }
public void setAudioOutputChannel(MagicAudioManager.AudioDevice selectedAudioDevice) { public void setAudioOutputChannel(MagicAudioManager.AudioDevice selectedAudioDevice) {
if (audioManager == null) { if (audioManager != null) {
return; audioManager.selectAudioDevice(selectedAudioDevice);
updateAudioOutputButton(audioManager.getResultingAudioDevice());
}
} }
audioManager.selectAudioDevice(selectedAudioDevice); private void updateAudioOutputButton(MagicAudioManager.AudioDevice activeAudioDevice) {
switch (activeAudioDevice) {
switch (audioManager.getResultingAudioDevice()) {
case BLUETOOTH: case BLUETOOTH:
binding.audioOutputButton.getHierarchy().setPlaceholderImage( binding.audioOutputButton.getHierarchy().setPlaceholderImage(
AppCompatResources.getDrawable(context, R.drawable.ic_baseline_bluetooth_audio_24)); 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 MagicAudioManager.AudioDevice device,
final Set<MagicAudioManager.AudioDevice> availableDevices) { final Set<MagicAudioManager.AudioDevice> availableDevices) {
Log.d(TAG, "onAudioManagerDevicesChanged: " + availableDevices + ", " Log.d(TAG, "onAudioManagerDevicesChanged: " + availableDevices + ", "
+ "selected: " + device); + "result: " + device);
final boolean shouldDisableProximityLock = (device.equals(MagicAudioManager.AudioDevice.WIRED_HEADSET) final boolean shouldDisableProximityLock = (device.equals(MagicAudioManager.AudioDevice.WIRED_HEADSET)
|| device.equals(MagicAudioManager.AudioDevice.SPEAKER_PHONE) || device.equals(MagicAudioManager.AudioDevice.SPEAKER_PHONE)
@ -760,6 +759,11 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager.
} else { } else {
powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.WITH_PROXIMITY_SENSOR_LOCK); 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); Log.d(TAG, " currentSessionId is " + currentSessionId);
for (HashMap<String, Object> participant : users) { for (HashMap<String, Object> participant : users) {
long inCallFlag = (long)participant.get("inCall"); long inCallFlag = (long) participant.get("inCall");
if (!participant.get("sessionId").equals(currentSessionId)) { if (!participant.get("sessionId").equals(currentSessionId)) {
boolean isNewSession; 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; isNewSession = inCallFlag != 0;
if (isNewSession) { if (isNewSession) {
@ -1688,7 +1692,7 @@ public class CallActivity extends CallBaseActivity implements MagicAudioManager.
} }
} else { } else {
Log.d(TAG, " inCallFlag of currentSessionId: " + inCallFlag); 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."); Log.d(TAG, "Most probably a moderator ended the call for all.");
hangup(true); hangup(true);
} }

View File

@ -42,17 +42,22 @@ class AudioOutputDialog(val callActivity: CallActivity) : BottomSheetDialog(call
setContentView(dialogAudioOutputBinding.root) setContentView(dialogAudioOutputBinding.root)
window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
hideUnavailableOutputChannels() updateOutputDeviceList()
highlightActiveOutputChannel() highlightActiveOutputChannel()
initClickListeners() initClickListeners()
} }
private fun hideUnavailableOutputChannels() { fun updateOutputDeviceList() {
if (callActivity.audioManager?.audioDevices?.contains(MagicAudioManager.AudioDevice.BLUETOOTH) == false){ if (callActivity.audioManager?.audioDevices?.contains(MagicAudioManager.AudioDevice.BLUETOOTH) == false){
dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.GONE dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.GONE
} else {
dialogAudioOutputBinding.audioOutputBluetooth.visibility = View.VISIBLE
} }
if (callActivity.audioManager?.audioDevices?.contains(MagicAudioManager.AudioDevice.EARPIECE) == false){ if (callActivity.audioManager?.audioDevices?.contains(MagicAudioManager.AudioDevice.EARPIECE) == false){
dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.GONE dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.GONE
} else {
dialogAudioOutputBinding.audioOutputEarspeaker.visibility = View.VISIBLE
} }
} }

View File

@ -59,7 +59,7 @@ public class MagicAudioManager {
private final MagicBluetoothManager bluetoothManager; private final MagicBluetoothManager bluetoothManager;
private boolean controlSpeakerByProximitySensor; private boolean controlSpeakerByProximitySensor;
private AudioManager audioManager; private AudioManager audioManager;
private AudioManagerEvents audioManagerEvents; private AudioManagerListener audioManagerListener;
private AudioManagerState amState; private AudioManagerState amState;
private int savedAudioMode = AudioManager.MODE_INVALID; private int savedAudioMode = AudioManager.MODE_INVALID;
private boolean savedIsSpeakerPhoneOn = false; private boolean savedIsSpeakerPhoneOn = false;
@ -147,7 +147,7 @@ public class MagicAudioManager {
} }
@SuppressLint("WrongConstant") @SuppressLint("WrongConstant")
public void start(AudioManagerEvents audioManagerEvents) { public void start(AudioManagerListener audioManagerListener) {
Log.d(TAG, "start"); Log.d(TAG, "start");
ThreadUtils.checkIsOnMainThread(); ThreadUtils.checkIsOnMainThread();
if (amState == AudioManagerState.RUNNING) { if (amState == AudioManagerState.RUNNING) {
@ -157,7 +157,7 @@ public class MagicAudioManager {
// TODO(henrika): perhaps call new method called preInitAudio() here if UNINITIALIZED. // TODO(henrika): perhaps call new method called preInitAudio() here if UNINITIALIZED.
Log.d(TAG, "AudioManager starts..."); Log.d(TAG, "AudioManager starts...");
this.audioManagerEvents = audioManagerEvents; this.audioManagerListener = audioManagerListener;
amState = AudioManagerState.RUNNING; amState = AudioManagerState.RUNNING;
// Store current audio state so we can restore it when stop() is called. // 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); powerManagerUtils.updatePhoneState(PowerManagerUtils.PhoneState.IDLE);
audioManagerEvents = null; audioManagerListener = null;
Log.d(TAG, "AudioManager stopped"); Log.d(TAG, "AudioManager stopped");
} }
@ -462,7 +462,7 @@ public class MagicAudioManager {
// Correct user selected audio devices if needed. // Correct user selected audio devices if needed.
if (userSelectedAudioDevice == AudioDevice.BLUETOOTH if (userSelectedAudioDevice == AudioDevice.BLUETOOTH
&& bluetoothManager.getState() == MagicBluetoothManager.State.HEADSET_UNAVAILABLE) { && bluetoothManager.getState() == MagicBluetoothManager.State.HEADSET_UNAVAILABLE) {
userSelectedAudioDevice = AudioDevice.NONE; userSelectedAudioDevice = AudioDevice.SPEAKER_PHONE;
} }
if (userSelectedAudioDevice == AudioDevice.SPEAKER_PHONE && hasWiredHeadset) { if (userSelectedAudioDevice == AudioDevice.SPEAKER_PHONE && hasWiredHeadset) {
userSelectedAudioDevice = AudioDevice.WIRED_HEADSET; userSelectedAudioDevice = AudioDevice.WIRED_HEADSET;
@ -539,9 +539,9 @@ public class MagicAudioManager {
Log.d(TAG, "New device status: " Log.d(TAG, "New device status: "
+ "available=" + audioDevices + ", " + "available=" + audioDevices + ", "
+ "resulting(new)=" + newResultingAudioDevice); + "resulting(new)=" + newResultingAudioDevice);
if (audioManagerEvents != null) { if (audioManagerListener != null) {
// Notify a listening client that audio device has been changed. // Notify a listening client that audio device has been changed.
audioManagerEvents.onAudioDeviceChanged(resultingAudioDevice, audioDevices); audioManagerListener.onAudioDeviceChanged(resultingAudioDevice, audioDevices);
} }
} }
Log.d(TAG, "--- updateAudioDeviceState done"); Log.d(TAG, "--- updateAudioDeviceState done");
@ -567,7 +567,7 @@ public class MagicAudioManager {
/** /**
* Selected audio device change event. * 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. // Callback fired once audio device is changed or list of available audio devices changed.
void onAudioDeviceChanged( void onAudioDeviceChanged(
AudioDevice selectedAudioDevice, Set<AudioDevice> availableAudioDevices); AudioDevice selectedAudioDevice, Set<AudioDevice> availableAudioDevices);