Home | History | Annotate | Download | only in bluetooth
      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 com.googlecode.android_scripting.Log;
     27 
     28 import java.util.Set;
     29 
     30 /**
     31  * This class is used to put the device in discovery mode.
     32  */
     33 public class BluetoothDiscoveryHelper {
     34 
     35     /**
     36      * BLuetooth discovery listener Interface.
     37      */
     38     public interface BluetoothDiscoveryListener {
     39 
     40         /**
     41          * Add Bonded device.
     42          */
     43         void addBondedDevice(String name, String address);
     44 
     45         /**
     46          * Add Devices.
     47          */
     48         void addDevice(String name, String address);
     49 
     50         /**
     51          * Complete scanning.
     52          */
     53         void scanDone();
     54     }
     55 
     56     private final Context mContext;
     57     private final BluetoothDiscoveryListener mListener;
     58     private final BroadcastReceiver mReceiver;
     59 
     60     public BluetoothDiscoveryHelper(
     61             Context context, BluetoothDiscoveryListener listener) {
     62     mContext = context;
     63     mListener = listener;
     64     mReceiver = new BluetoothReceiver();
     65     }
     66 
     67     private class BluetoothReceiver extends BroadcastReceiver {
     68     @Override
     69         public void onReceive(Context context, Intent intent) {
     70             final String action = intent.getAction();
     71 
     72             if (BluetoothDevice.ACTION_FOUND.equals(action)) {
     73                 // Get the BluetoothDevice object from the Intent.
     74                 BluetoothDevice device = intent.getParcelableExtra(
     75                         BluetoothDevice.EXTRA_DEVICE);
     76                 Log.d("Found device " + device.getAliasName());
     77                 // If it's already paired, skip it, because it's been listed already.
     78                 if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
     79                     mListener.addDevice(device.getName(), device.getAddress());
     80                 }
     81             } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
     82                 mListener.scanDone();
     83             }
     84         }
     85     }
     86     /**
     87      * Start Bluetooth Discovery.
     88      */
     89 
     90     public void startDiscovery() {
     91         BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
     92 
     93         if (bluetoothAdapter.isDiscovering()) {
     94             bluetoothAdapter.cancelDiscovery();
     95         }
     96 
     97         Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
     98         for (BluetoothDevice device : pairedDevices) {
     99             mListener.addBondedDevice(device.getName(), device.getAddress());
    100         }
    101 
    102         IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    103         filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    104         mContext.registerReceiver(mReceiver, filter);
    105 
    106         if (!bluetoothAdapter.isEnabled()) {
    107             bluetoothAdapter.enable();
    108         }
    109 
    110         bluetoothAdapter.startDiscovery();
    111     }
    112 
    113     /**
    114      * Cancel.
    115      */
    116     public void cancel() {
    117         mContext.unregisterReceiver(mReceiver);
    118         mListener.scanDone();
    119     }
    120 }
    121