CallAudioRoutePeripheralAdapter.java revision 486cb197d4426a0f740b1c73ba3acdc76b3d67d3
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.telecom;
18
19import com.android.server.telecom.bluetooth.BluetoothRouteManager;
20
21/**
22 * A class that acts as a listener to things that could change call audio routing, namely
23 * bluetooth status, wired headset status, and dock status.
24 */
25public class CallAudioRoutePeripheralAdapter implements WiredHeadsetManager.Listener,
26        DockManager.Listener, BluetoothRouteManager.BluetoothStateListener {
27
28    private final CallAudioRouteStateMachine mCallAudioRouteStateMachine;
29    private final BluetoothRouteManager mBluetoothRouteManager;
30
31    public CallAudioRoutePeripheralAdapter(
32            CallAudioRouteStateMachine callAudioRouteStateMachine,
33            BluetoothRouteManager bluetoothManager,
34            WiredHeadsetManager wiredHeadsetManager,
35            DockManager dockManager) {
36        mCallAudioRouteStateMachine = callAudioRouteStateMachine;
37        mBluetoothRouteManager = bluetoothManager;
38
39        mBluetoothRouteManager.setListener(this);
40        wiredHeadsetManager.addListener(this);
41        dockManager.addListener(this);
42    }
43
44    public boolean isBluetoothAudioOn() {
45        return mBluetoothRouteManager.isBluetoothAudioConnectedOrPending();
46    }
47
48    @Override
49    public void onBluetoothStateChange(int oldState, int newState) {
50        switch (oldState) {
51            case BluetoothRouteManager.BLUETOOTH_DISCONNECTED:
52            case BluetoothRouteManager.BLUETOOTH_UNINITIALIZED:
53                switch (newState) {
54                    case BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED:
55                    case BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED:
56                        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
57                                CallAudioRouteStateMachine.CONNECT_BLUETOOTH);
58                        break;
59                }
60                break;
61            case BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED:
62                switch (newState) {
63                    case BluetoothRouteManager.BLUETOOTH_DISCONNECTED:
64                        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
65                                CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH);
66                        break;
67                    case BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED:
68                        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
69                                CallAudioRouteStateMachine.SWITCH_BLUETOOTH);
70                        break;
71                }
72                break;
73            case BluetoothRouteManager.BLUETOOTH_AUDIO_CONNECTED:
74            case BluetoothRouteManager.BLUETOOTH_AUDIO_PENDING:
75                switch (newState) {
76                    case BluetoothRouteManager.BLUETOOTH_DISCONNECTED:
77                        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
78                                CallAudioRouteStateMachine.DISCONNECT_BLUETOOTH);
79                        break;
80                    case BluetoothRouteManager.BLUETOOTH_DEVICE_CONNECTED:
81                        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
82                                CallAudioRouteStateMachine.BT_AUDIO_DISCONNECT);
83                        break;
84                }
85                break;
86        }
87    }
88    /**
89      * Updates the audio route when the headset plugged in state changes. For example, if audio is
90      * being routed over speakerphone and a headset is plugged in then switch to wired headset.
91      */
92    @Override
93    public void onWiredHeadsetPluggedInChanged(boolean oldIsPluggedIn, boolean newIsPluggedIn) {
94        if (!oldIsPluggedIn && newIsPluggedIn) {
95            mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
96                    CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET);
97        } else if (oldIsPluggedIn && !newIsPluggedIn){
98            mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
99                    CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET);
100        }
101    }
102
103    @Override
104    public void onDockChanged(boolean isDocked) {
105        mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
106                isDocked ? CallAudioRouteStateMachine.CONNECT_DOCK
107                        : CallAudioRouteStateMachine.DISCONNECT_DOCK
108        );
109    }
110}
111