diff options
-rw-r--r-- | java/com/android/incallui/InCallServiceImpl.java | 1 | ||||
-rw-r--r-- | java/com/android/incallui/audiomode/AudioModeProvider.java | 45 |
2 files changed, 46 insertions, 0 deletions
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java index a2e243202..a08ee0aa5 100644 --- a/java/com/android/incallui/InCallServiceImpl.java +++ b/java/com/android/incallui/InCallServiceImpl.java @@ -77,6 +77,7 @@ public class InCallServiceImpl extends InCallService { Trace.beginSection("InCallServiceImpl.onBind"); final Context context = getApplicationContext(); final ContactInfoCache contactInfoCache = ContactInfoCache.getInstance(context); + AudioModeProvider.getInstance().initializeAudioState(this); InCallPresenter.getInstance() .setUp( context, diff --git a/java/com/android/incallui/audiomode/AudioModeProvider.java b/java/com/android/incallui/audiomode/AudioModeProvider.java index f62afa7f2..eb59e95d4 100644 --- a/java/com/android/incallui/audiomode/AudioModeProvider.java +++ b/java/com/android/incallui/audiomode/AudioModeProvider.java @@ -16,7 +16,11 @@ package com.android.incallui.audiomode; +import android.content.Context; +import android.media.AudioDeviceInfo; +import android.media.AudioManager; import android.telecom.CallAudioState; +import com.android.dialer.common.LogUtil; import java.util.ArrayList; import java.util.List; @@ -61,6 +65,47 @@ public class AudioModeProvider { return audioState; } + /** + * Sets a approximated audio state before {@link #onAudioStateChanged} is called. Classes such as + * {@link com.android.incallui.ProximitySensor} fetches the audio state before it is updated by + * telecom. This method attempts to guess the correct routing based on connected audio devices. + * The audio state may still be wrong on a second call due to b/64811128, telecom setting the + * route back to earpiece when a call ends. + */ + public void initializeAudioState(Context context) { + onAudioStateChanged( + new CallAudioState(false, getApproximatedAudioRoute(context), SUPPORTED_AUDIO_ROUTE_ALL)); + } + + private static int getApproximatedAudioRoute(Context context) { + AudioManager audioManager = context.getSystemService(AudioManager.class); + boolean hasBluetooth = false; + boolean hasHeadset = false; + for (AudioDeviceInfo info : audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) { + switch (info.getType()) { + case AudioDeviceInfo.TYPE_BLUETOOTH_A2DP: + case AudioDeviceInfo.TYPE_BLUETOOTH_SCO: + hasBluetooth = true; + continue; + case AudioDeviceInfo.TYPE_WIRED_HEADSET: + hasHeadset = true; + continue; + default: + continue; + } + } + if (hasBluetooth) { + LogUtil.i("AudioModeProvider.getApproximatedAudioRoute", "Routing to bluetooth"); + return CallAudioState.ROUTE_BLUETOOTH; + } + if (hasHeadset) { + LogUtil.i("AudioModeProvider.getApproximatedAudioRoute", "Routing to headset"); + return CallAudioState.ROUTE_WIRED_HEADSET; + } + LogUtil.i("AudioModeProvider.getApproximatedAudioRoute", "Routing to earpiece"); + return CallAudioState.ROUTE_EARPIECE; + } + /** Notified on changes to audio mode. */ public interface AudioModeListener { |