Skip to content

Commit

Permalink
Merge pull request #1269 from dotintent/feat/1266
Browse files Browse the repository at this point in the history
feat: add subscriptionType param to monitor characteristic methods
  • Loading branch information
aliberski authored Jan 24, 2025
2 parents c34253a + 7b5e0f5 commit 4a31df2
Show file tree
Hide file tree
Showing 10 changed files with 128 additions and 35 deletions.
9 changes: 6 additions & 3 deletions android/src/main/java/com/bleplx/BlePlxModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -768,13 +768,14 @@ public void monitorCharacteristicForDevice(final String deviceId,
final String serviceUUID,
final String characteristicUUID,
final String transactionId,
final String subscriptionType,
final Promise promise) {
if (!this.isRequestPossibleHandler("monitorCharacteristicForDevice", promise)) {
return;
}
final SafePromise safePromise = new SafePromise(promise);
bleAdapter.monitorCharacteristicForDevice(
deviceId, serviceUUID, characteristicUUID, transactionId,
deviceId, serviceUUID, characteristicUUID, transactionId, subscriptionType,
new OnEventCallback<Characteristic>() {
@Override
public void onEvent(Characteristic data) {
Expand All @@ -797,13 +798,14 @@ public void onError(BleError error) {
public void monitorCharacteristicForService(final int serviceIdentifier,
final String characteristicUUID,
final String transactionId,
final String subscriptionType,
final Promise promise) {
if (!this.isRequestPossibleHandler("monitorCharacteristicForService", promise)) {
return;
}
final SafePromise safePromise = new SafePromise(promise);
bleAdapter.monitorCharacteristicForService(
serviceIdentifier, characteristicUUID, transactionId,
serviceIdentifier, characteristicUUID, transactionId, subscriptionType,
new OnEventCallback<Characteristic>() {
@Override
public void onEvent(Characteristic data) {
Expand All @@ -825,14 +827,15 @@ public void onError(BleError error) {
@ReactMethod
public void monitorCharacteristic(final int characteristicIdentifier,
final String transactionId,
final String subscriptionType,
final Promise promise) {
if (!this.isRequestPossibleHandler("monitorCharacteristic", promise)) {
return;
}
final SafePromise safePromise = new SafePromise(promise);
//TODO resolve safePromise with null when monitoring has been completed
bleAdapter.monitorCharacteristic(
characteristicIdentifier, transactionId,
characteristicIdentifier, transactionId, subscriptionType,
new OnEventCallback<Characteristic>() {
@Override
public void onEvent(Characteristic data) {
Expand Down
3 changes: 3 additions & 0 deletions android/src/main/java/com/bleplx/adapter/BleAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,19 +163,22 @@ void monitorCharacteristicForDevice(
String serviceUUID,
String characteristicUUID,
String transactionId,
String subscriptionType,
OnEventCallback<Characteristic> onEventCallback,
OnErrorCallback onErrorCallback);

void monitorCharacteristicForService(
int serviceIdentifier,
String characteristicUUID,
String transactionId,
String subscriptionType,
OnEventCallback<Characteristic> onEventCallback,
OnErrorCallback onErrorCallback);

void monitorCharacteristic(
int characteristicIdentifier,
String transactionId,
String subscriptionType,
OnEventCallback<Characteristic> onEventCallback,
OnErrorCallback onErrorCallback);

Expand Down
26 changes: 16 additions & 10 deletions android/src/main/java/com/bleplx/adapter/BleModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,7 @@ public void monitorCharacteristicForDevice(String deviceIdentifier,
String serviceUUID,
String characteristicUUID,
String transactionId,
String subscriptionType,
OnEventCallback<Characteristic> onEventCallback,
OnErrorCallback onErrorCallback) {
final Characteristic characteristic = getCharacteristicOrEmitError(
Expand All @@ -697,13 +698,14 @@ public void monitorCharacteristicForDevice(String deviceIdentifier,
return;
}

safeMonitorCharacteristicForDevice(characteristic, transactionId, onEventCallback, onErrorCallback);
safeMonitorCharacteristicForDevice(characteristic, transactionId, subscriptionType, onEventCallback, onErrorCallback);
}

@Override
public void monitorCharacteristicForService(int serviceIdentifier,
String characteristicUUID,
String transactionId,
String subscriptionType,
OnEventCallback<Characteristic> onEventCallback,
OnErrorCallback onErrorCallback) {
final Characteristic characteristic = getCharacteristicOrEmitError(
Expand All @@ -712,19 +714,19 @@ public void monitorCharacteristicForService(int serviceIdentifier,
return;
}

safeMonitorCharacteristicForDevice(characteristic, transactionId, onEventCallback, onErrorCallback);
safeMonitorCharacteristicForDevice(characteristic, transactionId, subscriptionType, onEventCallback, onErrorCallback);
}

@Override
public void monitorCharacteristic(int characteristicIdentifier, String transactionId,
public void monitorCharacteristic(int characteristicIdentifier, String transactionId, String subscriptionType,
OnEventCallback<Characteristic> onEventCallback,
OnErrorCallback onErrorCallback) {
final Characteristic characteristic = getCharacteristicOrEmitError(characteristicIdentifier, onErrorCallback);
if (characteristic == null) {
return;
}

safeMonitorCharacteristicForDevice(characteristic, transactionId, onEventCallback, onErrorCallback);
safeMonitorCharacteristicForDevice(characteristic, transactionId, subscriptionType, onEventCallback, onErrorCallback);
}

@Override
Expand Down Expand Up @@ -1439,6 +1441,7 @@ private void safeWriteCharacteristicForDevice(final Characteristic characteristi

private void safeMonitorCharacteristicForDevice(final Characteristic characteristic,
final String transactionId,
final String subscriptionType,
final OnEventCallback<Characteristic> onEventCallback,
final OnErrorCallback onErrorCallback) {
final RxBleConnection connection = getConnectionOrEmitError(characteristic.getDeviceId(), onErrorCallback);
Expand All @@ -1453,12 +1456,15 @@ private void safeMonitorCharacteristicForDevice(final Characteristic characteris
NotificationSetupMode setupMode = cccDescriptor != null
? NotificationSetupMode.QUICK_SETUP
: NotificationSetupMode.COMPAT;
if (characteristic.isNotifiable()) {
return connection.setupNotification(characteristic.gattCharacteristic, setupMode);
}

if (characteristic.isIndicatable()) {
return connection.setupIndication(characteristic.gattCharacteristic, setupMode);

if ("notification".equals(subscriptionType) && characteristic.isNotifiable()) {
return connection.setupNotification(characteristic.gattCharacteristic, setupMode);
} else if ("indication".equals(subscriptionType) && characteristic.isIndicatable()) {
return connection.setupIndication(characteristic.gattCharacteristic, setupMode);
} else if (characteristic.isNotifiable()) {
return connection.setupNotification(characteristic.gattCharacteristic, setupMode);
} else if (characteristic.isIndicatable()) {
return connection.setupIndication(characteristic.gattCharacteristic, setupMode);
}

return Observable.error(new CannotMonitorCharacteristicException(characteristic));
Expand Down
28 changes: 22 additions & 6 deletions src/BleManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import type {
Identifier,
UUID,
TransactionId,
CharacteristicSubscriptionType,
Base64,
ScanOptions,
ConnectionOptions,
Expand Down Expand Up @@ -958,11 +959,18 @@ export class BleManager {
serviceUUID: UUID,
characteristicUUID: UUID,
listener: (error: ?BleError, characteristic: ?Characteristic) => void,
transactionId: ?TransactionId
transactionId: ?TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Subscription {
const filledTransactionId = transactionId || this._nextUniqueID()
return this._handleMonitorCharacteristic(
BleModule.monitorCharacteristicForDevice(deviceIdentifier, serviceUUID, characteristicUUID, filledTransactionId),
BleModule.monitorCharacteristicForDevice(
deviceIdentifier,
serviceUUID,
characteristicUUID,
filledTransactionId,
subscriptionType
),
filledTransactionId,
listener
)
Expand All @@ -985,11 +993,17 @@ export class BleManager {
serviceIdentifier: Identifier,
characteristicUUID: UUID,
listener: (error: ?BleError, characteristic: ?Characteristic) => void,
transactionId: ?TransactionId
transactionId: ?TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Subscription {
const filledTransactionId = transactionId || this._nextUniqueID()
return this._handleMonitorCharacteristic(
BleModule.monitorCharacteristicForService(serviceIdentifier, characteristicUUID, filledTransactionId),
BleModule.monitorCharacteristicForService(
serviceIdentifier,
characteristicUUID,
filledTransactionId,
subscriptionType
),
filledTransactionId,
listener
)
Expand All @@ -1003,18 +1017,20 @@ export class BleManager {
* @param {function(error: ?BleError, characteristic: ?Characteristic)} listener - callback which emits
* {@link Characteristic} objects with modified value for each notification.
* @param {?TransactionId} transactionId optional `transactionId` which can be used in
* @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic
* {@link #blemanagercanceltransaction|cancelTransaction()} function.
* @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe.
* @private
*/
_monitorCharacteristic(
characteristicIdentifier: Identifier,
listener: (error: ?BleError, characteristic: ?Characteristic) => void,
transactionId: ?TransactionId
transactionId: ?TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Subscription {
const filledTransactionId = transactionId || this._nextUniqueID()
return this._handleMonitorCharacteristic(
BleModule.monitorCharacteristic(characteristicIdentifier, filledTransactionId),
BleModule.monitorCharacteristic(characteristicIdentifier, filledTransactionId, subscriptionType),
filledTransactionId,
listener
)
Expand Down
16 changes: 13 additions & 3 deletions src/BleModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type {
Identifier,
UUID,
TransactionId,
CharacteristicSubscriptionType,
Base64,
ScanOptions,
ConnectionOptions
Expand Down Expand Up @@ -607,14 +608,16 @@ export interface BleModuleInterface {
* @param {UUID} serviceUUID Service UUID
* @param {UUID} characteristicUUID Characteristic UUID
* @param {TransactionId} transactionId Transaction handle used to cancel operation
* @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic
* @returns {Promise<void>} Value which is returned when monitoring was cancelled or resulted in error
* @private
*/
monitorCharacteristicForDevice(
deviceIdentifier: DeviceId,
serviceUUID: UUID,
characteristicUUID: UUID,
transactionId: TransactionId
transactionId: TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Promise<void>;

/**
Expand All @@ -623,24 +626,31 @@ export interface BleModuleInterface {
* @param {Identifier} serviceIdentifier Service ID
* @param {UUID} characteristicUUID Characteristic UUID
* @param {TransactionId} transactionId Transaction handle used to cancel operation
* @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic
* @returns {Promise<void>} Value which is returned when monitoring was cancelled or resulted in error
* @private
*/
monitorCharacteristicForService(
serviceIdentifier: Identifier,
characteristicUUID: UUID,
transactionId: TransactionId
transactionId: TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Promise<void>;

/**
* Setup monitoring of characteristic value.
*
* @param {Identifier} characteristicIdentifier Characteristic ID
* @param {TransactionId} transactionId Transaction handle used to cancel operation
* @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic
* @returns {Promise<void>} Value which is returned when monitoring was cancelled or resulted in error
* @private
*/
monitorCharacteristic(characteristicIdentifier: Identifier, transactionId: TransactionId): Promise<void>;
monitorCharacteristic(
characteristicIdentifier: Identifier,
transactionId: TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Promise<void>;

// Descriptor operations

Expand Down
16 changes: 13 additions & 3 deletions src/Characteristic.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@ import type { BleManager } from './BleManager'
import type { BleError } from './BleError'
import { Descriptor } from './Descriptor'
import type { NativeCharacteristic } from './BleModule'
import type { DeviceId, Identifier, UUID, TransactionId, Base64, Subscription } from './TypeDefinition'
import type {
DeviceId,
Identifier,
UUID,
TransactionId,
CharacteristicSubscriptionType,
Base64,
Subscription
} from './TypeDefinition'

/**
* Characteristic object.
Expand Down Expand Up @@ -130,14 +138,16 @@ export class Characteristic implements NativeCharacteristic {
* @param {function(error: ?BleError, characteristic: ?Characteristic)} listener callback which emits
* this {@link Characteristic} with modified value for each notification.
* @param {?TransactionId} transactionId optional `transactionId` which can be used in
* @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic
* {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function.
* @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe.
*/
monitor(
listener: (error: ?BleError, characteristic: ?Characteristic) => void,
transactionId: ?TransactionId
transactionId: ?TransactionId,
subscriptionType: ?CharacteristicSubscriptionType
): Subscription {
return this._manager._monitorCharacteristic(this.id, listener, transactionId)
return this._manager._monitorCharacteristic(this.id, listener, transactionId, subscriptionType)
}

/**
Expand Down
17 changes: 14 additions & 3 deletions src/Device.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,15 @@ import type { Service } from './Service'
import type { Descriptor } from './Descriptor'
import { ConnectionPriority } from './TypeDefinition'
import type { NativeDevice } from './BleModule'
import type { DeviceId, Base64, UUID, Subscription, TransactionId, ConnectionOptions } from './TypeDefinition'
import type {
DeviceId,
Base64,
UUID,
Subscription,
TransactionId,
CharacteristicSubscriptionType,
ConnectionOptions
} from './TypeDefinition'

/**
* Device instance which can be retrieved only by calling
Expand Down Expand Up @@ -298,21 +306,24 @@ export class Device implements NativeDevice {
* @param {function(error: ?BleError, characteristic: ?Characteristic)} listener - callback which emits
* {@link Characteristic} objects with modified value for each notification.
* @param {?TransactionId} transactionId optional `transactionId` which can be used in
* @param {?CharacteristicSubscriptionType} subscriptionType [android only] subscription type of the characteristic
* {@link #blemanagercanceltransaction|bleManager.cancelTransaction()} function.
* @returns {Subscription} Subscription on which `remove()` function can be called to unsubscribe.
*/
monitorCharacteristicForService(
serviceUUID: UUID,
characteristicUUID: UUID,
listener: (error: ?BleError, characteristic: ?Characteristic) => void,
transactionId: ?TransactionId
transactionId: ?TransactionId,
subscriptionType?: CharacteristicSubscriptionType
): Subscription {
return this._manager.monitorCharacteristicForDevice(
this.id,
serviceUUID,
characteristicUUID,
listener,
transactionId
transactionId,
subscriptionType
)
}

Expand Down
Loading

0 comments on commit 4a31df2

Please sign in to comment.