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;
@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<MagicAudioManager.AudioDevice> 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<MagicAudioManager.AudioDevice> 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<String, Object> 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);
}

View File

@ -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
}
}

View File

@ -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<AudioDevice> availableAudioDevices);