HeadsetClientService.java revision 8d536f3db19e8ea7426e98e470dc15d10ecbae87
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; 35aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport com.android.bluetooth.Utils; 36aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport java.util.ArrayList; 37aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Guptaimport java.util.List; 38aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 39aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta/** 408d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood * Provides Bluetooth Headset Client (HF Role) profile, as a service in the 41aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Bluetooth application. 42aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * 43aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * @hide 44aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta */ 458d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwoodpublic class HeadsetClientService extends ProfileService { 46aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta private static final boolean DBG = false; 478d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static final String TAG = "HeadsetClientService"; 48aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 498d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private HeadsetClientStateMachine mStateMachine; 508d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static HeadsetClientService sHeadsetClientService; 51aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 52aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 53aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected String getName() { 54aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return TAG; 55aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 56aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 57aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 58aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public IProfileServiceBinder initBinder() { 598d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood return new BluetoothHeadsetClientBinder(this); 60aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 61aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 62aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 63aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected boolean start() { 648d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine = HeadsetClientStateMachine.make(this); 65aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION); 66aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta filter.addAction(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY); 67aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta try { 68aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta registerReceiver(mBroadcastReceiver, filter); 69aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } catch (Exception e) { 70aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Log.w(TAG, "Unable to register broadcat receiver", e); 71aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 728d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood setHeadsetClientService(this); 73aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 74aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 75aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 76aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 77aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected boolean stop() { 78aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta try { 79aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta unregisterReceiver(mBroadcastReceiver); 80aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } catch (Exception e) { 81aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Log.w(TAG, "Unable to unregister broadcast receiver", e); 82aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 83aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.doQuit(); 84aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 85aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 86aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 87aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 88aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta protected boolean cleanup() { 89aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (mStateMachine != null) { 90aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.cleanup(); 91aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 928d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood clearHeadsetClientService(); 93aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 94aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 95aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 96aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 97aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 98aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public void onReceive(Context context, Intent intent) { 99aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta String action = intent.getAction(); 100aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 101aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) { 102aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); 103aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (streamType == AudioManager.STREAM_BLUETOOTH_SCO) { 104aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int streamValue = intent 105aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta .getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); 106aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int streamPrevValue = intent.getIntExtra( 107aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, -1); 108aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 109aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (streamValue != -1 && streamValue != streamPrevValue) { 110aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(mStateMachine.obtainMessage( 1118d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientStateMachine.SET_SPEAKER_VOLUME, streamValue, 0)); 112aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 113aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 114aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 115aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 116aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta }; 117aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 118aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta /** 119aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta * Handlers for incoming service calls 120aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta */ 1218d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static class BluetoothHeadsetClientBinder extends IBluetoothHeadsetClient.Stub 122aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta implements IProfileServiceBinder { 1238d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private HeadsetClientService mService; 124aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 1258d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public BluetoothHeadsetClientBinder(HeadsetClientService svc) { 126aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mService = svc; 127aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 128aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 129aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 130aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean cleanup() { 131aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mService = null; 132aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 133aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 134aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 1358d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private HeadsetClientService getService() { 136aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (!Utils.checkCaller()) { 1378d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.w(TAG, "HeadsetClient call not allowed for non-active user"); 138aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 139aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 140aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 141aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (mService != null && mService.isAvailable()) { 142aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mService; 143aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 144aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 145aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 146aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 147aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 148aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean connect(BluetoothDevice device) { 1498d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 150aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 151aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 152aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 153aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.connect(device); 154aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 155aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 156aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 157aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean disconnect(BluetoothDevice device) { 1588d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 159aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 160aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 161aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 162aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.disconnect(device); 163aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 164aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 165aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 166aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public List<BluetoothDevice> getConnectedDevices() { 1678d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 168aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 169aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return new ArrayList<BluetoothDevice>(0); 170aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 171aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getConnectedDevices(); 172aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 173aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 174aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 175aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { 1768d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 177aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 178aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return new ArrayList<BluetoothDevice>(0); 179aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 180aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getDevicesMatchingConnectionStates(states); 181aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 182aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 183aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 184aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getConnectionState(BluetoothDevice device) { 1858d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 186aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 187aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return BluetoothProfile.STATE_DISCONNECTED; 188aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 189aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getConnectionState(device); 190aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 191aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 192aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 193aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean setPriority(BluetoothDevice device, int priority) { 1948d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 195aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 196aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 197aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 198aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.setPriority(device, priority); 199aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 200aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 201aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 202aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getPriority(BluetoothDevice device) { 2038d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 204aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 205aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return BluetoothProfile.PRIORITY_UNDEFINED; 206aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 207aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getPriority(device); 208aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 209aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 210aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 211aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean startVoiceRecognition(BluetoothDevice device) { 2128d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 213aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 214aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 215aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 216aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.startVoiceRecognition(device); 217aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 218aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 219aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 220aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean stopVoiceRecognition(BluetoothDevice device) { 2218d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 222aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 223aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 224aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 225aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.stopVoiceRecognition(device); 226aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 227aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 228aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 229aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean acceptIncomingConnect(BluetoothDevice device) { 2308d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 231aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 232aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 233aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 234aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.acceptIncomingConnect(device); 235aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 236aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 237aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 238aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean rejectIncomingConnect(BluetoothDevice device) { 2398d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 240aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 241aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 242aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 243aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.rejectIncomingConnect(device); 244aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 245aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 246aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 247aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getAudioState(BluetoothDevice device) { 2488d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 249aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 2508d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood return BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED; 251aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 252aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getAudioState(device); 253aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 254aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 255aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 256aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean connectAudio() { 2578d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 258aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 259aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 260aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 261aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.connectAudio(); 262aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 263aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 264aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 265aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean disconnectAudio() { 2668d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 267aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 268aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 269aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 270aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.disconnectAudio(); 271aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 272aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 273aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 274aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean acceptCall(BluetoothDevice device, int flag) { 2758d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 276aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 277aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 278aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 279aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.acceptCall(device, flag); 280aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 281aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 282aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 283aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean rejectCall(BluetoothDevice device) { 2848d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 285aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 286aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 287aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 288aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.rejectCall(device); 289aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 290aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 291aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 292aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean holdCall(BluetoothDevice device) { 2938d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 294aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 295aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 296aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 297aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.holdCall(device); 298aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 299aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 300aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 301aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean terminateCall(BluetoothDevice device, int index) { 3028d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 303aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 304aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 305aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 306aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.terminateCall(device, index); 307aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 308aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 309aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 310aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean explicitCallTransfer(BluetoothDevice device) { 3118d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 312aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 313aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 314aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 315aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.explicitCallTransfer(device); 316aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 317aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 318aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 319aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean enterPrivateMode(BluetoothDevice device, int index) { 3208d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 321aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 322aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 323aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 324aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.enterPrivateMode(device, index); 325aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 326aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 327aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 328aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean redial(BluetoothDevice device) { 3298d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 330aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 331aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 332aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 333aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.redial(device); 334aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 335aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 336aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 337aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean dial(BluetoothDevice device, String number) { 3388d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 339aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 340aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 341aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 342aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.dial(device, number); 343aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 344aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 345aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 346aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean dialMemory(BluetoothDevice device, int location) { 3478d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 348aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 349aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 350aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 351aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.dialMemory(device, location); 352aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 353aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 354aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 3558d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) { 3568d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 357aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 358aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 359aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 360aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getCurrentCalls(device); 361aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 362aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 363aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 364aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean sendDTMF(BluetoothDevice device, byte code) { 3658d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 366aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 367aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 368aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 369aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.sendDTMF(device, code); 370aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 371aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 372aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 373aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean getLastVoiceTagNumber(BluetoothDevice device) { 3748d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 375aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 376aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 377aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 378aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getLastVoiceTagNumber(device); 379aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 380aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 381aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 382aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgEvents(BluetoothDevice device) { 3838d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 384aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 385aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 386aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 387aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getCurrentAgEvents(device); 388aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 389aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 390aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta @Override 391aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgFeatures(BluetoothDevice device) { 3928d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood HeadsetClientService service = getService(); 393aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (service == null) { 394aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 395aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 396aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return service.getCurrentAgFeatures(device); 397aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 398aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta }; 399aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 400aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // API methods 4018d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public static synchronized HeadsetClientService getHeadsetClientService() { 4028d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood if (sHeadsetClientService != null && sHeadsetClientService.isAvailable()) { 403aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4048d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "getHeadsetClientService(): returning " + sHeadsetClientService); 405aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 4068d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood return sHeadsetClientService; 407aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 408aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4098d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood if (sHeadsetClientService == null) { 4108d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "getHeadsetClientService(): service is NULL"); 4118d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood } else if (!(sHeadsetClientService.isAvailable())) { 4128d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "getHeadsetClientService(): service is not available"); 413aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 414aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 415aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 416aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 417aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4188d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static synchronized void setHeadsetClientService(HeadsetClientService instance) { 419aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (instance != null && instance.isAvailable()) { 420aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4218d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "setHeadsetClientService(): set to: " + sHeadsetClientService); 422aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 4238d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood sHeadsetClientService = instance; 424aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } else { 425aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 4268d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood if (sHeadsetClientService == null) { 4278d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "setHeadsetClientService(): service not available"); 4288d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood } else if (!sHeadsetClientService.isAvailable()) { 4298d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Log.d(TAG, "setHeadsetClientService(): service is cleaning up"); 430aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 431aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 432aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 433aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 434aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4358d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood private static synchronized void clearHeadsetClientService() { 4368d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood sHeadsetClientService = null; 437aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 438aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 439aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean connect(BluetoothDevice device) { 440aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 441aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH ADMIN permission"); 442aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 443aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (getPriority(device) == BluetoothProfile.PRIORITY_OFF) { 444aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 445aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 446aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 447aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 448aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState == BluetoothProfile.STATE_CONNECTED || 449aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState == BluetoothProfile.STATE_CONNECTING) { 450aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 451aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 452aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4538d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.CONNECT, device); 454aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 455aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 456aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 457aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean disconnect(BluetoothDevice device) { 458aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 459aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH ADMIN permission"); 460aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 461aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 462aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 463aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 464aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 465aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4668d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.DISCONNECT, device); 467aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 468aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 469aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 470aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public List<BluetoothDevice> getConnectedDevices() { 471aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 472aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getConnectedDevices(); 473aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 474aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 475aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta private List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { 476aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 477aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getDevicesMatchingConnectionStates(states); 478aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 479aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 480aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int getConnectionState(BluetoothDevice device) { 481aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 482aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getConnectionState(device); 483aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 484aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 4858d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood // TODO Should new setting for HeadsetClient priority be created? 486aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean setPriority(BluetoothDevice device, int priority) { 487aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 488aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH_ADMIN permission"); 489aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Settings.Global.putInt(getContentResolver(), 490aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Settings.Global.getBluetoothHeadsetPriorityKey(device.getAddress()), 491aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta priority); 492aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (DBG) { 493aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Log.d(TAG, "Saved priority " + device + " = " + priority); 494aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 495aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 496aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 497aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 498aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public int getPriority(BluetoothDevice device) { 499aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, 500aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta "Need BLUETOOTH_ADMIN permission"); 501aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int priority = Settings.Global.getInt(getContentResolver(), 502aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Settings.Global.getBluetoothHeadsetPriorityKey(device.getAddress()), 503aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta BluetoothProfile.PRIORITY_UNDEFINED); 504aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return priority; 505aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 506aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 507aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean startVoiceRecognition(BluetoothDevice device) { 508aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 509aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 510aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 511aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 512aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 513aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5148d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.VOICE_RECOGNITION_START); 515aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 516aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 517aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 518aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean stopVoiceRecognition(BluetoothDevice device) { 519aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 520aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // It seem that we really need to check the AudioOn state. 521aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // But since we allow startVoiceRecognition in STATE_CONNECTED and 522aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // STATE_CONNECTING state, we do these 2 in this method 523aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 524aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 525aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 526aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 527aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5288d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.VOICE_RECOGNITION_STOP); 529aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 530aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 531aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 532aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean acceptIncomingConnect(BluetoothDevice device) { 533aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // TODO(BT) remove it if stack does access control 534aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 535aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 536aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 537aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean rejectIncomingConnect(BluetoothDevice device) { 538aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta // TODO(BT) remove it if stack does access control 539aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 540aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 541aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 542aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int getAudioState(BluetoothDevice device) { 543aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getAudioState(device); 544aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 545aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 546aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean connectAudio() { 547aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); 548aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (!mStateMachine.isConnected()) { 549aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 550aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 551aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (mStateMachine.isAudioOn()) { 552aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 553aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5548d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.CONNECT_AUDIO); 555aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 556aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 557aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 558aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean disconnectAudio() { 559aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission"); 560aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (!mStateMachine.isAudioOn()) { 561aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 562aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5638d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood mStateMachine.sendMessage(HeadsetClientStateMachine.DISCONNECT_AUDIO); 564aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 565aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 566aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 567aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean holdCall(BluetoothDevice device) { 568aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 569aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 570aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 571aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 572aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 573aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5748d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.HOLD_CALL); 575aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 576aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 577aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 578aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 579aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean acceptCall(BluetoothDevice device, int flag) { 580aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 581aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 582aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 583aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 584aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 585aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 5868d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.ACCEPT_CALL); 587aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = flag; 588aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 589aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 590aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 591aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 592aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean rejectCall(BluetoothDevice device) { 593aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 594aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 595aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 596aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 597aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 598aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 599aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6008d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.REJECT_CALL); 601aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 602aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 603aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 604aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 605aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean terminateCall(BluetoothDevice device, int index) { 606aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 607aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 608aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 609aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 610aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 611aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 612aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6138d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.TERMINATE_CALL); 614aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = index; 615aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 616aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 617aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 618aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 619aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean enterPrivateMode(BluetoothDevice device, int index) { 620aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 621aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 622aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 623aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 624aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 625aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 626aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6278d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.ENTER_PRIVATE_MODE); 628aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = index; 629aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 630aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 631aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 632aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 633aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean redial(BluetoothDevice device) { 634aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 635aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 636aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 637aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 638aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 639aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 640aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6418d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.REDIAL); 642aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 643aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 644aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 645aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 646aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean dial(BluetoothDevice device, String number) { 647aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 648aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 649aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 650aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 651aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 652aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 653aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6548d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.DIAL_NUMBER); 655aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.obj = number; 656aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 657aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 658aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 659aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 660aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta boolean dialMemory(BluetoothDevice device, int location) { 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 } 6678d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.DIAL_MEMORY); 668aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = location; 669aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 670aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 671aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 672aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 673aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean sendDTMF(BluetoothDevice device, byte code) { 674aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 675aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 676aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 677aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 678aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 679aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 6808d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.SEND_DTMF); 681aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta msg.arg1 = code; 682aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 683aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 684aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 685aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 686aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean getLastVoiceTagNumber(BluetoothDevice device) { 687aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 688aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 689aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 690aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 691aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 692aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 6938d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood Message msg = mStateMachine.obtainMessage(HeadsetClientStateMachine.LAST_VTAG_NUMBER); 694aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 695aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 696aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 697aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 6988d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood public List<BluetoothHeadsetClientCall> getCurrentCalls(BluetoothDevice device) { 699aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 700aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 701aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED) { 702aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 703aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 704aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getCurrentCalls(); 705aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 706aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 707aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public boolean explicitCallTransfer(BluetoothDevice device) { 708aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 709aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 710aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED && 711aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta connectionState != BluetoothProfile.STATE_CONNECTING) { 712aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return false; 713aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 714aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta Message msg = mStateMachine 7158d536f3db19e8ea7426e98e470dc15d10ecbae87Mike Lockwood .obtainMessage(HeadsetClientStateMachine.EXPLICIT_CALL_TRANSFER); 716aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta mStateMachine.sendMessage(msg); 717aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return true; 718aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 719aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 720aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgEvents(BluetoothDevice device) { 721aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 722aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 723aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED) { 724aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 725aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 726aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getCurrentAgEvents(); 727aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 728aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta 729aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta public Bundle getCurrentAgFeatures(BluetoothDevice device) { 730aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 731aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta int connectionState = mStateMachine.getConnectionState(device); 732aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta if (connectionState != BluetoothProfile.STATE_CONNECTED) { 733aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return null; 734aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 735aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta return mStateMachine.getCurrentAgFeatures(); 736aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta } 737aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta} 738