expo-flic2 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/flic2/ExpoFlic2Module.kt +45 -6
- package/build/ExpoFlic2.types.d.ts +2 -1
- package/build/ExpoFlic2.types.d.ts.map +1 -1
- package/build/ExpoFlic2.types.js +1 -0
- package/build/ExpoFlic2.types.js.map +1 -1
- package/build/index.d.ts +4 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -0
- package/build/index.js.map +1 -1
- package/ios/ExpoFlic2Module.swift +9 -1
- package/ios/Flic2ManagerBridge.swift +11 -0
- package/package.json +1 -1
- package/src/ExpoFlic2.types.ts +1 -0
- package/src/__tests__/exports.test.ts +4 -2
- package/src/index.ts +4 -0
package/android/build.gradle
CHANGED
|
@@ -4,14 +4,14 @@ plugins {
|
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
group = 'expo.modules.flic2'
|
|
7
|
-
version = '0.
|
|
7
|
+
version = '0.3.0'
|
|
8
8
|
|
|
9
9
|
android {
|
|
10
10
|
namespace "expo.modules.flic2"
|
|
11
11
|
|
|
12
12
|
defaultConfig {
|
|
13
13
|
versionCode 1
|
|
14
|
-
versionName "0.
|
|
14
|
+
versionName "0.3.0"
|
|
15
15
|
minSdkVersion 24
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -9,11 +9,13 @@ import io.flic.flic2libandroid.Flic2ButtonListener
|
|
|
9
9
|
import io.flic.flic2libandroid.Flic2Manager
|
|
10
10
|
import io.flic.flic2libandroid.Flic2ScanCallback
|
|
11
11
|
import io.flic.flic2libandroid.BatteryLevel
|
|
12
|
+
import java.util.concurrent.ConcurrentHashMap
|
|
12
13
|
|
|
13
14
|
class ExpoFlic2Module : Module() {
|
|
14
15
|
|
|
15
16
|
private var manager: Flic2Manager? = null
|
|
16
|
-
private val triggerModes =
|
|
17
|
+
private val triggerModes = ConcurrentHashMap<String, String>()
|
|
18
|
+
private val buttonListeners = mutableMapOf<String, Flic2ButtonListener>()
|
|
17
19
|
|
|
18
20
|
override fun definition() = ModuleDefinition {
|
|
19
21
|
Name("ExpoFlic2")
|
|
@@ -29,11 +31,19 @@ class ExpoFlic2Module : Module() {
|
|
|
29
31
|
"onFlic2ManagerState"
|
|
30
32
|
)
|
|
31
33
|
|
|
34
|
+
OnDestroy {
|
|
35
|
+
manager?.getButtons()?.forEach { button ->
|
|
36
|
+
buttonListeners[button.uuid]?.let { button.removeListener(it) }
|
|
37
|
+
}
|
|
38
|
+
buttonListeners.clear()
|
|
39
|
+
triggerModes.clear()
|
|
40
|
+
}
|
|
41
|
+
|
|
32
42
|
Function("initialize") {
|
|
33
43
|
val context = appContext.reactContext ?: return@Function null
|
|
34
44
|
manager = Flic2Manager.initAndGetInstance(context, Handler(Looper.getMainLooper()))
|
|
35
45
|
manager?.getButtons()?.forEach { button ->
|
|
36
|
-
button
|
|
46
|
+
attachListener(button)
|
|
37
47
|
}
|
|
38
48
|
null
|
|
39
49
|
}
|
|
@@ -59,7 +69,7 @@ class ExpoFlic2Module : Module() {
|
|
|
59
69
|
|
|
60
70
|
override fun onComplete(result: Int, subCode: Int, button: Flic2Button?) {
|
|
61
71
|
if (button != null) {
|
|
62
|
-
button
|
|
72
|
+
attachListener(button)
|
|
63
73
|
sendEvent("onFlic2Scan", mapOf(
|
|
64
74
|
"isScanning" to false,
|
|
65
75
|
"button" to button.toRecord(triggerModes[button.uuid] ?: "clickAndDoubleClickAndHold")
|
|
@@ -93,6 +103,8 @@ class ExpoFlic2Module : Module() {
|
|
|
93
103
|
Function("forgetButton") { uuid: String ->
|
|
94
104
|
val button = findButton(uuid)
|
|
95
105
|
if (button != null) {
|
|
106
|
+
buttonListeners.remove(uuid)?.let { button.removeListener(it) }
|
|
107
|
+
triggerModes.remove(uuid)
|
|
96
108
|
manager?.forgetButton(button)
|
|
97
109
|
}
|
|
98
110
|
}
|
|
@@ -106,8 +118,34 @@ class ExpoFlic2Module : Module() {
|
|
|
106
118
|
return manager?.getButtons()?.find { it.uuid == uuid }
|
|
107
119
|
}
|
|
108
120
|
|
|
121
|
+
private fun attachListener(button: Flic2Button) {
|
|
122
|
+
buttonListeners[button.uuid]?.let { button.removeListener(it) }
|
|
123
|
+
val listener = createButtonListener()
|
|
124
|
+
buttonListeners[button.uuid] = listener
|
|
125
|
+
button.addListener(listener)
|
|
126
|
+
}
|
|
127
|
+
|
|
109
128
|
private fun createButtonListener(): Flic2ButtonListener {
|
|
110
129
|
return object : Flic2ButtonListener() {
|
|
130
|
+
override fun onButtonClickOrHold(
|
|
131
|
+
button: Flic2Button,
|
|
132
|
+
wasQueued: Boolean,
|
|
133
|
+
lastQueued: Boolean,
|
|
134
|
+
timestamp: Long,
|
|
135
|
+
isClick: Boolean,
|
|
136
|
+
isHold: Boolean
|
|
137
|
+
) {
|
|
138
|
+
val mode = triggerModes[button.uuid] ?: "clickAndDoubleClickAndHold"
|
|
139
|
+
if (mode != "click" && mode != "clickAndHold") return
|
|
140
|
+
val ageSeconds = (System.currentTimeMillis() - timestamp) / 1000
|
|
141
|
+
if (isClick) {
|
|
142
|
+
sendEvent("onFlic2Click", mapOf("uuid" to button.uuid, "queued" to wasQueued, "age" to ageSeconds))
|
|
143
|
+
}
|
|
144
|
+
if (isHold && mode == "clickAndHold") {
|
|
145
|
+
sendEvent("onFlic2Hold", mapOf("uuid" to button.uuid, "queued" to wasQueued, "age" to ageSeconds))
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
111
149
|
override fun onButtonSingleOrDoubleClickOrHold(
|
|
112
150
|
button: Flic2Button,
|
|
113
151
|
wasQueued: Boolean,
|
|
@@ -117,11 +155,12 @@ class ExpoFlic2Module : Module() {
|
|
|
117
155
|
isDoubleClick: Boolean,
|
|
118
156
|
isHold: Boolean
|
|
119
157
|
) {
|
|
120
|
-
val ageSeconds = (System.currentTimeMillis() - timestamp) / 1000
|
|
121
158
|
val mode = triggerModes[button.uuid] ?: "clickAndDoubleClickAndHold"
|
|
159
|
+
if (mode == "click" || mode == "clickAndHold") return
|
|
160
|
+
val ageSeconds = (System.currentTimeMillis() - timestamp) / 1000
|
|
122
161
|
val emitClick = isSingleClick && mode != "clickAndDoubleClick"
|
|
123
|
-
val emitDoubleClick = isDoubleClick
|
|
124
|
-
val emitHold = isHold && mode != "
|
|
162
|
+
val emitDoubleClick = isDoubleClick
|
|
163
|
+
val emitHold = isHold && mode != "clickAndDoubleClick"
|
|
125
164
|
if (emitClick) {
|
|
126
165
|
sendEvent("onFlic2Click", mapOf(
|
|
127
166
|
"uuid" to button.uuid,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoFlic2.types.d.ts","sourceRoot":"","sources":["../src/ExpoFlic2.types.ts"],"names":[],"mappings":"AAAA,oBAAY,oBAAoB;IAC9B,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,KAAK,UAAU;
|
|
1
|
+
{"version":3,"file":"ExpoFlic2.types.d.ts","sourceRoot":"","sources":["../src/ExpoFlic2.types.ts"],"names":[],"mappings":"AAAA,oBAAY,oBAAoB;IAC9B,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,QAAQ,aAAa;CACtB;AAED,oBAAY,gBAAgB;IAC1B,KAAK,UAAU;IACf,YAAY,iBAAiB;IAC7B,mBAAmB,wBAAwB;IAC3C,0BAA0B,+BAA+B;CAC1D;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,oBAAoB,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,oBAAoB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,SAAS,CAAC;CAC9F,CAAC"}
|
package/build/ExpoFlic2.types.js
CHANGED
|
@@ -4,6 +4,7 @@ export var Flic2ConnectionState;
|
|
|
4
4
|
Flic2ConnectionState["Connecting"] = "connecting";
|
|
5
5
|
Flic2ConnectionState["Connected"] = "connected";
|
|
6
6
|
Flic2ConnectionState["Ready"] = "ready";
|
|
7
|
+
Flic2ConnectionState["Unpaired"] = "unpaired";
|
|
7
8
|
})(Flic2ConnectionState || (Flic2ConnectionState = {}));
|
|
8
9
|
export var Flic2TriggerMode;
|
|
9
10
|
(function (Flic2TriggerMode) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoFlic2.types.js","sourceRoot":"","sources":["../src/ExpoFlic2.types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"ExpoFlic2.types.js","sourceRoot":"","sources":["../src/ExpoFlic2.types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,oBAMX;AAND,WAAY,oBAAoB;IAC9B,qDAA6B,CAAA;IAC7B,iDAAyB,CAAA;IACzB,+CAAuB,CAAA;IACvB,uCAAe,CAAA;IACf,6CAAqB,CAAA;AACvB,CAAC,EANW,oBAAoB,KAApB,oBAAoB,QAM/B;AAED,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,mCAAe,CAAA;IACf,iDAA6B,CAAA;IAC7B,+DAA2C,CAAA;IAC3C,6EAAyD,CAAA;AAC3D,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B","sourcesContent":["export enum Flic2ConnectionState {\n Disconnected = \"disconnected\",\n Connecting = \"connecting\",\n Connected = \"connected\",\n Ready = \"ready\",\n Unpaired = \"unpaired\",\n}\n\nexport enum Flic2TriggerMode {\n Click = \"click\",\n ClickAndHold = \"clickAndHold\",\n ClickAndDoubleClick = \"clickAndDoubleClick\",\n ClickAndDoubleClickAndHold = \"clickAndDoubleClickAndHold\",\n}\n\nexport type Flic2Button = {\n uuid: string;\n bluetoothAddress: string;\n serialNumber: string;\n name: string;\n connectionState: Flic2ConnectionState;\n firmwareVersion: number;\n batteryLevel: number;\n pressCount: number;\n triggerMode: Flic2TriggerMode;\n isReady: boolean;\n};\n\nexport type Flic2ClickEvent = {\n uuid: string;\n queued: boolean;\n age: number;\n};\n\nexport type Flic2DoubleClickEvent = {\n uuid: string;\n queued: boolean;\n age: number;\n};\n\nexport type Flic2HoldEvent = {\n uuid: string;\n queued: boolean;\n age: number;\n};\n\nexport type Flic2UpOrDownEvent = {\n uuid: string;\n isDown: boolean;\n queued: boolean;\n age: number;\n};\n\nexport type Flic2ConnectionEvent = {\n uuid: string;\n state: Flic2ConnectionState;\n error?: string;\n};\n\nexport type Flic2ScanEvent = {\n isScanning: boolean;\n button?: Flic2Button;\n error?: string;\n /** iOS only: scanner status during scan (discovered, connected, verified, verificationFailed) */\n scanEvent?: string;\n};\n\nexport type Flic2BatteryEvent = {\n uuid: string;\n level: number;\n};\n\nexport type Flic2ManagerStateEvent = {\n state: \"poweredOn\" | \"poweredOff\" | \"resetting\" | \"unsupported\" | \"unauthorized\" | \"unknown\";\n};\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -16,5 +16,9 @@ export declare function addOnUpOrDownListener(listener: (event: Flic2UpOrDownEve
|
|
|
16
16
|
export declare function addOnConnectionListener(listener: (event: Flic2ConnectionEvent) => void): EventSubscription;
|
|
17
17
|
export declare function addOnScanListener(listener: (event: Flic2ScanEvent) => void): EventSubscription;
|
|
18
18
|
export declare function addOnBatteryListener(listener: (event: Flic2BatteryEvent) => void): EventSubscription;
|
|
19
|
+
/**
|
|
20
|
+
* iOS only. The Android Flic2 SDK does not provide a Bluetooth manager state
|
|
21
|
+
* callback, so this listener will never fire on Android.
|
|
22
|
+
*/
|
|
19
23
|
export declare function addOnManagerStateListener(listener: (event: Flic2ManagerStateEvent) => void): EventSubscription;
|
|
20
24
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAED,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAE1C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAEN;AAID,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GACzC,iBAAiB,CAEnB;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAC/C,iBAAiB,CAEnB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GACxC,iBAAiB,CAEnB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC5C,iBAAiB,CAEnB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAC9C,iBAAiB,CAEnB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GACxC,iBAAiB,CAEnB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAC3C,iBAAiB,CAEnB;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAChD,iBAAiB,CAEnB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAED,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAE1C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAEN;AAID,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GACzC,iBAAiB,CAEnB;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAC/C,iBAAiB,CAEnB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GACxC,iBAAiB,CAEnB;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC5C,iBAAiB,CAEnB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAC9C,iBAAiB,CAEnB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GACxC,iBAAiB,CAEnB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAC3C,iBAAiB,CAEnB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAChD,iBAAiB,CAEnB"}
|
package/build/index.js
CHANGED
|
@@ -46,6 +46,10 @@ export function addOnScanListener(listener) {
|
|
|
46
46
|
export function addOnBatteryListener(listener) {
|
|
47
47
|
return ExpoFlic2.addListener("onFlic2Battery", listener);
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* iOS only. The Android Flic2 SDK does not provide a Bluetooth manager state
|
|
51
|
+
* callback, so this listener will never fire on Android.
|
|
52
|
+
*/
|
|
49
53
|
export function addOnManagerStateListener(listener) {
|
|
50
54
|
return ExpoFlic2.addListener("onFlic2ManagerState", listener);
|
|
51
55
|
}
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAc1C,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAUjB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,UAAU;IACxB,SAAS,CAAC,UAAU,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,SAAS,CAAC,SAAS,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,SAAS,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAsB;IAEtB,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,wBAAwB;AAExB,MAAM,UAAU,kBAAkB,CAChC,QAA0C;IAE1C,OAAO,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAgD;IAEhD,OAAO,SAAS,CAAC,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAyC;IAEzC,OAAO,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAA6C;IAE7C,OAAO,SAAS,CAAC,WAAW,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAA+C;IAE/C,OAAO,SAAS,CAAC,WAAW,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAyC;IAEzC,OAAO,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAA4C;IAE5C,OAAO,SAAS,CAAC,WAAW,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAAiD;IAEjD,OAAO,SAAS,CAAC,WAAW,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC","sourcesContent":["import { EventSubscription } from \"expo-modules-core\";\nimport ExpoFlic2 from \"./ExpoFlic2Module\";\nimport {\n Flic2TriggerMode,\n type Flic2Button,\n type Flic2ClickEvent,\n type Flic2DoubleClickEvent,\n type Flic2HoldEvent,\n type Flic2UpOrDownEvent,\n type Flic2ConnectionEvent,\n type Flic2ScanEvent,\n type Flic2BatteryEvent,\n type Flic2ManagerStateEvent,\n} from \"./ExpoFlic2.types\";\n\nexport {\n Flic2ConnectionState,\n Flic2TriggerMode,\n type Flic2Button,\n type Flic2ClickEvent,\n type Flic2DoubleClickEvent,\n type Flic2HoldEvent,\n type Flic2UpOrDownEvent,\n type Flic2ConnectionEvent,\n type Flic2ScanEvent,\n type Flic2BatteryEvent,\n type Flic2ManagerStateEvent,\n} from \"./ExpoFlic2.types\";\n\nexport function initialize(): void {\n ExpoFlic2.initialize();\n}\n\nexport function startScan(): void {\n ExpoFlic2.startScan();\n}\n\nexport function stopScan(): void {\n ExpoFlic2.stopScan();\n}\n\nexport function getButtons(): Flic2Button[] {\n return ExpoFlic2.getButtons();\n}\n\nexport function connectButton(uuid: string): void {\n ExpoFlic2.connectButton(uuid);\n}\n\nexport function disconnectButton(uuid: string): void {\n ExpoFlic2.disconnectButton(uuid);\n}\n\nexport function forgetButton(uuid: string): void {\n ExpoFlic2.forgetButton(uuid);\n}\n\nexport function setButtonTriggerMode(\n uuid: string,\n mode: Flic2TriggerMode\n): void {\n ExpoFlic2.setButtonTriggerMode(uuid, mode);\n}\n\n// Typed event listeners\n\nexport function addOnClickListener(\n listener: (event: Flic2ClickEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Click\", listener);\n}\n\nexport function addOnDoubleClickListener(\n listener: (event: Flic2DoubleClickEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2DoubleClick\", listener);\n}\n\nexport function addOnHoldListener(\n listener: (event: Flic2HoldEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Hold\", listener);\n}\n\nexport function addOnUpOrDownListener(\n listener: (event: Flic2UpOrDownEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2UpOrDown\", listener);\n}\n\nexport function addOnConnectionListener(\n listener: (event: Flic2ConnectionEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Connection\", listener);\n}\n\nexport function addOnScanListener(\n listener: (event: Flic2ScanEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Scan\", listener);\n}\n\nexport function addOnBatteryListener(\n listener: (event: Flic2BatteryEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Battery\", listener);\n}\n\nexport function addOnManagerStateListener(\n listener: (event: Flic2ManagerStateEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2ManagerState\", listener);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAc1C,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAUjB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,UAAU;IACxB,SAAS,CAAC,UAAU,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,SAAS,CAAC,SAAS,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,SAAS,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,IAAsB;IAEtB,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,wBAAwB;AAExB,MAAM,UAAU,kBAAkB,CAChC,QAA0C;IAE1C,OAAO,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAgD;IAEhD,OAAO,SAAS,CAAC,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAyC;IAEzC,OAAO,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAA6C;IAE7C,OAAO,SAAS,CAAC,WAAW,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAA+C;IAE/C,OAAO,SAAS,CAAC,WAAW,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,QAAyC;IAEzC,OAAO,SAAS,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAA4C;IAE5C,OAAO,SAAS,CAAC,WAAW,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAiD;IAEjD,OAAO,SAAS,CAAC,WAAW,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAChE,CAAC","sourcesContent":["import { EventSubscription } from \"expo-modules-core\";\nimport ExpoFlic2 from \"./ExpoFlic2Module\";\nimport {\n Flic2TriggerMode,\n type Flic2Button,\n type Flic2ClickEvent,\n type Flic2DoubleClickEvent,\n type Flic2HoldEvent,\n type Flic2UpOrDownEvent,\n type Flic2ConnectionEvent,\n type Flic2ScanEvent,\n type Flic2BatteryEvent,\n type Flic2ManagerStateEvent,\n} from \"./ExpoFlic2.types\";\n\nexport {\n Flic2ConnectionState,\n Flic2TriggerMode,\n type Flic2Button,\n type Flic2ClickEvent,\n type Flic2DoubleClickEvent,\n type Flic2HoldEvent,\n type Flic2UpOrDownEvent,\n type Flic2ConnectionEvent,\n type Flic2ScanEvent,\n type Flic2BatteryEvent,\n type Flic2ManagerStateEvent,\n} from \"./ExpoFlic2.types\";\n\nexport function initialize(): void {\n ExpoFlic2.initialize();\n}\n\nexport function startScan(): void {\n ExpoFlic2.startScan();\n}\n\nexport function stopScan(): void {\n ExpoFlic2.stopScan();\n}\n\nexport function getButtons(): Flic2Button[] {\n return ExpoFlic2.getButtons();\n}\n\nexport function connectButton(uuid: string): void {\n ExpoFlic2.connectButton(uuid);\n}\n\nexport function disconnectButton(uuid: string): void {\n ExpoFlic2.disconnectButton(uuid);\n}\n\nexport function forgetButton(uuid: string): void {\n ExpoFlic2.forgetButton(uuid);\n}\n\nexport function setButtonTriggerMode(\n uuid: string,\n mode: Flic2TriggerMode\n): void {\n ExpoFlic2.setButtonTriggerMode(uuid, mode);\n}\n\n// Typed event listeners\n\nexport function addOnClickListener(\n listener: (event: Flic2ClickEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Click\", listener);\n}\n\nexport function addOnDoubleClickListener(\n listener: (event: Flic2DoubleClickEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2DoubleClick\", listener);\n}\n\nexport function addOnHoldListener(\n listener: (event: Flic2HoldEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Hold\", listener);\n}\n\nexport function addOnUpOrDownListener(\n listener: (event: Flic2UpOrDownEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2UpOrDown\", listener);\n}\n\nexport function addOnConnectionListener(\n listener: (event: Flic2ConnectionEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Connection\", listener);\n}\n\nexport function addOnScanListener(\n listener: (event: Flic2ScanEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Scan\", listener);\n}\n\nexport function addOnBatteryListener(\n listener: (event: Flic2BatteryEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2Battery\", listener);\n}\n\n/**\n * iOS only. The Android Flic2 SDK does not provide a Bluetooth manager state\n * callback, so this listener will never fire on Android.\n */\nexport function addOnManagerStateListener(\n listener: (event: Flic2ManagerStateEvent) => void\n): EventSubscription {\n return ExpoFlic2.addListener(\"onFlic2ManagerState\", listener);\n}\n"]}
|
|
@@ -80,7 +80,15 @@ public class ExpoFlic2Module: Module {
|
|
|
80
80
|
Function("forgetButton") { (uuid: String) in
|
|
81
81
|
guard let manager = FLICManager.shared(),
|
|
82
82
|
let button = findButton(uuid) else { return }
|
|
83
|
-
manager.forgetButton(button) { _,
|
|
83
|
+
manager.forgetButton(button) { [weak self] _, error in
|
|
84
|
+
if let error = error {
|
|
85
|
+
self?.sendEvent("onFlic2Connection", [
|
|
86
|
+
"uuid": uuid,
|
|
87
|
+
"state": "disconnected",
|
|
88
|
+
"error": error.localizedDescription
|
|
89
|
+
])
|
|
90
|
+
}
|
|
91
|
+
}
|
|
84
92
|
}
|
|
85
93
|
|
|
86
94
|
Function("setButtonTriggerMode") { (uuid: String, mode: String) in
|
|
@@ -64,6 +64,17 @@ class Flic2ManagerBridge: NSObject, FLICManagerDelegate, FLICButtonDelegate {
|
|
|
64
64
|
module?.sendEvent("onFlic2Connection", payload)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
func button(_ button: FLICButton, didUnpairWithError error: Error?) {
|
|
68
|
+
var payload: [String: Any] = [
|
|
69
|
+
"uuid": button.identifier.uuidString,
|
|
70
|
+
"state": "unpaired"
|
|
71
|
+
]
|
|
72
|
+
if let error = error {
|
|
73
|
+
payload["error"] = error.localizedDescription
|
|
74
|
+
}
|
|
75
|
+
module?.sendEvent("onFlic2Connection", payload)
|
|
76
|
+
}
|
|
77
|
+
|
|
67
78
|
// MARK: - FLICButtonDelegate (click events via legacy delegate methods)
|
|
68
79
|
|
|
69
80
|
func button(_ button: FLICButton, didReceiveButtonDown queued: Bool, age: Int) {
|
package/package.json
CHANGED
package/src/ExpoFlic2.types.ts
CHANGED
|
@@ -9,11 +9,12 @@ describe("Flic2ConnectionState enum", () => {
|
|
|
9
9
|
expect(Flic2ConnectionState.Connecting).toBe("connecting");
|
|
10
10
|
expect(Flic2ConnectionState.Connected).toBe("connected");
|
|
11
11
|
expect(Flic2ConnectionState.Ready).toBe("ready");
|
|
12
|
+
expect(Flic2ConnectionState.Unpaired).toBe("unpaired");
|
|
12
13
|
});
|
|
13
14
|
|
|
14
|
-
it("has exactly
|
|
15
|
+
it("has exactly 5 values", () => {
|
|
15
16
|
const values = Object.values(Flic2ConnectionState);
|
|
16
|
-
expect(values).toHaveLength(
|
|
17
|
+
expect(values).toHaveLength(5);
|
|
17
18
|
});
|
|
18
19
|
});
|
|
19
20
|
|
|
@@ -42,6 +43,7 @@ describe("public API exports", () => {
|
|
|
42
43
|
"connecting",
|
|
43
44
|
"connected",
|
|
44
45
|
"ready",
|
|
46
|
+
"unpaired", // iOS only: emitted when a button is factory-reset or loses pairing
|
|
45
47
|
];
|
|
46
48
|
const enumValues = Object.values(Flic2ConnectionState);
|
|
47
49
|
expect(enumValues).toEqual(nativeStrings);
|
package/src/index.ts
CHANGED
|
@@ -106,6 +106,10 @@ export function addOnBatteryListener(
|
|
|
106
106
|
return ExpoFlic2.addListener("onFlic2Battery", listener);
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
+
/**
|
|
110
|
+
* iOS only. The Android Flic2 SDK does not provide a Bluetooth manager state
|
|
111
|
+
* callback, so this listener will never fire on Android.
|
|
112
|
+
*/
|
|
109
113
|
export function addOnManagerStateListener(
|
|
110
114
|
listener: (event: Flic2ManagerStateEvent) => void
|
|
111
115
|
): EventSubscription {
|