react-native-spike-sdk 4.0.13-beta.1 → 4.0.13-beta.11
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 +585 -0
- package/ios/SpikeExceptionMapper.swift +35 -31
- package/ios/SpikeSdk.m +27 -4
- package/ios/SpikeSdk.swift +180 -14
- package/ios/SpikeSdk.xcodeproj/project.xcworkspace/xcuserdata/jaroslav.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/lib/commonjs/Spike.js +7 -3
- package/lib/commonjs/Spike.js.map +1 -1
- package/lib/commonjs/SpikeException.js +5 -3
- package/lib/commonjs/SpikeException.js.map +1 -1
- package/lib/commonjs/index.js +76 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/v3/DataModels/ActivityAdditionalData.js +18 -0
- package/lib/commonjs/v3/DataModels/ActivityAdditionalData.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivityConfig.js +17 -0
- package/lib/commonjs/v3/DataModels/ActivityConfig.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivityEntry.js +2 -0
- package/lib/commonjs/v3/DataModels/ActivityEntry.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivitySamples.js +2 -0
- package/lib/commonjs/v3/DataModels/ActivitySamples.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivityTag.js +5 -1
- package/lib/commonjs/v3/DataModels/ActivityTag.js.map +1 -1
- package/lib/commonjs/v3/DataModels/ActivityType.js +2 -1
- package/lib/commonjs/v3/DataModels/ActivityType.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/DataModels/InputMethod.js +2 -1
- package/lib/commonjs/v3/DataModels/InputMethod.js.map +1 -1
- package/lib/commonjs/v3/DataModels/MetricType.js +36 -2
- package/lib/commonjs/v3/DataModels/MetricType.js.map +1 -1
- package/lib/commonjs/v3/DataModels/Provider.js +2 -13
- package/lib/commonjs/v3/DataModels/Provider.js.map +1 -1
- package/lib/commonjs/v3/DataModels/ProviderSource.js +7 -1
- package/lib/commonjs/v3/DataModels/ProviderSource.js.map +1 -1
- package/lib/commonjs/v3/DataModels/RecordSource.js +2 -0
- package/lib/commonjs/v3/DataModels/RecordSource.js.map +1 -0
- package/lib/commonjs/v3/DataModels/SleepConfig.js +15 -0
- package/lib/commonjs/v3/DataModels/SleepConfig.js.map +1 -0
- package/lib/commonjs/v3/DataModels/StatisticsInterval.js +3 -3
- package/lib/commonjs/v3/DataModels/StatisticsInterval.js.map +1 -1
- package/lib/commonjs/v3/DataModels/StatisticsType.js +2 -1
- package/lib/commonjs/v3/DataModels/StatisticsType.js.map +1 -1
- package/lib/commonjs/v3/DataModels/Unit.js +2 -1
- package/lib/commonjs/v3/DataModels/Unit.js.map +1 -1
- package/lib/commonjs/v3/DataModels/UserInfoResponse.js +6 -0
- package/lib/commonjs/v3/DataModels/UserInfoResponse.js.map +1 -0
- package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js +199 -29
- package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js.map +1 -1
- package/lib/commonjs/v3/StatisticsFilter.js +6 -1
- package/lib/commonjs/v3/StatisticsFilter.js.map +1 -1
- package/lib/commonjs/version.js +9 -0
- package/lib/commonjs/version.js.map +1 -0
- package/lib/module/Spike.js +7 -3
- package/lib/module/Spike.js.map +1 -1
- package/lib/module/SpikeException.js +5 -3
- package/lib/module/SpikeException.js.map +1 -1
- package/lib/module/index.js +7 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/v3/DataModels/ActivityAdditionalData.js +12 -0
- package/lib/module/v3/DataModels/ActivityAdditionalData.js.map +1 -0
- package/lib/module/v3/DataModels/ActivityConfig.js +10 -0
- package/lib/module/v3/DataModels/ActivityConfig.js.map +1 -0
- package/lib/module/v3/DataModels/ActivityEntry.js +2 -0
- package/lib/module/v3/DataModels/ActivityEntry.js.map +1 -0
- package/lib/module/v3/DataModels/ActivitySamples.js +2 -0
- package/lib/module/v3/DataModels/ActivitySamples.js.map +1 -0
- package/lib/module/v3/DataModels/ActivityTag.js +5 -2
- package/lib/module/v3/DataModels/ActivityTag.js.map +1 -1
- package/lib/module/v3/DataModels/ActivityType.js +2 -2
- package/lib/module/v3/DataModels/ActivityType.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/DataModels/InputMethod.js +2 -2
- package/lib/module/v3/DataModels/InputMethod.js.map +1 -1
- package/lib/module/v3/DataModels/MetricType.js +36 -3
- package/lib/module/v3/DataModels/MetricType.js.map +1 -1
- package/lib/module/v3/DataModels/Provider.js +2 -14
- package/lib/module/v3/DataModels/Provider.js.map +1 -1
- package/lib/module/v3/DataModels/ProviderSource.js +7 -2
- package/lib/module/v3/DataModels/ProviderSource.js.map +1 -1
- package/lib/module/v3/DataModels/RecordSource.js +2 -0
- package/lib/module/v3/DataModels/RecordSource.js.map +1 -0
- package/lib/module/v3/DataModels/SleepConfig.js +8 -0
- package/lib/module/v3/DataModels/SleepConfig.js.map +1 -0
- package/lib/module/v3/DataModels/StatisticsInterval.js +3 -4
- package/lib/module/v3/DataModels/StatisticsInterval.js.map +1 -1
- package/lib/module/v3/DataModels/StatisticsType.js +2 -2
- package/lib/module/v3/DataModels/StatisticsType.js.map +1 -1
- package/lib/module/v3/DataModels/Unit.js +2 -2
- package/lib/module/v3/DataModels/Unit.js.map +1 -1
- package/lib/module/v3/DataModels/UserInfoResponse.js +2 -0
- package/lib/module/v3/DataModels/UserInfoResponse.js.map +1 -0
- package/lib/module/v3/SpikeRNConnectionAPIv3.js +199 -29
- package/lib/module/v3/SpikeRNConnectionAPIv3.js.map +1 -1
- package/lib/module/v3/StatisticsFilter.js +6 -1
- package/lib/module/v3/StatisticsFilter.js.map +1 -1
- package/lib/module/version.js +3 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/DataModels/SpikeActivitiesStreamDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeActivitiesSummaryDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeBodyDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeBreathingDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeCaloriesDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeData.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeDataTypes.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeDistanceDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeEcgDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeGlucoseDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeHeartDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeOxygenSaturationDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeSleepDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeStepsDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeStepsIntradayDataEntry.d.ts.map +1 -0
- package/lib/typescript/DataModels/SpikeWebhookJob.d.ts.map +1 -0
- package/lib/typescript/DataTypes/SpikeDataType.d.ts.map +1 -0
- package/lib/typescript/{src/Spike.d.ts → Spike.d.ts} +7 -2
- package/lib/typescript/Spike.d.ts.map +1 -0
- package/lib/typescript/SpikeBackgroundDeliveriesLogger.d.ts.map +1 -0
- package/lib/typescript/SpikeConnection.d.ts.map +1 -0
- package/lib/typescript/SpikeConnectionTypes.d.ts.map +1 -0
- package/lib/typescript/SpikeException.d.ts.map +1 -0
- package/lib/typescript/SpikeLogger.d.ts.map +1 -0
- package/lib/typescript/SpikeSdk.d.ts.map +1 -0
- package/lib/typescript/{src/index.d.ts → index.d.ts} +15 -4
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/v3/Conversion.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityAdditionalData.d.ts +9 -0
- package/lib/typescript/v3/DataModels/ActivityAdditionalData.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityConfig.d.ts +12 -0
- package/lib/typescript/v3/DataModels/ActivityConfig.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityEntry.d.ts +11 -0
- package/lib/typescript/v3/DataModels/ActivityEntry.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivitySamples.d.ts +8 -0
- package/lib/typescript/v3/DataModels/ActivitySamples.d.ts.map +1 -0
- package/lib/typescript/{src/v3 → v3}/DataModels/ActivityTag.d.ts +3 -0
- package/lib/typescript/v3/DataModels/ActivityTag.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityType.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/HealthConnectAvailabilityStatus.d.ts +6 -0
- package/lib/typescript/v3/DataModels/HealthConnectAvailabilityStatus.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/InputMethod.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/MetricType.d.ts +45 -0
- package/lib/typescript/v3/DataModels/MetricType.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/Provider.d.ts +14 -0
- package/lib/typescript/v3/DataModels/Provider.d.ts.map +1 -0
- package/lib/typescript/{src/v3 → v3}/DataModels/ProviderSource.d.ts +5 -0
- package/lib/typescript/v3/DataModels/ProviderSource.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/RecordSource.d.ts +11 -0
- package/lib/typescript/v3/DataModels/RecordSource.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/SleepConfig.d.ts +9 -0
- package/lib/typescript/v3/DataModels/SleepConfig.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/SpikeRecord.d.ts +33 -0
- package/lib/typescript/v3/DataModels/SpikeRecord.d.ts.map +1 -0
- package/lib/typescript/{src/v3 → v3}/DataModels/Statistic.d.ts +2 -2
- package/lib/typescript/v3/DataModels/Statistic.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/StatisticsInterval.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/StatisticsType.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/UUID.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/Unit.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/UserInfoResponse.d.ts +12 -0
- package/lib/typescript/v3/DataModels/UserInfoResponse.d.ts.map +1 -0
- package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts +133 -0
- package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts.map +1 -0
- package/lib/typescript/v3/StatisticsFilter.d.ts +14 -0
- package/lib/typescript/v3/StatisticsFilter.d.ts.map +1 -0
- package/lib/typescript/version.d.ts +2 -0
- package/lib/typescript/version.d.ts.map +1 -0
- package/package.json +12 -7
- package/src/Spike.ts +12 -5
- package/src/SpikeException.ts +18 -3
- package/src/index.ts +33 -2
- package/src/v3/DataModels/ActivityAdditionalData.ts +11 -0
- package/src/v3/DataModels/ActivityConfig.ts +20 -0
- package/src/v3/DataModels/ActivityEntry.ts +11 -0
- package/src/v3/DataModels/ActivitySamples.ts +10 -0
- package/src/v3/DataModels/ActivityTag.ts +6 -2
- package/src/v3/DataModels/ActivityType.ts +3 -2
- package/src/v3/DataModels/HealthConnectAvailabilityStatus.ts +6 -0
- package/src/v3/DataModels/InputMethod.ts +3 -2
- package/src/v3/DataModels/MetricType.ts +37 -3
- package/src/v3/DataModels/Provider.ts +3 -14
- package/src/v3/DataModels/ProviderSource.ts +8 -2
- package/src/v3/DataModels/RecordSource.ts +13 -0
- package/src/v3/DataModels/SleepConfig.ts +18 -0
- package/src/v3/DataModels/SpikeRecord.ts +25 -23
- package/src/v3/DataModels/Statistic.ts +12 -10
- package/src/v3/DataModels/StatisticsInterval.ts +3 -7
- package/src/v3/DataModels/StatisticsType.ts +3 -2
- package/src/v3/DataModels/Unit.ts +3 -2
- package/src/v3/DataModels/UserInfoResponse.ts +13 -0
- package/src/v3/SpikeRNConnectionAPIv3.ts +314 -51
- package/src/v3/StatisticsFilter.ts +14 -1
- package/src/version.ts +3 -0
- package/lib/typescript/src/DataModels/SpikeActivitiesStreamDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeActivitiesSummaryDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeBodyDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeBreathingDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeCaloriesDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeData.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeDataTypes.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeDistanceDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeEcgDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeGlucoseDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeHeartDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeOxygenSaturationDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeSleepDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeStepsDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeStepsIntradayDataEntry.d.ts.map +0 -1
- package/lib/typescript/src/DataModels/SpikeWebhookJob.d.ts.map +0 -1
- package/lib/typescript/src/DataTypes/SpikeDataType.d.ts.map +0 -1
- package/lib/typescript/src/Spike.d.ts.map +0 -1
- package/lib/typescript/src/SpikeBackgroundDeliveriesLogger.d.ts.map +0 -1
- package/lib/typescript/src/SpikeConnection.d.ts.map +0 -1
- package/lib/typescript/src/SpikeConnectionTypes.d.ts.map +0 -1
- package/lib/typescript/src/SpikeException.d.ts.map +0 -1
- package/lib/typescript/src/SpikeLogger.d.ts.map +0 -1
- package/lib/typescript/src/SpikeSdk.d.ts.map +0 -1
- package/lib/typescript/src/index.d.ts.map +0 -1
- package/lib/typescript/src/v3/Conversion.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/ActivityTag.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/ActivityType.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/InputMethod.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/MetricType.d.ts +0 -12
- package/lib/typescript/src/v3/DataModels/MetricType.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/Provider.d.ts +0 -26
- package/lib/typescript/src/v3/DataModels/Provider.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/ProviderSource.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/SpikeRecord.d.ts +0 -30
- package/lib/typescript/src/v3/DataModels/SpikeRecord.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/Statistic.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/StatisticsInterval.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/StatisticsType.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/UUID.d.ts.map +0 -1
- package/lib/typescript/src/v3/DataModels/Unit.d.ts.map +0 -1
- package/lib/typescript/src/v3/SpikeRNConnectionAPIv3.d.ts +0 -14
- package/lib/typescript/src/v3/SpikeRNConnectionAPIv3.d.ts.map +0 -1
- package/lib/typescript/src/v3/StatisticsFilter.d.ts +0 -7
- package/lib/typescript/src/v3/StatisticsFilter.d.ts.map +0 -1
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeActivitiesStreamDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeActivitiesSummaryDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeBodyDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeBreathingDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeCaloriesDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeData.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeDataTypes.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeDistanceDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeEcgDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeGlucoseDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeHeartDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeOxygenSaturationDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeSleepDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeStepsDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeStepsIntradayDataEntry.d.ts +0 -0
- /package/lib/typescript/{src/DataModels → DataModels}/SpikeWebhookJob.d.ts +0 -0
- /package/lib/typescript/{src/DataTypes → DataTypes}/SpikeDataType.d.ts +0 -0
- /package/lib/typescript/{src/SpikeBackgroundDeliveriesLogger.d.ts → SpikeBackgroundDeliveriesLogger.d.ts} +0 -0
- /package/lib/typescript/{src/SpikeConnection.d.ts → SpikeConnection.d.ts} +0 -0
- /package/lib/typescript/{src/SpikeConnectionTypes.d.ts → SpikeConnectionTypes.d.ts} +0 -0
- /package/lib/typescript/{src/SpikeException.d.ts → SpikeException.d.ts} +0 -0
- /package/lib/typescript/{src/SpikeLogger.d.ts → SpikeLogger.d.ts} +0 -0
- /package/lib/typescript/{src/SpikeSdk.d.ts → SpikeSdk.d.ts} +0 -0
- /package/lib/typescript/{src/v3 → v3}/Conversion.d.ts +0 -0
- /package/lib/typescript/{src/v3 → v3}/DataModels/ActivityType.d.ts +0 -0
- /package/lib/typescript/{src/v3 → v3}/DataModels/InputMethod.d.ts +0 -0
- /package/lib/typescript/{src/v3 → v3}/DataModels/StatisticsInterval.d.ts +0 -0
- /package/lib/typescript/{src/v3 → v3}/DataModels/StatisticsType.d.ts +0 -0
- /package/lib/typescript/{src/v3 → v3}/DataModels/UUID.d.ts +0 -0
- /package/lib/typescript/{src/v3 → v3}/DataModels/Unit.d.ts +0 -0
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.6'
|
|
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,19 @@ 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.ActivityConfig
|
|
20
|
+
import com.spikeapi.apiv3.datamodels.SleepConfig
|
|
21
|
+
import com.spikeapi.apiv3.datamodels.StatisticsType
|
|
22
|
+
import com.spikeapi.apiv3.datamodels.utils.ActivityConfigUtils
|
|
23
|
+
import com.spikeapi.apiv3.datamodels.utils.SleepConfigUtils
|
|
24
|
+
import com.spikeapi.apiv3.datamodels.utils.StatisticsTypeUtils
|
|
25
|
+
import com.spikeapi.apiv3.datamodels.utils.StatisticsIntervalUtils
|
|
26
|
+
import com.spikeapi.apiv3.datamodels.utils.MetricTypeUtils
|
|
27
|
+
import com.spikeapi.apiv3.datamodels.StatisticsInterval
|
|
28
|
+
import com.spikeapi.apiv3.datamodels.StatisticsFilter
|
|
29
|
+
import com.spikeapi.apiv3.healthconnect.HealthConnectPermissionManager
|
|
17
30
|
import kotlinx.coroutines.CoroutineScope
|
|
18
31
|
import kotlinx.coroutines.Dispatchers
|
|
19
32
|
import kotlinx.coroutines.SupervisorJob
|
|
@@ -22,6 +35,10 @@ import kotlinx.coroutines.sync.Mutex
|
|
|
22
35
|
import kotlinx.coroutines.sync.withLock
|
|
23
36
|
import java.time.OffsetDateTime
|
|
24
37
|
import java.util.UUID
|
|
38
|
+
import android.util.Log
|
|
39
|
+
import java.time.Instant
|
|
40
|
+
import java.time.format.DateTimeParseException
|
|
41
|
+
|
|
25
42
|
|
|
26
43
|
fun <I, O> ComponentActivity.registerActivityResultLauncher(
|
|
27
44
|
contract: ActivityResultContract<I, O>,
|
|
@@ -513,7 +530,9 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
513
530
|
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
514
531
|
.emit(eventName, params)
|
|
515
532
|
}
|
|
533
|
+
|
|
516
534
|
override fun onHostResume() {
|
|
535
|
+
// Old SDK
|
|
517
536
|
checkPermissionsFor?.let {
|
|
518
537
|
it.second.forEach { permission ->
|
|
519
538
|
checkPermissionsGranted(
|
|
@@ -524,6 +543,12 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
524
543
|
}
|
|
525
544
|
}
|
|
526
545
|
checkPermissionsFor = null
|
|
546
|
+
|
|
547
|
+
// New SDK V3
|
|
548
|
+
checkPermissionsForV3?.let {
|
|
549
|
+
areAllPermissionsGranted(it.first, it.second, it.third)
|
|
550
|
+
}
|
|
551
|
+
checkPermissionsForV3 = null
|
|
527
552
|
}
|
|
528
553
|
|
|
529
554
|
override fun onHostPause() {
|
|
@@ -554,4 +579,564 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
554
579
|
}
|
|
555
580
|
}
|
|
556
581
|
|
|
582
|
+
// ------------------------- V3 -------------------------
|
|
583
|
+
|
|
584
|
+
@ReactMethod
|
|
585
|
+
fun setWrapper(type: String, version: String) {
|
|
586
|
+
SpikeConnectionAPIv3.setWrapper(type, version)
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
@ReactMethod
|
|
590
|
+
fun createConnectionAPIv3(
|
|
591
|
+
uuid: String,
|
|
592
|
+
appId: String,
|
|
593
|
+
authToken: String,
|
|
594
|
+
customerEndUserId: String,
|
|
595
|
+
promise: Promise
|
|
596
|
+
) {
|
|
597
|
+
scope.launch {
|
|
598
|
+
try {
|
|
599
|
+
val connection = SpikeConnectionAPIv3.createConnection(
|
|
600
|
+
appId = appId,
|
|
601
|
+
authToken = authToken,
|
|
602
|
+
customerEndUserId = customerEndUserId,
|
|
603
|
+
context = reactApplicationContext
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
addConnectionV3(connection, uuid)
|
|
607
|
+
promise.resolve(uuid)
|
|
608
|
+
|
|
609
|
+
} catch (e: SpikeExceptions) {
|
|
610
|
+
promise.reject(e.mapException(), e.message)
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/// --- Read user info ---
|
|
616
|
+
|
|
617
|
+
@ReactMethod
|
|
618
|
+
fun getUserInfo(
|
|
619
|
+
connectionUUID: String,
|
|
620
|
+
promise: Promise
|
|
621
|
+
) {
|
|
622
|
+
scope.launch {
|
|
623
|
+
try {
|
|
624
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
625
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
626
|
+
"Connection not found (getUserInfo)"
|
|
627
|
+
)
|
|
628
|
+
|
|
629
|
+
val result = connection.getUserInfo()
|
|
630
|
+
|
|
631
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
632
|
+
|
|
633
|
+
} catch (e: SpikeExceptions) {
|
|
634
|
+
promise.reject(e.mapException(), e.message)
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/// --- Read Health connect data ---
|
|
640
|
+
|
|
641
|
+
@ReactMethod
|
|
642
|
+
fun getStatistics(
|
|
643
|
+
connectionUUID: String,
|
|
644
|
+
types: ReadableArray, // [StatisticsType]
|
|
645
|
+
from: String, // Instant
|
|
646
|
+
to: String, // Instant
|
|
647
|
+
interval: String, // StatisticsInterval
|
|
648
|
+
filter: String?, // StatisticsFilter?
|
|
649
|
+
promise: Promise
|
|
650
|
+
) {
|
|
651
|
+
scope.launch {
|
|
652
|
+
try {
|
|
653
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
654
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
655
|
+
"Connection not found (getStatistics)"
|
|
656
|
+
)
|
|
657
|
+
val statTypes = types.toArrayList().mapNotNull {
|
|
658
|
+
StatisticsTypeUtils.fromValue(it as String)
|
|
659
|
+
}.toSet()
|
|
660
|
+
val dateFrom = convertIsoStringToInstant(from)
|
|
661
|
+
val dateTo = convertIsoStringToInstant(to)
|
|
662
|
+
val statsInterval = StatisticsIntervalUtils.fromValue(interval)
|
|
663
|
+
val statsFilter = StatisticsFilter.fromValue(filter)
|
|
664
|
+
|
|
665
|
+
val result = connection.getStatistics(
|
|
666
|
+
types = statTypes,
|
|
667
|
+
from = dateFrom,
|
|
668
|
+
to = dateTo,
|
|
669
|
+
interval = statsInterval,
|
|
670
|
+
filter = statsFilter
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
674
|
+
|
|
675
|
+
} catch (e: SpikeExceptions) {
|
|
676
|
+
promise.reject(e.mapException(), e.message)
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
@ReactMethod
|
|
682
|
+
fun getRecords(
|
|
683
|
+
connectionUUID: String,
|
|
684
|
+
types: ReadableArray, // [MetricType]
|
|
685
|
+
from: String, // Instant
|
|
686
|
+
to: String, // Instant
|
|
687
|
+
filter: String?, // StatisticsFilter?
|
|
688
|
+
promise: Promise
|
|
689
|
+
) {
|
|
690
|
+
scope.launch {
|
|
691
|
+
try {
|
|
692
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
693
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
694
|
+
"Connection not found (getRecords)"
|
|
695
|
+
)
|
|
696
|
+
val statTypes = types.toArrayList().mapNotNull {
|
|
697
|
+
MetricTypeUtils.fromValue(it as String)
|
|
698
|
+
}.toSet()
|
|
699
|
+
val dateFrom = convertIsoStringToInstant(from)
|
|
700
|
+
val dateTo = convertIsoStringToInstant(to)
|
|
701
|
+
val statsFilter = StatisticsFilter.fromValue(filter)
|
|
702
|
+
|
|
703
|
+
val result = connection.getRecords(
|
|
704
|
+
types = statTypes,
|
|
705
|
+
from = dateFrom,
|
|
706
|
+
to = dateTo,
|
|
707
|
+
filter = statsFilter
|
|
708
|
+
)
|
|
709
|
+
|
|
710
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
711
|
+
|
|
712
|
+
} catch (e: SpikeExceptions) {
|
|
713
|
+
promise.reject(e.mapException(), e.message)
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
@ReactMethod
|
|
719
|
+
fun getActivities(
|
|
720
|
+
connectionUUID: String,
|
|
721
|
+
configJson: String, // ActivityConfig
|
|
722
|
+
from: String, // Instant
|
|
723
|
+
to: String, // Instant
|
|
724
|
+
filter: String?, // StatisticsFilter?
|
|
725
|
+
promise: Promise
|
|
726
|
+
) {
|
|
727
|
+
scope.launch {
|
|
728
|
+
try {
|
|
729
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
730
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
731
|
+
"Connection not found (getActivities)"
|
|
732
|
+
)
|
|
733
|
+
val dateFrom = convertIsoStringToInstant(from)
|
|
734
|
+
val dateTo = convertIsoStringToInstant(to)
|
|
735
|
+
val statsFilter = StatisticsFilter.fromValue(filter)
|
|
736
|
+
val configObject = ActivityConfigUtils.fromValue(configJson) ?: ActivityConfig()
|
|
737
|
+
|
|
738
|
+
val result = connection.getActivities(
|
|
739
|
+
config = configObject,
|
|
740
|
+
from = dateFrom,
|
|
741
|
+
to = dateTo,
|
|
742
|
+
filter = statsFilter
|
|
743
|
+
)
|
|
744
|
+
|
|
745
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
746
|
+
|
|
747
|
+
} catch (e: SpikeExceptions) {
|
|
748
|
+
promise.reject(e.mapException(), e.message)
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
@ReactMethod
|
|
754
|
+
fun getSleep(
|
|
755
|
+
connectionUUID: String,
|
|
756
|
+
configJson: String, // SleepConfig
|
|
757
|
+
from: String, // Instant
|
|
758
|
+
to: String, // Instant
|
|
759
|
+
filter: String?, // StatisticsFilter?
|
|
760
|
+
promise: Promise
|
|
761
|
+
) {
|
|
762
|
+
scope.launch {
|
|
763
|
+
try {
|
|
764
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
765
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
766
|
+
"Connection not found (getSleep)"
|
|
767
|
+
)
|
|
768
|
+
val dateFrom = convertIsoStringToInstant(from)
|
|
769
|
+
val dateTo = convertIsoStringToInstant(to)
|
|
770
|
+
val statsFilter = StatisticsFilter.fromValue(filter)
|
|
771
|
+
val configObject = SleepConfigUtils.fromValue(configJson) ?: SleepConfig()
|
|
772
|
+
|
|
773
|
+
val result = connection.getSleep(
|
|
774
|
+
config = configObject,
|
|
775
|
+
from = dateFrom,
|
|
776
|
+
to = dateTo,
|
|
777
|
+
filter = statsFilter
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
|
|
781
|
+
|
|
782
|
+
} catch (e: SpikeExceptions) {
|
|
783
|
+
promise.reject(e.mapException(), e.message)
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/// --- Health connect permissions ---
|
|
789
|
+
|
|
790
|
+
@ReactMethod
|
|
791
|
+
fun checkHealthConnectAvailability(connectionUUID: String, promise: Promise) {
|
|
792
|
+
scope.launch {
|
|
793
|
+
try {
|
|
794
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
795
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
796
|
+
"Connection not found (checkHealthConnectAvailability)"
|
|
797
|
+
)
|
|
798
|
+
|
|
799
|
+
val result = connection.checkHealthConnectAvailability()
|
|
800
|
+
promise.resolve(result.value)
|
|
801
|
+
|
|
802
|
+
} catch (e: SpikeExceptions) {
|
|
803
|
+
promise.reject(e.mapException(), e.message)
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
@ReactMethod
|
|
809
|
+
fun openHealthConnectInstallation(connectionUUID: String, promise: Promise) {
|
|
810
|
+
scope.launch {
|
|
811
|
+
try {
|
|
812
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
813
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
814
|
+
"Connection not found (openHealthConnectInstallation)"
|
|
815
|
+
)
|
|
816
|
+
|
|
817
|
+
connection.openHealthConnectInstallation()
|
|
818
|
+
promise.resolve(true)
|
|
819
|
+
|
|
820
|
+
} catch (e: SpikeExceptions) {
|
|
821
|
+
promise.reject(e.mapException(), e.message)
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
@ReactMethod
|
|
827
|
+
fun enableHealthConnectIntegration(connectionUUID: String, promise: Promise) {
|
|
828
|
+
scope.launch {
|
|
829
|
+
try {
|
|
830
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
831
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
832
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
connection.enableHealthConnectIntegration()
|
|
836
|
+
Log.d("SpikeSdkModule", "Health Connect integration enabled")
|
|
837
|
+
promise.resolve(true)
|
|
838
|
+
} catch (e: SpikeExceptions) {
|
|
839
|
+
promise.reject(e.mapException(), e.message)
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
@ReactMethod
|
|
845
|
+
fun disableHealthConnectIntegration(connectionUUID: String, promise: Promise) {
|
|
846
|
+
scope.launch {
|
|
847
|
+
try {
|
|
848
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
849
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
850
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
851
|
+
)
|
|
852
|
+
|
|
853
|
+
connection.disableHealthConnectIntegration()
|
|
854
|
+
Log.d("SpikeSdkModule", "Health Connect integration disabled")
|
|
855
|
+
promise.resolve(true)
|
|
856
|
+
|
|
857
|
+
} catch (e: SpikeExceptions) {
|
|
858
|
+
promise.reject(e.mapException(), e.message)
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
@ReactMethod
|
|
864
|
+
fun isHealthConnectIntegrationEnabled(connectionUUID: String, promise: Promise) {
|
|
865
|
+
scope.launch {
|
|
866
|
+
try {
|
|
867
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
868
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
869
|
+
"Connection not found (enableHealthConnectIntegration)"
|
|
870
|
+
)
|
|
871
|
+
|
|
872
|
+
val result = connection.isHealthConnectIntegrationEnabled()
|
|
873
|
+
Log.d("SpikeSdkModule", "Health Connect integration is " + if (result) { "enabled" } else ( "disabled" ))
|
|
874
|
+
promise.resolve(result)
|
|
875
|
+
|
|
876
|
+
} catch (e: SpikeExceptions) {
|
|
877
|
+
promise.reject(e.mapException(), e.message)
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
@ReactMethod
|
|
883
|
+
fun getGrantedHealthKitPermissions(connectionUUID: String, promise: Promise) {
|
|
884
|
+
scope.launch {
|
|
885
|
+
try {
|
|
886
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
887
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
888
|
+
"Connection not found (getGrantedHealthKitPermissions)"
|
|
889
|
+
)
|
|
890
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
891
|
+
return@launch promise.reject(
|
|
892
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
893
|
+
"Health Connect should be enabled before calling getGrantedHealthKitPermissions"
|
|
894
|
+
)
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
val permissions = connection
|
|
898
|
+
.getHealthConnectPermissionManager()
|
|
899
|
+
.getGrantedPermissions()
|
|
900
|
+
|
|
901
|
+
val result = Arguments.createArray()
|
|
902
|
+
permissions.forEach {
|
|
903
|
+
result.pushString(it)
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
Log.w("SpikeSdkModule", "$permissions")
|
|
907
|
+
promise.resolve(result)
|
|
908
|
+
|
|
909
|
+
} catch (e: SpikeExceptions) {
|
|
910
|
+
promise.reject(e.mapException(), e.message)
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
@ReactMethod
|
|
916
|
+
fun getHealthConnectPermissions(
|
|
917
|
+
connectionUUID: String,
|
|
918
|
+
statisticTypes: ReadableArray,
|
|
919
|
+
metricTypes: ReadableArray,
|
|
920
|
+
activityConfigs: ReadableArray,
|
|
921
|
+
sleepConfigs: ReadableArray,
|
|
922
|
+
includeEnhancedPermissions: Boolean,
|
|
923
|
+
promise: Promise
|
|
924
|
+
) {
|
|
925
|
+
scope.launch {
|
|
926
|
+
try {
|
|
927
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
928
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
929
|
+
"Connection not found (getHealthConnectPermissions)"
|
|
930
|
+
)
|
|
931
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
932
|
+
return@launch promise.reject(
|
|
933
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
934
|
+
"Health Connect should be enabled before calling getHealthConnectPermissionsForStatisticTypes"
|
|
935
|
+
)
|
|
936
|
+
}
|
|
937
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
938
|
+
|
|
939
|
+
val statTypes = statisticTypes.toArrayList().mapNotNull {
|
|
940
|
+
StatisticsTypeUtils.fromValue(it as String)
|
|
941
|
+
}.toSet()
|
|
942
|
+
|
|
943
|
+
val mTypes = metricTypes.toArrayList().mapNotNull {
|
|
944
|
+
MetricTypeUtils.fromValue(it as String)
|
|
945
|
+
}.toSet()
|
|
946
|
+
|
|
947
|
+
val aConfigs = activityConfigs.toArrayList().mapNotNull {
|
|
948
|
+
ActivityConfigUtils.fromValue(it as String)
|
|
949
|
+
}.toSet()
|
|
950
|
+
|
|
951
|
+
val sConfigs = sleepConfigs.toArrayList().mapNotNull {
|
|
952
|
+
SleepConfigUtils.fromValue(it as String)
|
|
953
|
+
}.toSet()
|
|
954
|
+
|
|
955
|
+
val permissions = permissionManager
|
|
956
|
+
.getPermissions(
|
|
957
|
+
statisticsTypes = statTypes,
|
|
958
|
+
metricTypes = mTypes,
|
|
959
|
+
activityConfigs = aConfigs,
|
|
960
|
+
sleepConfigs = sConfigs,
|
|
961
|
+
includeEnhancedPermissions = includeEnhancedPermissions
|
|
962
|
+
)
|
|
963
|
+
|
|
964
|
+
val result = Arguments.createArray()
|
|
965
|
+
permissions.forEach {
|
|
966
|
+
result.pushString(it)
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// Log.w("SpikeSdkModule", "$permissions")
|
|
970
|
+
promise.resolve(result)
|
|
971
|
+
|
|
972
|
+
} catch (e: SpikeExceptions) {
|
|
973
|
+
promise.reject(e.mapException(), e.message)
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
@ReactMethod
|
|
979
|
+
fun revokeAllHealthConnectPermissions(connectionUUID: String, promise: Promise) {
|
|
980
|
+
scope.launch {
|
|
981
|
+
try {
|
|
982
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
983
|
+
SpikeExceptions.SpikeException("Connection not found").mapException(),
|
|
984
|
+
"Connection not found (revokeAllHealthConnectPermissions)"
|
|
985
|
+
)
|
|
986
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
987
|
+
return@launch promise.reject(
|
|
988
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
989
|
+
"Health Connect should be enabled before calling revokeAllHealthConnectPermissions"
|
|
990
|
+
)
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
connection
|
|
994
|
+
.getHealthConnectPermissionManager()
|
|
995
|
+
.revokeAllPermissions()
|
|
996
|
+
|
|
997
|
+
promise.resolve(true)
|
|
998
|
+
|
|
999
|
+
} catch (e: SpikeExceptions) {
|
|
1000
|
+
promise.reject(e.mapException(), e.message)
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
@ReactMethod
|
|
1006
|
+
fun requestPermissionsFromHealthConnect(connectionUUID: String, permissions: ReadableArray, promise: Promise) {
|
|
1007
|
+
scope.launch {
|
|
1008
|
+
try {
|
|
1009
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
1010
|
+
SpikeExceptions.SpikeException(
|
|
1011
|
+
"Connection not found"
|
|
1012
|
+
).mapException(), "Connection not found"
|
|
1013
|
+
)
|
|
1014
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
1015
|
+
return@launch promise.reject(
|
|
1016
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
1017
|
+
"Health Connect should be enabled before calling requestPermissionsFromHealthConnect"
|
|
1018
|
+
)
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
1022
|
+
val permissionsStrings = permissions.toArrayList().map{ it as String }.toSet()
|
|
1023
|
+
|
|
1024
|
+
if (checkIfAllPermissionsAreGranted(permissionManager, permissionsStrings)) {
|
|
1025
|
+
// All permissions granted, nothing to do here
|
|
1026
|
+
promise.resolve(true)
|
|
1027
|
+
return@launch
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
Log.d("SpikeSdkModule", "Will ask for following Health Connect permissions: $permissions")
|
|
1031
|
+
|
|
1032
|
+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) {
|
|
1033
|
+
startHealthConnectRequest_oldAndroid(connectionUUID, permissionManager, permissionsStrings, promise)
|
|
1034
|
+
} else {
|
|
1035
|
+
startHealthConnectRequest(connectionUUID, permissionManager, permissionsStrings, promise)
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
} catch (e: SpikeExceptions) {
|
|
1039
|
+
promise.reject(e.mapException(), e.message)
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
private fun startHealthConnectRequest_oldAndroid(connectionUUID: String, permissionManager: HealthConnectPermissionManager, permissions: Set<String>, promise: Promise) {
|
|
1045
|
+
// val availability = connection.getHealthConnectAvailability()
|
|
1046
|
+
// && availability == HealthConnectAvailability.INSTALLED
|
|
1047
|
+
try {
|
|
1048
|
+
val intent = permissionManager.getRequestPermissionResultContract().createIntent(
|
|
1049
|
+
reactApplicationContext, permissions
|
|
1050
|
+
)
|
|
1051
|
+
|
|
1052
|
+
reactApplicationContext.currentActivity?.startActivityForResult(
|
|
1053
|
+
intent,
|
|
1054
|
+
REQUEST_CODE
|
|
1055
|
+
)
|
|
1056
|
+
promise.resolve(true)
|
|
1057
|
+
|
|
1058
|
+
} catch (e: SpikeExceptions) {
|
|
1059
|
+
promise.reject(e.mapException(), e.message)
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
private var checkPermissionsForV3: Triple<String, Set<String>, Promise>? = null
|
|
1064
|
+
|
|
1065
|
+
private fun startHealthConnectRequest(connectionUUID: String, permissionManager: HealthConnectPermissionManager, permissions: Set<String>, promise: Promise) {
|
|
1066
|
+
try {
|
|
1067
|
+
val activity = reactApplicationContext.currentActivity
|
|
1068
|
+
if (!(activity is ComponentActivity)) {
|
|
1069
|
+
promise.resolve(false)
|
|
1070
|
+
return
|
|
1071
|
+
}
|
|
1072
|
+
checkPermissionsForV3 = Triple(
|
|
1073
|
+
connectionUUID,
|
|
1074
|
+
permissions,
|
|
1075
|
+
promise
|
|
1076
|
+
)
|
|
1077
|
+
val launcher = activity.registerActivityResultLauncher(permissionManager.getRequestPermissionResultContract()) {
|
|
1078
|
+
|
|
1079
|
+
}
|
|
1080
|
+
launcher.launch(permissions)
|
|
1081
|
+
|
|
1082
|
+
} catch (e: SpikeExceptions) {
|
|
1083
|
+
promise.reject(e.mapException(), e.message)
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
@ReactMethod
|
|
1088
|
+
fun areAllPermissionsGranted(connectionUUID: String, permissions: Set<String>, promise: Promise) {
|
|
1089
|
+
scope.launch {
|
|
1090
|
+
try {
|
|
1091
|
+
val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
|
|
1092
|
+
SpikeExceptions.SpikeException(
|
|
1093
|
+
"Connection not found"
|
|
1094
|
+
).mapException(), "Connection not found"
|
|
1095
|
+
)
|
|
1096
|
+
if (!connection.isHealthConnectIntegrationEnabled()) {
|
|
1097
|
+
return@launch promise.reject(
|
|
1098
|
+
SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
|
|
1099
|
+
"Health Connect should be enabled before calling areAllPermissionsGranted"
|
|
1100
|
+
)
|
|
1101
|
+
}
|
|
1102
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
1103
|
+
|
|
1104
|
+
val permissionsGranted: Boolean = checkIfAllPermissionsAreGranted(permissionManager, permissions)
|
|
1105
|
+
promise.resolve(permissionsGranted)
|
|
1106
|
+
|
|
1107
|
+
} catch (e: SpikeExceptions) {
|
|
1108
|
+
promise.reject(e.mapException(), e.message)
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
private suspend fun checkIfAllPermissionsAreGranted(permissionManager: HealthConnectPermissionManager, permissions: Set<String>): Boolean {
|
|
1114
|
+
return permissionManager.getGrantedPermissions().containsAll(permissions)
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
/// --- Private stuff ---
|
|
1118
|
+
|
|
1119
|
+
// Do not use this directly, use `addConnection` and `getConnection` instead
|
|
1120
|
+
private val _connectionsV3 = mutableMapOf<String, SpikeConnectionAPIv3>()
|
|
1121
|
+
|
|
1122
|
+
private val mutexV3 = Mutex()
|
|
1123
|
+
|
|
1124
|
+
// Add new connection to the dictionary in a thread-safe manner
|
|
1125
|
+
private suspend fun addConnectionV3(connection: SpikeConnectionAPIv3, uuid: String) {
|
|
1126
|
+
mutex.withLock {
|
|
1127
|
+
_connectionsV3[uuid] = connection
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
// Synchronised read for safe multithreaded usage
|
|
1132
|
+
private suspend fun getConnectionV3(uuid: String): SpikeConnectionAPIv3? {
|
|
1133
|
+
mutex.withLock {
|
|
1134
|
+
return _connectionsV3[uuid]
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
557
1138
|
}
|
|
1139
|
+
|
|
1140
|
+
private fun convertIsoStringToInstant(isoString: String): Instant {
|
|
1141
|
+
return Instant.parse(isoString)
|
|
1142
|
+
}
|