Example usage for android.bluetooth BluetoothDevice EXTRA_BOND_STATE

List of usage examples for android.bluetooth BluetoothDevice EXTRA_BOND_STATE

Introduction

In this page you can find the example usage for android.bluetooth BluetoothDevice EXTRA_BOND_STATE.

Prototype

String EXTRA_BOND_STATE

To view the source code for android.bluetooth BluetoothDevice EXTRA_BOND_STATE.

Click Source Link

Document

Used as an int extra field in #ACTION_BOND_STATE_CHANGED intents.

Usage

From source file:com.wolkabout.hexiwear.service.BluetoothService.java

@Receiver(actions = BluetoothDevice.ACTION_BOND_STATE_CHANGED)
void onBondStateChanged(Intent intent) {
    final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    final int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);
    final int previousBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1);

    Log.d(TAG, "Bond state changed for: " + device.getAddress() + " new state: " + bondState + " previous: "
            + previousBondState);//from www. j  a  v  a 2 s .  c  o  m

    if (bondState == BluetoothDevice.BOND_BONDED) {
        Log.i(TAG, "Bonded");
        createGATT(device);
    } else if (bondState == BluetoothDevice.BOND_NONE) {
        device.createBond();
    }
}

From source file:com.wolkabout.hexiwear.activity.MainActivity.java

@Receiver(actions = BluetoothDevice.ACTION_BOND_STATE_CHANGED)
void onBondStateChanged(Intent intent) {
    final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    final int previousBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1);
    final int newBondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);

    Log.d(TAG, device.getName() + "(" + device.getAddress() + ") changed state: " + previousBondState + " -> "
            + newBondState);// w w w .  ja va2 s . c  o m
    adapter.notifyDataSetChanged();

    if (newBondState == BluetoothDevice.BOND_BONDED) {
        onBonded(device);
    } else if (previousBondState == BluetoothDevice.BOND_BONDING && newBondState == BluetoothDevice.BOND_NONE) {
        device.createBond();
    }
}

From source file:is.hello.buruberi.bluetooth.stacks.android.NativeGattPeripheral.java

@NonNull
@Override/* w  w  w. j  a  v a 2  s.  co m*/
@RequiresPermission(allOf = { Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, })
public Observable<GattPeripheral> createBond() {
    return createObservable(new Observable.OnSubscribe<GattPeripheral>() {
        @Override
        public void call(final Subscriber<? super GattPeripheral> subscriber) {
            if (getBondStatus() == BOND_BONDED) {
                logger.info(GattPeripheral.LOG_TAG, "Device already bonded, skipping.");

                subscriber.onNext(NativeGattPeripheral.this);
                subscriber.onCompleted();
                return;
            }

            final Subscription subscription = createBondReceiver().subscribe(new Subscriber<Intent>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                    subscriber.onError(e);
                }

                @Override
                public void onNext(Intent intent) {
                    final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                            BluetoothDevice.ERROR);
                    final int previousState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE,
                            BluetoothDevice.ERROR);

                    logger.info(GattPeripheral.LOG_TAG,
                            "Bond status changed from " + BondException.getBondStateString(previousState)
                                    + " to " + BondException.getBondStateString(state));

                    if (state == BluetoothDevice.BOND_BONDED) {
                        logger.info(LOG_TAG, "Bonding succeeded.");

                        subscriber.onNext(NativeGattPeripheral.this);
                        subscriber.onCompleted();

                        unsubscribe();
                    } else if (state == BluetoothDevice.ERROR
                            || state == BOND_NONE && previousState == BOND_CHANGING) {
                        final int reason = intent.getIntExtra(BondException.EXTRA_REASON,
                                BondException.REASON_UNKNOWN_FAILURE);
                        logger.error(LOG_TAG,
                                "Bonding failed for reason " + BondException.getReasonString(reason), null);
                        subscriber.onError(new BondException(reason));

                        unsubscribe();
                    }
                }
            });

            if (!BluetoothDeviceCompat.createBond(bluetoothDevice)) {
                subscription.unsubscribe();
                subscriber.onError(new BondException(BondException.REASON_ANDROID_API_CHANGED));
            }
        }
    });
}

