1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.googlecode.android_scripting.facade.bluetooth; 18 19 import android.bluetooth.BluetoothAdapter; 20 import android.bluetooth.BluetoothDevice; 21 import android.content.BroadcastReceiver; 22 import android.content.Context; 23 import android.content.Intent; 24 import android.content.IntentFilter; 25 26 import java.util.Set; 27 28 import com.googlecode.android_scripting.Log; 29 30 public class BluetoothDiscoveryHelper { 31 32 public static interface BluetoothDiscoveryListener { 33 public void addBondedDevice(String name, String address); 34 35 public void addDevice(String name, String address); 36 37 public void scanDone(); 38 } 39 40 private final Context mContext; 41 private final BluetoothDiscoveryListener mListener; 42 private final BroadcastReceiver mReceiver; 43 44 public BluetoothDiscoveryHelper(Context context, BluetoothDiscoveryListener listener) { 45 mContext = context; 46 mListener = listener; 47 mReceiver = new BluetoothReceiver(); 48 } 49 50 private class BluetoothReceiver extends BroadcastReceiver { 51 @Override 52 public void onReceive(Context context, Intent intent) { 53 final String action = intent.getAction(); 54 55 if (BluetoothDevice.ACTION_FOUND.equals(action)) { 56 // Get the BluetoothDevice object from the Intent. 57 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 58 Log.d("Found device " + device.getAliasName()); 59 // If it's already paired, skip it, because it's been listed already. 60 if (device.getBondState() != BluetoothDevice.BOND_BONDED) { 61 mListener.addDevice(device.getName(), device.getAddress()); 62 } 63 } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 64 mListener.scanDone(); 65 } 66 } 67 } 68 69 public void startDiscovery() { 70 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 71 72 if (bluetoothAdapter.isDiscovering()) { 73 bluetoothAdapter.cancelDiscovery(); 74 } 75 76 Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); 77 for (BluetoothDevice device : pairedDevices) { 78 mListener.addBondedDevice(device.getName(), device.getAddress()); 79 } 80 81 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 82 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 83 mContext.registerReceiver(mReceiver, filter); 84 85 if (!bluetoothAdapter.isEnabled()) { 86 bluetoothAdapter.enable(); 87 } 88 89 bluetoothAdapter.startDiscovery(); 90 } 91 92 public void cancel() { 93 mContext.unregisterReceiver(mReceiver); 94 mListener.scanDone(); 95 } 96 } 97