Loading src/com/android/server/telecom/CallAudioRouteStateMachine.java +25 −8 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; import android.content.Context; import android.content.pm.UserInfo; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.IAudioService; import android.os.Binder; Loading Loading @@ -68,6 +69,12 @@ import java.util.Objects; * mIsMuted: a boolean indicating whether the audio is muted */ public class CallAudioRouteStateMachine extends StateMachine { /** Values for CallAudioRouteStateMachine constructor's earPieceRouting arg. */ public static final int EARPIECE_FORCE_DISABLED = 0; public static final int EARPIECE_FORCE_ENABLED = 1; public static final int EARPIECE_AUTO_DETECT = 2; /** Direct the audio stream through the device's earpiece. */ public static final int ROUTE_EARPIECE = CallAudioState.ROUTE_EARPIECE; Loading Loading @@ -1259,7 +1266,7 @@ public class CallAudioRouteStateMachine extends StateMachine { WiredHeadsetManager wiredHeadsetManager, StatusBarNotifier statusBarNotifier, CallAudioManager.AudioServiceFactory audioServiceFactory, boolean doesDeviceSupportEarpieceRoute) { int earpieceControl) { super(NAME); addState(mActiveEarpieceRoute); addState(mActiveHeadsetRoute); Loading @@ -1278,7 +1285,16 @@ public class CallAudioRouteStateMachine extends StateMachine { mWiredHeadsetManager = wiredHeadsetManager; mStatusBarNotifier = statusBarNotifier; mAudioServiceFactory = audioServiceFactory; mDoesDeviceSupportEarpieceRoute = doesDeviceSupportEarpieceRoute; switch (earpieceControl) { case EARPIECE_FORCE_DISABLED: mDoesDeviceSupportEarpieceRoute = false; break; case EARPIECE_FORCE_ENABLED: mDoesDeviceSupportEarpieceRoute = true; break; default: mDoesDeviceSupportEarpieceRoute = checkForEarpieceSupport(); } mIsInbandRingSupported = BluetoothHeadset.isInbandRingingSupported(mContext); mLock = callsManager.getLock(); Loading Loading @@ -1600,14 +1616,15 @@ public class CallAudioRouteStateMachine extends StateMachine { return currentState.isActive(); } public static boolean doesDeviceSupportEarpieceRoute() { String[] characteristics = SystemProperties.get("ro.build.characteristics").split(","); for (String characteristic : characteristics) { if ("watch".equals(characteristic)) { return false; private boolean checkForEarpieceSupport() { AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS); for (AudioDeviceInfo device: deviceList) { if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) { return true; } } return true; // No earpiece found return false; } private int calculateBaselineRouteMessage(boolean isExplicitUserRequest, Loading src/com/android/server/telecom/CallsManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -340,7 +340,7 @@ public class CallsManager extends Call.ListenerBase wiredHeadsetManager, statusBarNotifier, audioServiceFactory, CallAudioRouteStateMachine.doesDeviceSupportEarpieceRoute() CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT ); callAudioRouteStateMachine.initialize(); Loading tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java +69 −52 Original line number Diff line number Diff line Loading @@ -89,7 +89,7 @@ public class CallAudioRouteStateMachineTest public int expectedRoute; public BluetoothDevice expectedBluetoothDevice = null; public int expectedAvailableRoutes; // also may exclude the speakerphone. public boolean doesDeviceSupportEarpiece; // set to false in the case of Wear devices public int earpieceControl; // Allows disabling the earpiece to simulate Wear or Car public boolean shouldRunWithFocus; public int callSupportedRoutes = CallAudioState.ROUTE_ALL; Loading @@ -97,7 +97,7 @@ public class CallAudioRouteStateMachineTest public RoutingTestParameters(String name, int initialRoute, int availableRoutes, int speakerInteraction, int bluetoothInteraction, int action, int expectedRoute, int expectedAvailableRoutes, boolean doesDeviceSupportEarpiece, int expectedAvailableRoutes, int earpieceControl, boolean shouldRunWithFocus) { this.name = name; this.initialRoute = initialRoute; Loading @@ -107,7 +107,7 @@ public class CallAudioRouteStateMachineTest this.action = action; this.expectedRoute = expectedRoute; this.expectedAvailableRoutes = expectedAvailableRoutes; this.doesDeviceSupportEarpiece = doesDeviceSupportEarpiece; this.earpieceControl = earpieceControl; this.shouldRunWithFocus = shouldRunWithFocus; } Loading Loading @@ -142,7 +142,7 @@ public class CallAudioRouteStateMachineTest ", action=" + action + ", expectedRoute=" + expectedRoute + ", expectedAvailableRoutes=" + expectedAvailableRoutes + ", doesDeviceSupportEarpiece=" + doesDeviceSupportEarpiece + ", earpieceControl=" + earpieceControl + ", shouldRunWithFocus=" + shouldRunWithFocus + '}'; } Loading Loading @@ -186,6 +186,23 @@ public class CallAudioRouteStateMachineTest any(CallAudioState.class)); } @SmallTest public void testEarpieceAutodetect() { CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine( mContext, mockCallsManager, mockBluetoothRouteManager, mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT); // Since we don't know if we're on a platform with an earpiece or not, all we can do // is ensure the stateMachine construction didn't fail. But at least we exercised the // autodetection code... assertNotNull(stateMachine); } @LargeTest public void testStateMachineTransitionsWithFocus() throws Throwable { List<RoutingTestParameters> paramList = generateTransitionTests(true); Loading @@ -207,7 +224,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true); Loading Loading @@ -250,7 +267,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true); Loading Loading @@ -291,7 +308,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); Collection<BluetoothDevice> availableDevices = Collections.singleton(bluetoothDevice1); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); Loading Loading @@ -362,7 +379,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true); Loading Loading @@ -395,7 +412,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); setInBandRing(false); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(false); Loading Loading @@ -440,7 +457,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); List<BluetoothDevice> availableDevices = Arrays.asList(bluetoothDevice1, bluetoothDevice2, bluetoothDevice3); Loading Loading @@ -482,14 +499,14 @@ public class CallAudioRouteStateMachineTest public void testInitializationWithEarpieceNoHeadsetNoBluetooth() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_EARPIECE, CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest public void testInitializationWithEarpieceAndHeadsetNoBluetooth() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_WIRED_HEADSET, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest Loading @@ -497,7 +514,7 @@ public class CallAudioRouteStateMachineTest CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest Loading @@ -505,21 +522,21 @@ public class CallAudioRouteStateMachineTest CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest public void testInitializationWithNoEarpieceNoHeadsetNoBluetooth() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_SPEAKER, CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } @SmallTest public void testInitializationWithHeadsetNoBluetoothNoEarpiece() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_WIRED_HEADSET, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } @SmallTest Loading @@ -527,18 +544,18 @@ public class CallAudioRouteStateMachineTest CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } @SmallTest public void testInitializationWithBluetoothNoHeadsetNoEarpiece() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } private void initializationTestHelper(CallAudioState expectedState, boolean doesDeviceSupportEarpiece) { int earpieceControl) { when(mockWiredHeadsetManager.isPluggedIn()).thenReturn( (expectedState.getSupportedRouteMask() & CallAudioState.ROUTE_WIRED_HEADSET) != 0); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn( Loading @@ -551,7 +568,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, doesDeviceSupportEarpiece); earpieceControl); stateMachine.initialize(); assertEquals(expectedState, stateMachine.getCurrentCallAudioState()); } Loading @@ -567,7 +584,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -580,7 +597,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_BLUETOOTH, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -593,7 +610,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -606,7 +623,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -619,7 +636,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -632,7 +649,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -645,7 +662,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -658,7 +675,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -671,7 +688,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_EARPIECE, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -684,7 +701,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -697,7 +714,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_EARPIECE, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -710,7 +727,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -723,7 +740,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -736,7 +753,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -749,7 +766,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -762,7 +779,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -775,7 +792,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_SPEAKER, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -788,7 +805,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_SPEAKER, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -801,7 +818,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_SPEAKER, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_BLUETOOTH, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -814,7 +831,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -827,7 +844,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -840,7 +857,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -853,7 +870,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -866,7 +883,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -879,7 +896,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -892,7 +909,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_BLUETOOTH, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -905,7 +922,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BASELINE_ROUTE, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_BLUETOOTH, // expectedAvailableRoutes false, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -918,7 +935,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_SPEAKER, // expectedAvailableRoutes false, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -931,7 +948,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_SPEAKER, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus ).setCallSupportedRoutes(CallAudioState.ROUTE_ALL & ~CallAudioState.ROUTE_EARPIECE)); Loading @@ -944,7 +961,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_SPEAKER, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus ).setCallSupportedRoutes(CallAudioState.ROUTE_ALL & ~CallAudioState.ROUTE_EARPIECE)); Loading Loading @@ -973,7 +990,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, params.doesDeviceSupportEarpiece); params.earpieceControl); setupMocksForParams(stateMachine, params); Loading Loading @@ -1086,7 +1103,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, params.doesDeviceSupportEarpiece); params.earpieceControl); // Set up bluetooth and speakerphone state when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn( Loading Loading
src/com/android/server/telecom/CallAudioRouteStateMachine.java +25 −8 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; import android.content.Context; import android.content.pm.UserInfo; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.IAudioService; import android.os.Binder; Loading Loading @@ -68,6 +69,12 @@ import java.util.Objects; * mIsMuted: a boolean indicating whether the audio is muted */ public class CallAudioRouteStateMachine extends StateMachine { /** Values for CallAudioRouteStateMachine constructor's earPieceRouting arg. */ public static final int EARPIECE_FORCE_DISABLED = 0; public static final int EARPIECE_FORCE_ENABLED = 1; public static final int EARPIECE_AUTO_DETECT = 2; /** Direct the audio stream through the device's earpiece. */ public static final int ROUTE_EARPIECE = CallAudioState.ROUTE_EARPIECE; Loading Loading @@ -1259,7 +1266,7 @@ public class CallAudioRouteStateMachine extends StateMachine { WiredHeadsetManager wiredHeadsetManager, StatusBarNotifier statusBarNotifier, CallAudioManager.AudioServiceFactory audioServiceFactory, boolean doesDeviceSupportEarpieceRoute) { int earpieceControl) { super(NAME); addState(mActiveEarpieceRoute); addState(mActiveHeadsetRoute); Loading @@ -1278,7 +1285,16 @@ public class CallAudioRouteStateMachine extends StateMachine { mWiredHeadsetManager = wiredHeadsetManager; mStatusBarNotifier = statusBarNotifier; mAudioServiceFactory = audioServiceFactory; mDoesDeviceSupportEarpieceRoute = doesDeviceSupportEarpieceRoute; switch (earpieceControl) { case EARPIECE_FORCE_DISABLED: mDoesDeviceSupportEarpieceRoute = false; break; case EARPIECE_FORCE_ENABLED: mDoesDeviceSupportEarpieceRoute = true; break; default: mDoesDeviceSupportEarpieceRoute = checkForEarpieceSupport(); } mIsInbandRingSupported = BluetoothHeadset.isInbandRingingSupported(mContext); mLock = callsManager.getLock(); Loading Loading @@ -1600,14 +1616,15 @@ public class CallAudioRouteStateMachine extends StateMachine { return currentState.isActive(); } public static boolean doesDeviceSupportEarpieceRoute() { String[] characteristics = SystemProperties.get("ro.build.characteristics").split(","); for (String characteristic : characteristics) { if ("watch".equals(characteristic)) { return false; private boolean checkForEarpieceSupport() { AudioDeviceInfo[] deviceList = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS); for (AudioDeviceInfo device: deviceList) { if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) { return true; } } return true; // No earpiece found return false; } private int calculateBaselineRouteMessage(boolean isExplicitUserRequest, Loading
src/com/android/server/telecom/CallsManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -340,7 +340,7 @@ public class CallsManager extends Call.ListenerBase wiredHeadsetManager, statusBarNotifier, audioServiceFactory, CallAudioRouteStateMachine.doesDeviceSupportEarpieceRoute() CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT ); callAudioRouteStateMachine.initialize(); Loading
tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java +69 −52 Original line number Diff line number Diff line Loading @@ -89,7 +89,7 @@ public class CallAudioRouteStateMachineTest public int expectedRoute; public BluetoothDevice expectedBluetoothDevice = null; public int expectedAvailableRoutes; // also may exclude the speakerphone. public boolean doesDeviceSupportEarpiece; // set to false in the case of Wear devices public int earpieceControl; // Allows disabling the earpiece to simulate Wear or Car public boolean shouldRunWithFocus; public int callSupportedRoutes = CallAudioState.ROUTE_ALL; Loading @@ -97,7 +97,7 @@ public class CallAudioRouteStateMachineTest public RoutingTestParameters(String name, int initialRoute, int availableRoutes, int speakerInteraction, int bluetoothInteraction, int action, int expectedRoute, int expectedAvailableRoutes, boolean doesDeviceSupportEarpiece, int expectedAvailableRoutes, int earpieceControl, boolean shouldRunWithFocus) { this.name = name; this.initialRoute = initialRoute; Loading @@ -107,7 +107,7 @@ public class CallAudioRouteStateMachineTest this.action = action; this.expectedRoute = expectedRoute; this.expectedAvailableRoutes = expectedAvailableRoutes; this.doesDeviceSupportEarpiece = doesDeviceSupportEarpiece; this.earpieceControl = earpieceControl; this.shouldRunWithFocus = shouldRunWithFocus; } Loading Loading @@ -142,7 +142,7 @@ public class CallAudioRouteStateMachineTest ", action=" + action + ", expectedRoute=" + expectedRoute + ", expectedAvailableRoutes=" + expectedAvailableRoutes + ", doesDeviceSupportEarpiece=" + doesDeviceSupportEarpiece + ", earpieceControl=" + earpieceControl + ", shouldRunWithFocus=" + shouldRunWithFocus + '}'; } Loading Loading @@ -186,6 +186,23 @@ public class CallAudioRouteStateMachineTest any(CallAudioState.class)); } @SmallTest public void testEarpieceAutodetect() { CallAudioRouteStateMachine stateMachine = new CallAudioRouteStateMachine( mContext, mockCallsManager, mockBluetoothRouteManager, mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT); // Since we don't know if we're on a platform with an earpiece or not, all we can do // is ensure the stateMachine construction didn't fail. But at least we exercised the // autodetection code... assertNotNull(stateMachine); } @LargeTest public void testStateMachineTransitionsWithFocus() throws Throwable { List<RoutingTestParameters> paramList = generateTransitionTests(true); Loading @@ -207,7 +224,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true); Loading Loading @@ -250,7 +267,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true); Loading Loading @@ -291,7 +308,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); Collection<BluetoothDevice> availableDevices = Collections.singleton(bluetoothDevice1); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); Loading Loading @@ -362,7 +379,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(true); Loading Loading @@ -395,7 +412,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); setInBandRing(false); when(mockBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(false); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(false); Loading Loading @@ -440,7 +457,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, true); CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); List<BluetoothDevice> availableDevices = Arrays.asList(bluetoothDevice1, bluetoothDevice2, bluetoothDevice3); Loading Loading @@ -482,14 +499,14 @@ public class CallAudioRouteStateMachineTest public void testInitializationWithEarpieceNoHeadsetNoBluetooth() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_EARPIECE, CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest public void testInitializationWithEarpieceAndHeadsetNoBluetooth() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_WIRED_HEADSET, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest Loading @@ -497,7 +514,7 @@ public class CallAudioRouteStateMachineTest CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest Loading @@ -505,21 +522,21 @@ public class CallAudioRouteStateMachineTest CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, true); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED); } @SmallTest public void testInitializationWithNoEarpieceNoHeadsetNoBluetooth() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_SPEAKER, CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } @SmallTest public void testInitializationWithHeadsetNoBluetoothNoEarpiece() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_WIRED_HEADSET, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } @SmallTest Loading @@ -527,18 +544,18 @@ public class CallAudioRouteStateMachineTest CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } @SmallTest public void testInitializationWithBluetoothNoHeadsetNoEarpiece() { CallAudioState expectedState = new CallAudioState(false, CallAudioState.ROUTE_BLUETOOTH, CallAudioState.ROUTE_SPEAKER | CallAudioState.ROUTE_BLUETOOTH); initializationTestHelper(expectedState, false); initializationTestHelper(expectedState, CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED); } private void initializationTestHelper(CallAudioState expectedState, boolean doesDeviceSupportEarpiece) { int earpieceControl) { when(mockWiredHeadsetManager.isPluggedIn()).thenReturn( (expectedState.getSupportedRouteMask() & CallAudioState.ROUTE_WIRED_HEADSET) != 0); when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn( Loading @@ -551,7 +568,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, doesDeviceSupportEarpiece); earpieceControl); stateMachine.initialize(); assertEquals(expectedState, stateMachine.getCurrentCallAudioState()); } Loading @@ -567,7 +584,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -580,7 +597,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_BLUETOOTH, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -593,7 +610,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -606,7 +623,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -619,7 +636,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -632,7 +649,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -645,7 +662,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -658,7 +675,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -671,7 +688,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_EARPIECE, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -684,7 +701,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -697,7 +714,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.CONNECT_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_EARPIECE, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -710,7 +727,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -723,7 +740,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -736,7 +753,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_WIRED_HEADSET, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -749,7 +766,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -762,7 +779,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -775,7 +792,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_SPEAKER, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -788,7 +805,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_SPEAKER, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -801,7 +818,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_SPEAKER, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_BLUETOOTH, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -814,7 +831,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -827,7 +844,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -840,7 +857,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -853,7 +870,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_EARPIECE, // action CallAudioState.ROUTE_EARPIECE, // expectedRoute CallAudioState.ROUTE_EARPIECE, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -866,7 +883,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -879,7 +896,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_BLUETOOTH, // expectedAvailable true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -892,7 +909,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BLUETOOTH, // action CallAudioState.ROUTE_BLUETOOTH, // expectedRoute CallAudioState.ROUTE_WIRED_HEADSET | CallAudioState.ROUTE_BLUETOOTH, // expectedAvai true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -905,7 +922,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.SWITCH_BASELINE_ROUTE, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_BLUETOOTH, // expectedAvailableRoutes false, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -918,7 +935,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_SPEAKER, // expectedAvailableRoutes false, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_DISABLED, // earpieceControl shouldRunWithFocus )); Loading @@ -931,7 +948,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_SPEAKER, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus ).setCallSupportedRoutes(CallAudioState.ROUTE_ALL & ~CallAudioState.ROUTE_EARPIECE)); Loading @@ -944,7 +961,7 @@ public class CallAudioRouteStateMachineTest CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH, // action CallAudioState.ROUTE_SPEAKER, // expectedRoute CallAudioState.ROUTE_SPEAKER, // expectedAvailableRoutes true, // doesDeviceSupportEarpiece CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED, // earpieceControl shouldRunWithFocus ).setCallSupportedRoutes(CallAudioState.ROUTE_ALL & ~CallAudioState.ROUTE_EARPIECE)); Loading Loading @@ -973,7 +990,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, params.doesDeviceSupportEarpiece); params.earpieceControl); setupMocksForParams(stateMachine, params); Loading Loading @@ -1086,7 +1103,7 @@ public class CallAudioRouteStateMachineTest mockWiredHeadsetManager, mockStatusBarNotifier, mAudioServiceFactory, params.doesDeviceSupportEarpiece); params.earpieceControl); // Set up bluetooth and speakerphone state when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn( Loading