From source file:is.hello.buruberi.bluetooth.stacks.android.NativeGattPeripheral.java

@NonNull
@Override/*from   w  w  w . j  a v  a  2  s.c o m*/
@RequiresPermission(allOf = { Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, })
public Observable<GattPeripheral> removeBond(final @NonNull OperationTimeout timeout) {
    return createObservable(new Observable.OnSubscribe<GattPeripheral>() {
        @Override
        public void call(final Subscriber<? super GattPeripheral> subscriber) {
            if (getBondStatus() != BOND_BONDED) {
                logger.info(GattPeripheral.LOG_TAG, "Device not bonded, skipping.");

                subscriber.onNext(NativeGattPeripheral.this);
                subscriber.onCompleted();
                return;
            }

            final Subscription subscription = createBondReceiver().subscribe(new Subscriber<Intent>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                    subscriber.onError(e);
                }

                @Override
                public void onNext(Intent intent) {
                    timeout.reschedule();

                    final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                            BluetoothDevice.ERROR);
                    final int previousState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE,
                            BluetoothDevice.ERROR);

                    logger.info(GattPeripheral.LOG_TAG,
                            "Bond status changed from " + BondException.getBondStateString(previousState)
                                    + " to " + BondException.getBondStateString(state));

                    if (state == BluetoothDevice.BOND_NONE) {
                        logger.info(LOG_TAG, "Removing bond succeeded.");
                        timeout.unschedule();

                        subscriber.onNext(NativeGattPeripheral.this);
                        subscriber.onCompleted();

                        unsubscribe();
                    } else if (state == BluetoothDevice.ERROR) {
                        timeout.unschedule();

                        final int reason = intent.getIntExtra(BondException.EXTRA_REASON,
                                BondException.REASON_UNKNOWN_FAILURE);
                        logger.error(LOG_TAG,
                                "Removing bond failed for reason " + BondException.getReasonString(reason),
                                null);
                        subscriber.onError(new BondException(reason));

                        unsubscribe();
                    }
                }
            });

            timeout.setTimeoutAction(new Action0() {
                @Override
                public void call() {
                    subscription.unsubscribe();

                    // This can happen in Lollipop
                    if (getBondStatus() == BOND_NONE) {
                        subscriber.onNext(NativeGattPeripheral.this);
                        subscriber.onCompleted();
                    } else {
                        subscriber.onError(new OperationTimeoutException(Operation.REMOVE_BOND));
                    }
                }
            }, stack.getScheduler());

            if (!BluetoothDeviceCompat.removeBond(bluetoothDevice)) {
                subscription.unsubscribe();
                subscriber.onError(new BondException(BondException.REASON_ANDROID_API_CHANGED));
            } else {
                timeout.schedule();
            }
        }
    });
}

From source file:com.android.dragonkeyboardfirmwareupdater.KeyboardFirmwareUpdateService.java

/**
 * Handles intents ACTION_CONNECTION_STATE_CHANGED, ACTION_STATE_CHANGED,
 * ACTION_BOND_STATE_CHANGED, ACTION_KEYBOARD_UPDATE_CONFIRMED.
 * <p/>/*from   w w w.jav a2 s  .  co  m*/
 * [ACTION_STATE_CHANGED]
 * This action is used to keep track of ON/OFF state change on the system Bluetooth adapter.
 * The
 * purpose is to synchronize the local Bluetooth connectivity with system Bluetooth state.
 * <p/>
 * [ACTION_CONNECTION_STATE_CHANGED]
 * This action is used to keep track of the connection change on the target device. The purpose
 * is to synchronize the connection cycles of the local GATT connection and the system
 * Bluetooth
 * connection.
 * <p/>
 * [ACTION_BOND_STATE_CHANGED]
 * This action is used to keep track of the bond state change on the target device. The purpose
 * is to the connection cycles of the local GATT connection and the system Bluetooth
 * connection.
 * <p/>
 * [ACTION_KEYBOARD_UPDATE_CONFIRMED]
 * This action is used to receive the update confirmation from the user. The purpose is to
 * trigger DFU process.
 */
