Skip to content

Commit 29ad11f

Browse files
committed
create debug logger
1 parent 8f5ce7e commit 29ad11f

File tree

7 files changed

+122
-2
lines changed

7 files changed

+122
-2
lines changed

example/lib/src/ui/device_list.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ class _DeviceListState extends State<_DeviceList> {
125125
if (widget.scannerState.scanIsInProgress ||
126126
widget.scannerState.discoveredDevices.isNotEmpty)
127127
Padding(
128-
padding: const EdgeInsetsDirectional.only(start: 18.0),
128+
padding:
129+
const EdgeInsetsDirectional.only(start: 18.0),
129130
child: Text(
130131
'count: ${widget.scannerState.discoveredDevices.length}'),
131132
),

lib/flutter_reactive_ble.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export 'src/model/connection_priority.dart';
66
export 'src/model/connection_state_update.dart';
77
export 'src/model/discovered_device.dart';
88
export 'src/model/generic_failure.dart';
9+
export 'src/model/log_level.dart';
910
export 'src/model/qualified_characteristic.dart';
1011
export 'src/model/result.dart';
1112
export 'src/model/scan_mode.dart';

lib/src/debug_logger.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:flutter_reactive_ble/src/model/log_level.dart';
2+
3+
class DebugLogger {
4+
DebugLogger(void Function(Object object) printToConsole)
5+
: _printToConsole = printToConsole;
6+
7+
void enable() {
8+
_logLevel = LogLevel.verbose;
9+
}
10+
11+
void disable() {
12+
_logLevel = LogLevel.none;
13+
}
14+
15+
void log(Object message) {
16+
if (_logLevel == LogLevel.verbose) {
17+
_printToConsole('REACTIVE_BLE: $message');
18+
}
19+
}
20+
21+
final void Function(Object object) _printToConsole;
22+
LogLevel _logLevel = LogLevel.none;
23+
}

lib/src/model/log_level.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
enum LogLevel { none, verbose }

lib/src/reactive_ble.dart

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dart:async';
22
import 'dart:io';
33

44
import 'package:flutter_reactive_ble/src/connected_device_operation.dart';
5+
import 'package:flutter_reactive_ble/src/debug_logger.dart';
56
import 'package:flutter_reactive_ble/src/device_connector.dart';
67
import 'package:flutter_reactive_ble/src/device_scanner.dart';
78
import 'package:flutter_reactive_ble/src/discovered_devices_registry.dart';
@@ -10,6 +11,7 @@ import 'package:flutter_reactive_ble/src/model/characteristic_value.dart';
1011
import 'package:flutter_reactive_ble/src/model/connection_priority.dart';
1112
import 'package:flutter_reactive_ble/src/model/connection_state_update.dart';
1213
import 'package:flutter_reactive_ble/src/model/discovered_device.dart';
14+
import 'package:flutter_reactive_ble/src/model/log_level.dart';
1315
import 'package:flutter_reactive_ble/src/model/qualified_characteristic.dart';
1416
import 'package:flutter_reactive_ble/src/model/scan_mode.dart';
1517
import 'package:flutter_reactive_ble/src/model/uuid.dart';
@@ -31,12 +33,13 @@ class FlutterReactiveBle {
3133
@required DeviceScanner deviceScanner,
3234
@required DeviceConnector deviceConnector,
3335
@required ConnectedDeviceOperation connectedDeviceOperation,
36+
@required DebugLogger debugLogger,
3437
}) {
3538
_pluginController = pluginController;
3639
_deviceScanner = deviceScanner;
3740
_deviceConnector = deviceConnector;
3841
_connectedDeviceOperator = connectedDeviceOperation;
39-
42+
_debugLogger = debugLogger;
4043
_trackStatus();
4144
}
4245

