@Override public void log(final BluetoothDevice device, final int level, final String message) { final BleManager<BleManagerCallbacks> manager = mBleManagers.get(device); if (manager != null) manager.log(level, message); }
@Override public void log(final int level, @StringRes final int messageRes, final Object... params) { for (final BleManager<BleManagerCallbacks> manager : mBleManagers.values()) manager.log(level, messageRes, params); } }
@Override public void log(final int level, @NonNull final String message) { for (final BleManager<BleManagerCallbacks> manager : mBleManagers.values()) manager.log(level, message); }
@Override public void log(final BluetoothDevice device, final int level, @StringRes final int messageRes, final Object... params) { final BleManager<BleManagerCallbacks> manager = mBleManagers.get(device); if (manager != null) manager.log(level, messageRes, params); }
@Override public void log(final int priority, @StringRes final int messageRes, @Nullable final Object... params) { final String message = mContext.getString(messageRes, params); log(priority, message); }
@MainThread private boolean internalBeginReliableWrite() { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || !mConnected) return false; // Reliable Write can't be before the old one isn't executed or aborted. if (mReliableWriteInProgress) return true; log(Log.VERBOSE, "Beginning reliable write..."); log(Log.DEBUG, "gatt.beginReliableWrite()"); return mReliableWriteInProgress = gatt.beginReliableWrite(); }
@MainThread private boolean internalExecuteReliableWrite() { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || !mConnected) return false; if (!mReliableWriteInProgress) return false; log(Log.VERBOSE, "Executing reliable write..."); log(Log.DEBUG, "gatt.executeReliableWrite()"); return gatt.executeReliableWrite(); }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @MainThread private boolean internalRequestMtu(@IntRange(from = 23, to = 517) final int mtu) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || !mConnected) return false; log(Log.VERBOSE, "Requesting new MTU..."); log(Log.DEBUG, "gatt.requestMtu(" + mtu + ")"); return gatt.requestMtu(mtu); }
@MainThread private boolean internalWriteDescriptor(final BluetoothGattDescriptor descriptor) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || descriptor == null || !mConnected) return false; log(Log.VERBOSE, "Writing descriptor " + descriptor.getUuid()); log(Log.DEBUG, "gatt.writeDescriptor(" + descriptor.getUuid() + ")"); return internalWriteDescriptorWorkaround(descriptor); }
@MainThread private boolean internalReadDescriptor(final BluetoothGattDescriptor descriptor) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || descriptor == null || !mConnected) return false; log(Log.VERBOSE, "Reading descriptor " + descriptor.getUuid()); log(Log.DEBUG, "gatt.readDescriptor(" + descriptor.getUuid() + ")"); return gatt.readDescriptor(descriptor); }
@Override public void onReceive(final Context context, final Intent intent) { final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // Skip other devices. if (mBluetoothDevice == null || device == null || !device.getAddress().equals(mBluetoothDevice.getAddress())) return; // String values are used as the constants are not available for Android 4.3. final int variant = intent.getIntExtra("android.bluetooth.device.extra.PAIRING_VARIANT"/*BluetoothDevice.EXTRA_PAIRING_VARIANT*/, 0); log(Log.DEBUG, "[Broadcast] Action received: android.bluetooth.device.action.PAIRING_REQUEST"/*BluetoothDevice.ACTION_PAIRING_REQUEST*/ + ", pairing variant: " + pairingVariantToString(variant) + " (" + variant + ")"); onPairingRequestReceived(device, variant); } };
@MainThread private boolean internalReadCharacteristic(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null || !mConnected) return false; // Check characteristic property. final int properties = characteristic.getProperties(); if ((properties & BluetoothGattCharacteristic.PROPERTY_READ) == 0) return false; log(Log.VERBOSE, "Reading characteristic " + characteristic.getUuid()); log(Log.DEBUG, "gatt.readCharacteristic(" + characteristic.getUuid() + ")"); return gatt.readCharacteristic(characteristic); }
@MainThread private boolean internalEnableNotifications(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null || !mConnected) return false; final BluetoothGattDescriptor descriptor = getCccd(characteristic, BluetoothGattCharacteristic.PROPERTY_NOTIFY); if (descriptor != null) { log(Log.DEBUG, "gatt.setCharacteristicNotification(" + characteristic.getUuid() + ", true)"); gatt.setCharacteristicNotification(characteristic, true); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); log(Log.VERBOSE, "Enabling notifications for " + characteristic.getUuid()); log(Log.DEBUG, "gatt.writeDescriptor(" + CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID + ", value=0x01-00)"); return internalWriteDescriptorWorkaround(descriptor); } return false; }
@MainThread private boolean internalEnableIndications(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null || !mConnected) return false; final BluetoothGattDescriptor descriptor = getCccd(characteristic, BluetoothGattCharacteristic.PROPERTY_INDICATE); if (descriptor != null) { log(Log.DEBUG, "gatt.setCharacteristicNotification(" + characteristic.getUuid() + ", true)"); gatt.setCharacteristicNotification(characteristic, true); descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE); log(Log.VERBOSE, "Enabling indications for " + characteristic.getUuid()); log(Log.DEBUG, "gatt.writeDescriptor(" + CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID + ", value=0x02-00)"); return internalWriteDescriptorWorkaround(descriptor); } return false; }
@MainThread private boolean internalDisableNotifications(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null || !mConnected) return false; final BluetoothGattDescriptor descriptor = getCccd(characteristic, BluetoothGattCharacteristic.PROPERTY_NOTIFY); if (descriptor != null) { log(Log.DEBUG, "gatt.setCharacteristicNotification(" + characteristic.getUuid() + ", false)"); gatt.setCharacteristicNotification(characteristic, false); descriptor.setValue(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE); log(Log.VERBOSE, "Disabling notifications and indications for " + characteristic.getUuid()); log(Log.DEBUG, "gatt.writeDescriptor(" + CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID + ", value=0x00-00)"); return internalWriteDescriptorWorkaround(descriptor); } return false; }
/** * This method disables notifications on the Battery Level characteristic. * * @deprecated Use {@link #disableNotifications(BluetoothGattCharacteristic)} instead. */ @Deprecated protected void disableBatteryLevelNotifications() { Request.newDisableBatteryLevelNotificationsRequest().setManager(this) .done(device -> log(Log.INFO, "Battery Level notifications disabled")) .enqueue(); }
@RequiresApi(api = Build.VERSION_CODES.O) @MainThread private boolean internalSetPreferredPhy(@PhyMask final int txPhy, @PhyMask final int rxPhy, @PhyOption final int phyOptions) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || !mConnected) return false; log(Log.VERBOSE, "Requesting preferred PHYs..."); log(Log.DEBUG, "gatt.setPreferredPhy(" + phyMaskToString(txPhy) + ", " + phyMaskToString(rxPhy) + ", coding option = " + phyCodedOptionToString(phyOptions) + ")"); gatt.setPreferredPhy(txPhy, rxPhy, phyOptions); return true; }
@MainThread private boolean internalWriteCharacteristic(final BluetoothGattCharacteristic characteristic) { final BluetoothGatt gatt = mBluetoothGatt; if (gatt == null || characteristic == null || !mConnected) return false; // Check characteristic property. final int properties = characteristic.getProperties(); if ((properties & (BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE)) == 0) return false; log(Log.VERBOSE, "Writing characteristic " + characteristic.getUuid() + " (" + writeTypeToString(characteristic.getWriteType()) + ")"); log(Log.DEBUG, "gatt.writeCharacteristic(" + characteristic.getUuid() + ")"); return gatt.writeCharacteristic(characteristic); }