methodCallHandler method

Future methodCallHandler(
  1. MethodCall methodCall
)

Implementation

Future<dynamic> methodCallHandler(MethodCall methodCall) async {
  switch (methodCall.method) {
    case 'stateUpdate':
      _stateStreamController.add(BBState.values.firstWhere((v) => (v.name == methodCall.arguments['value']), orElse: () => BBState.unknown));
      return;

    case 'authorizationStatusUpdate':
      _authorizationStatusStreamController.add(
        BBAuthorization.values.firstWhere((v) => (v.name == methodCall.arguments['value']), orElse: () => BBAuthorization.unknown),
      );
      return;

    case 'scanEnabledUpdate':
      _scanEnabledStreamController.add(methodCall.arguments['value']);
      return;

    case 'scanResultUpdate':
      final data = methodCall.arguments['value'];
      if (data == null) {
        return;
      }

      final device = devices[data['id']];
      if (device == null) {
        return;
      }

      final scanResult = BBScanResult(
        device: device,
        name: data['name'],
        rssi: data['rssi'],
        connectable: data['connectable'],
        advertisedServices: List<String>.from(data['advertisedServices']),
        manufacturerId: data['manufacturerId'],
        manufacturerName: data['manufacturerName'],
        manufacturerData: data['manufacturerData'],
      );
      _scanResultsStreamController.add(scanResult);
      return;

    case 'devicesUpdate':
      final devices = _devicesStreamController.value;
      methodCall.arguments['value'].forEach((data) {
        devices[data['id']] = BBDevice(id: data['id'], name: data['name']);
      });
      _devicesStreamController.add(devices);
      return;

    case 'deviceConnectionStatusUpdate':
      final deviceId = methodCall.arguments['deviceId'];
      final value = BBDeviceConnectionStatus.values.firstWhere(
        (v) => (v.name == methodCall.arguments['value']),
        orElse: () => BBDeviceConnectionStatus.disconnected,
      );
      _deviceConnectionStatusController(deviceId).add(value);
      return;

    case 'deviceServicesUpdate':
      final deviceId = methodCall.arguments['deviceId'];

      final value = List<BBService>.from(
        methodCall.arguments['value'].map(
          (serviceData) => BBService(
            id: serviceData['id'],
            name: serviceData['name'],
            characteristics: List<BBCharacteristic>.from(
              serviceData['characteristics'].map(
                (characteristicData) => BBCharacteristic(
                  deviceId: deviceId,
                  serviceId: serviceData['id'],
                  id: characteristicData['id'],
                  name: characteristicData['name'],
                  properties: {
                    for (final property in characteristicData['properties']) ...BBCharacteristicProperty.values.where((v) => (v.name == property)),
                  },
                ),
              ),
            ),
          ),
        ),
      );

      // Prune all controllers that belong to removed characteristics
      _pruneRemovedCharacteristicControllers(_deviceCharacteristicNotifyEnabledControllers, deviceId, value);
      _pruneRemovedCharacteristicControllers(_deviceCharacteristicDataControllers, deviceId, value);

      _deviceServicesController(deviceId).add(value);

      return;

    case 'deviceMTUUpdate':
      final deviceId = methodCall.arguments['deviceId'];
      final value = methodCall.arguments['value'];
      _deviceMtuController(deviceId).add(value);
      return;

    case 'deviceCharacteristicIsNotifyingUpdate':
      final deviceId = methodCall.arguments['deviceId'];
      final serviceId = methodCall.arguments['serviceId'];
      final characteristicId = methodCall.arguments['characteristicId'];
      final value = methodCall.arguments['value'];
      _deviceCharacteristicNotifyEnabledController(deviceId, serviceId, characteristicId).add(value);
      return;

    case 'deviceCharacteristicDataUpdate':
      final deviceId = methodCall.arguments['deviceId'];
      final serviceId = methodCall.arguments['serviceId'];
      final characteristicId = methodCall.arguments['characteristicId'];
      final value = methodCall.arguments['value'];
      _deviceCharacteristicDataControllerGetOrCreate(deviceId, serviceId, characteristicId).add(value);
      return;

    default:
      if (kDebugMode) {
        print('Unprocessed event ${methodCall.method} with payload ${methodCall.arguments}');
      }
  }
}