diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2017-08-31 16:17:04 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-08-31 16:17:04 +0000 |
commit | c39ea3c55fac807c0b98aabdf56c70dc8a49036c (patch) | |
tree | e282668a9587cf6c1ec7b604dea860400c75c6c7 /java/com/android/incallui/audiomode/AudioModeProvider.java | |
parent | 68038172793ee0e2ab3e2e56ddfbeb82879d1f58 (diff) | |
parent | 2ca4318cc1ee57dda907ba2069bd61d162b1baef (diff) |
Merge "Update Dialer source to latest internal Google revision."
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 { |