@@ -93,6 +96,7 @@ class FlutterReactiveBle {
9396
DeviceConnector _deviceConnector;
9497
ConnectedDeviceOperation _connectedDeviceOperator;
9598
DeviceScanner _deviceScanner;
99+
DebugLogger _debugLogger;
96100

97101
/// Initializes this [FlutterReactiveBle] instance and its platform-specific
98102
/// counterparts.
@@ -116,6 +120,8 @@ class FlutterReactiveBle {
116120
scanRegistry: scanRegistry,
117121
);
118122

123+
_debugLogger ??= DebugLogger(print);
124+
119125
_deviceConnector ??= DeviceConnector(
120126
pluginController: _pluginController,
121127
discoveredDevicesRegistry: scanRegistry,
@@ -296,6 +302,9 @@ class FlutterReactiveBle {
296302
.clearGattCache(deviceId)
297303
.then((info) => info.dematerialize());
298304

305+
/// Subscribes to a updates from a the characteristic specified.
306+
///
307+
/// This stream terminates automatically when the device is disconnected.
299308
Stream<List<int>> subscribeToCharacteristic(
300309
QualifiedCharacteristic characteristic) {
301310
final terminateFuture = connectedDeviceStream
@@ -313,4 +322,19 @@ class FlutterReactiveBle {
313322
),
314323
);
315324
}
325+
326+
/// Sets the verbosity of debug output.
327+
///
328+
/// Use [LogLevel.verbose] for full debug output. Make sure to run this only for debugging purposes.
329+
/// Use [LogLevel.none] to disable logging. This is also the default.
330+
void setLogLevel(LogLevel logLevel) {
331+
switch (logLevel) {
332+
case LogLevel.none:
333+
_debugLogger.disable();
334+
break;
335+
case LogLevel.verbose:
336+
_debugLogger.enable();
337+
break;
338+
}
339+
}
316340
}

test/debug_logger_test.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import 'package:flutter_reactive_ble/src/debug_logger.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:mockito/mockito.dart';
4+
5+
void main() {
6+
group('$DebugLogger', () {
7+
DebugLogger sut;
8+
_PrinterMock printerMock;
9+
10+
setUp(() {
11+
printerMock = _PrinterMock();
12+
sut = DebugLogger(printerMock.print);
13+
});
14+
15+
group('Given debuglevel is enabled', () {
16+
setUp(() {
17+
sut.enable();
18+
});
19+
20+
test('It logs message', () {
21+
const message = "Log message";
22+
sut.log(message);
23+
verify(printerMock.print('REACTIVE_BLE: $message')).called(1);
24+
});
25+
});
26+
27+
group('Given debuglevel is disabled', () {
28+
test('It does not log message', () {
29+
const message = "Log message";
30+
sut.log(message);
31+
verifyNever(printerMock.print(any));
32+
});
33+
});
34+
});
35+
}
36+
37+
abstract class _Printer {
38+
void print(Object object);
39+
}
40+
41+
class _PrinterMock extends Mock implements _Printer {}

test/reactive_ble_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import 'dart:async';
22

33
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
44
import 'package:flutter_reactive_ble/src/connected_device_operation.dart';
5+
import 'package:flutter_reactive_ble/src/debug_logger.dart';
56
import 'package:flutter_reactive_ble/src/device_connector.dart';
67
import 'package:flutter_reactive_ble/src/device_scanner.dart';
78
import 'package:flutter_reactive_ble/src/model/clear_gatt_cache_error.dart';
9+
import 'package:flutter_reactive_ble/src/model/log_level.dart';
810
import 'package:flutter_reactive_ble/src/model/unit.dart';
911
import 'package:flutter_reactive_ble/src/plugin_controller.dart';
1012
import 'package:flutter_test/flutter_test.dart';
@@ -17,6 +19,7 @@ void main() {
1719
_DeviceConnectorMock _deviceConnector;
1820
_DeviceOperationMock _deviceOperation;
1921
StreamController<BleStatus> _bleStatusController;
22+
_DebugLoggerMock _debugLoggerMock;
2023

2124
FlutterReactiveBle _sut;
2225

@@ -26,6 +29,7 @@ void main() {
2629
_deviceConnector = _DeviceConnectorMock();
2730
_deviceOperation = _DeviceOperationMock();
2831
_bleStatusController = StreamController();
32+
_debugLoggerMock = _DebugLoggerMock();
2933

3034
when(_pluginController.initialize()).thenAnswer(
3135
(_) => Future.value(),
@@ -40,6 +44,7 @@ void main() {
4044
deviceScanner: _deviceScanner,
4145
deviceConnector: _deviceConnector,
4246
connectedDeviceOperation: _deviceOperation,
47+
debugLogger: _debugLoggerMock,
4348
);
4449
});
4550

@@ -544,6 +549,28 @@ void main() {
544549
);
545550
});
546551
});
552+
553+
group('Logging', () {
554+
group('When loglevel is set to verbose', () {
555+
setUp(() {
556+
_sut.setLogLevel(LogLevel.verbose);
557+
});
558+
559+
test('It enables debug logging', () {
560+
verify(_debugLoggerMock.enable()).called(1);
561+
});
562+
});
563+
564+
group('When loglevel is set to none', () {
565+
setUp(() {
566+
_sut.setLogLevel(LogLevel.none);
567+
});
568+
569+
test('It enables debug logging', () {
570+
verify(_debugLoggerMock.disable()).called(1);
571+
});
572+
});
573+
});
547574
});
548575
}
549576

@@ -560,3 +587,5 @@ class _DeviceScannerMock extends Mock implements DeviceScanner {}
560587
class _DeviceConnectorMock extends Mock implements DeviceConnector {}
561588

562589
class _DeviceOperationMock extends Mock implements ConnectedDeviceOperation {}
590+
591+
class _DebugLoggerMock extends Mock implements DebugLogger {}

0 commit comments

Comments
 (0)