private void onHandleIntent(Context context, Intent intent) {
    final String action = intent.getAction();
    Log.d(TAG, "onHandleIntent: Received action: " + action);

    if (BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED.equals(action)) {

        if (!isBluetoothEnabled()) {
            Log.w(TAG, "onHandleIntent: Bluetooth connectivity not enabled");
            return;
        }

        // Match the connected device with the default keyboard name.
        Bundle extras = intent.getExtras();
        if (extras == null)
            return;
        final BluetoothDevice device = extras.getParcelable(BluetoothDevice.EXTRA_DEVICE);
        final int deviceConnectionState = extras.getInt(BluetoothAdapter.EXTRA_CONNECTION_STATE);

        Log.d(TAG, "onHandleIntent: " + device.getName() + " [" + device.getAddress() + "] change to state: "
                + deviceConnectionState);

        // Match the name of the target keyboard.
        if (!isTargetKeyboard(device))
            return;

        if (deviceConnectionState == BluetoothAdapter.STATE_CONNECTED) {
            // Prevent the second keyboard from using the service.
            if (isUpdateServiceInUse())
                return;

            obtainKeyboardInfo(device.getName(), device.getAddress());

            if (mDfuStatus != DFU_STATE_INFO_READY) {
                Log.w(TAG, "onHandleIntent: DFU preparation failed");
                changeDfuStatus(DFU_STATE_OBTAIN_INFO_ERROR);
                return;
            }

            showUpdateNotification();
        } else if (deviceConnectionState == BluetoothAdapter.STATE_DISCONNECTING) {
            handleGattDisconnection();
        }

    } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
        final int adapterState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
        if (adapterState == BluetoothAdapter.STATE_ON) {
            if (!isBluetoothEnabled())
                enableBluetoothConnectivity();
        } else if (adapterState == BluetoothAdapter.STATE_TURNING_OFF) {
            // Terminate update process and disable Bluetooth connectivity.
            disableBluetoothConnectivity();

            // Since BluetoothAdapter has been disabled, the callback of disconnection would not
            // be called. Therefore a separate clean-up of GATT connection is need.
            cleanUpGattConnection();
        }

    } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras == null)
            return;
        final BluetoothDevice device = extras.getParcelable(BluetoothDevice.EXTRA_DEVICE);
        final int deviceBondState = extras.getInt(BluetoothDevice.EXTRA_BOND_STATE);

        Log.d(TAG, "onHandleIntent: state change on device " + device.getName() + " [" + device.getAddress()
                + "], bond state: " + deviceBondState);

        if (!isTargetKeyboard(device))
            return;

        if (deviceBondState == BluetoothDevice.BOND_NONE) {
            handleGattDisconnection();
        }

    } else if (ACTION_KEYBOARD_UPDATE_CONFIRMED.equals(action)) {
        dismissUpdateNotification();

        if (mDfuStatus != DFU_STATE_INFO_READY || mDfuStatus == DFU_STATE_UPDATING) {
            Log.w(TAG, "onHandleIntent: DFP preparation not ready or DFU is in progress. ");
            changeDfuStatus(DFU_STATE_UPDATE_ABORTED);
            return;
        }

        String keyboardName = intent.getStringExtra(EXTRA_KEYBOARD_NAME);
        String keyboardAddress = intent.getStringExtra(EXTRA_KEYBOARD_ADDRESS);
        if (!mKeyboardName.equals(keyboardName) || !mKeyboardAddress.equals(keyboardAddress)) {
            Log.w(TAG, "onHandleIntent: No DFU service associated with " + keyboardName + " [" + keyboardAddress
                    + "]");
            return;
        }

        Log.d(TAG, "onHandleIntent: Start update process on " + keyboardName + " [" + keyboardAddress + "]");
        changeDfuStatus(DFU_STATE_SWITCHING_TO_DFU_MODE);

    } else if (ACTION_KEYBOARD_UPDATE_POSTPONED.equals(action)) {
        dismissUpdateNotification();
        // TODO(mcchou): Update the preference when the Settings keyboard entry is available.
    }
}