1aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta/* 2aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Copyright (c) 2014 The Android Open Source Project 3aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Copyright (C) 2012 The Android Open Source Project 4aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * 5aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 6aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * you may not use this file except in compliance with the License. 7aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * You may obtain a copy of the License at 8aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * 9aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 10aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * 11aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Unless required by applicable law or agreed to in writing, software 12aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 13aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * See the License for the specific language governing permissions and 15aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * limitations under the License. 16aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta */ 17aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 18aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptapackage com.android.bluetooth.hfpclient; 19aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 20aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.bluetooth.BluetoothDevice; 21aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.bluetooth.BluetoothProfile; 228d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwoodimport android.bluetooth.BluetoothHeadsetClient; 238d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwoodimport android.bluetooth.BluetoothHeadsetClientCall; 248d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwoodimport android.bluetooth.IBluetoothHeadsetClient; 25aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.content.BroadcastReceiver; 26aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.content.Context; 27aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.content.Intent; 28aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.content.IntentFilter; 29aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.media.AudioManager; 30aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.os.Bundle; 31aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.os.Message; 32aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.provider.Settings; 33aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport android.util.Log; 34aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport com.android.bluetooth.btservice.ProfileService; 35a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwalimport com.android.bluetooth.hfpclient.connserv.HfpClientConnectionService; 36aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport com.android.bluetooth.Utils; 37aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport java.util.ArrayList; 38aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport java.util.List; 39aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 40a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal 41aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta/** 428d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood * Provides Bluetooth Headset Client (HF Role) profile, as a service in the 43aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Bluetooth application. 44aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * 45aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * @hide 46aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta */ 478d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwoodpublic class HeadsetClientService extends ProfileService { 48aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta private static final boolean DBG = false; 498d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static final String TAG = "HeadsetClientService"; 50aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 518d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private HeadsetClientStateMachine mStateMachine; 528d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static HeadsetClientService sHeadsetClientService; 53aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 54a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal public static String HFP_CLIENT_STOP_TAG = "hfp_client_stop_tag"; 55a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal 56aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 57aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected String getName() { 58aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return TAG; 59aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 60aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 61aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 62aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public IProfileServiceBinder initBinder() { 638d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood return new BluetoothHeadsetClientBinder(this); 64aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 65aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 66aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 67aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected boolean start() { 688d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine = HeadsetClientStateMachine.make(this); 69aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION); 70aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta filter.addAction(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY); 71aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta try { 72aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta registerReceiver(mBroadcastReceiver, filter); 73aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } catch (Exception e) { 74aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Log.w(TAG, "Unable to register broadcat receiver", e); 75aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 768d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood setHeadsetClientService(this); 77a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal 78a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal // Start the HfpClientConnectionService to create connection with telecom when HFP 79a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal // connection is available. 80a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal Intent startIntent = new Intent(this, HfpClientConnectionService.class); 81a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal startService(startIntent); 82a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal 83aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 84aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 85aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 86aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 87aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected boolean stop() { 88aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta try { 89aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta unregisterReceiver(mBroadcastReceiver); 90aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } catch (Exception e) { 91aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Log.w(TAG, "Unable to unregister broadcast receiver", e); 92aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 93617b75198109f2ddf2af31bbb5a5db691a351186Lianchao Song if (mStateMachine != null) { 94617b75198109f2ddf2af31bbb5a5db691a351186Lianchao Song mStateMachine.doQuit(); 95617b75198109f2ddf2af31bbb5a5db691a351186Lianchao Song } 96a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal 97a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal // Stop the HfpClientConnectionService. 98a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal Intent stopIntent = new Intent(this, HfpClientConnectionService.class); 99a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal stopIntent.putExtra(HFP_CLIENT_STOP_TAG, true); 100a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal startService(stopIntent); 101a8fc504fed7dcb5dc074980b9d4cfa7a56445424Sanket Agarwal 102aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 103aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 104aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 105aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 106aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected boolean cleanup() { 107aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (mStateMachine != null) { 108aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.cleanup(); 109aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 1108d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood clearHeadsetClientService(); 111aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 112aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 113aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 114aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 115aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 116aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public void onReceive(Context context, Intent intent) { 117aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta String action = intent.getAction(); 118aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 1193076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal // We handle the volume changes for Voice calls here since HFP audio volume control does 1203076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal // not go through audio manager (audio mixer). We check if the voice call volume has 1213076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal // changed and subsequently change the SCO volume see 1223076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal // ({@link HeadsetClientStateMachine#SET_SPEAKER_VOLUME} in 1233076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal // {@link HeadsetClientStateMachine} for details. 124aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) { 1253076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal Log.d(TAG, "Volume changed for stream: " + 1263076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal intent.getExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE)); 127aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); 1283076d2acccf5c3db0db19b622f062e259be39f3aSanket Agarwal if (streamType == AudioManager.STREAM_VOICE_CALL) { 129aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int streamValue = intent 130aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta .getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); 131aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int streamPrevValue = intent.getIntExtra( 132aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, -1); 133aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 134aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (streamValue != -1 && streamValue != streamPrevValue) { 135aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(mStateMachine.obtainMessage( 1368d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientStateMachine.SET_SPEAKER_VOLUME, streamValue, 0)); 137aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 138aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 139aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 140aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 141aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta }; 142aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 143aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta /** 144aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Handlers for incoming service calls 145aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta */ 1468d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static class BluetoothHeadsetClientBinder extends IBluetoothHeadsetClient.Stub 147aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta implements IProfileServiceBinder { 1488d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private HeadsetClientService mService; 149aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 1508d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public BluetoothHeadsetClientBinder(HeadsetClientService svc) { 151aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mService = svc; 152aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 153aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 154aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 155aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean cleanup() { 156aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mService = null; 157aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 158aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 159aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 1608d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private HeadsetClientService getService() { 161aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (!Utils.checkCaller()) { 1628d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.w(TAG, "HeadsetClient call not allowed for non-active user"); 163aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 164aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 165aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 166aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (mService != null && mService.isAvailable()) { 167aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mService; 168aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 16933acd2208455171249084dd86ae0ed95db1e4c49Wei Liu 17033acd2208455171249084dd86ae0ed95db1e4c49Wei Liu Log.e(TAG, "HeadsetClientService is not available."); 171aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 172aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 173aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 174aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 175aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean connect(BluetoothDevice device) { 1768d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 177aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 178aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 179aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 180aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.connect(device); 181aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 182aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 183aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 184aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean disconnect(BluetoothDevice device) { 1858d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 186aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 187aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 188aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 189aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.disconnect(device); 190aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 191aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 192aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 193aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public List<BluetoothDevice> getConnectedDevices() { 1948d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 195aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 196aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return new ArrayList<BluetoothDevice>(0); 197aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 198aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getConnectedDevices(); 199aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 200aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 201aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 202aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { 2038d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 204aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 205aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return new ArrayList<BluetoothDevice>(0); 206aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 207aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getDevicesMatchingConnectionStates(states); 208aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 209aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 210aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 211aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getConnectionState(BluetoothDevice device) { 2128d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 213aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 214aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return BluetoothProfile.STATE_DISCONNECTED; 215aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 216aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getConnectionState(device); 217aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 218aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 219aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 220aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean setPriority(BluetoothDevice device, int priority) { 2218d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 222aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 223aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 224aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 225aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.setPriority(device, priority); 226aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 227aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 228aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 229aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getPriority(BluetoothDevice device) { 2308d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 231aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 232aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return BluetoothProfile.PRIORITY_UNDEFINED; 233aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 234aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getPriority(device); 235aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 236aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 237aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 238aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean startVoiceRecognition(BluetoothDevice device) { 2398d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 240aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 241aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 242aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 243aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.startVoiceRecognition(device); 244aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 245aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 246aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 247aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean stopVoiceRecognition(BluetoothDevice device) { 2488d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 249aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 250aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 251aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 252aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.stopVoiceRecognition(device); 253aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 254aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 255aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 256aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean acceptIncomingConnect(BluetoothDevice device) { 2578d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 258aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 259aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 260aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 261aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.acceptIncomingConnect(device); 262aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 263aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 264aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 265aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean rejectIncomingConnect(BluetoothDevice device) { 2668d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 267aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 268aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 269aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 270aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.rejectIncomingConnect(device); 271aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 272aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 273aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 274aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getAudioState(BluetoothDevice device) { 2758d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 276aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 2778d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood return BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED; 278aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 279aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getAudioState(device); 280aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 281aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 282aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 28322bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee public void setAudioRouteAllowed(boolean allowed) { 28422bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee HeadsetClientService service = getService(); 28522bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee if (service != null) { 28622bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee service.setAudioRouteAllowed(allowed); 28722bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee } 28822bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee } 28922bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee 29022bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee @Override 29122bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee public boolean getAudioRouteAllowed() { 29222bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee HeadsetClientService service = getService(); 29322bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee if (service != null) { 29422bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee return service.getAudioRouteAllowed(); 29522bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee } 29622bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee 29722bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee return false; 29822bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee } 29922bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee 30022bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee @Override 301aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean connectAudio() { 3028d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 303aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 304aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 305aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 306aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.connectAudio(); 307aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 308aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 309aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 310aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean disconnectAudio() { 3118d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 312aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 313aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 314aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 315aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.disconnectAudio(); 316aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 317aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 318aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 319aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean acceptCall(BluetoothDevice device, int flag) { 3208d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 321aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 322aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 323aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 324aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.acceptCall(device, flag); 325aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 326aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 327aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 328aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean rejectCall(BluetoothDevice device) { 3298d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 330aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 331aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 332aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 333aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.rejectCall(device); 334aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 335aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 336aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 337aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean holdCall(BluetoothDevice device) { 3388d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 339aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 340aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 341aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 342aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.holdCall(device); 343aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 344aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 345aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 346aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean terminateCall(BluetoothDevice device, int index) { 3478d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 348aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 349aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 350aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 351aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.terminateCall(device, index); 352aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 353aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 354aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 355aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean explicitCallTransfer(BluetoothDevice device) { 3568d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 357aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 358aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 359aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 360aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.explicitCallTransfer(device); 361aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 362aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 363aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 364aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean enterPrivateMode(BluetoothDevice device, int index) { 3658d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 366aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 367aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 368aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 369aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.enterPrivateMode(device, index); 370aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 371aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 372aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 373aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean redial(BluetoothDevice device) { 3748d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 375aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 376aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 377aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 378aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.redial(device); 379aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 380aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 381aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 382aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean dial(BluetoothDevice device, String number) { 3838d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 384aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 385aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 386aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 387aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.dial(device, number); 388aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 389aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 390aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 391aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean dialMemory(BluetoothDevice device, int location) { 3928d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 393aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 394aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 395aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 396aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.dialMemory(device, location); 397aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 398aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 399aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 4008d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) { 4018d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 402aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 403aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 404aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 405aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getCurrentCalls(device); 406aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 407aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 408aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 409aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean sendDTMF(BluetoothDevice device, byte code) { 4108d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 411aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 412aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 413aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 414aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.sendDTMF(device, code); 415aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 416aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 417aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 418aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean getLastVoiceTagNumber(BluetoothDevice device) { 4198d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 420aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 421aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 422aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 423aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getLastVoiceTagNumber(device); 424aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 425aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 426aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 427aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgEvents(BluetoothDevice device) { 4288d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 429aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 430aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 431aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 432aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getCurrentAgEvents(device); 433aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 434aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 435aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 436aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgFeatures(BluetoothDevice device) { 4378d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 438aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 439aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 440aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 441aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getCurrentAgFeatures(device); 442aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 443aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta }; 444aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 445aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // API methods 4468d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public static synchronized HeadsetClientService getHeadsetClientService() { 4478d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood if (sHeadsetClientService != null && sHeadsetClientService.isAvailable()) { 448aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4498d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "getHeadsetClientService(): returning " + sHeadsetClientService); 450aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 4518d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood return sHeadsetClientService; 452aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 453aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4548d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood if (sHeadsetClientService == null) { 4558d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "getHeadsetClientService(): service is NULL"); 4568d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood } else if (!(sHeadsetClientService.isAvailable())) { 4578d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "getHeadsetClientService(): service is not available"); 458aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 459aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 460aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 461aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 462aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4638d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static synchronized void setHeadsetClientService(HeadsetClientService instance) { 464aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (instance != null && instance.isAvailable()) { 465aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4668d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "setHeadsetClientService(): set to: " + sHeadsetClientService); 467aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 4688d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood sHeadsetClientService = instance; 469aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } else { 470aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4718d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood if (sHeadsetClientService == null) { 4728d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "setHeadsetClientService(): service not available"); 4738d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood } else if (!sHeadsetClientService.isAvailable()) { 4748d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "setHeadsetClientService(): service is cleaning up"); 475aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 476aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 477aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 478aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 479aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4808d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static synchronized void clearHeadsetClientService() { 4818d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood sHeadsetClientService = null; 482aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 483aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 484aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean connect(BluetoothDevice device) { 485aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 486aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH ADMIN permission"); 487aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 488aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (getPriority(device) == BluetoothProfile.PRIORITY_OFF) { 48933acd2208455171249084dd86ae0ed95db1e4c49Wei Liu Log.w(TAG, "Connection not allowed: <" + device.getAddress() + "> is PRIORITY_OFF"); 490aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 491aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 492aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 493aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 494aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState == BluetoothProfile.STATE_CONNECTED || 495aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState == BluetoothProfile.STATE_CONNECTING) { 49633acd2208455171249084dd86ae0ed95db1e4c49Wei Liu Log.w(TAG, "Unable to connect: state is CONNECTING or CONNECTED."); 497aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 498aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 499aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 5008d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.CONNECT, device); 501aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 502aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 503aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 504aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean disconnect(BluetoothDevice device) { 505aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 506aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH ADMIN permission"); 507aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 508aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 509aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 510aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 511aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 512aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 5138d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.DISCONNECT, device); 514aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 515aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 516aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 517aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public List<BluetoothDevice> getConnectedDevices() { 518aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 519aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getConnectedDevices(); 520aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 521aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 522aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta private List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { 523aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 524aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getDevicesMatchingConnectionStates(states); 525aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 526aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 527aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int getConnectionState(BluetoothDevice device) { 528aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 529aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getConnectionState(device); 530aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 531aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 5328d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood // TODO Should new setting for HeadsetClient priority be created? 533aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean setPriority(BluetoothDevice device, int priority) { 534aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 535aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH_ADMIN permission"); 536aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Settings.Global.putInt(getContentResolver(), 537aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Settings.Global.getBluetoothHeadsetPriorityKey(device.getAddress()), 538aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta priority); 539aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 540aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Log.d(TAG, "Saved priority " + device + " = " + priority); 541aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 542aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 543aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 544aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 545aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getPriority(BluetoothDevice device) { 546aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 547aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH_ADMIN permission"); 548aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int priority = Settings.Global.getInt(getContentResolver(), 549aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Settings.Global.getBluetoothHeadsetPriorityKey(device.getAddress()), 550aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta BluetoothProfile.PRIORITY_UNDEFINED); 551aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return priority; 552aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 553aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 554aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean startVoiceRecognition(BluetoothDevice device) { 555aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 556aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 557aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 558aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 559aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 560aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5618d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.VOICE_RECOGNITION_START); 562aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 563aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 564aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 565aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean stopVoiceRecognition(BluetoothDevice device) { 566aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 567aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // It seem that we really need to check the AudioOn state. 568aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // But since we allow startVoiceRecognition in STATE_CONNECTED and 569aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // STATE_CONNECTING state, we do these 2 in this method 570aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 571aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 572aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 573aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 574aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5758d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.VOICE_RECOGNITION_STOP); 576aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 577aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 578aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 579aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean acceptIncomingConnect(BluetoothDevice device) { 580aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // TODO(BT) remove it if stack does access control 581aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 582aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 583aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 584aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean rejectIncomingConnect(BluetoothDevice device) { 585aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // TODO(BT) remove it if stack does access control 586aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 587aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 588aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 589aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int getAudioState(BluetoothDevice device) { 590aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getAudioState(device); 591aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 592aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 59322bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee public void setAudioRouteAllowed(boolean allowed) { 59422bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee mStateMachine.setAudioRouteAllowed(allowed); 59522bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee } 59622bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee 59722bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee public boolean getAudioRouteAllowed() { 59822bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee return mStateMachine.getAudioRouteAllowed(); 59922bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee } 60022bb39444356637fbcabd4acf04f2fdb9e3da177Bryce Lee 601aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean connectAudio() { 602aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); 603aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (!mStateMachine.isConnected()) { 604aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 605aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 606aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (mStateMachine.isAudioOn()) { 607aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 608aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 6098d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.CONNECT_AUDIO); 610aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 611aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 612aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 613aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean disconnectAudio() { 614aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); 615aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (!mStateMachine.isAudioOn()) { 616aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 617aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 6188d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.DISCONNECT_AUDIO); 619aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 620aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 621aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 622aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean holdCall(BluetoothDevice device) { 623aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 624aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 625aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 626aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 627aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 628aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 6298d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.HOLD_CALL); 630aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 631aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 632aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 633aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 634aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean acceptCall(BluetoothDevice device, int flag) { 635aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 636aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 637aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 638aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 639aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 640aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 6418d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.ACCEPT_CALL); 642aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = flag; 643aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 644aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 645aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 646aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 647aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean rejectCall(BluetoothDevice device) { 648aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 649aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 650aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 651aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 652aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 653aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 654aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6558d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.REJECT_CALL); 656aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 657aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 658aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 659aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 660aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean terminateCall(BluetoothDevice device, int index) { 661aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 662aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 663aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 664aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 665aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 666aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 667aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6688d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.TERMINATE_CALL); 669aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = index; 670aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 671aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 672aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 673aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 674aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean enterPrivateMode(BluetoothDevice device, int index) { 675aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 676aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 677aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 678aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 679aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 680aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 681aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6828d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.ENTER_PRIVATE_MODE); 683aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = index; 684aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 685aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 686aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 687aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 688aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean redial(BluetoothDevice device) { 689aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 690aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 691aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 692aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 693aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 694aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 695aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6968d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.REDIAL); 697aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 698aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 699aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 700aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 701aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean dial(BluetoothDevice device, String number) { 702aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 703aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 704aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 705aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 706aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 707aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 708aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 7098d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.DIAL_NUMBER); 710aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.obj = number; 711aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 712aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 713aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 714aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 715aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean dialMemory(BluetoothDevice device, int location) { 716aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 717aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 718aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 719aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 720aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 721aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 7228d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.DIAL_MEMORY); 723aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = location; 724aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 725aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 726aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 727aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 728aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean sendDTMF(BluetoothDevice device, byte code) { 729aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 730aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 731aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 732aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 733aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 734aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 7358d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.SEND_DTMF); 736aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = code; 737aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 738aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 739aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 740aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 741aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean getLastVoiceTagNumber(BluetoothDevice device) { 742aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 743aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 744aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 745aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 746aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 747aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 7488d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.LAST_VTAG_NUMBER); 749aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 750aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 751aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 752aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 7538d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) { 754aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 755aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 756aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED) { 757aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 758aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 759aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getCurrentCalls(); 760aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 761aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 762aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean explicitCallTransfer(BluetoothDevice device) { 763aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 764aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 765aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 766aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 767aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 768aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 769aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Message msg = mStateMachine 7708d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood .obtainMessage(HeadsetClientStateMachine.EXPLICIT_CALL_TRANSFER); 771aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 772aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 773aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 774aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 775aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgEvents(BluetoothDevice device) { 776aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 777aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 778aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED) { 779aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 780aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 781aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getCurrentAgEvents(); 782aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 783aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 784aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgFeatures(BluetoothDevice device) { 785aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 786aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 787aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED) { 788aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 789aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 790aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getCurrentAgFeatures(); 791aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 792838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood 793838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood @Override 794838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood public void dump(StringBuilder sb) { 795838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood super.dump(sb); 796838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood if (mStateMachine != null) { 797838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood mStateMachine.dump(sb); 798838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood } 799838949d46a4cc054985a8cfd682004f8dd6d3bbbMike Lockwood } 800aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta} 801