More intelligent default behavior with speakerphone and wired headset

When video is enabled, speakerphone is now enabled unless
there's a wired headset.  If speakerphone is enabled and
a wired headset gets plugged in, speakerphone is disabled.
If video is enabled and a wired headset is removed, speakerphone
is enabled.

Fixes #6153
// FREEBIE
This commit is contained in:
Moxie Marlinspike 2017-02-03 12:00:00 -08:00
parent 5cfd7477ab
commit d92cbfe305
4 changed files with 52 additions and 5 deletions

View File

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

View File

@ -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) {

View File

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

View File

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