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

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