react-native-flic2 0.3.26 → 2.0.0-alpha.39

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.
Files changed (243) hide show
  1. package/Flic2.podspec +22 -0
  2. package/{LICENSE.md → LICENSE} +1 -1
  3. package/README.md +17 -523
  4. package/android/build.gradle +64 -132
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +17 -29
  7. package/android/src/main/java/com/flic2/Flic2ButtonListener.kt +132 -0
  8. package/android/src/main/java/com/flic2/Flic2Converter.kt +103 -0
  9. package/android/src/main/java/com/flic2/Flic2Module.kt +480 -0
  10. package/android/src/main/java/com/flic2/Flic2Package.kt +33 -0
  11. package/android/src/main/java/com/flic2/Flic2Service.kt +112 -0
  12. package/ios/Flic2.h +9 -4
  13. package/ios/Flic2.mm +610 -0
  14. package/ios/flic2lib.framework/Headers/FLICButton.h +1 -1
  15. package/ios/flic2lib.framework/Headers/FLICManager.h +1 -1
  16. package/ios/flic2lib.framework/Info.plist +0 -0
  17. package/ios/flic2lib.framework/Modules/module.modulemap +1 -1
  18. package/ios/flic2lib.framework/flic2lib +0 -0
  19. package/lib/module/NativeFlic2.js +14 -0
  20. package/lib/module/NativeFlic2.js.map +1 -0
  21. package/lib/module/index.js +91 -0
  22. package/lib/module/index.js.map +1 -0
  23. package/lib/module/package.json +1 -0
  24. package/lib/typescript/package.json +1 -0
  25. package/lib/typescript/src/NativeFlic2.d.ts +119 -0
  26. package/lib/typescript/src/NativeFlic2.d.ts.map +1 -0
  27. package/lib/typescript/src/index.d.ts +81 -0
  28. package/lib/typescript/src/index.d.ts.map +1 -0
  29. package/package.json +132 -19
  30. package/src/NativeFlic2.ts +157 -0
  31. package/src/index.tsx +159 -0
  32. package/.editorconfig +0 -7
  33. package/.gitattributes +0 -1
  34. package/.idea/codeStyles/Project.xml +0 -116
  35. package/.idea/modules.xml +0 -8
  36. package/.idea/react-native-flic2.iml +0 -9
  37. package/.idea/vcs.xml +0 -6
  38. package/.idea/workspace.xml +0 -140
  39. package/android/.classpath +0 -6
  40. package/android/.gradle/5.4.1/executionHistory/executionHistory.bin +0 -0
  41. package/android/.gradle/5.4.1/executionHistory/executionHistory.lock +0 -0
  42. package/android/.gradle/5.4.1/fileChanges/last-build.bin +0 -0
  43. package/android/.gradle/5.4.1/fileContent/fileContent.lock +0 -0
  44. package/android/.gradle/5.4.1/fileHashes/fileHashes.bin +0 -0
  45. package/android/.gradle/5.4.1/fileHashes/fileHashes.lock +0 -0
  46. package/android/.gradle/5.4.1/fileHashes/resourceHashesCache.bin +0 -0
  47. package/android/.gradle/5.4.1/gc.properties +0 -0
  48. package/android/.gradle/5.4.1/javaCompile/classAnalysis.bin +0 -0
  49. package/android/.gradle/5.4.1/javaCompile/jarAnalysis.bin +0 -0
  50. package/android/.gradle/5.4.1/javaCompile/javaCompile.lock +0 -0
  51. package/android/.gradle/5.4.1/javaCompile/taskHistory.bin +0 -0
  52. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  53. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  54. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  55. package/android/.gradle/vcs-1/gc.properties +0 -0
  56. package/android/.idea/caches/build_file_checksums.ser +0 -0
  57. package/android/.idea/codeStyles/Project.xml +0 -116
  58. package/android/.idea/gradle.xml +0 -18
  59. package/android/.idea/libraries/Gradle__android_arch_core_common_1_1_1_jar.xml +0 -11
  60. package/android/.idea/libraries/Gradle__android_arch_core_runtime_1_1_1_aar.xml +0 -12
  61. package/android/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_1_jar.xml +0 -11
  62. package/android/.idea/libraries/Gradle__android_arch_lifecycle_livedata_1_1_1_aar.xml +0 -12
  63. package/android/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_1_aar.xml +0 -12
  64. package/android/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_1_aar.xml +0 -12
  65. package/android/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_1_aar.xml +0 -12
  66. package/android/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_28_0_0_aar.xml +0 -10
  67. package/android/.idea/libraries/Gradle__com_android_support_appcompat_v7_28_0_0_aar.xml +0 -13
  68. package/android/.idea/libraries/Gradle__com_android_support_asynclayoutinflater_28_0_0_aar.xml +0 -10
  69. package/android/.idea/libraries/Gradle__com_android_support_collections_28_0_0_jar.xml +0 -9
  70. package/android/.idea/libraries/Gradle__com_android_support_coordinatorlayout_28_0_0_aar.xml +0 -13
  71. package/android/.idea/libraries/Gradle__com_android_support_cursoradapter_28_0_0_aar.xml +0 -10
  72. package/android/.idea/libraries/Gradle__com_android_support_customview_28_0_0_aar.xml +0 -10
  73. package/android/.idea/libraries/Gradle__com_android_support_documentfile_28_0_0_aar.xml +0 -10
  74. package/android/.idea/libraries/Gradle__com_android_support_drawerlayout_28_0_0_aar.xml +0 -13
  75. package/android/.idea/libraries/Gradle__com_android_support_interpolator_28_0_0_aar.xml +0 -10
  76. package/android/.idea/libraries/Gradle__com_android_support_loader_28_0_0_aar.xml +0 -10
  77. package/android/.idea/libraries/Gradle__com_android_support_localbroadcastmanager_28_0_0_aar.xml +0 -10
  78. package/android/.idea/libraries/Gradle__com_android_support_print_28_0_0_aar.xml +0 -13
  79. package/android/.idea/libraries/Gradle__com_android_support_slidingpanelayout_28_0_0_aar.xml +0 -10
  80. package/android/.idea/libraries/Gradle__com_android_support_support_annotations_28_0_0_jar.xml +0 -9
  81. package/android/.idea/libraries/Gradle__com_android_support_support_compat_28_0_0_aar.xml +0 -13
  82. package/android/.idea/libraries/Gradle__com_android_support_support_core_ui_28_0_0_aar.xml +0 -10
  83. package/android/.idea/libraries/Gradle__com_android_support_support_core_utils_28_0_0_aar.xml +0 -10
  84. package/android/.idea/libraries/Gradle__com_android_support_support_fragment_28_0_0_aar.xml +0 -13
  85. package/android/.idea/libraries/Gradle__com_android_support_support_vector_drawable_28_0_0_aar.xml +0 -10
  86. package/android/.idea/libraries/Gradle__com_android_support_swiperefreshlayout_28_0_0_aar.xml +0 -13
  87. package/android/.idea/libraries/Gradle__com_android_support_versionedparcelable_28_0_0_aar.xml +0 -10
  88. package/android/.idea/libraries/Gradle__com_android_support_viewpager_28_0_0_aar.xml +0 -10
  89. package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_1_10_0_aar.xml +0 -12
  90. package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_1_10_0_aar.xml +0 -15
  91. package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_1_10_0_aar.xml +0 -15
  92. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_1_10_0_aar.xml +0 -15
  93. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_1_10_0_aar.xml +0 -15
  94. package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_1_10_0_aar.xml +0 -12
  95. package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_11_2_jar.xml +0 -13
  96. package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_59_10_aar.xml +0 -17
  97. package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_6_0_aar.xml +0 -14
  98. package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2_jar.xml +0 -13
  99. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_12_1_jar.xml +0 -13
  100. package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_3_12_1_jar.xml +0 -13
  101. package/android/.idea/libraries/Gradle__com_squareup_okio_okio_1_15_0_jar.xml +0 -13
  102. package/android/.idea/libraries/Gradle__io_flic_flic2lib_android_1_1_0_aar.xml +0 -14
  103. package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml +0 -13
  104. package/android/.idea/misc.xml +0 -14
  105. package/android/.idea/modules.xml +0 -8
  106. package/android/.idea/runConfigurations.xml +0 -12
  107. package/android/.idea/vcs.xml +0 -6
  108. package/android/.idea/workspace.xml +0 -348
  109. package/android/.project +0 -34
  110. package/android/.settings/org.eclipse.buildship.core.prefs +0 -13
  111. package/android/README.md +0 -14
  112. package/android/android.iml +0 -139
  113. package/android/build/generated/source/buildConfig/debug/nl/xguard/flic2/BuildConfig.java +0 -13
  114. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +0 -46
  115. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output.json +0 -1
  116. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +0 -1
  117. package/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  118. package/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +0 -15
  119. package/android/build/intermediates/incremental/packageDebugResources/merged.dir/values/values.xml +0 -4
  120. package/android/build/intermediates/incremental/packageDebugResources/merger.xml +0 -2
  121. package/android/build/intermediates/library_manifest/debug/AndroidManifest.xml +0 -46
  122. package/android/build/intermediates/merged_manifests/debug/output.json +0 -1
  123. package/android/build/intermediates/packaged_res/debug/drawable/ic_launcher_background.xml +0 -74
  124. package/android/build/intermediates/packaged_res/debug/drawable-v24/ic_launcher_foreground.xml +0 -34
  125. package/android/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher.xml +0 -5
  126. package/android/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
  127. package/android/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher.png +0 -0
  128. package/android/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher_round.png +0 -0
  129. package/android/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher.png +0 -0
  130. package/android/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher_round.png +0 -0
  131. package/android/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher.png +0 -0
  132. package/android/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher_round.png +0 -0
  133. package/android/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher.png +0 -0
  134. package/android/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher_round.png +0 -0
  135. package/android/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher.png +0 -0
  136. package/android/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher_round.png +0 -0
  137. package/android/build/intermediates/packaged_res/debug/values/values.xml +0 -4
  138. package/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +0 -989
  139. package/android/build/intermediates/symbols/debug/R.txt +0 -1302
  140. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -95
  141. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  142. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  143. package/android/gradlew +0 -172
  144. package/android/gradlew.bat +0 -84
  145. package/android/local.properties +0 -8
  146. package/android/src/main/ic_launcher-web.png +0 -0
  147. package/android/src/main/java/nl/xguard/flic2/Flic2.java +0 -213
  148. package/android/src/main/java/nl/xguard/flic2/Flic2Package.java +0 -28
  149. package/android/src/main/java/nl/xguard/flic2/communication/IReactEvent.java +0 -15
  150. package/android/src/main/java/nl/xguard/flic2/communication/NullReactEvent.java +0 -47
  151. package/android/src/main/java/nl/xguard/flic2/communication/ReactEvent.java +0 -230
  152. package/android/src/main/java/nl/xguard/flic2/model/IReactFlic2Manager.java +0 -27
  153. package/android/src/main/java/nl/xguard/flic2/model/NullReactFlic2Manager.java +0 -70
  154. package/android/src/main/java/nl/xguard/flic2/model/ReactAndroidHandler.java +0 -33
  155. package/android/src/main/java/nl/xguard/flic2/model/ReactFlic2ButtonListener.java +0 -106
  156. package/android/src/main/java/nl/xguard/flic2/model/ReactFlic2Manager.java +0 -168
  157. package/android/src/main/java/nl/xguard/flic2/model/ReactFlic2ScanCallback.java +0 -48
  158. package/android/src/main/java/nl/xguard/flic2/model/ReactLogger.java +0 -14
  159. package/android/src/main/java/nl/xguard/flic2/service/Flic2Service.java +0 -200
  160. package/android/src/main/java/nl/xguard/flic2/service/Flic2ServiceConnection.java +0 -41
  161. package/android/src/main/java/nl/xguard/flic2/service/IFlic2Service.java +0 -13
  162. package/android/src/main/java/nl/xguard/flic2/sharedpreferences/flic2SharedPreferences.java +0 -35
  163. package/android/src/main/java/nl/xguard/flic2/util/ActivityUtil.java +0 -29
  164. package/android/src/main/java/nl/xguard/flic2/util/Consumer.java +0 -12
  165. package/android/src/main/res/drawable/ic_launcher_background.xml +0 -74
  166. package/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -34
  167. package/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -5
  168. package/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
  169. package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  170. package/android/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  171. package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  172. package/android/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  173. package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  174. package/android/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  175. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  176. package/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  177. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  178. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  179. package/android/src/main/res/values/ids.xml +0 -5
  180. package/build/generated/source/buildConfig/debug/com/flic2/BuildConfig.java +0 -13
  181. package/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -46
  182. package/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output.json +0 -1
  183. package/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +0 -1
  184. package/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  185. package/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  186. package/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  187. package/build/intermediates/incremental/debug-mergeJniLibs/merge-state +0 -0
  188. package/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  189. package/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  190. package/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  191. package/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +0 -15
  192. package/build/intermediates/incremental/packageDebugResources/merger.xml +0 -2
  193. package/build/intermediates/intermediate-jars/debug/classes.jar +0 -0
  194. package/build/intermediates/intermediate-jars/debug/res.jar +0 -0
  195. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/BuildConfig.class +0 -0
  196. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/Flic2Module$1.class +0 -0
  197. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/Flic2Module.class +0 -0
  198. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/Flic2Package.class +0 -0
  199. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/callback/flic2ButtonCallback.class +0 -0
  200. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/communication/ReactEvent.class +0 -0
  201. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/service/Flic2Service$BootUpReceiver.class +0 -0
  202. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/service/Flic2Service$UpdateReceiver.class +0 -0
  203. package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/service/Flic2Service.class +0 -0
  204. package/build/intermediates/library_manifest/debug/AndroidManifest.xml +0 -46
  205. package/build/intermediates/merged_manifests/debug/output.json +0 -1
  206. package/build/intermediates/packaged-classes/debug/classes.jar +0 -0
  207. package/build/intermediates/packaged_res/debug/drawable/ic_launcher_background.xml +0 -74
  208. package/build/intermediates/packaged_res/debug/drawable-v24/ic_launcher_foreground.xml +0 -34
  209. package/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher.xml +0 -5
  210. package/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
  211. package/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher.png +0 -0
  212. package/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher_round.png +0 -0
  213. package/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher.png +0 -0
  214. package/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher_round.png +0 -0
  215. package/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher.png +0 -0
  216. package/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher_round.png +0 -0
  217. package/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher.png +0 -0
  218. package/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher_round.png +0 -0
  219. package/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher.png +0 -0
  220. package/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher_round.png +0 -0
  221. package/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +0 -1290
  222. package/build/intermediates/symbols/debug/R.txt +0 -1764
  223. package/build/intermediates/transforms/mergeJavaRes/debug/0.jar +0 -0
  224. package/build/intermediates/transforms/mergeJavaRes/debug/__content__.json +0 -1
  225. package/build/intermediates/transforms/mergeJniLibs/debug/__content__.json +0 -1
  226. package/build/intermediates/transforms/stripDebugSymbol/debug/__content__.json +0 -1
  227. package/build/outputs/aar/react-native-flic2-debug.aar +0 -0
  228. package/build/outputs/logs/manifest-merger-debug-report.txt +0 -95
  229. package/flic2Button.js +0 -170
  230. package/index.js +0 -430
  231. package/ios/Flic2.m +0 -611
  232. package/ios/Flic2.xcodeproj/project.pbxproj +0 -320
  233. package/ios/Flic2.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -4
  234. package/ios/Flic2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  235. package/ios/Flic2.xcodeproj/project.xcworkspace/xcuserdata/wesdewitte.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  236. package/ios/Flic2.xcodeproj/xcshareddata/xcschemes/Flic2.xcscheme +0 -66
  237. package/ios/Flic2.xcodeproj/xcuserdata/wesdewitte.xcuserdatad/xcschemes/xcschememanagement.plist +0 -22
  238. package/ios/Flic2.xcworkspace/contents.xcworkspacedata +0 -7
  239. package/ios/Flic2.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  240. package/ios/Flic2.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -5
  241. package/ios/Flic2.xcworkspace/xcuserdata/wesdewitte.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  242. package/ios/Flic2.xcworkspace/xcuserdata/wesdewitte.xcuserdatad/WorkspaceSettings.xcsettings +0 -14
  243. package/react-native-flic2.podspec +0 -26
