react-native-spike-sdk 4.0.13-beta.2 → 4.0.13-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/spikesdk/SpikeSdkModule.kt +389 -0
- package/ios/SpikeExceptionMapper.swift +2 -0
- package/lib/commonjs/SpikeException.js +2 -0
- package/lib/commonjs/SpikeException.js.map +1 -1
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/v3/DataModels/HealthConnectAvailabilityStatus.js +13 -0
- package/lib/commonjs/v3/DataModels/HealthConnectAvailabilityStatus.js.map +1 -0
- package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js +143 -27
- package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js.map +1 -1
- package/lib/module/SpikeException.js +2 -0
- package/lib/module/SpikeException.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/v3/DataModels/HealthConnectAvailabilityStatus.js +7 -0
- package/lib/module/v3/DataModels/HealthConnectAvailabilityStatus.js.map +1 -0
- package/lib/module/v3/SpikeRNConnectionAPIv3.js +143 -27
- package/lib/module/v3/SpikeRNConnectionAPIv3.js.map +1 -1
- package/lib/typescript/src/SpikeException.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/v3/DataModels/HealthConnectAvailabilityStatus.d.ts +6 -0
- package/lib/typescript/src/v3/DataModels/HealthConnectAvailabilityStatus.d.ts.map +1 -0
- package/lib/typescript/src/v3/SpikeRNConnectionAPIv3.d.ts +74 -2
- package/lib/typescript/src/v3/SpikeRNConnectionAPIv3.d.ts.map +1 -1
- package/package.json +8 -4
- package/src/SpikeException.ts +3 -0
- package/src/index.ts +2 -0
- package/src/v3/DataModels/HealthConnectAvailabilityStatus.ts +6 -0
- package/src/v3/SpikeRNConnectionAPIv3.ts +176 -45
package/android/build.gradle
CHANGED
|
@@ -76,7 +76,7 @@ dependencies {
|
|
|
76
76
|
//noinspection GradleDynamicVersion
|
|
77
77
|
implementation "com.facebook.react:react-android:0.71.3"
|
|
78
78
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
79
|
-
implementation 'com.spikeapi.sdk:spike-sdk:
|
|
79
|
+
implementation 'com.spikeapi.sdk:spike-sdk:4.0.12-beta.1'
|
|
80
80
|
implementation 'androidx.core:core-ktx:1.9.0'
|
|
81
81
|
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
|
|
82
82
|
implementation 'com.google.code.gson:gson:2.10.1'
|
|
@@ -14,6 +14,12 @@ import com.spikeapi.SpikeExceptions
|
|
|
14
14
|
import com.spikeapi.SpikeLogger
|
|
15
15
|
import com.spikeapi.SpikePackageChecker
|
|
16
16
|
import com.spikeapi.healthconnect.HealthConnectAvailability
|
|
17
|
+
import com.spikeapi.apiv3.SpikeConnectionAPIv3
|
|
18
|
+
import com.spikeapi.apiv3.datamodels.MetricType
|
|
19
|
+
import com.spikeapi.apiv3.datamodels.StatisticsType
|
|
20
|
+
import com.spikeapi.apiv3.datamodels.StatisticsInterval
|
|
21
|
+
import com.spikeapi.apiv3.datamodels.StatisticsFilter
|
|
22
|
+
import com.spikeapi.apiv3.healthconnect.HealthConnectPermissionManager
|
|
17
23
|
import kotlinx.coroutines.CoroutineScope
|
|
18
24
|
import kotlinx.coroutines.Dispatchers
|
|
19
25
|
import kotlinx.coroutines.SupervisorJob
|
|
@@ -22,6 +28,10 @@ import kotlinx.coroutines.sync.Mutex
|
|
|
22
28
|
import kotlinx.coroutines.sync.withLock
|
|
23
29
|
import java.time.OffsetDateTime
|
|
24
30
|
import java.util.UUID
|
|
31
|
+
import android.util.Log
|
|
32
|
+
import java.time.Instant
|
|
33
|
+
import java.time.format.DateTimeParseException
|
|
34
|
+
|
|
25
35
|
|
|
26
36
|
fun <I, O> ComponentActivity.registerActivityResultLauncher(
|
|
27
37
|
contract: ActivityResultContract<I, O>,
|
|
@@ -513,7 +523,9 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
513
523
|
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
514
524
|
.emit(eventName, params)
|
|
515
525
|
}
|
|
526
|
+
|
|
516
527
|
override fun onHostResume() {
|
|
528
|
+
// Old SDK
|
|
517
529
|
checkPermissionsFor?.let {
|
|
518
530
|
it.second.forEach { permission ->
|
|
519
531
|
checkPermissionsGranted(
|
|
@@ -524,6 +536,12 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
524
536
|
}
|
|
525
537
|
}
|
|
526
538
|
checkPermissionsFor = null
|
|
539
|
+
|
|
540
|
+
// New SDK V3
|
|
541
|
+
checkPermissionsForV3?.let {
|
|
542
|
+
areAllPermissionsGranted(it.first, it.second, it.third)
|
|
543
|
+
}
|
|
544
|
+
checkPermissionsForV3 = null
|
|
527
545
|
}
|
|
528
546
|
|
|
529
547
|
override fun onHostPause() {
|
|
@@ -554,4 +572,375 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
554
572
|
}
|
|
555
573
|
}
|
|
556
574
|
|
|
575
|
+
// ------------------------- V3 -------------------------
|
|
576
|
+
|
|
577
|
+
@ReactMethod
|
|
578
|
+
fun setWrapper(type: String, version: String) {
|
|
579
|
+
SpikeConnectionAPIv3.setWrapper(type, version)
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
@ReactMethod
|
|
583
|
+
fun createConnectionAPIv3(
|
|
584
|
+
uuid: String,
|
|
585
|
+
appId: String,
|
|
586
|
+
authToken: String,
|
|
587
|
+
customerEndUserId: String,
|
|
588
|
+
promise: Promise
|
|
589
|
+
) {
|
|
590
|
+
scope.launch {
|
|
591
|
+
try {
|
|
592
|
+
val connection = SpikeConnectionAPIv3.createConnection(
|
|
593
|
+
appId = appId,
|
|
594
|
+
authToken = authToken,
|
|
595
|
+
customerEndUserId = customerEndUserId,
|
|
596
|
+
context = reactApplicationContext
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
addConnectionV3(connection, uuid)
|
|
600
|
+
promise.resolve(uuid)
|
|
601
|
+
|
|
602
|
+
} catch (e: SpikeExceptions) {
|
|
603
|
+
promise.reject(e.mapException(), e.message)
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/// --- Read Health connect data ---
|
|
609
|
+
|
|
610
|
+
@ReactMethod
|
|
611
|
+
fun getStatisticsconnectionUUID(
|
|
612
|
+
connectionUUID: String,
|
|
613
|
+
types: ReadableArray, // [StatisticsType]
|
|
614
|
+
from: String, // Instant
|
|
615
|
+
to: String, // Instant
|
|
616
|
+
interval: String, // StatisticsInterval
|
|
617
|
+
filter: String?, // StatisticsFilter?
|
|
618
|
+
promise: Promise
|
|
619
|
+
) {
|
|
620
|
+
scope.launch {
|
|
621
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
622
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
623
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
624
|
+
)
|
|
625
|
+
val statTypes = types.toArrayList().mapNotNull {
|
|
626
|
+
StatisticsType.fromValue(it as String)
|
|
627
|
+
}.toSet()
|
|
628
|
+
val dateFrom = convertIsoStringToInstant(from)
|
|
629
|
+
val dateTo = convertIsoStringToInstant(to)
|
|
630
|
+
val statsInterval = StatisticsInterval.fromValue(interval)
|
|
631
|
+
val statsFilter = StatisticsFilter.fromValue(filter)
|
|
632
|
+
|
|
633
|
+
val result = connection.getStatistics(
|
|
634
|
+
types = statTypes,
|
|
635
|
+
from = dateFrom,
|
|
636
|
+
to = dateTo,
|
|
637
|
+
interval = statsInterval,
|
|
638
|
+
filter = statsFilter
|
|
639
|
+
)
|
|
640
|
+
|
|
641
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
@ReactMethod
|
|
646
|
+
fun getRecordsconnectionUUID(
|
|
647
|
+
connectionUUID: String,
|
|
648
|
+
types: ReadableArray, // [MetricType]
|
|
649
|
+
from: String, // Instant
|
|
650
|
+
to: String, // Instant
|
|
651
|
+
filter: String?, // StatisticsFilter?
|
|
652
|
+
promise: Promise
|
|
653
|
+
) {
|
|
654
|
+
scope.launch {
|
|
655
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
656
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
657
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
658
|
+
)
|
|
659
|
+
val statTypes = types.toArrayList().mapNotNull {
|
|
660
|
+
MetricType.fromValue(it as String)
|
|
661
|
+
}.toSet()
|
|
662
|
+
val dateFrom = convertIsoStringToInstant(from)
|
|
663
|
+
val dateTo = convertIsoStringToInstant(to)
|
|
664
|
+
val statsFilter = StatisticsFilter.fromValue(filter)
|
|
665
|
+
|
|
666
|
+
val result = connection.getRecords(
|
|
667
|
+
types = statTypes,
|
|
668
|
+
from = dateFrom,
|
|
669
|
+
to = dateTo,
|
|
670
|
+
filter = statsFilter
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/// --- Health connect permissions ---
|
|
678
|
+
|
|
679
|
+
@ReactMethod
|
|
680
|
+
fun checkHealthConnectAvailability(connectionUUID: String, promise: Promise) {
|
|
681
|
+
scope.launch {
|
|
682
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
683
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
684
|
+
"Connection not found (checkHealthConnectAvailability)"
|
|
685
|
+
)
|
|
686
|
+
|
|
687
|
+
val result = connection.checkHealthConnectAvailability()
|
|
688
|
+
promise.resolve(result.value)
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
@ReactMethod
|
|
693
|
+
fun openHealthConnectInstallation(connectionUUID: String, promise: Promise) {
|
|
694
|
+
scope.launch {
|
|
695
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
696
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
697
|
+
"Connection not found (openHealthConnectInstallation)"
|
|
698
|
+
)
|
|
699
|
+
|
|
700
|
+
connection.openHealthConnectInstallation()
|
|
701
|
+
promise.resolve(true)
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
@ReactMethod
|
|
706
|
+
fun enableHealthConnectIntegration(connectionUUID: String, promise: Promise) {
|
|
707
|
+
scope.launch {
|
|
708
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
709
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
710
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
711
|
+
)
|
|
712
|
+
|
|
713
|
+
connection.enableHealthConnectIntegration()
|
|
714
|
+
Log.d("SpikeSdkModule", "Health Connect integration enabled")
|
|
715
|
+
promise.resolve(true)
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
@ReactMethod
|
|
720
|
+
fun disableHealthConnectIntegration(connectionUUID: String, promise: Promise) {
|
|
721
|
+
scope.launch {
|
|
722
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
723
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
724
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
725
|
+
)
|
|
726
|
+
|
|
727
|
+
connection.disableHealthConnectIntegration()
|
|
728
|
+
Log.d("SpikeSdkModule", "Health Connect integration disabled")
|
|
729
|
+
promise.resolve(true)
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
@ReactMethod
|
|
734
|
+
fun isHealthConnectIntegrationEnabled(connectionUUID: String, promise: Promise) {
|
|
735
|
+
scope.launch {
|
|
736
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
737
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
738
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
739
|
+
)
|
|
740
|
+
|
|
741
|
+
val result = connection.isHealthConnectIntegrationEnabled()
|
|
742
|
+
Log.d("SpikeSdkModule", "Health Connect integration is " + if (result) { "enabled" } else ( "disabled" ))
|
|
743
|
+
promise.resolve(result)
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
@ReactMethod
|
|
748
|
+
fun getGrantedHealthKitPermissions(connectionUUID: String, promise: Promise) {
|
|
749
|
+
scope.launch {
|
|
750
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
751
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
752
|
+
"Connection not found (getGrantedHealthKitPermissions)"
|
|
753
|
+
)
|
|
754
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
755
|
+
return@launch promise.reject(
|
|
756
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
757
|
+
"Health Connect should be enabled before calling getGrantedHealthKitPermissions"
|
|
758
|
+
)
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
val permissions = connection
|
|
762
|
+
.getHealthConnectPermissionManager()
|
|
763
|
+
.getGrantedPermissions()
|
|
764
|
+
|
|
765
|
+
val result = Arguments.createArray()
|
|
766
|
+
permissions.forEach {
|
|
767
|
+
result.pushString(it)
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
Log.w("SpikeSdkModule", "$permissions")
|
|
771
|
+
promise.resolve(result)
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
@ReactMethod
|
|
776
|
+
fun getHealthConnectPermissionsForStatisticTypes(connectionUUID: String, statisticTypes: ReadableArray, promise: Promise) {
|
|
777
|
+
scope.launch {
|
|
778
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
779
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
780
|
+
"Connection not found (getPermissionsForHealthConnect)"
|
|
781
|
+
)
|
|
782
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
783
|
+
return@launch promise.reject(
|
|
784
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
785
|
+
"Health Connect should be enabled before calling getHealthConnectPermissionsForStatisticTypes"
|
|
786
|
+
)
|
|
787
|
+
}
|
|
788
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
789
|
+
|
|
790
|
+
val statTypes = statisticTypes.toArrayList().mapNotNull {
|
|
791
|
+
StatisticsType.fromValue(it as String)
|
|
792
|
+
}.toSet()
|
|
793
|
+
|
|
794
|
+
val permissions = permissionManager
|
|
795
|
+
.getPermissionsForStatistics(statisticsTypes = statTypes)
|
|
796
|
+
|
|
797
|
+
val result = Arguments.createArray()
|
|
798
|
+
permissions.forEach {
|
|
799
|
+
result.pushString(it)
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// Log.w("SpikeSdkModule", "$permissions")
|
|
803
|
+
promise.resolve(result)
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
@ReactMethod
|
|
808
|
+
fun revokeAllHealthConnectPermissions(connectionUUID: String, promise: Promise) {
|
|
809
|
+
scope.launch {
|
|
810
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
811
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
812
|
+
"Connection not found (revokeAllHealthConnectPermissions)"
|
|
813
|
+
)
|
|
814
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
815
|
+
return@launch promise.reject(
|
|
816
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
817
|
+
"Health Connect should be enabled before calling revokeAllHealthConnectPermissions"
|
|
818
|
+
)
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
connection
|
|
822
|
+
.getHealthConnectPermissionManager()
|
|
823
|
+
.revokeAllPermissions()
|
|
824
|
+
|
|
825
|
+
promise.resolve(true)
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
@ReactMethod
|
|
830
|
+
fun requestPermissionsFromHealthConnect(connectionUUID: String, permissions: ReadableArray, promise: Promise) {
|
|
831
|
+
scope.launch {
|
|
832
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
833
|
+
SpikeExceptions.SpikeException(
|
|
834
|
+
"Connection not found"
|
|
835
|
+
).mapException(), "Connection not found"
|
|
836
|
+
)
|
|
837
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
838
|
+
return@launch promise.reject(
|
|
839
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
840
|
+
"Health Connect should be enabled before calling requestPermissionsFromHealthConnect"
|
|
841
|
+
)
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
845
|
+
val permissionsStrings = permissions.toArrayList().map{ it as String }.toSet()
|
|
846
|
+
|
|
847
|
+
if (checkIfAllPermissionsAreGranted(permissionManager, permissionsStrings)) {
|
|
848
|
+
// All permissions granted, nothing to do here
|
|
849
|
+
promise.resolve(true)
|
|
850
|
+
return@launch
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
Log.d("SpikeSdkModule", "Will ask for following Health Connect permissions: $permissions")
|
|
854
|
+
|
|
855
|
+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) {
|
|
856
|
+
startHealthConnectRequest_oldAndroid(connectionUUID, permissionManager, permissionsStrings, promise)
|
|
857
|
+
} else {
|
|
858
|
+
startHealthConnectRequest(connectionUUID, permissionManager, permissionsStrings, promise)
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
private fun startHealthConnectRequest_oldAndroid(connectionUUID: String, permissionManager: HealthConnectPermissionManager, permissions: Set<String>, promise: Promise) {
|
|
864
|
+
// val availability = connection.getHealthConnectAvailability()
|
|
865
|
+
// && availability == HealthConnectAvailability.INSTALLED
|
|
866
|
+
val intent = permissionManager.getRequestPermissionResultContract().createIntent(
|
|
867
|
+
reactApplicationContext, permissions
|
|
868
|
+
)
|
|
869
|
+
|
|
870
|
+
reactApplicationContext.currentActivity?.startActivityForResult(
|
|
871
|
+
intent,
|
|
872
|
+
REQUEST_CODE
|
|
873
|
+
)
|
|
874
|
+
promise.resolve(true)
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
private var checkPermissionsForV3: Triple<String, Set<String>, Promise>? = null
|
|
878
|
+
|
|
879
|
+
private fun startHealthConnectRequest(connectionUUID: String, permissionManager: HealthConnectPermissionManager, permissions: Set<String>, promise: Promise) {
|
|
880
|
+
val activity = reactApplicationContext.currentActivity
|
|
881
|
+
if (!(activity is ComponentActivity)) {
|
|
882
|
+
promise.resolve(false)
|
|
883
|
+
return
|
|
884
|
+
}
|
|
885
|
+
checkPermissionsForV3 = Triple(
|
|
886
|
+
connectionUUID,
|
|
887
|
+
permissions,
|
|
888
|
+
promise
|
|
889
|
+
)
|
|
890
|
+
val launcher = activity.registerActivityResultLauncher(permissionManager.getRequestPermissionResultContract()) {
|
|
891
|
+
|
|
892
|
+
}
|
|
893
|
+
launcher.launch(permissions)
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
@ReactMethod
|
|
897
|
+
fun areAllPermissionsGranted(connectionUUID: String, permissions: Set<String>, promise: Promise) {
|
|
898
|
+
scope.launch {
|
|
899
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
900
|
+
SpikeExceptions.SpikeException(
|
|
901
|
+
"Connection not found"
|
|
902
|
+
).mapException(), "Connection not found"
|
|
903
|
+
)
|
|
904
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
905
|
+
return@launch promise.reject(
|
|
906
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
907
|
+
"Health Connect should be enabled before calling areAllPermissionsGranted"
|
|
908
|
+
)
|
|
909
|
+
}
|
|
910
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
911
|
+
|
|
912
|
+
val permissionsGranted: Boolean = checkIfAllPermissionsAreGranted(permissionManager, permissions)
|
|
913
|
+
promise.resolve(permissionsGranted)
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
private suspend fun checkIfAllPermissionsAreGranted(permissionManager: HealthConnectPermissionManager, permissions: Set<String>): Boolean {
|
|
918
|
+
return permissionManager.getGrantedPermissions().containsAll(permissions)
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
/// --- Private stuff ---
|
|
922
|
+
|
|
923
|
+
// Do not use this directly, use `addConnection` and `getConnection` instead
|
|
924
|
+
private val _connectionsV3 = mutableMapOf<String, SpikeConnectionAPIv3>()
|
|
925
|
+
|
|
926
|
+
private val mutexV3 = Mutex()
|
|
927
|
+
|
|
928
|
+
// Add new connection to the dictionary in a thread-safe manner
|
|
929
|
+
private suspend fun addConnectionV3(connection: SpikeConnectionAPIv3, uuid: String) {
|
|
930
|
+
mutex.withLock {
|
|
931
|
+
_connectionsV3[uuid] = connection
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
// Synchronised read for safe multithreaded usage
|
|
936
|
+
private suspend fun getConnectionV3(uuid: String): SpikeConnectionAPIv3? {
|
|
937
|
+
mutex.withLock {
|
|
938
|
+
return _connectionsV3[uuid]
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
557
942
|
}
|
|
943
|
+
|
|
944
|
+
private fun convertIsoStringToInstant(isoString: String): Instant {
|
|
945
|
+
return Instant.parse(isoString)
|
|
946
|
+
}
|
|
@@ -98,6 +98,8 @@ const unwrapSpikeException = error => {
|
|
|
98
98
|
return new SpikeException("SpikeConnectionNotFoundException");
|
|
99
99
|
case 'SpikeDataDecodingException':
|
|
100
100
|
return new SpikeException("SpikeDataDecodingException:" + error.message);
|
|
101
|
+
case 'SpikeApiException':
|
|
102
|
+
return new SpikeException(error.message);
|
|
101
103
|
default:
|
|
102
104
|
return new SpikeException("Default SpikeException: " + error.message);
|
|
103
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SpikeException","Error","constructor","message","exports","SpikeConnectionIsClosedException","SpikeInvalidCredentialsException","SpikeInvalidDateRangeException","SpikeInvalidCallbackUrlException","SpikePackException","SpikePermissionsNotGrantedException","SpikeServerException","SpikeUnpackException","SpikeCallbackURLNotProvidedException","SpikeHealthDataNotAvailableException","unwrapSpikeException","error","code"],"sourceRoot":"../../src","sources":["SpikeException.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["SpikeException","Error","constructor","message","exports","SpikeConnectionIsClosedException","SpikeInvalidCredentialsException","SpikeInvalidDateRangeException","SpikeInvalidCallbackUrlException","SpikePackException","SpikePermissionsNotGrantedException","SpikeServerException","SpikeUnpackException","SpikeCallbackURLNotProvidedException","SpikeHealthDataNotAvailableException","unwrapSpikeException","error","code"],"sourceRoot":"../../src","sources":["SpikeException.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -15,6 +15,12 @@ Object.defineProperty(exports, "ActivityType", {
|
|
|
15
15
|
return _ActivityType.ActivityType;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
|
+
Object.defineProperty(exports, "HealthConnectAvailabilityStatus", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _HealthConnectAvailabilityStatus.HealthConnectAvailabilityStatus;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
18
24
|
Object.defineProperty(exports, "InputMethod", {
|
|
19
25
|
enumerable: true,
|
|
20
26
|
get: function () {
|
|
@@ -163,6 +169,7 @@ var _StatisticsType = require("./v3/DataModels/StatisticsType");
|
|
|
163
169
|
var _StatisticsInterval = require("./v3/DataModels/StatisticsInterval");
|
|
164
170
|
var _Unit = require("./v3/DataModels/Unit");
|
|
165
171
|
var _StatisticsFilter = require("./v3/StatisticsFilter");
|
|
172
|
+
var _HealthConnectAvailabilityStatus = require("./v3/DataModels/HealthConnectAvailabilityStatus");
|
|
166
173
|
var _default = exports.default = {
|
|
167
174
|
createConnection: _Spike.createConnection,
|
|
168
175
|
getBackgroundConnections: _Spike.getBackgroundConnections,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_SpikeDataTypes","require","_Spike","_SpikeConnection","_SpikeException","_SpikeRNConnectionAPIv","_ActivityTag","_ActivityType","_InputMethod","_MetricType","_Provider","_ProviderSource","_StatisticsType","_StatisticsInterval","_Unit","_StatisticsFilter","_default","exports","default","createConnection","getBackgroundConnections","ensurePermissionsAreGranted","isPackageInstalled","isHealthDataAvailable","createConnectionAPIv3"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_SpikeDataTypes","require","_Spike","_SpikeConnection","_SpikeException","_SpikeRNConnectionAPIv","_ActivityTag","_ActivityType","_InputMethod","_MetricType","_Provider","_ProviderSource","_StatisticsType","_StatisticsInterval","_Unit","_StatisticsFilter","_HealthConnectAvailabilityStatus","_default","exports","default","createConnection","getBackgroundConnections","ensurePermissionsAreGranted","isPackageInstalled","isHealthDataAvailable","createConnectionAPIv3"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AASA,IAAAE,gBAAA,GAAAF,OAAA;AAIA,IAAAG,eAAA,GAAAH,OAAA;AAkEA,IAAAI,sBAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAN,OAAA;AACA,IAAAO,YAAA,GAAAP,OAAA;AACA,IAAAQ,WAAA,GAAAR,OAAA;AACA,IAAAS,SAAA,GAAAT,OAAA;AACA,IAAAU,eAAA,GAAAV,OAAA;AACA,IAAAW,eAAA,GAAAX,OAAA;AACA,IAAAY,mBAAA,GAAAZ,OAAA;AACA,IAAAa,KAAA,GAAAb,OAAA;AACA,IAAAc,iBAAA,GAAAd,OAAA;AACA,IAAAe,gCAAA,GAAAf,OAAA;AAAkG,IAAAgB,QAAA,GAAAC,OAAA,CAAAC,OAAA,GArDnF;EACbC,gBAAgB,EAAhBA,uBAAgB;EAChBC,wBAAwB,EAAxBA,+BAAwB;EACxBC,2BAA2B,EAA3BA,kCAA2B;EAC3BC,kBAAkB,EAAlBA,yBAAkB;EAClBC,qBAAqB,EAArBA,4BAAqB;EACrB;EACAC,qBAAqB,EAArBA;AACF,CAAC,EAiCD","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.HealthConnectAvailabilityStatus = void 0;
|
|
7
|
+
let HealthConnectAvailabilityStatus = exports.HealthConnectAvailabilityStatus = /*#__PURE__*/function (HealthConnectAvailabilityStatus) {
|
|
8
|
+
HealthConnectAvailabilityStatus["notInstalled"] = "NOT_INSTALLED";
|
|
9
|
+
HealthConnectAvailabilityStatus["updateRequired"] = "UPDATE_REQUIRED";
|
|
10
|
+
HealthConnectAvailabilityStatus["installed"] = "INSTALLED";
|
|
11
|
+
return HealthConnectAvailabilityStatus;
|
|
12
|
+
}({});
|
|
13
|
+
//# sourceMappingURL=HealthConnectAvailabilityStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["HealthConnectAvailabilityStatus","exports"],"sourceRoot":"../../../../src","sources":["v3/DataModels/HealthConnectAvailabilityStatus.ts"],"mappings":";;;;;;IACYA,+BAA+B,GAAAC,OAAA,CAAAD,+BAAA,0BAA/BA,+BAA+B;EAA/BA,+BAA+B;EAA/BA,+BAA+B;EAA/BA,+BAA+B;EAAA,OAA/BA,+BAA+B;AAAA","ignoreList":[]}
|