1ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie/* 2ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Copyright (C) 2013 The Android Open Source Project 3ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 4ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Licensed under the Apache License, Version 2.0 (the "License"); 5ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * you may not use this file except in compliance with the License. 6ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * You may obtain a copy of the License at 7ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 8ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * http://www.apache.org/licenses/LICENSE-2.0 9ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 10ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Unless required by applicable law or agreed to in writing, software 11ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * distributed under the License is distributed on an "AS IS" BASIS, 12ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * See the License for the specific language governing permissions and 14ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * limitations under the License. 15ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 16ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 17ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xiepackage android.bluetooth; 18ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 192d49752ee050ab7f1cd848933f6c62a73707e2d9Tor Norbyeimport android.Manifest; 202d49752ee050ab7f1cd848933f6c62a73707e2d9Tor Norbyeimport android.annotation.RequiresPermission; 21ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport android.content.Context; 22ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport android.os.RemoteException; 23ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport android.util.Log; 24ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 25ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport java.util.ArrayList; 26ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xieimport java.util.List; 27ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 28ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie/** 29ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * High level manager used to obtain an instance of an {@link BluetoothAdapter} 30ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * and to conduct overall Bluetooth Management. 31ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p> 32ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Use {@link android.content.Context#getSystemService(java.lang.String)} 33ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * with {@link Context#BLUETOOTH_SERVICE} to create an {@link BluetoothManager}, 34ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * then call {@link #getAdapter} to obtain the {@link BluetoothAdapter}. 35ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p> 36ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Alternately, you can just call the static helper 37ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothAdapter#getDefaultAdapter()}. 38ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 39ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <div class="special reference"> 40ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <h3>Developer Guides</h3> 41ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>For more information about using BLUETOOTH, read the 42ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <a href="{@docRoot}guide/topics/connectivity/bluetooth.html">Bluetooth</a> developer guide.</p> 43ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * </div> 44ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 45ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @see Context#getSystemService 46ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @see BluetoothAdapter#getDefaultAdapter() 47ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 48ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xiepublic final class BluetoothManager { 49ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie private static final String TAG = "BluetoothManager"; 50ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie private static final boolean DBG = true; 51ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie private static final boolean VDBG = true; 52ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 53ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie private final BluetoothAdapter mAdapter; 54ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 55ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 56ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @hide 57ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 58ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public BluetoothManager(Context context) { 59ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie context = context.getApplicationContext(); 60ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (context == null) { 61ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie throw new IllegalArgumentException( 62ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie "context not associated with any application (using a mock context?)"); 63ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 64ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie // Legacy api - getDefaultAdapter does not take in the context 65ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie mAdapter = BluetoothAdapter.getDefaultAdapter(); 66ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 67ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 68ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 69ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Get the default BLUETOOTH Adapter for this device. 70ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 71ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return the default BLUETOOTH Adapter 72ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 73ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public BluetoothAdapter getAdapter() { 74ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return mAdapter; 75ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 76ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 77ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 78ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Get the current connection state of the profile to the remote device. 79ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 80ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>This is not specific to any application configuration but represents 81ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * the connection state of the local Bluetooth adapter for certain profile. 82ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * This can be used by applications like status bar which would just like 83ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * to know the state of Bluetooth. 84ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 85ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 86ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 87ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param device Remote bluetooth device. 88ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param profile GATT or GATT_SERVER 89ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return State of the profile connection. One of 90ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothProfile#STATE_CONNECTED}, {@link BluetoothProfile#STATE_CONNECTING}, 91ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothProfile#STATE_DISCONNECTED}, 92ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothProfile#STATE_DISCONNECTING} 93ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 942d49752ee050ab7f1cd848933f6c62a73707e2d9Tor Norbye @RequiresPermission(Manifest.permission.BLUETOOTH) 95ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public int getConnectionState(BluetoothDevice device, int profile) { 96ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (DBG) Log.d(TAG,"getConnectionState()"); 97ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 98ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie List<BluetoothDevice> connectedDevices = getConnectedDevices(profile); 99ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie for(BluetoothDevice connectedDevice : connectedDevices) { 100ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (device.equals(connectedDevice)) { 101ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return BluetoothProfile.STATE_CONNECTED; 102ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 103ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 104ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 105ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return BluetoothProfile.STATE_DISCONNECTED; 106ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 107ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 108ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 109ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Get connected devices for the specified profile. 110ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 111ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p> Return the set of devices which are in state {@link BluetoothProfile#STATE_CONNECTED} 112ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 113ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>This is not specific to any application configuration but represents 114ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * the connection state of Bluetooth for this profile. 115ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * This can be used by applications like status bar which would just like 116ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * to know the state of Bluetooth. 117ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 118ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 119ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 120ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param profile GATT or GATT_SERVER 121ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return List of devices. The list will be empty on error. 122ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 1232d49752ee050ab7f1cd848933f6c62a73707e2d9Tor Norbye @RequiresPermission(Manifest.permission.BLUETOOTH) 124ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public List<BluetoothDevice> getConnectedDevices(int profile) { 125ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (DBG) Log.d(TAG,"getConnectedDevices"); 126ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (profile != BluetoothProfile.GATT && profile != BluetoothProfile.GATT_SERVER) { 127ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie throw new IllegalArgumentException("Profile not supported: " + profile); 128ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 129ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 130ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie List<BluetoothDevice> connectedDevices = new ArrayList<BluetoothDevice>(); 131ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 132ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie try { 133ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie IBluetoothManager managerService = mAdapter.getBluetoothManager(); 134cdd94e3647e921acc23f166ebb4f95ca6575a5bdMatthew Xie IBluetoothGatt iGatt = managerService.getBluetoothGatt(); 135ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (iGatt == null) return connectedDevices; 136ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 137ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie connectedDevices = iGatt.getDevicesMatchingConnectionStates( 138ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie new int[] { BluetoothProfile.STATE_CONNECTED }); 139ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } catch (RemoteException e) { 140ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie Log.e(TAG,"",e); 141ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 142ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 143ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return connectedDevices; 144ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 145ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 146ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 147ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 148ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Get a list of devices that match any of the given connection 149ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * states. 150ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 151ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p> If none of the devices match any of the given states, 152ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * an empty list will be returned. 153ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 154ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>This is not specific to any application configuration but represents 155ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * the connection state of the local Bluetooth adapter for this profile. 156ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * This can be used by applications like status bar which would just like 157ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * to know the state of the local adapter. 158ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 159ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission. 160ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * 161ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param profile GATT or GATT_SERVER 162ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param states Array of states. States can be one of 163ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothProfile#STATE_CONNECTED}, {@link BluetoothProfile#STATE_CONNECTING}, 164ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothProfile#STATE_DISCONNECTED}, 165ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * {@link BluetoothProfile#STATE_DISCONNECTING}, 166ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return List of devices. The list will be empty on error. 167ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 1682d49752ee050ab7f1cd848933f6c62a73707e2d9Tor Norbye @RequiresPermission(Manifest.permission.BLUETOOTH) 169ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public List<BluetoothDevice> getDevicesMatchingConnectionStates(int profile, int[] states) { 170ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (DBG) Log.d(TAG,"getDevicesMatchingConnectionStates"); 171ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 172ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (profile != BluetoothProfile.GATT && profile != BluetoothProfile.GATT_SERVER) { 173ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie throw new IllegalArgumentException("Profile not supported: " + profile); 174ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 175ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 176ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie List<BluetoothDevice> devices = new ArrayList<BluetoothDevice>(); 177ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 178ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie try { 179ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie IBluetoothManager managerService = mAdapter.getBluetoothManager(); 180cdd94e3647e921acc23f166ebb4f95ca6575a5bdMatthew Xie IBluetoothGatt iGatt = managerService.getBluetoothGatt(); 181ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (iGatt == null) return devices; 182ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie devices = iGatt.getDevicesMatchingConnectionStates(states); 183ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } catch (RemoteException e) { 184ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie Log.e(TAG,"",e); 185ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 186ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 187ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return devices; 188ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 189ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 190ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie /** 191ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * Open a GATT Server 192ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * The callback is used to deliver results to Caller, such as connection status as well 193ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * as the results of any other GATT server operations. 194ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * The method returns a BluetoothGattServer instance. You can use BluetoothGattServer 195ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * to conduct GATT server operations. 196ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param context App context 197ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @param callback GATT server callback handler that will receive asynchronous callbacks. 198ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie * @return BluetoothGattServer instance 199ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie */ 200ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie public BluetoothGattServer openGattServer(Context context, 201ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie BluetoothGattServerCallback callback) { 202b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta 203b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta return (openGattServer (context, callback, BluetoothDevice.TRANSPORT_AUTO)); 204b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta } 205b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta 206b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta /** 207b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * Open a GATT Server 208b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * The callback is used to deliver results to Caller, such as connection status as well 209b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * as the results of any other GATT server operations. 210b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * The method returns a BluetoothGattServer instance. You can use BluetoothGattServer 211b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * to conduct GATT server operations. 212b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * @param context App context 213b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * @param callback GATT server callback handler that will receive asynchronous callbacks. 214b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * @param transport preferred transport for GATT connections to remote dual-mode devices 215b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * {@link BluetoothDevice#TRANSPORT_AUTO} or 216b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * {@link BluetoothDevice#TRANSPORT_BREDR} or {@link BluetoothDevice#TRANSPORT_LE} 217b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * @return BluetoothGattServer instance 218b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta * @hide 219b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta */ 220b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta public BluetoothGattServer openGattServer(Context context, 221b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta BluetoothGattServerCallback callback,int transport) { 222ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (context == null || callback == null) { 223ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie throw new IllegalArgumentException("null parameter: " + context + " " + callback); 224ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 225ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 226ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie // TODO(Bluetooth) check whether platform support BLE 227ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie // Do the check here or in GattServer? 228ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie 229ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie try { 230ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie IBluetoothManager managerService = mAdapter.getBluetoothManager(); 231cdd94e3647e921acc23f166ebb4f95ca6575a5bdMatthew Xie IBluetoothGatt iGatt = managerService.getBluetoothGatt(); 232ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie if (iGatt == null) { 233ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie Log.e(TAG, "Fail to get GATT Server connection"); 234ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return null; 235ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 236b88fa824ab6337684de9aa8437c4952df4f1a75eGanesh Ganapathi Batta BluetoothGattServer mGattServer = new BluetoothGattServer(context, iGatt,transport); 237ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie Boolean regStatus = mGattServer.registerCallback(callback); 238ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return regStatus? mGattServer : null; 239ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } catch (RemoteException e) { 240ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie Log.e(TAG,"",e); 241ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie return null; 242ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 243ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie } 244ddf7e4756c31d0ed90802f98abeaa79df6d16b2aMatthew Xie} 245