Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  * Copyright (C) 2016 Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * 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, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * 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