summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2017-08-21 15:55:43 -0700
committerEric Erfanian <erfanian@google.com>2017-08-30 11:21:54 -0700
commit7d7aa42abb000b1576d7ec7b74462295479e3452 (patch)
treece87abb3781be4bd6c062becdb6f86178ece8c46 /java
parent4b2abce679a35d4ecc05c2dce1db1fc06df68153 (diff)
Guess the correct routing when initializing AudioModeProvider
Previously the default route for AudioModeProvider is ROUTE_EARPIECE. The in call ProximitySensor is initialized before InCallServiceImpl is fully bound, and the real route is not updated by telecom yet, which will cause a proximity wake lock to be held on bluetooth and turn off the screen. In this CL, when initializing AudioModeProvider the routing will be guessed based on what audio devices is connected. Bug: 64211001 Test: AudioModeProviderTest PiperOrigin-RevId: 165987811 Change-Id: I0a976a9654fbf5b6f966d45d219a3d3685b207f5
Diffstat (limited to 'java')
-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 {