diff --git a/src/org/thoughtcrime/redphone/util/AudioUtils.java b/src/org/thoughtcrime/redphone/util/AudioUtils.java index 242b44e35..5160285a7 100644 --- a/src/org/thoughtcrime/redphone/util/AudioUtils.java +++ b/src/org/thoughtcrime/redphone/util/AudioUtils.java @@ -1,6 +1,7 @@ package org.thoughtcrime.redphone.util; import android.content.Context; +import android.content.Intent; import android.media.AudioManager; import android.os.Build; import android.util.Log; @@ -62,4 +63,12 @@ public class AudioUtils { return AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED; } } + + public static String getWiredHeadsetUpdateAction() { + if (Build.VERSION.SDK_INT >= 21) { + return AudioManager.ACTION_HEADSET_PLUG; + } else { + return Intent.ACTION_HEADSET_PLUG; + } + } } diff --git a/src/org/thoughtcrime/securesms/WebRtcCallActivity.java b/src/org/thoughtcrime/securesms/WebRtcCallActivity.java index 7da27b8e1..ab4826ec7 100644 --- a/src/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/src/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -46,6 +46,7 @@ import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.service.MessageRetrievalService; import org.thoughtcrime.securesms.service.WebRtcCallService; +import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; import org.whispersystems.libsignal.IdentityKey; @@ -91,7 +92,9 @@ public class WebRtcCallActivity extends Activity { if (!networkAccess.isCensored(this)) MessageRetrievalService.registerActivityStarted(this); initializeScreenshotSecurity(); EventBus.getDefault().registerSticky(this); + registerBluetoothReceiver(); + registerWiredHeadsetReceiver(); } @Override @@ -113,6 +116,7 @@ public class WebRtcCallActivity extends Activity { if (!networkAccess.isCensored(this)) MessageRetrievalService.registerActivityStopped(this); EventBus.getDefault().unregister(this); unregisterReceiver(bluetoothStateReceiver); + unregisterReceiver(wiredHeadsetStateReceiver); } @Override @@ -149,7 +153,12 @@ public class WebRtcCallActivity extends Activity { } private void handleSetMuteVideo(boolean muted) { -// callScreen.setLocalVideoEnabled(!muted); + AudioManager audioManager = ServiceUtil.getAudioManager(this); + + if (!muted && !audioManager.isWiredHeadsetOn() && !audioManager.isBluetoothScoOn()) { + AudioUtils.enableSpeakerphoneRouting(WebRtcCallActivity.this); + callScreen.notifyAudioRoutingChange(); + } Intent intent = new Intent(this, WebRtcCallService.class); intent.setAction(WebRtcCallService.ACTION_SET_MUTE_VIDEO); @@ -352,6 +361,27 @@ public class WebRtcCallActivity extends Activity { callScreen.notifyBluetoothChange(); } + private void registerWiredHeadsetReceiver() { + IntentFilter filter = new IntentFilter(); + filter.addAction(AudioUtils.getWiredHeadsetUpdateAction()); + wiredHeadsetStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + int state = intent.getIntExtra("state", -1); + + if (state == 0 && callScreen.isVideoEnabled()) { + AudioUtils.enableSpeakerphoneRouting(WebRtcCallActivity.this); + callScreen.notifyAudioRoutingChange(); + } else if (state == 1) { + AudioUtils.enableDefaultRouting(WebRtcCallActivity.this); + callScreen.notifyAudioRoutingChange(); + } + + } + }; + registerReceiver(wiredHeadsetStateReceiver, filter); + } + private class AudioButtonListener implements WebRtcCallControls.AudioButtonListener { @Override public void onAudioChange(AudioUtils.AudioMode mode) { diff --git a/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java b/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java index dd17295a4..3cc1efccf 100644 --- a/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java +++ b/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallControls.java @@ -99,14 +99,14 @@ public class WebRtcCallControls extends LinearLayout { }); } - public boolean isVideoMuted() { - return !videoMuteButton.isChecked(); - } - public void setAudioButtonListener(final AudioButtonListener listener) { audioButton.setListener(listener); } + public boolean isVideoEnabled() { + return videoMuteButton.isChecked(); + } + public void reset() { updateAudioButton(); audioMuteButton.setChecked(false); diff --git a/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java b/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java index a7fc55295..13f692cf1 100644 --- a/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java +++ b/src/org/thoughtcrime/securesms/components/webrtc/WebRtcCallScreen.java @@ -179,6 +179,10 @@ public class WebRtcCallScreen extends FrameLayout implements Recipient.Recipient this.controls.updateAudioButton(); } + public void notifyAudioRoutingChange() { + this.controls.updateAudioButton(); + } + public void setLocalVideoEnabled(boolean enabled) { if (enabled && this.localRenderLayout.isHidden()) { this.localRenderLayout.setHidden(false); @@ -199,6 +203,10 @@ public class WebRtcCallScreen extends FrameLayout implements Recipient.Recipient } } + public boolean isVideoEnabled() { + return controls.isVideoEnabled(); + } + private void initialize() { LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.webrtc_call_screen, this, true);