summaryrefslogtreecommitdiff
path: root/java/com/android/incallui/audiomode/AudioModeProvider.java
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2017-08-31 16:17:04 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-08-31 16:17:04 +0000
commitc39ea3c55fac807c0b98aabdf56c70dc8a49036c (patch)
treee282668a9587cf6c1ec7b604dea860400c75c6c7 /java/com/android/incallui/audiomode/AudioModeProvider.java
parent68038172793ee0e2ab3e2e56ddfbeb82879d1f58 (diff)
parent2ca4318cc1ee57dda907ba2069bd61d162b1baef (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.java45
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 {