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 
17 package com.android.server.telecom;
18 
19 import 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  */
25 public class CallAudioRoutePeripheralAdapter implements WiredHeadsetManager.Listener,
26         DockManager.Listener, BluetoothRouteManager.BluetoothStateListener {
27 
28     private final CallAudioRouteStateMachine mCallAudioRouteStateMachine;
29     private final BluetoothRouteManager mBluetoothRouteManager;
30 
CallAudioRoutePeripheralAdapter( CallAudioRouteStateMachine callAudioRouteStateMachine, BluetoothRouteManager bluetoothManager, WiredHeadsetManager wiredHeadsetManager, DockManager dockManager)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 
isBluetoothAudioOn()44     public boolean isBluetoothAudioOn() {
45         return mBluetoothRouteManager.isBluetoothAudioConnectedOrPending();
46     }
47 
48     @Override
onBluetoothDeviceListChanged()49     public void onBluetoothDeviceListChanged() {
50         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
51                 CallAudioRouteStateMachine.BLUETOOTH_DEVICE_LIST_CHANGED);
52     }
53 
54     @Override
onBluetoothActiveDevicePresent()55     public void onBluetoothActiveDevicePresent() {
56         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
57                 CallAudioRouteStateMachine.BT_ACTIVE_DEVICE_PRESENT);
58     }
59 
60     @Override
onBluetoothActiveDeviceGone()61     public void onBluetoothActiveDeviceGone() {
62         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
63                 CallAudioRouteStateMachine.BT_ACTIVE_DEVICE_GONE);
64     }
65 
66     @Override
onBluetoothAudioConnected()67     public void onBluetoothAudioConnected() {
68         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
69                 CallAudioRouteStateMachine.BT_AUDIO_CONNECTED);
70     }
71 
72     @Override
onBluetoothAudioDisconnected()73     public void onBluetoothAudioDisconnected() {
74         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
75                 CallAudioRouteStateMachine.BT_AUDIO_DISCONNECTED);
76     }
77 
78     @Override
onUnexpectedBluetoothStateChange()79     public void onUnexpectedBluetoothStateChange() {
80         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
81                 CallAudioRouteStateMachine.UPDATE_SYSTEM_AUDIO_ROUTE);
82     }
83 
84     /**
85       * Updates the audio route when the headset plugged in state changes. For example, if audio is
86       * being routed over speakerphone and a headset is plugged in then switch to wired headset.
87       */
88     @Override
onWiredHeadsetPluggedInChanged(boolean oldIsPluggedIn, boolean newIsPluggedIn)89     public void onWiredHeadsetPluggedInChanged(boolean oldIsPluggedIn, boolean newIsPluggedIn) {
90         if (!oldIsPluggedIn && newIsPluggedIn) {
91             mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
92                     CallAudioRouteStateMachine.CONNECT_WIRED_HEADSET);
93         } else if (oldIsPluggedIn && !newIsPluggedIn){
94             mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
95                     CallAudioRouteStateMachine.DISCONNECT_WIRED_HEADSET);
96         }
97     }
98 
99     @Override
onDockChanged(boolean isDocked)100     public void onDockChanged(boolean isDocked) {
101         mCallAudioRouteStateMachine.sendMessageWithSessionInfo(
102                 isDocked ? CallAudioRouteStateMachine.CONNECT_DOCK
103                         : CallAudioRouteStateMachine.DISCONNECT_DOCK
104         );
105     }
106 }
107