diff options
Diffstat (limited to 'java/com/android/incallui/audiomode/AudioModeProvider.java')
-rw-r--r-- | java/com/android/incallui/audiomode/AudioModeProvider.java | 45 |
1 files changed, 45 insertions, 0 deletions
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 { |