-
Notifications
You must be signed in to change notification settings - Fork 198
Expand file tree
/
Copy pathFlutterBleLibPlugin.java
More file actions
148 lines (128 loc) · 6.79 KB
/
FlutterBleLibPlugin.java
File metadata and controls
148 lines (128 loc) · 6.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package com.polidea.flutter_ble_lib;
import android.content.Context;
import android.util.Log;
import com.polidea.flutter_ble_lib.constant.ArgumentKey;
import com.polidea.flutter_ble_lib.constant.ChannelName;
import com.polidea.flutter_ble_lib.constant.MethodName;
import com.polidea.flutter_ble_lib.delegate.BluetoothStateDelegate;
import com.polidea.flutter_ble_lib.delegate.CallDelegate;
import com.polidea.flutter_ble_lib.delegate.CharacteristicsDelegate;
import com.polidea.flutter_ble_lib.delegate.DescriptorsDelegate;
import com.polidea.flutter_ble_lib.delegate.DeviceConnectionDelegate;
import com.polidea.flutter_ble_lib.delegate.DevicesDelegate;
import com.polidea.flutter_ble_lib.delegate.DiscoveryDelegate;
import com.polidea.flutter_ble_lib.delegate.LogLevelDelegate;
import com.polidea.flutter_ble_lib.delegate.MtuDelegate;
import com.polidea.flutter_ble_lib.delegate.RssiDelegate;
import com.polidea.flutter_ble_lib.event.AdapterStateStreamHandler;
import com.polidea.flutter_ble_lib.event.CharacteristicsMonitorStreamHandler;
import com.polidea.flutter_ble_lib.event.ConnectionStateStreamHandler;
import com.polidea.flutter_ble_lib.event.RestoreStateStreamHandler;
import com.polidea.flutter_ble_lib.event.ScanningStreamHandler;
import com.polidea.multiplatformbleadapter.BleAdapter;
import com.polidea.multiplatformbleadapter.BleAdapterFactory;
import com.polidea.multiplatformbleadapter.OnEventCallback;
import java.util.LinkedList;
import java.util.List;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
public class FlutterBleLibPlugin implements MethodCallHandler {
static final String TAG = FlutterBleLibPlugin.class.getName();
private BleAdapter bleAdapter;
private Context context;
private AdapterStateStreamHandler adapterStateStreamHandler = new AdapterStateStreamHandler();
private RestoreStateStreamHandler restoreStateStreamHandler = new RestoreStateStreamHandler();
private ScanningStreamHandler scanningStreamHandler = new ScanningStreamHandler();
private ConnectionStateStreamHandler connectionStateStreamHandler = new ConnectionStateStreamHandler();
private CharacteristicsMonitorStreamHandler characteristicsMonitorStreamHandler = new CharacteristicsMonitorStreamHandler();
private List<CallDelegate> delegates = new LinkedList<>();
public static void registerWith(Registrar registrar) {
final MethodChannel channel = new MethodChannel(registrar.messenger(), ChannelName.FLUTTER_BLE_LIB);
final EventChannel bluetoothStateChannel = new EventChannel(registrar.messenger(), ChannelName.ADAPTER_STATE_CHANGES);
final EventChannel restoreStateChannel = new EventChannel(registrar.messenger(), ChannelName.STATE_RESTORE_EVENTS);
final EventChannel scanningChannel = new EventChannel(registrar.messenger(), ChannelName.SCANNING_EVENTS);
final EventChannel connectionStateChannel = new EventChannel(registrar.messenger(), ChannelName.CONNECTION_STATE_CHANGE_EVENTS);
final EventChannel characteristicMonitorChannel = new EventChannel(registrar.messenger(), ChannelName.MONITOR_CHARACTERISTIC);
final FlutterBleLibPlugin plugin = new FlutterBleLibPlugin(registrar.context());
channel.setMethodCallHandler(plugin);
scanningChannel.setStreamHandler(plugin.scanningStreamHandler);
bluetoothStateChannel.setStreamHandler(plugin.adapterStateStreamHandler);
restoreStateChannel.setStreamHandler(plugin.restoreStateStreamHandler);
connectionStateChannel.setStreamHandler(plugin.connectionStateStreamHandler);
characteristicMonitorChannel.setStreamHandler(plugin.characteristicsMonitorStreamHandler);
}
private FlutterBleLibPlugin(Context context) {
this.context = context;
}
private void setupAdapter(Context context) {
bleAdapter = BleAdapterFactory.getNewAdapter(context);
delegates.add(new DeviceConnectionDelegate(bleAdapter, connectionStateStreamHandler));
delegates.add(new LogLevelDelegate(bleAdapter));
delegates.add(new DiscoveryDelegate(bleAdapter));
delegates.add(new BluetoothStateDelegate(bleAdapter));
delegates.add(new RssiDelegate(bleAdapter));
delegates.add(new MtuDelegate(bleAdapter));
delegates.add(new CharacteristicsDelegate(bleAdapter, characteristicsMonitorStreamHandler));
delegates.add(new DevicesDelegate(bleAdapter));
delegates.add(new DescriptorsDelegate(bleAdapter));
scanningStreamHandler.attachAdapter(bleAdapter);
}
@Override
public void onMethodCall(MethodCall call, Result result) {
Log.d(TAG, "on native side observed method: " + call.method);
for (CallDelegate delegate : delegates) {
if (delegate.canHandle(call)) {
delegate.onMethodCall(call, result);
return;
}
}
switch (call.method) {
case MethodName.CREATE_CLIENT:
createClient(call, result);
break;
case MethodName.DESTROY_CLIENT:
destroyClient(result);
break;
case MethodName.STOP_DEVICE_SCAN:
scanningStreamHandler.stopDeviceScan(result);
break;
case MethodName.CANCEL_TRANSACTION:
cancelTransaction(call, result);
break;
default:
result.notImplemented();
}
}
private void createClient(MethodCall call, Result result) {
setupAdapter(context);
bleAdapter.createClient(call.<String>argument(ArgumentKey.RESTORE_STATE_IDENTIFIER),
new OnEventCallback<String>() {
@Override
public void onEvent(String adapterState) {
adapterStateStreamHandler.onNewAdapterState(adapterState);
}
}, new OnEventCallback<Integer>() {
@Override
public void onEvent(Integer restoreStateIdentifier) {
restoreStateStreamHandler.onRestoreEvent(restoreStateIdentifier);
}
});
result.success(null);
}
private void destroyClient(Result result) {
bleAdapter.destroyClient();
scanningStreamHandler.detachAdapter();
connectionStateStreamHandler.onComplete();
bleAdapter = null;
delegates.clear();
result.success(null);
}
private void cancelTransaction(MethodCall call, Result result) {
bleAdapter.cancelTransaction(call.<String>argument(ArgumentKey.TRANSACTION_ID));
result.success(null);
}
}