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.
- package/Flic2.podspec +22 -0
- package/{LICENSE.md → LICENSE} +1 -1
- package/README.md +17 -523
- package/android/build.gradle +64 -132
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +17 -29
- package/android/src/main/java/com/flic2/Flic2ButtonListener.kt +132 -0
- package/android/src/main/java/com/flic2/Flic2Converter.kt +103 -0
- package/android/src/main/java/com/flic2/Flic2Module.kt +480 -0
- package/android/src/main/java/com/flic2/Flic2Package.kt +33 -0
- package/android/src/main/java/com/flic2/Flic2Service.kt +112 -0
- package/ios/Flic2.h +9 -4
- package/ios/Flic2.mm +610 -0
- package/ios/flic2lib.framework/Headers/FLICButton.h +1 -1
- package/ios/flic2lib.framework/Headers/FLICManager.h +1 -1
- package/ios/flic2lib.framework/Info.plist +0 -0
- package/ios/flic2lib.framework/Modules/module.modulemap +1 -1
- package/ios/flic2lib.framework/flic2lib +0 -0
- package/lib/module/NativeFlic2.js +14 -0
- package/lib/module/NativeFlic2.js.map +1 -0
- package/lib/module/index.js +91 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeFlic2.d.ts +119 -0
- package/lib/typescript/src/NativeFlic2.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +81 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +132 -19
- package/src/NativeFlic2.ts +157 -0
- package/src/index.tsx +159 -0
- package/.editorconfig +0 -7
- package/.gitattributes +0 -1
- package/.idea/codeStyles/Project.xml +0 -116
- package/.idea/modules.xml +0 -8
- package/.idea/react-native-flic2.iml +0 -9
- package/.idea/vcs.xml +0 -6
- package/.idea/workspace.xml +0 -140
- package/android/.classpath +0 -6
- package/android/.gradle/5.4.1/executionHistory/executionHistory.bin +0 -0
- package/android/.gradle/5.4.1/executionHistory/executionHistory.lock +0 -0
- package/android/.gradle/5.4.1/fileChanges/last-build.bin +0 -0
- package/android/.gradle/5.4.1/fileContent/fileContent.lock +0 -0
- package/android/.gradle/5.4.1/fileHashes/fileHashes.bin +0 -0
- package/android/.gradle/5.4.1/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/5.4.1/fileHashes/resourceHashesCache.bin +0 -0
- package/android/.gradle/5.4.1/gc.properties +0 -0
- package/android/.gradle/5.4.1/javaCompile/classAnalysis.bin +0 -0
- package/android/.gradle/5.4.1/javaCompile/jarAnalysis.bin +0 -0
- package/android/.gradle/5.4.1/javaCompile/javaCompile.lock +0 -0
- package/android/.gradle/5.4.1/javaCompile/taskHistory.bin +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/caches/build_file_checksums.ser +0 -0
- package/android/.idea/codeStyles/Project.xml +0 -116
- package/android/.idea/gradle.xml +0 -18
- package/android/.idea/libraries/Gradle__android_arch_core_common_1_1_1_jar.xml +0 -11
- package/android/.idea/libraries/Gradle__android_arch_core_runtime_1_1_1_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_1_jar.xml +0 -11
- package/android/.idea/libraries/Gradle__android_arch_lifecycle_livedata_1_1_1_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_1_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_1_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_1_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_appcompat_v7_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_asynclayoutinflater_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_collections_28_0_0_jar.xml +0 -9
- package/android/.idea/libraries/Gradle__com_android_support_coordinatorlayout_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_cursoradapter_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_customview_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_documentfile_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_drawerlayout_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_interpolator_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_loader_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_localbroadcastmanager_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_print_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_slidingpanelayout_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_support_annotations_28_0_0_jar.xml +0 -9
- package/android/.idea/libraries/Gradle__com_android_support_support_compat_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_support_core_ui_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_support_core_utils_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_support_fragment_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_support_vector_drawable_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_swiperefreshlayout_28_0_0_aar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_android_support_versionedparcelable_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_android_support_viewpager_28_0_0_aar.xml +0 -10
- package/android/.idea/libraries/Gradle__com_facebook_fresco_drawee_1_10_0_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fbcore_1_10_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_fresco_1_10_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_1_10_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_base_1_10_0_aar.xml +0 -15
- package/android/.idea/libraries/Gradle__com_facebook_fresco_imagepipeline_okhttp3_1_10_0_aar.xml +0 -12
- package/android/.idea/libraries/Gradle__com_facebook_infer_annotation_infer_annotation_0_11_2_jar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_facebook_react_react_native_0_59_10_aar.xml +0 -17
- package/android/.idea/libraries/Gradle__com_facebook_soloader_soloader_0_6_0_aar.xml +0 -14
- package/android/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_3_0_2_jar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_12_1_jar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_urlconnection_3_12_1_jar.xml +0 -13
- package/android/.idea/libraries/Gradle__com_squareup_okio_okio_1_15_0_jar.xml +0 -13
- package/android/.idea/libraries/Gradle__io_flic_flic2lib_android_1_1_0_aar.xml +0 -14
- package/android/.idea/libraries/Gradle__javax_inject_javax_inject_1_jar.xml +0 -13
- package/android/.idea/misc.xml +0 -14
- package/android/.idea/modules.xml +0 -8
- package/android/.idea/runConfigurations.xml +0 -12
- package/android/.idea/vcs.xml +0 -6
- package/android/.idea/workspace.xml +0 -348
- package/android/.project +0 -34
- package/android/.settings/org.eclipse.buildship.core.prefs +0 -13
- package/android/README.md +0 -14
- package/android/android.iml +0 -139
- package/android/build/generated/source/buildConfig/debug/nl/xguard/flic2/BuildConfig.java +0 -13
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +0 -46
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output.json +0 -1
- package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +0 -1
- package/android/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +0 -15
- package/android/build/intermediates/incremental/packageDebugResources/merged.dir/values/values.xml +0 -4
- package/android/build/intermediates/incremental/packageDebugResources/merger.xml +0 -2
- package/android/build/intermediates/library_manifest/debug/AndroidManifest.xml +0 -46
- package/android/build/intermediates/merged_manifests/debug/output.json +0 -1
- package/android/build/intermediates/packaged_res/debug/drawable/ic_launcher_background.xml +0 -74
- package/android/build/intermediates/packaged_res/debug/drawable-v24/ic_launcher_foreground.xml +0 -34
- package/android/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher.xml +0 -5
- package/android/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
- package/android/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher_round.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher_round.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher_round.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher_round.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher.png +0 -0
- package/android/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher_round.png +0 -0
- package/android/build/intermediates/packaged_res/debug/values/values.xml +0 -4
- package/android/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +0 -989
- package/android/build/intermediates/symbols/debug/R.txt +0 -1302
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -95
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/android/gradlew +0 -172
- package/android/gradlew.bat +0 -84
- package/android/local.properties +0 -8
- package/android/src/main/ic_launcher-web.png +0 -0
- package/android/src/main/java/nl/xguard/flic2/Flic2.java +0 -213
- package/android/src/main/java/nl/xguard/flic2/Flic2Package.java +0 -28
- package/android/src/main/java/nl/xguard/flic2/communication/IReactEvent.java +0 -15
- package/android/src/main/java/nl/xguard/flic2/communication/NullReactEvent.java +0 -47
- package/android/src/main/java/nl/xguard/flic2/communication/ReactEvent.java +0 -230
- package/android/src/main/java/nl/xguard/flic2/model/IReactFlic2Manager.java +0 -27
- package/android/src/main/java/nl/xguard/flic2/model/NullReactFlic2Manager.java +0 -70
- package/android/src/main/java/nl/xguard/flic2/model/ReactAndroidHandler.java +0 -33
- package/android/src/main/java/nl/xguard/flic2/model/ReactFlic2ButtonListener.java +0 -106
- package/android/src/main/java/nl/xguard/flic2/model/ReactFlic2Manager.java +0 -168
- package/android/src/main/java/nl/xguard/flic2/model/ReactFlic2ScanCallback.java +0 -48
- package/android/src/main/java/nl/xguard/flic2/model/ReactLogger.java +0 -14
- package/android/src/main/java/nl/xguard/flic2/service/Flic2Service.java +0 -200
- package/android/src/main/java/nl/xguard/flic2/service/Flic2ServiceConnection.java +0 -41
- package/android/src/main/java/nl/xguard/flic2/service/IFlic2Service.java +0 -13
- package/android/src/main/java/nl/xguard/flic2/sharedpreferences/flic2SharedPreferences.java +0 -35
- package/android/src/main/java/nl/xguard/flic2/util/ActivityUtil.java +0 -29
- package/android/src/main/java/nl/xguard/flic2/util/Consumer.java +0 -12
- package/android/src/main/res/drawable/ic_launcher_background.xml +0 -74
- package/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -34
- package/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -5
- package/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
- package/android/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/android/src/main/res/values/ids.xml +0 -5
- package/build/generated/source/buildConfig/debug/com/flic2/BuildConfig.java +0 -13
- package/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -46
- package/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output.json +0 -1
- package/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +0 -1
- package/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
- package/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
- package/build/intermediates/incremental/debug-mergeJniLibs/merge-state +0 -0
- package/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
- package/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
- package/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
- package/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +0 -15
- package/build/intermediates/incremental/packageDebugResources/merger.xml +0 -2
- package/build/intermediates/intermediate-jars/debug/classes.jar +0 -0
- package/build/intermediates/intermediate-jars/debug/res.jar +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/BuildConfig.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/Flic2Module$1.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/Flic2Module.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/Flic2Package.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/callback/flic2ButtonCallback.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/communication/ReactEvent.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/service/Flic2Service$BootUpReceiver.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/service/Flic2Service$UpdateReceiver.class +0 -0
- package/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/flic2/service/Flic2Service.class +0 -0
- package/build/intermediates/library_manifest/debug/AndroidManifest.xml +0 -46
- package/build/intermediates/merged_manifests/debug/output.json +0 -1
- package/build/intermediates/packaged-classes/debug/classes.jar +0 -0
- package/build/intermediates/packaged_res/debug/drawable/ic_launcher_background.xml +0 -74
- package/build/intermediates/packaged_res/debug/drawable-v24/ic_launcher_foreground.xml +0 -34
- package/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher.xml +0 -5
- package/build/intermediates/packaged_res/debug/mipmap-anydpi-v26/ic_launcher_round.xml +0 -5
- package/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-hdpi-v4/ic_launcher_round.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-mdpi-v4/ic_launcher_round.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-xhdpi-v4/ic_launcher_round.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-xxhdpi-v4/ic_launcher_round.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher.png +0 -0
- package/build/intermediates/packaged_res/debug/mipmap-xxxhdpi-v4/ic_launcher_round.png +0 -0
- package/build/intermediates/res/symbol-table-with-package/debug/package-aware-r.txt +0 -1290
- package/build/intermediates/symbols/debug/R.txt +0 -1764
- package/build/intermediates/transforms/mergeJavaRes/debug/0.jar +0 -0
- package/build/intermediates/transforms/mergeJavaRes/debug/__content__.json +0 -1
- package/build/intermediates/transforms/mergeJniLibs/debug/__content__.json +0 -1
- package/build/intermediates/transforms/stripDebugSymbol/debug/__content__.json +0 -1
- package/build/outputs/aar/react-native-flic2-debug.aar +0 -0
- package/build/outputs/logs/manifest-merger-debug-report.txt +0 -95
- package/flic2Button.js +0 -170
- package/index.js +0 -430
- package/ios/Flic2.m +0 -611
- package/ios/Flic2.xcodeproj/project.pbxproj +0 -320
- package/ios/Flic2.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -4
- package/ios/Flic2.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/ios/Flic2.xcodeproj/project.xcworkspace/xcuserdata/wesdewitte.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/Flic2.xcodeproj/xcshareddata/xcschemes/Flic2.xcscheme +0 -66
- package/ios/Flic2.xcodeproj/xcuserdata/wesdewitte.xcuserdatad/xcschemes/xcschememanagement.plist +0 -22
- package/ios/Flic2.xcworkspace/contents.xcworkspacedata +0 -7
- package/ios/Flic2.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/ios/Flic2.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -5
- package/ios/Flic2.xcworkspace/xcuserdata/wesdewitte.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/Flic2.xcworkspace/xcuserdata/wesdewitte.xcuserdatad/WorkspaceSettings.xcsettings +0 -14
- 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 :
|
|
7
|
+
@interface Flic2 : NativeFlic2SpecBase <NativeFlic2Spec, FLICManagerDelegate, FLICButtonDelegate>
|
|
8
|
+
|
|
9
|
+
@property (nonatomic, strong) FLICManager *manager;
|
|
10
|
+
@property (nonatomic, assign) BOOL managerRestored;
|
|
11
|
+
|
|
7
12
|
@end
|