From cef2d4b242c19e978cb6faf3f788159f10c74a0f Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Mon, 12 Feb 2024 19:05:30 +0100 Subject: [PATCH 1/7] feat: Implemented feature advance query https://outsystemsrd.atlassian.net/browse/RMET-3047 --- CHANGELOG.md | 3 +++ .../outsystems/plugins/healthfitness/OSHealthFitness.kt | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17fa641c..4066a53c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ The changes documented here do not include those from the original repository. ## [Unreleased] +## 2024-02-09 +- Re-implemented AdvanceQuery feature (https://outsystemsrd.atlassian.net/browse/RMET-3047). + ## 2024-02-09 - Re-implemented ListBackgroundJobs feature (https://outsystemsrd.atlassian.net/browse/RMET-3069). diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index f89bb7f1..4a972beb 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -165,8 +165,9 @@ class OSHealthFitness : CordovaImplementation() { } private fun advancedQuery(args: JSONArray) { - val parameters = gson.fromJson(args.getString(0), AdvancedQueryParameters::class.java) - healthStore?.advancedQueryAsync( + val parameters = gson.fromJson(args.getString(0), HealthAdvancedQueryParameters::class.java) + + healthConnectViewModel.advancedQueryAsync( parameters, { response -> val pluginResponseJson = gson.toJson(response) @@ -174,6 +175,9 @@ class OSHealthFitness : CordovaImplementation() { }, { error -> sendPluginResult(null, Pair(error.code.toString(), error.message)) + }, + { + } ) } From 65c366d3669ae65ff2814e951eb1b6a98a6e4b59 Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Mon, 12 Feb 2024 19:32:28 +0100 Subject: [PATCH 2/7] fix: Added error result when error permission https://outsystemsrd.atlassian.net/browse/RMET-3047 --- .../com/outsystems/plugins/healthfitness/OSHealthFitness.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index 4a972beb..7cb4be8f 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -176,12 +176,13 @@ class OSHealthFitness : CordovaImplementation() { { error -> sendPluginResult(null, Pair(error.code.toString(), error.message)) }, - { - + { error -> + sendPluginResult(null, Pair(error.code.toString(), error.message)) } ) } + private fun writeData(args: JSONArray) { try { val variable = args.getString(0) From e6b1bc3b6cc8199bb36134dab2e5310d2c19113e Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Wed, 14 Feb 2024 10:52:37 +0100 Subject: [PATCH 3/7] fix: Removed extra lines https://outsystemsrd.atlassian.net/browse/RMET-3047 --- .../com/outsystems/plugins/healthfitness/OSHealthFitness.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index 7cb4be8f..409f87e6 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -166,7 +166,6 @@ class OSHealthFitness : CordovaImplementation() { private fun advancedQuery(args: JSONArray) { val parameters = gson.fromJson(args.getString(0), HealthAdvancedQueryParameters::class.java) - healthConnectViewModel.advancedQueryAsync( parameters, { response -> @@ -182,7 +181,6 @@ class OSHealthFitness : CordovaImplementation() { ) } - private fun writeData(args: JSONArray) { try { val variable = args.getString(0) From bb28fb33dba00e13e3551e38d3a30fd70a745b1d Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Thu, 15 Feb 2024 11:40:17 +0100 Subject: [PATCH 4/7] fix: Updated with minor variables scope changes https://outsystemsrd.atlassian.net/browse/RMET-3047 --- .../plugins/healthfitness/OSHealthFitness.kt | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index 409f87e6..3c719f7c 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -13,7 +13,16 @@ import com.outsystems.osnotificationpermissions.* import com.outsystems.plugins.healthfitness.background.BackgroundJobParameters import com.outsystems.plugins.healthfitness.background.DatabaseManager import com.outsystems.plugins.healthfitness.background.UpdateBackgroundJobParameters +import com.outsystems.plugins.healthfitness.data.HealthConnectDataManager +import com.outsystems.plugins.healthfitness.data.HealthRecord +import com.outsystems.plugins.healthfitness.data.types.HealthAdvancedQueryParameters +import com.outsystems.plugins.healthfitness.data.types.HealthFitnessError +import com.outsystems.plugins.healthfitness.data.types.HealthFitnessGroupPermission +import com.outsystems.plugins.healthfitness.data.types.HealthFitnessPermission +import com.outsystems.plugins.healthfitness.repository.HealthConnectRepository import com.outsystems.plugins.healthfitness.store.* +import com.outsystems.plugins.healthfitness.utils.HealthConnectHelper +import com.outsystems.plugins.healthfitness.viewmodel.HealthConnectViewModel import com.outsystems.plugins.oscordova.CordovaImplementation import org.apache.cordova.* import org.json.JSONArray @@ -22,14 +31,14 @@ import org.json.JSONException class OSHealthFitness : CordovaImplementation() { override var callbackContext: CallbackContext? = null - var healthStore: HealthStoreInterface? = null - val gson by lazy { Gson() } - var notificationPermissions = OSNotificationPermissions() - lateinit var healthConnectViewModel: HealthConnectViewModel - lateinit var healthConnectRepository: HealthConnectRepository - lateinit var healthConnectDataManager: HealthConnectDataManager + private var healthStore: HealthStoreInterface? = null + private val gson by lazy { Gson() } + private var notificationPermissions = OSNotificationPermissions() + private lateinit var healthConnectViewModel: HealthConnectViewModel + private lateinit var healthConnectRepository: HealthConnectRepository + private lateinit var healthConnectDataManager: HealthConnectDataManager lateinit var healthConnectHelper: HealthConnectHelper - lateinit var backgroundParameters: BackgroundJobParameters + private lateinit var backgroundParameters: BackgroundJobParameters override fun initialize(cordova: CordovaInterface, webView: CordovaWebView) { super.initialize(cordova, webView) @@ -175,8 +184,8 @@ class OSHealthFitness : CordovaImplementation() { { error -> sendPluginResult(null, Pair(error.code.toString(), error.message)) }, - { error -> - sendPluginResult(null, Pair(error.code.toString(), error.message)) + { + sendPluginResult(null, Pair(HealthFitnessError.PERMISSIONS_DENIED_ERROR.code.toString(), HealthFitnessError.PERMISSIONS_DENIED_ERROR.message)) } ) } @@ -184,7 +193,7 @@ class OSHealthFitness : CordovaImplementation() { private fun writeData(args: JSONArray) { try { val variable = args.getString(0) - val healthRecordName = HealthRecordName.valueOf(variable) + val healthRecordName = HealthRecord.valueOf(variable) val value = args.getDouble(1) healthConnectViewModel.writeData( @@ -206,7 +215,7 @@ class OSHealthFitness : CordovaImplementation() { private fun getLastRecord(args: JSONArray) { try { healthConnectViewModel.getLastRecord( - HealthRecordName.valueOf(args.getString(0)), + HealthRecord.valueOf(args.getString(0)), { sendPluginResult(it, null) }, From 022c4bdc8ec0c82ee77b2ffcf8dae98ab430a7d9 Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Fri, 16 Feb 2024 12:02:19 +0100 Subject: [PATCH 5/7] fix: Handled HealthFitnessError.PERMISSIONS_DENIED_ERROR as a generic error https://outsystemsrd.atlassian.net/browse/RMET-3047 --- .../plugins/healthfitness/OSHealthFitness.kt | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index 3c719f7c..9a990de3 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -13,16 +13,8 @@ import com.outsystems.osnotificationpermissions.* import com.outsystems.plugins.healthfitness.background.BackgroundJobParameters import com.outsystems.plugins.healthfitness.background.DatabaseManager import com.outsystems.plugins.healthfitness.background.UpdateBackgroundJobParameters -import com.outsystems.plugins.healthfitness.data.HealthConnectDataManager -import com.outsystems.plugins.healthfitness.data.HealthRecord import com.outsystems.plugins.healthfitness.data.types.HealthAdvancedQueryParameters -import com.outsystems.plugins.healthfitness.data.types.HealthFitnessError -import com.outsystems.plugins.healthfitness.data.types.HealthFitnessGroupPermission -import com.outsystems.plugins.healthfitness.data.types.HealthFitnessPermission -import com.outsystems.plugins.healthfitness.repository.HealthConnectRepository import com.outsystems.plugins.healthfitness.store.* -import com.outsystems.plugins.healthfitness.utils.HealthConnectHelper -import com.outsystems.plugins.healthfitness.viewmodel.HealthConnectViewModel import com.outsystems.plugins.oscordova.CordovaImplementation import org.apache.cordova.* import org.json.JSONArray @@ -31,14 +23,14 @@ import org.json.JSONException class OSHealthFitness : CordovaImplementation() { override var callbackContext: CallbackContext? = null - private var healthStore: HealthStoreInterface? = null - private val gson by lazy { Gson() } - private var notificationPermissions = OSNotificationPermissions() - private lateinit var healthConnectViewModel: HealthConnectViewModel - private lateinit var healthConnectRepository: HealthConnectRepository - private lateinit var healthConnectDataManager: HealthConnectDataManager + var healthStore: HealthStoreInterface? = null + val gson by lazy { Gson() } + var notificationPermissions = OSNotificationPermissions() + lateinit var healthConnectViewModel: HealthConnectViewModel + lateinit var healthConnectRepository: HealthConnectRepository + lateinit var healthConnectDataManager: HealthConnectDataManager lateinit var healthConnectHelper: HealthConnectHelper - private lateinit var backgroundParameters: BackgroundJobParameters + lateinit var backgroundParameters: BackgroundJobParameters override fun initialize(cordova: CordovaInterface, webView: CordovaWebView) { super.initialize(cordova, webView) @@ -183,9 +175,6 @@ class OSHealthFitness : CordovaImplementation() { }, { error -> sendPluginResult(null, Pair(error.code.toString(), error.message)) - }, - { - sendPluginResult(null, Pair(HealthFitnessError.PERMISSIONS_DENIED_ERROR.code.toString(), HealthFitnessError.PERMISSIONS_DENIED_ERROR.message)) } ) } From 7c0c28bdcf4b4b92a0a437bf602e5975d76c3192 Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Mon, 19 Feb 2024 10:18:27 +0100 Subject: [PATCH 6/7] chore: Renamed advancedQuery for consistency https://outsystemsrd.atlassian.net/browse/RMET-3047 --- .../com/outsystems/plugins/healthfitness/OSHealthFitness.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index 9a990de3..21399d3f 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -167,7 +167,7 @@ class OSHealthFitness : CordovaImplementation() { private fun advancedQuery(args: JSONArray) { val parameters = gson.fromJson(args.getString(0), HealthAdvancedQueryParameters::class.java) - healthConnectViewModel.advancedQueryAsync( + healthConnectViewModel.advancedQuery( parameters, { response -> val pluginResponseJson = gson.toJson(response) From cc4b9497ac32de2c138d8b39b815e34ff8356130 Mon Sep 17 00:00:00 2001 From: Invisgoth Date: Tue, 20 Feb 2024 19:04:52 +0100 Subject: [PATCH 7/7] chore: Merged development branch https://outsystemsrd.atlassian.net/browse/RMET-3047 --- .../plugins/healthfitness/OSHealthFitness.kt | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt index 21399d3f..67eb6aa7 100755 --- a/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt +++ b/src/android/com/outsystems/plugins/healthfitness/OSHealthFitness.kt @@ -25,11 +25,11 @@ class OSHealthFitness : CordovaImplementation() { var healthStore: HealthStoreInterface? = null val gson by lazy { Gson() } - var notificationPermissions = OSNotificationPermissions() lateinit var healthConnectViewModel: HealthConnectViewModel lateinit var healthConnectRepository: HealthConnectRepository lateinit var healthConnectDataManager: HealthConnectDataManager lateinit var healthConnectHelper: HealthConnectHelper + lateinit var workManagerHelper: WorkManagerHelperInterface lateinit var backgroundParameters: BackgroundJobParameters override fun initialize(cordova: CordovaInterface, webView: CordovaWebView) { @@ -41,7 +41,9 @@ class OSHealthFitness : CordovaImplementation() { healthConnectDataManager = HealthConnectDataManager(database) healthConnectRepository = HealthConnectRepository(healthConnectDataManager) healthConnectHelper = HealthConnectHelper() - healthConnectViewModel = HealthConnectViewModel(healthConnectRepository, healthConnectHelper) + workManagerHelper = WorkManagerHelper() + healthConnectViewModel = + HealthConnectViewModel(healthConnectRepository, healthConnectHelper, workManagerHelper) } override fun execute( @@ -219,21 +221,25 @@ class OSHealthFitness : CordovaImplementation() { } private fun setBackgroundJob(args: JSONArray) { - // save arguments for later use in case we need to request permissions + // save arguments for later use backgroundParameters = gson.fromJson(args.getString(0), BackgroundJobParameters::class.java) - if (!notificationPermissions.hasNotificationPermission(this)) { - notificationPermissions.requestNotificationPermission( - this, - ACTIVITY_NOTIFICATION_PERMISSIONS_REQUEST_CODE - ) - } else { - setBackgroundJobWithParameters(backgroundParameters) - } + + val permissions = mutableListOf().apply { + if (SDK_INT >= 33) { + add(Manifest.permission.POST_NOTIFICATIONS) + } + if (SDK_INT >= 29) { + add(Manifest.permission.ACTIVITY_RECOGNITION) + } + }.toTypedArray() + + PermissionHelper.requestPermissions(this, BACKGROUND_JOB_PERMISSIONS_REQUEST_CODE, permissions) } private fun setBackgroundJobWithParameters(parameters: BackgroundJobParameters) { healthConnectViewModel.setBackgroundJob( parameters, + getContext(), { sendPluginResult("success", null) }, @@ -344,26 +350,26 @@ class OSHealthFitness : CordovaImplementation() { } return } - ACTIVITY_NOTIFICATION_PERMISSIONS_REQUEST_CODE -> { - if (grantResults.isNotEmpty() && - grantResults[0] == PackageManager.PERMISSION_GRANTED - ) { - setBackgroundJobWithParameters(backgroundParameters) - } else { - sendPluginResult( - null, - Pair( - HealthFitnessError.NOTIFICATION_PERMISSION_DENIED_ERROR.code.toString(), - HealthFitnessError.NOTIFICATION_PERMISSION_DENIED_ERROR.message + BACKGROUND_JOB_PERMISSIONS_REQUEST_CODE -> { + for (result in grantResults) { + if (result == PackageManager.PERMISSION_DENIED) { + sendPluginResult( + null, + Pair( + HealthFitnessError.BACKGROUND_JOB_PERMISSIONS_DENIED_ERROR.code.toString(), + HealthFitnessError.BACKGROUND_JOB_PERMISSIONS_DENIED_ERROR.message + ) ) - ) + return + } } + setBackgroundJobWithParameters(backgroundParameters) } } } companion object { const val ACTIVITY_LOCATION_PERMISSIONS_REQUEST_CODE = 1 - const val ACTIVITY_NOTIFICATION_PERMISSIONS_REQUEST_CODE = 2 + const val BACKGROUND_JOB_PERMISSIONS_REQUEST_CODE = 2 } } \ No newline at end of file