summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/com/android/incallui/InCallServiceImpl.java1
-rw-r--r--java/com/android/incallui/audiomode/AudioModeProvider.java45
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 {