@@ -0,0 +1,480 @@
1
+ package com.flic2
2
+
3
+ import android.content.ComponentName
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import android.content.ServiceConnection
7
+ import android.os.Build
8
+ import android.os.IBinder
9
+ import android.util.Log
10
+ import com.facebook.react.bridge.Arguments
11
+ import com.facebook.react.bridge.Promise
12
+ import com.facebook.react.bridge.ReactApplicationContext
13
+ import com.facebook.react.bridge.WritableMap
14
+ import com.facebook.react.module.annotations.ReactModule
15
+ import io.flic.flic2libandroid.Flic2Button
16
+ import io.flic.flic2libandroid.Flic2Manager
17
+ import io.flic.flic2libandroid.Flic2ScanCallback
18
+ import kotlinx.coroutines.CoroutineScope
19
+ import kotlinx.coroutines.Dispatchers
20
+ import kotlinx.coroutines.Job
21
+ import kotlinx.coroutines.TimeoutCancellationException
22
+ import kotlinx.coroutines.cancel
23
+ import kotlinx.coroutines.launch
24
+ import kotlinx.coroutines.suspendCancellableCoroutine
25
+ import kotlinx.coroutines.withTimeout
26
+ import kotlin.coroutines.resume
27
+ import kotlin.coroutines.resumeWithException
28
+
29
+ // Custom exception for scan errors with error codes
30
+ class ScanException(val errorCode: String, val code: Int, message: String) : Exception(message)
31
+
32
+ @ReactModule(name = Flic2Module.NAME)
33
+ class Flic2Module(reactContext: ReactApplicationContext) :
34
+ NativeFlic2Spec(reactContext) {
35
+
36
+ private var flic2Service: Flic2Service? = null
37
+ private var serviceBound = false
38
+ private val moduleScope = CoroutineScope(Dispatchers.Main + Job())
39
+ private var scanJob: Job? = null
40
+ private val buttonListeners = mutableMapOf<String, Flic2ButtonEventListener>()
41
+ private var initializePromise: Promise? = null
42
+
43
+ companion object {
44
+ const val NAME = "Flic2"
45
+ private const val TAG = "Flic2Module"
46
+ }
47
+
48
+ private val serviceConnection = object : ServiceConnection {
49
+ override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
50
+ Log.d(TAG, "Service connected")
51
+ val binder = service as Flic2Service.Flic2ServiceBinder
52
+ flic2Service = binder.getService()
53
+ serviceBound = true
54
+
55
+ // Set up listeners for existing buttons
56
+ flic2Service?.getManager()?.let { manager ->
57
+ manager.buttons.forEach { button ->
58
+ setupButtonListener(button)
59
+ }
60
+ }
61
+
62
+ // Resolve the initialize promise if pending
63
+ initializePromise?.let { promise ->
64
+ promise.resolve(Arguments.createMap().apply {
65
+ putBoolean("success", true)
66
+ putString("message", "Manager initialized successfully")
67
+ })
68
+ initializePromise = null
69
+ }
70
+ }
71
+
72
+ override fun onServiceDisconnected(name: ComponentName?) {
73
+ Log.d(TAG, "Service disconnected")
74
+ serviceBound = false
75
+ flic2Service = null
76
+
77
+ // Reject any pending initialize promise
78
+ initializePromise?.let { promise ->
79
+ promise.reject("SERVICE_DISCONNECTED", "Service disconnected unexpectedly")
80
+ initializePromise = null
81
+ }
82
+ }
83
+ }
84
+
85
+ override fun getName(): String {
86
+ return NAME
87
+ }
88
+
89
+ override fun invalidate() {
90
+ super.invalidate()
91
+ moduleScope.cancel()
92
+ if (serviceBound) {
93
+ reactApplicationContext.unbindService(serviceConnection)
94
+ serviceBound = false
95
+ }
96
+ }
97
+
98
+ // Example method - keep for reference
99
+ override fun multiply(a: Double, b: Double): Double {
100
+ val result = a * b
101
+
102
+ val eventData = Arguments.createMap().apply {
103
+ putDouble("a", a)
104
+ putDouble("b", b)
105
+ putDouble("result", result)
106
+ }
107
+ emitOnMultiply(eventData)
108
+
109
+ return result
110
+ }
111
+
112
+ // MARK: - Manager Methods
113
+
114
+ override fun initialize(background: Boolean, promise: Promise) {
115
+ try {
116
+ // Store the promise to resolve when service is connected
117
+ initializePromise = promise
118
+
119
+ val intent = Intent(reactApplicationContext, Flic2Service::class.java)
120
+
121
+ // Start service
122
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
123
+ reactApplicationContext.startForegroundService(intent)
124
+ } else {
125
+ reactApplicationContext.startService(intent)
126
+ }
127
+
128
+ // Bind to service - promise will be resolved in onServiceConnected
129
+ val bound = reactApplicationContext.bindService(
130
+ intent,
131
+ serviceConnection,
132
+ Context.BIND_AUTO_CREATE
133
+ )
134
+
135
+ if (!bound) {
136
+ initializePromise = null
137
+ promise.reject("INIT_ERROR", "Failed to bind to service")
138
+ }
139
+ } catch (e: Exception) {
140
+ Log.e(TAG, "Failed to initialize", e)
141
+ initializePromise = null
142
+ promise.reject("INIT_ERROR", "Failed to initialize: ${e.message}", e)
143
+ }
144
+ }
145
+
146
+ override fun getButtons(promise: Promise) {
147
+ try {
148
+ val manager = flic2Service?.getManager()
149
+ if (manager == null) {
150
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
151
+ return
152
+ }
153
+
154
+ val buttons = manager.buttons
155
+ val buttonArray = Flic2Converter.buttonsToArray(buttons)
156
+ promise.resolve(buttonArray)
157
+ } catch (e: Exception) {
158
+ Log.e(TAG, "Failed to get buttons", e)
159
+ promise.reject("GET_BUTTONS_ERROR", "Failed to get buttons: ${e.message}", e)
160
+ }
161
+ }
162
+
163
+ override fun scanForButtons(promise: Promise) {
164
+ val manager = flic2Service?.getManager()
165
+ if (manager == null) {
166
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
167
+ return
168
+ }
169
+
170
+ // Cancel any existing scan
171
+ scanJob?.cancel()
172
+
173
+ Log.d(TAG, "Starting scan")
174
+
175
+ manager.startScan(object : Flic2ScanCallback {
176
+ override fun onDiscoveredAlreadyPairedButton(button: Flic2Button) {
177
+ Log.d(TAG, "Discovered already paired button")
178
+ emitOnScanStatusChange(Arguments.createMap().apply {
179
+ putInt("event", 0)
180
+ putString("eventName", "discovered")
181
+ })
182
+ }
183
+
184
+ override fun onDiscovered(bdAddr: String) {
185
+ Log.d(TAG, "Discovered button: $bdAddr")
186
+ emitOnScanStatusChange(Arguments.createMap().apply {
187
+ putInt("event", 0)
188
+ putString("eventName", "discovered")
189
+ })
190
+ }
191
+
192
+ override fun onConnected() {
193
+ Log.d(TAG, "Button connected during scan")
194
+ emitOnScanStatusChange(Arguments.createMap().apply {
195
+ putInt("event", 1)
196
+ putString("eventName", "connected")
197
+ })
198
+ }
199
+
200
+ override fun onComplete(result: Int, subCode: Int, button: Flic2Button?) {
201
+ Log.d(TAG, "Scan complete: result=$result, button=${button?.uuid}")
202
+
203
+ if (result == Flic2ScanCallback.RESULT_SUCCESS && button != null) {
204
+ emitOnScanStatusChange(Arguments.createMap().apply {
205
+ putInt("event", 2)
206
+ putString("eventName", "verified")
207
+ })
208
+
209
+ // Auto-connect (trigger mode not available in Android v1.1.0+)
210
+ button.connect()
211
+
212
+ setupButtonListener(button)
213
+
214
+ // Emit discovered event
215
+ emitOnButtonEvent(Arguments.createMap().apply {
216
+ putString("uuid", button.uuid)
217
+ putString("event", "discovered")
218
+ putMap("button", Flic2Converter.buttonToMap(button))
219
+ })
220
+ } else {
221
+ val errorCode = Flic2Converter.scanResultToString(result)
222
+ Log.e(TAG, "Scan failed with error code: $errorCode")
223
+ }
224
+ }
225
+ })
226
+
227
+ // Return immediately - scan results will come through events
228
+ promise.resolve(Arguments.createMap().apply {
229
+ putBoolean("success", true)
230
+ putString("message", "Scan started")
231
+ })
232
+ }
233
+
234
+ override fun stopScan(promise: Promise) {
235
+ try {
236
+ val manager = flic2Service?.getManager()
237
+ if (manager == null) {
238
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
239
+ return
240
+ }
241
+
242
+ scanJob?.cancel()
243
+ manager.stopScan()
244
+
245
+ promise.resolve(Arguments.createMap().apply {
246
+ putBoolean("success", true)
247
+ putString("message", "Scan stopped")
248
+ })
249
+ } catch (e: Exception) {
250
+ Log.e(TAG, "Failed to stop scan", e)
251
+ promise.reject("STOP_SCAN_ERROR", "Failed to stop scan: ${e.message}", e)
252
+ }
253
+ }
254
+
255
+ override fun forgetButton(uuid: String, promise: Promise) {
256
+ try {
257
+ val manager = flic2Service?.getManager()
258
+ if (manager == null) {
259
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
260
+ return
261
+ }
262
+
263
+ val button = manager.buttons.find { it.uuid == uuid }
264
+ if (button == null) {
265
+ promise.reject("BUTTON_NOT_FOUND", "Button not found")
266
+ return
267
+ }
268
+
269
+ // Disconnect before forgetting like iOS
270
+ button.disconnectOrAbortPendingConnection()
271
+
272
+ // Remove listener
273
+ buttonListeners.remove(uuid)
274
+
275
+ // Forget button
276
+ manager.forgetButton(button)
277
+
278
+ promise.resolve(Arguments.createMap().apply {
279
+ putBoolean("success", true)
280
+ putString("message", "Button forgotten")
281
+ })
282
+ } catch (e: Exception) {
283
+ Log.e(TAG, "Failed to forget button", e)
284
+ promise.reject("FORGET_ERROR", "Failed to forget button: ${e.message}", e)
285
+ }
286
+ }
287
+
288
+ // MARK: - Button Methods
289
+
290
+ override fun connectButton(uuid: String, promise: Promise) {
291
+ try {
292
+ val button = findButton(uuid)
293
+ if (button == null) {
294
+ promise.reject("BUTTON_NOT_FOUND", "Button not found")
295
+ return
296
+ }
297
+
298
+ button.connect()
299
+
300
+ promise.resolve(Arguments.createMap().apply {
301
+ putBoolean("success", true)
302
+ putString("message", "Connection initiated")
303
+ })
304
+ } catch (e: Exception) {
305
+ Log.e(TAG, "Failed to connect button", e)
306
+ promise.reject("CONNECT_ERROR", "Failed to connect: ${e.message}", e)
307
+ }
308
+ }
309
+
310
+ override fun disconnectButton(uuid: String, promise: Promise) {
311
+ try {
312
+ val button = findButton(uuid)
313
+ if (button == null) {
314
+ promise.reject("BUTTON_NOT_FOUND", "Button not found")
315
+ return
316
+ }
317
+
318
+ button.disconnectOrAbortPendingConnection()
319
+
320
+ promise.resolve(Arguments.createMap().apply {
321
+ putBoolean("success", true)
322
+ putString("message", "Disconnection initiated")
323
+ })
324
+ } catch (e: Exception) {
325
+ Log.e(TAG, "Failed to disconnect button", e)
326
+ promise.reject("DISCONNECT_ERROR", "Failed to disconnect: ${e.message}", e)
327
+ }
328
+ }
329
+
330
+ override fun setTriggerMode(uuid: String, mode: Double, promise: Promise) {
331
+ promise.reject(
332
+ "NOT_SUPPORTED_ON_ANDROID",
333
+ "Trigger mode is only supported on iOS. Android Flic2 library v1.1.0+ does not support trigger modes."
334
+ )
335
+ }
336
+
337
+ override fun setLatencyMode(uuid: String, mode: Double, promise: Promise) {
338
+ promise.reject(
339
+ "NOT_SUPPORTED_ON_ANDROID",
340
+ "Latency mode is only supported on iOS. Android Flic2 library v1.1.0+ does not support latency modes."
341
+ )
342
+ }
343
+
344
+ override fun setNickname(uuid: String, nickname: String, promise: Promise) {
345
+ try {
346
+ val button = findButton(uuid)
347
+ if (button == null) {
348
+ promise.reject("BUTTON_NOT_FOUND", "Button not found")
349
+ return
350
+ }
351
+
352
+ // v1.1.0 uses setName() method instead of property
353
+ button.setName(nickname)
354
+
355
+ promise.resolve(Arguments.createMap().apply {
356
+ putBoolean("success", true)
357
+ putString("message", "Nickname set")
358
+ })
359
+ } catch (e: Exception) {
360
+ Log.e(TAG, "Failed to set nickname", e)
361
+ promise.reject("SET_NICKNAME_ERROR", "Failed to set nickname: ${e.message}", e)
362
+ }
363
+ }
364
+
365
+ override fun connectAllKnownButtons(promise: Promise) {
366
+ try {
367
+ val manager = flic2Service?.getManager()
368
+ if (manager == null) {
369
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
370
+ return
371
+ }
372
+
373
+ val buttons = manager.buttons
374
+
375
+ buttons.forEach { button ->
376
+ Log.d(TAG, "Connecting button: ${button.getName()}")
377
+ // Trigger mode not available in Android v1.1.0+
378
+ button.connect()
379
+ }
380
+
381
+ promise.resolve(Arguments.createMap().apply {
382
+ putBoolean("success", true)
383
+ putString("message", "All buttons connection initiated")
384
+ })
385
+ } catch (e: Exception) {
386
+ Log.e(TAG, "Failed to connect all buttons", e)
387
+ promise.reject("CONNECT_ALL_ERROR", "Failed to connect all buttons: ${e.message}", e)
388
+ }
389
+ }
390
+
391
+ override fun disconnectAllKnownButtons(promise: Promise) {
392
+ try {
393
+ val manager = flic2Service?.getManager()
394
+ if (manager == null) {
395
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
396
+ return
397
+ }
398
+
399
+ val buttons = manager.buttons
400
+
401
+ buttons.forEach { button ->
402
+ Log.d(TAG, "Disconnecting button: ${button.name}")
403
+ button.disconnectOrAbortPendingConnection()
404
+ }
405
+
406
+ promise.resolve(Arguments.createMap().apply {
407
+ putBoolean("success", true)
408
+ putString("message", "All buttons disconnection initiated")
409
+ })
410
+ } catch (e: Exception) {
411
+ Log.e(TAG, "Failed to disconnect all buttons", e)
412
+ promise.reject("DISCONNECT_ALL_ERROR", "Failed to disconnect all buttons: ${e.message}", e)
413
+ }
414
+ }
415
+
416
+ override fun forgetAllButtons(promise: Promise) {
417
+ try {
418
+ val manager = flic2Service?.getManager()
419
+ if (manager == null) {
420
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
421
+ return
422
+ }
423
+
424
+ // Create a copy of the list to avoid concurrent modification
425
+ val buttons = manager.buttons.toList()
426
+
427
+ buttons.forEach { button ->
428
+ buttonListeners.remove(button.uuid)
429
+ button.disconnectOrAbortPendingConnection()
430
+ manager.forgetButton(button)
431
+ }
432
+
433
+ promise.resolve(Arguments.createMap().apply {
434
+ putBoolean("success", true)
435
+ putString("message", "All buttons forgotten")
436
+ })
437
+ } catch (e: Exception) {
438
+ Log.e(TAG, "Failed to forget all buttons", e)
439
+ promise.reject("FORGET_ALL_ERROR", "Failed to forget all buttons: ${e.message}", e)
440
+ }
441
+ }
442
+
443
+ override fun isScanning(promise: Promise) {
444
+ try {
445
+ val manager = flic2Service?.getManager()
446
+ if (manager == null) {
447
+ promise.reject("NOT_INITIALIZED", "Manager not initialized")
448
+ return
449
+ }
450
+
451
+ val scanning = (scanJob != null && scanJob?.isActive == true)
452
+ promise.resolve(scanning)
453
+ } catch (e: Exception) {
454
+ Log.e(TAG, "Failed to check scanning status", e)
455
+ promise.reject("IS_SCANNING_ERROR", "Failed to check scanning status: ${e.message}", e)
456
+ }
457
+ }
458
+
459
+ // MARK: - Helper Methods
460
+
461
+ private fun findButton(uuid: String): Flic2Button? {
462
+ return flic2Service?.getManager()?.buttons?.find { it.uuid == uuid }
463
+ }
464
+
465
+ private fun setupButtonListener(button: Flic2Button) {
466
+ // Remove existing listener if any
467
+ buttonListeners.remove(button.uuid)
468
+
469
+ // Create new listener
470
+ val listener = Flic2ButtonEventListener { event ->
471
+ emitOnButtonEvent(event)
472
+ }
473
+
474
+ // Add listener to button
475
+ button.addListener(listener)
476
+
477
+ // Store listener reference
478
+ buttonListeners[button.uuid] = listener
479
+ }
480
+ }
@@ -0,0 +1,33 @@
1
+ package com.flic2
2
+
3
+ import com.facebook.react.BaseReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.module.model.ReactModuleInfo
7
+ import com.facebook.react.module.model.ReactModuleInfoProvider
8
+ import java.util.HashMap
9
+
10
+ class Flic2Package : BaseReactPackage() {
11
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
+ return if (name == Flic2Module.NAME) {
13
+ Flic2Module(reactContext)
14
+ } else {
15
+ null
16
+ }
17
+ }
18
+
19
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
20
+ return ReactModuleInfoProvider {
21
+ val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
22
+ moduleInfos[Flic2Module.NAME] = ReactModuleInfo(
23
+ Flic2Module.NAME,
24
+ Flic2Module.NAME,
25
+ false, // canOverrideExistingModule
26
+ false, // needsEagerInit
27
+ false, // isCxxModule
28
+ true // isTurboModule
29
+ )
30
+ moduleInfos
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,112 @@
1
+ package com.flic2
2
+
3
+ import android.app.Notification
4
+ import android.app.NotificationChannel
5
+ import android.app.NotificationManager
6
+ import android.app.PendingIntent
7
+ import android.app.Service
8
+ import android.content.Intent
9
+ import android.os.Binder
10
+ import android.os.Build
11
+ import android.os.Handler
12
+ import android.os.IBinder
13
+ import android.os.Looper
14
+ import android.util.Log
15
+ import androidx.core.app.NotificationCompat
16
+ import io.flic.flic2libandroid.Flic2Manager
17
+
18
+ class Flic2Service : Service() {
19
+
20
+ private val binder = Flic2ServiceBinder()
21
+ private var manager: Flic2Manager? = null
22
+
23
+ companion object {
24
+ private const val TAG = "Flic2Service"
25
+ private const val NOTIFICATION_ID = 1
26
+ private const val CHANNEL_ID = "Flic2ServiceChannel"
27
+ private const val CHANNEL_NAME = "Flic2 Service"
28
+ }
29
+
30
+ inner class Flic2ServiceBinder : Binder() {
31
+ fun getService(): Flic2Service = this@Flic2Service
32
+ }
33
+
34
+ override fun onCreate() {
35
+ super.onCreate()
36
+ Log.d(TAG, "Service onCreate")
37
+
38
+ try {
39
+ // Initialize Flic2Manager on main thread with Handler
40
+ // v1.1.0 API: init() returns void, must call getInstance() after
41
+ Flic2Manager.init(
42
+ applicationContext,
43
+ Handler(Looper.getMainLooper())
44
+ )
45
+ manager = Flic2Manager.getInstance()
46
+ Log.d(TAG, "Flic2Manager initialized successfully")
47
+ } catch (e: Exception) {
48
+ Log.e(TAG, "Failed to initialize Flic2Manager", e)
49
+ }
50
+ }
51
+
52
+ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
53
+ Log.d(TAG, "Service onStartCommand")
54
+
55
+ // Create notification channel for Android O and above
56
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
57
+ val channel = NotificationChannel(
58
+ CHANNEL_ID,
59
+ CHANNEL_NAME,
60
+ NotificationManager.IMPORTANCE_LOW
61
+ ).apply {
62
+ description = "Keeps Flic2 buttons connected in the background"
63
+ setShowBadge(false)
64
+ }
65
+
66
+ val notificationManager = getSystemService(NotificationManager::class.java)
67
+ notificationManager.createNotificationChannel(channel)
68
+ }
69
+
70
+ // Create notification
71
+ val notification = createNotification()
72
+
73
+ // Start as foreground service
74
+ startForeground(NOTIFICATION_ID, notification)
75
+
76
+ return START_STICKY
77
+ }
78
+
79
+ override fun onBind(intent: Intent?): IBinder {
80
+ Log.d(TAG, "Service onBind")
81
+ return binder
82
+ }
83
+
84
+ override fun onDestroy() {
85
+ Log.d(TAG, "Service onDestroy")
86
+ super.onDestroy()
87
+ }
88
+
89
+ fun getManager(): Flic2Manager? = manager
90
+
91
+ fun isManagerInitialized(): Boolean = manager != null
92
+
93
+ private fun createNotification(): Notification {
94
+ val notificationIntent = Intent(this, Flic2Service::class.java)
95
+ val pendingIntent = PendingIntent.getActivity(
96
+ this,
97
+ 0,
98
+ notificationIntent,
99
+ PendingIntent.FLAG_IMMUTABLE
100
+ )
101
+
102
+ return NotificationCompat.Builder(this, CHANNEL_ID)
103
+ .setContentTitle("Flic2 Service")
104
+ .setContentText("Flic2 buttons are connected")
105
+ .setSmallIcon(android.R.drawable.ic_dialog_info)
106
+ .setContentIntent(pendingIntent)
107
+ .setPriority(NotificationCompat.PRIORITY_LOW)
108
+ .setOngoing(true)
109
+ .build()
110
+ }
111
+ }
112
+
package/ios/Flic2.h CHANGED
@@ -1,7 +1,12 @@
1
-
1
+ #import <Flic2Spec/Flic2Spec.h>
2
+ #import <flic2lib/FLICManager.h>
3
+ #import <flic2lib/FLICButton.h>
4
+ #import <flic2lib/FLICEnums.h>
2
5
  #import <React/RCTBridgeModule.h>
3
- #import <React/RCTEventEmitter.h>
4
- @import flic2lib;
5
6
 
6
- @interface Flic2 : RCTEventEmitter <FLICButtonDelegate, FLICManagerDelegate, RCTBridgeModule>
7
+ @interface Flic2 : NativeFlic2SpecBase <NativeFlic2Spec, FLICManagerDelegate, FLICButtonDelegate>
8
+
9
+ @property (nonatomic, strong) FLICManager *manager;
10
+ @property (nonatomic, assign) BOOL managerRestored;
11
+
7
12
  @end