Просмотр исходного кода

update UI if audio output device changed

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Marcel Hibbe 3 лет назад
Родитель
Сommit
338f06dda1

+ 21 - 17
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<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);
                 }

+ 7 - 2
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
         }
     }
 

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