Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a8c495c authored by Scott Randolph's avatar Scott Randolph Committed by android-build-merger
Browse files

Earpiece availability from audio config (vs hard coded) am: 1b97fdd5

am: 8f35d024

Change-Id: Id0d9c17659c2065aabed3390a895ecc60429ae63
parents 99ba29fd 8f35d024
Loading
Loading
Loading
Loading
+25 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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);
@@ -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();

@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -340,7 +340,7 @@ public class CallsManager extends Call.ListenerBase
                wiredHeadsetManager,
                statusBarNotifier,
                audioServiceFactory,
                CallAudioRouteStateMachine.doesDeviceSupportEarpieceRoute()
                CallAudioRouteStateMachine.EARPIECE_AUTO_DETECT
        );
        callAudioRouteStateMachine.initialize();

+69 −52
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
        }

@@ -142,7 +142,7 @@ public class CallAudioRouteStateMachineTest
                    ", action=" + action +
                    ", expectedRoute=" + expectedRoute +
                    ", expectedAvailableRoutes=" + expectedAvailableRoutes +
                    ", doesDeviceSupportEarpiece=" + doesDeviceSupportEarpiece +
                    ", earpieceControl=" + earpieceControl +
                    ", shouldRunWithFocus=" + shouldRunWithFocus +
                    '}';
        }
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -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);
@@ -440,7 +457,7 @@ public class CallAudioRouteStateMachineTest
                mockWiredHeadsetManager,
                mockStatusBarNotifier,
                mAudioServiceFactory,
                true);
                CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED);
        List<BluetoothDevice> availableDevices =
                Arrays.asList(bluetoothDevice1, bluetoothDevice2, bluetoothDevice3);

@@ -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
@@ -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
@@ -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
@@ -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(
@@ -551,7 +568,7 @@ public class CallAudioRouteStateMachineTest
                mockWiredHeadsetManager,
                mockStatusBarNotifier,
                mAudioServiceFactory,
                doesDeviceSupportEarpiece);
                earpieceControl);
        stateMachine.initialize();
        assertEquals(expectedState, stateMachine.getCurrentCallAudioState());
    }
@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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
        ));

@@ -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));

@@ -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));

@@ -973,7 +990,7 @@ public class CallAudioRouteStateMachineTest
                mockWiredHeadsetManager,
                mockStatusBarNotifier,
                mAudioServiceFactory,
                params.doesDeviceSupportEarpiece);
                params.earpieceControl);

        setupMocksForParams(stateMachine, params);

@@ -1086,7 +1103,7 @@ public class CallAudioRouteStateMachineTest
                mockWiredHeadsetManager,
                mockStatusBarNotifier,
                mAudioServiceFactory,
                params.doesDeviceSupportEarpiece);
                params.earpieceControl);

        // Set up bluetooth and speakerphone state
        when(mockBluetoothRouteManager.isBluetoothAvailable()).thenReturn(