expo-flic2 0.2.2 → 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.
@@ -4,14 +4,14 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.flic2'
7
- version = '0.2.2'
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.2.2"
14
+ versionName "0.3.0"
15
15
  minSdkVersion 24
16
16
  }
17
17
 
@@ -31,5 +31,5 @@ repositories {
31
31
  }
32
32
 
33
33
  dependencies {
34
- implementation 'com.github.50ButtonsEach:flic2lib-android:2.+'
34
+ implementation 'com.github.50ButtonsEach:flic2lib-android:2.0.1'
35
35
  }
@@ -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 = mutableMapOf<String, String>()
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.addListener(createButtonListener())
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.addListener(createButtonListener())
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 && mode != "click" && mode != "clickAndHold"
124
- val emitHold = isHold && mode != "click" && mode != "clickAndDoubleClick"
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,
@@ -2,7 +2,8 @@ export declare enum Flic2ConnectionState {
2
2
  Disconnected = "disconnected",
3
3
  Connecting = "connecting",
4
4
  Connected = "connected",
5
- Ready = "ready"
5
+ Ready = "ready",
6
+ Unpaired = "unpaired"
6
7
  }
7
8
  export declare enum Flic2TriggerMode {
8
9
  Click = "click",
@@ -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;CAChB;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"}
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"}
@@ -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,oBAKX;AALD,WAAY,oBAAoB;IAC9B,qDAA6B,CAAA;IAC7B,iDAAyB,CAAA;IACzB,+CAAuB,CAAA;IACvB,uCAAe,CAAA;AACjB,CAAC,EALW,oBAAoB,KAApB,oBAAoB,QAK/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}\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"]}
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
@@ -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
  }
@@ -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) { _, _ in }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-flic2",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "description": "Expo module for Flic2 Bluetooth buttons",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -3,6 +3,7 @@ export enum Flic2ConnectionState {
3
3
  Connecting = "connecting",
4
4
  Connected = "connected",
5
5
  Ready = "ready",
6
+ Unpaired = "unpaired",
6
7
  }
7
8
 
8
9
  export enum Flic2TriggerMode {
@@ -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 4 values", () => {
15
+ it("has exactly 5 values", () => {
15
16
  const values = Object.values(Flic2ConnectionState);
16
- expect(values).toHaveLength(4);
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 {
@@ -1,30 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm install:*)",
5
- "Bash(npm audit:*)",
6
- "Bash(npm info:*)",
7
- "Bash(rm:*)",
8
- "Bash(find:*)",
9
- "Read(//private/tmp/flic2v2inspect/**)",
10
- "Bash(cp ~/.gradle/caches/modules-2/files-2.1/com.github.50ButtonsEach/flic2lib-android/2.0.1/6cc8ba382a7c6d95c7b2656860b941bfae791988/flic2lib-android-2.0.1.aar /tmp/flic2v2.aar)",
11
- "Bash(unzip -o /tmp/flic2v2.aar -d /tmp/flic2v2aar)",
12
- "Bash(jar tf:*)",
13
- "Read(//private/tmp/**)",
14
- "Bash(jar xf:*)",
15
- "Bash(javap -p io/flic/flic2libandroid/Flic2ScanCallback.class)",
16
- "Bash(cd:*)",
17
- "WebFetch(domain:github.com)",
18
- "WebFetch(domain:javadoc.jitpack.io)",
19
- "Bash(npm run:*)",
20
- "Bash(npm test:*)",
21
- "Bash(npx expo-module-scripts:*)",
22
- "Bash(java -version)",
23
- "Bash(echo ANDROID_HOME=$ANDROID_HOME)",
24
- "Read(//Users/ziller321/code/expo-flic2/$ANDROID_HOME/**)",
25
- "Bash(git add:*)",
26
- "Bash(git commit:*)",
27
- "Bash(git push:*)"
28
- ]
29
- }
30
- }