From a7d68738ee931a0fbae8ca5d8bc75fd7e718971c Mon Sep 17 00:00:00 2001 From: Ugur Akin Date: Sat, 31 Aug 2024 13:40:24 +0100 Subject: [PATCH 1/4] fix: fixes incorrect mapping between permission names to records --- .../permissions/PermissionUtils.kt | 38 ++++++++++++------- .../healthconnect/utils/ExceptionsUtils.kt | 1 + 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt b/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt index 2debd4d..64e2e35 100644 --- a/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt +++ b/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt @@ -1,12 +1,15 @@ package dev.matinzd.healthconnect.permissions +import android.util.Log import androidx.health.connect.client.PermissionController import androidx.health.connect.client.permission.HealthPermission import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.WritableNativeArray import com.facebook.react.bridge.WritableNativeMap import dev.matinzd.healthconnect.utils.InvalidRecordType +import dev.matinzd.healthconnect.utils.UnsupportedPermissionType import dev.matinzd.healthconnect.utils.reactRecordTypeToClassMap +import java.util.logging.Logger class PermissionUtils { companion object { @@ -34,24 +37,33 @@ class PermissionUtils { grantedPermissions.forEach { val map = WritableNativeMap() - val (accessType, recordType) = extractPermissionResult(it) - - map.putString("recordType", snakeToCamel(recordType)) - map.putString("accessType", accessType) - pushMap(map) + try { + val (accessType, recordType) = extractPermissionResult(it) + map.putString("recordType", recordType) + map.putString("accessType", accessType) + pushMap(map) + } + catch (e: UnsupportedPermissionType) { + Log.d("Unsupported Permission", "Encountered an unsupported permission type: $it") + } } } } - private fun extractPermissionResult(it: String): Pair { - val accessType = it.substring(it.lastIndexOf(".") + 1, it.indexOf("_")).lowercase() - val recordType = it.substring(it.indexOf("_") + 1).lowercase() - return Pair(accessType, recordType) - } + private fun extractPermissionResult(permissionName: String): Pair { + for((recordType, recordClass) in reactRecordTypeToClassMap) { + val readPermissionForRecord = HealthPermission.getReadPermission(recordClass) + if(readPermissionForRecord == permissionName) { + return Pair("read", recordType) + } + + val writePermissionForRecord = HealthPermission.getWritePermission(recordClass) + if(writePermissionForRecord == permissionName) { + return Pair("write", recordType) + } + } - private fun snakeToCamel(word: String): String { - val components = word.split("_") - return components.joinToString("") { it[0].uppercase() + it.substring(1) } + throw UnsupportedPermissionType() } } } diff --git a/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt b/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt index 8b860c9..7d0f7e6 100644 --- a/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt +++ b/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt @@ -15,6 +15,7 @@ class InvalidBloodPressure : Exception("Blood pressure is not valid") class InvalidMass : Exception("Mass is not valid") class InvalidLength : Exception("Length is not valid") class AggregationNotSupported : Exception("Aggregation is not supported for this record") +class UnsupportedPermissionType : Exception() fun Promise.rejectWithException(exception: Exception) { val code = when (exception) { From 0414ef44b2d2fafdd2af9b2a2cc77d2472fe3b6c Mon Sep 17 00:00:00 2001 From: Ugur Akin Date: Sat, 31 Aug 2024 14:09:11 +0100 Subject: [PATCH 2/4] style: reformatted file and remove unused import --- .../permissions/PermissionUtils.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt b/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt index 64e2e35..4d6b8ab 100644 --- a/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt +++ b/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt @@ -9,7 +9,6 @@ import com.facebook.react.bridge.WritableNativeMap import dev.matinzd.healthconnect.utils.InvalidRecordType import dev.matinzd.healthconnect.utils.UnsupportedPermissionType import dev.matinzd.healthconnect.utils.reactRecordTypeToClassMap -import java.util.logging.Logger class PermissionUtils { companion object { @@ -42,23 +41,22 @@ class PermissionUtils { map.putString("recordType", recordType) map.putString("accessType", accessType) pushMap(map) - } - catch (e: UnsupportedPermissionType) { + } catch (e: UnsupportedPermissionType) { Log.d("Unsupported Permission", "Encountered an unsupported permission type: $it") } } } } - private fun extractPermissionResult(permissionName: String): Pair { - for((recordType, recordClass) in reactRecordTypeToClassMap) { - val readPermissionForRecord = HealthPermission.getReadPermission(recordClass) - if(readPermissionForRecord == permissionName) { - return Pair("read", recordType) - } + private fun extractPermissionResult(permissionName: String): Pair { + for ((recordType, recordClass) in reactRecordTypeToClassMap) { + val readPermissionForRecord = HealthPermission.getReadPermission(recordClass) + if (readPermissionForRecord == permissionName) { + return Pair("read", recordType) + } val writePermissionForRecord = HealthPermission.getWritePermission(recordClass) - if(writePermissionForRecord == permissionName) { + if (writePermissionForRecord == permissionName) { return Pair("write", recordType) } } From a1080b1364c08011fc59ddc235fd8067f19ecdb5 Mon Sep 17 00:00:00 2001 From: Ugur Akin Date: Sat, 31 Aug 2024 14:56:46 +0100 Subject: [PATCH 3/4] fix: fixes granted permissions loop order and adds a permission class --- .../permissions/PermissionUtils.kt | 36 +++++-------------- .../permissions/ReactPermission.kt | 23 ++++++++++++ 2 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 android/src/main/java/dev/matinzd/healthconnect/permissions/ReactPermission.kt diff --git a/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt b/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt index 4d6b8ab..1ab12ad 100644 --- a/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt +++ b/android/src/main/java/dev/matinzd/healthconnect/permissions/PermissionUtils.kt @@ -1,13 +1,10 @@ package dev.matinzd.healthconnect.permissions -import android.util.Log import androidx.health.connect.client.PermissionController import androidx.health.connect.client.permission.HealthPermission import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.WritableNativeArray -import com.facebook.react.bridge.WritableNativeMap import dev.matinzd.healthconnect.utils.InvalidRecordType -import dev.matinzd.healthconnect.utils.UnsupportedPermissionType import dev.matinzd.healthconnect.utils.reactRecordTypeToClassMap class PermissionUtils { @@ -33,35 +30,20 @@ class PermissionUtils { fun mapPermissionResult(grantedPermissions: Set): WritableNativeArray { return WritableNativeArray().apply { - grantedPermissions.forEach { - val map = WritableNativeMap() + for ((recordType, recordClass) in reactRecordTypeToClassMap) { + val readPermissionForRecord = HealthPermission.getReadPermission(recordClass) + val writePermissionForRecord = HealthPermission.getWritePermission(recordClass) - try { - val (accessType, recordType) = extractPermissionResult(it) - map.putString("recordType", recordType) - map.putString("accessType", accessType) - pushMap(map) - } catch (e: UnsupportedPermissionType) { - Log.d("Unsupported Permission", "Encountered an unsupported permission type: $it") + if (grantedPermissions.contains(readPermissionForRecord)) { + pushMap(ReactPermission(AccessType.READ, recordType).toReadableMap()) } - } - } - } - - private fun extractPermissionResult(permissionName: String): Pair { - for ((recordType, recordClass) in reactRecordTypeToClassMap) { - val readPermissionForRecord = HealthPermission.getReadPermission(recordClass) - if (readPermissionForRecord == permissionName) { - return Pair("read", recordType) - } - val writePermissionForRecord = HealthPermission.getWritePermission(recordClass) - if (writePermissionForRecord == permissionName) { - return Pair("write", recordType) + if (grantedPermissions.contains(writePermissionForRecord)) { + pushMap(ReactPermission(AccessType.WRITE, recordType).toReadableMap()) + } } } - - throw UnsupportedPermissionType() } + } } diff --git a/android/src/main/java/dev/matinzd/healthconnect/permissions/ReactPermission.kt b/android/src/main/java/dev/matinzd/healthconnect/permissions/ReactPermission.kt new file mode 100644 index 0000000..43a8325 --- /dev/null +++ b/android/src/main/java/dev/matinzd/healthconnect/permissions/ReactPermission.kt @@ -0,0 +1,23 @@ +package dev.matinzd.healthconnect.permissions + +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.WritableNativeMap + +data class ReactPermission(val accessType: AccessType, val recordType: String) { + fun toReadableMap(): ReadableMap { + val map = WritableNativeMap() + map.putString(ACCESS_TYPE, accessType.reactName) + map.putString(RECORD_TYPE, recordType) + return map + } + + companion object { + private const val ACCESS_TYPE = "accessType" + private const val RECORD_TYPE = "recordType" + } +} + +enum class AccessType(val reactName: String) { + READ("read"), + WRITE("write") +} From d8dd004df93ea5ea91ff8baeda0e756044d572ea Mon Sep 17 00:00:00 2001 From: Ugur Akin Date: Sat, 31 Aug 2024 14:58:15 +0100 Subject: [PATCH 4/4] chore: remove obsolete custom exception --- .../main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt b/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt index 7d0f7e6..8b860c9 100644 --- a/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt +++ b/android/src/main/java/dev/matinzd/healthconnect/utils/ExceptionsUtils.kt @@ -15,7 +15,6 @@ class InvalidBloodPressure : Exception("Blood pressure is not valid") class InvalidMass : Exception("Mass is not valid") class InvalidLength : Exception("Length is not valid") class AggregationNotSupported : Exception("Aggregation is not supported for this record") -class UnsupportedPermissionType : Exception() fun Promise.rejectWithException(exception: Exception) { val code = when (exception) {