From 2c39ccb785f86e6b48ea2e190980d1f38706b9db Mon Sep 17 00:00:00 2001 From: Shubham Singh Date: Mon, 25 Mar 2024 15:36:03 +0530 Subject: [PATCH 1/2] Add iOS support for dietaryCaffeine --- packages/health/example/lib/main.dart | 2 +- packages/health/example/lib/util.dart | 1 + .../health/ios/Classes/SwiftHealthPlugin.swift | 15 ++++++++++++++- packages/health/lib/src/data_types.dart | 3 +++ packages/health/lib/src/health_factory.dart | 2 ++ packages/health/lib/src/health_value_types.dart | 14 ++++++++++++-- 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/health/example/lib/main.dart b/packages/health/example/lib/main.dart index 6825e3da0..7e964d781 100644 --- a/packages/health/example/lib/main.dart +++ b/packages/health/example/lib/main.dart @@ -165,7 +165,7 @@ class _HealthAppState extends State { success &= await health.writeHealthData( 0.0, HealthDataType.SLEEP_DEEP, earlier, now); success &= await health.writeMeal( - earlier, now, 1000, 50, 25, 50, "Banana", MealType.SNACK); + earlier, now, 1000, 50, 25, 50, "Banana", 0.002, MealType.SNACK); // Store an Audiogram // Uncomment these on iOS - only available on iOS // const frequencies = [125.0, 500.0, 1000.0, 2000.0, 4000.0, 8000.0]; diff --git a/packages/health/example/lib/util.dart b/packages/health/example/lib/util.dart index bef195969..9ec291fec 100644 --- a/packages/health/example/lib/util.dart +++ b/packages/health/example/lib/util.dart @@ -13,6 +13,7 @@ const List dataTypesIOS = [ HealthDataType.BODY_MASS_INDEX, HealthDataType.BODY_TEMPERATURE, HealthDataType.DIETARY_CARBS_CONSUMED, + HealthDataType.DIETARY_CAFFEINE, HealthDataType.DIETARY_ENERGY_CONSUMED, HealthDataType.DIETARY_FATS_CONSUMED, HealthDataType.DIETARY_PROTEIN_CONSUMED, diff --git a/packages/health/ios/Classes/SwiftHealthPlugin.swift b/packages/health/ios/Classes/SwiftHealthPlugin.swift index 36d560010..88ed6bfee 100644 --- a/packages/health/ios/Classes/SwiftHealthPlugin.swift +++ b/packages/health/ios/Classes/SwiftHealthPlugin.swift @@ -28,6 +28,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let DIETARY_ENERGY_CONSUMED = "DIETARY_ENERGY_CONSUMED" let DIETARY_FATS_CONSUMED = "DIETARY_FATS_CONSUMED" let DIETARY_PROTEIN_CONSUMED = "DIETARY_PROTEIN_CONSUMED" + let DIETARY_CAFFEINE = "DIETARY_CAFFEINE" let ELECTRODERMAL_ACTIVITY = "ELECTRODERMAL_ACTIVITY" let FORCED_EXPIRATORY_VOLUME = "FORCED_EXPIRATORY_VOLUME" let HEART_RATE = "HEART_RATE" @@ -211,6 +212,8 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { permissions.append(nutritionPermission) types.append(DIETARY_FATS_CONSUMED) permissions.append(nutritionPermission) + types.append(DIETARY_CAFFEINE) + permissions.append(nutritionPermission) } for (index, type) in types.enumerated() { @@ -259,11 +262,13 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let carbsType = dataTypeLookUp(key: DIETARY_CARBS_CONSUMED) let proteinType = dataTypeLookUp(key: DIETARY_PROTEIN_CONSUMED) let fatType = dataTypeLookUp(key: DIETARY_FATS_CONSUMED) - + let caffeineType = dataTypeLookUp(key: DIETARY_CAFFEINE) + typesToWrite.insert(caloriesType); typesToWrite.insert(carbsType); typesToWrite.insert(proteinType); typesToWrite.insert(fatType); + typesToWrite.insert(caffeineType); } else { let dataType = dataTypeLookUp(key: key) let access = permissions[index] @@ -426,6 +431,7 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let protein = (arguments["protein"] as? Double?) ?? 0, let fat = (arguments["fatTotal"] as? Double?) ?? 0, let name = (arguments["name"] as? String?), + let caffeine = (arguments["caffeine"] as? Double?) ?? 0, let mealType = (arguments["mealType"] as? String?) else { throw PluginError(message: "Invalid Arguments") @@ -459,6 +465,11 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { let fatSample = HKQuantitySample(type: HKSampleType.quantityType(forIdentifier: .dietaryFatTotal)!, quantity: HKQuantity(unit: HKUnit.gram(), doubleValue: fat), start: dateFrom, end: dateTo, metadata: metadata) nutrition.insert(fatSample) } + + if(caffeine > 0) { + let caffeineSample = HKQuantitySample(type: HKSampleType.quantityType(forIdentifier: .dietaryCaffeine)!, quantity: HKQuantity(unit: HKUnit.gram(), doubleValue: caffeine), start: dateFrom, end: dateTo, metadata: metadata) + nutrition.insert(caffeineSample) + } if #available(iOS 15.0, *){ let meal = HKCorrelation.init(type: HKCorrelationType.init(HKCorrelationTypeIdentifier.food), start: dateFrom, end: dateTo, objects: nutrition, metadata: metadata) @@ -1017,6 +1028,8 @@ public class SwiftHealthPlugin: NSObject, FlutterPlugin { forIdentifier: .dietaryCarbohydrates)! dataTypesDict[DIETARY_ENERGY_CONSUMED] = HKSampleType.quantityType( forIdentifier: .dietaryEnergyConsumed)! + dataTypesDict[DIETARY_CAFFEINE] = HKSampleType.quantityType( + forIdentifier: .dietaryCaffeine)! dataTypesDict[DIETARY_FATS_CONSUMED] = HKSampleType.quantityType( forIdentifier: .dietaryFatTotal)! dataTypesDict[DIETARY_PROTEIN_CONSUMED] = HKSampleType.quantityType( diff --git a/packages/health/lib/src/data_types.dart b/packages/health/lib/src/data_types.dart index bca127cd0..173d70b1a 100644 --- a/packages/health/lib/src/data_types.dart +++ b/packages/health/lib/src/data_types.dart @@ -13,6 +13,7 @@ enum HealthDataType { BODY_MASS_INDEX, BODY_TEMPERATURE, DIETARY_CARBS_CONSUMED, + DIETARY_CAFFEINE, DIETARY_ENERGY_CONSUMED, DIETARY_FATS_CONSUMED, DIETARY_PROTEIN_CONSUMED, @@ -78,6 +79,7 @@ const List _dataTypeKeysIOS = [ HealthDataType.BODY_MASS_INDEX, HealthDataType.BODY_TEMPERATURE, HealthDataType.DIETARY_CARBS_CONSUMED, + HealthDataType.DIETARY_CAFFEINE, HealthDataType.DIETARY_ENERGY_CONSUMED, HealthDataType.DIETARY_FATS_CONSUMED, HealthDataType.DIETARY_PROTEIN_CONSUMED, @@ -161,6 +163,7 @@ const Map _dataTypeToUnit = { HealthDataType.BODY_MASS_INDEX: HealthDataUnit.NO_UNIT, HealthDataType.BODY_TEMPERATURE: HealthDataUnit.DEGREE_CELSIUS, HealthDataType.DIETARY_CARBS_CONSUMED: HealthDataUnit.GRAM, + HealthDataType.DIETARY_CAFFEINE: HealthDataUnit.GRAM, HealthDataType.DIETARY_ENERGY_CONSUMED: HealthDataUnit.KILOCALORIE, HealthDataType.DIETARY_FATS_CONSUMED: HealthDataUnit.GRAM, HealthDataType.DIETARY_PROTEIN_CONSUMED: HealthDataUnit.GRAM, diff --git a/packages/health/lib/src/health_factory.dart b/packages/health/lib/src/health_factory.dart index dabd56b1b..d4a7b54d5 100644 --- a/packages/health/lib/src/health_factory.dart +++ b/packages/health/lib/src/health_factory.dart @@ -390,6 +390,7 @@ class HealthFactory { double? protein, double? fatTotal, String? name, + double? caffeine, MealType mealType) async { if (startTime.isAfter(endTime)) throw ArgumentError("startTime must be equal or earlier than endTime"); @@ -402,6 +403,7 @@ class HealthFactory { 'protein': protein, 'fatTotal': fatTotal, 'name': name, + 'caffeine': caffeine, 'mealType': mealType.name, }; bool? success = await _channel.invokeMethod('writeMeal', args); diff --git a/packages/health/lib/src/health_value_types.dart b/packages/health/lib/src/health_value_types.dart index ad2adef85..6c16a80a5 100644 --- a/packages/health/lib/src/health_value_types.dart +++ b/packages/health/lib/src/health_value_types.dart @@ -290,6 +290,7 @@ class ElectrocardiogramVoltageValue extends HealthValue { /// * [fat] - the amount of fat in grams /// * [name] - the name of the food /// * [carbs] - the amount of carbs in grams +/// * [caffeine] - the amount of caffeine in grams /// * [mealType] - the type of meal class NutritionHealthValue extends HealthValue { double? _protein; @@ -297,10 +298,11 @@ class NutritionHealthValue extends HealthValue { double? _fat; String? _name; double? _carbs; + double? _caffeine; String _mealType; NutritionHealthValue(this._protein, this._calories, this._fat, this._name, - this._carbs, this._mealType); + this._carbs, this._caffeine, this._mealType); /// The amount of protein in grams. double? get protein => _protein; @@ -317,6 +319,9 @@ class NutritionHealthValue extends HealthValue { /// The amount of carbs in grams. double? get carbs => _carbs; + /// The amount of caffeine in grams. + double? get caffeine => _caffeine; + /// The type of meal. String get mealType => _mealType; @@ -327,6 +332,7 @@ class NutritionHealthValue extends HealthValue { json['fat'] != null ? (json['fat'] as num).toDouble() : null, json['name'] != null ? (json['name'] as String) : null, json['carbs'] != null ? (json['carbs'] as num).toDouble() : null, + json['caffeine'] != null ? (json['caffeine'] as num).toDouble() : null, json['mealType'] as String, ); } @@ -338,6 +344,7 @@ class NutritionHealthValue extends HealthValue { 'fat': _fat, 'name': _name, 'carbs': _carbs, + 'caffeine': _caffeine, 'mealType': _mealType, }; @@ -348,6 +355,7 @@ class NutritionHealthValue extends HealthValue { fat: ${fat.toString()}, name: ${name.toString()}, carbs: ${carbs.toString()}, + caffeine: ${caffeine.toString()}, mealType: $mealType"""; } @@ -359,11 +367,13 @@ class NutritionHealthValue extends HealthValue { o.fat == this.fat && o.name == this.name && o.carbs == this.carbs && + o.caffeine == this.caffeine && o.mealType == this.mealType; } @override - int get hashCode => Object.hash(protein, calories, fat, name, carbs); + int get hashCode => + Object.hash(protein, calories, fat, name, carbs, caffeine); } /// An abstract class for health values. From 6254f87723fa2143d866f240d0c8063497bd8cdc Mon Sep 17 00:00:00 2001 From: Shubham Singh Date: Mon, 25 Mar 2024 16:26:22 +0530 Subject: [PATCH 2/2] Add Android support for caffeine --- .../src/main/kotlin/cachet/plugins/health/HealthPlugin.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt b/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt index 424f0afea..a41a7ed22 100644 --- a/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt +++ b/packages/health/android/src/main/kotlin/cachet/plugins/health/HealthPlugin.kt @@ -623,6 +623,7 @@ class HealthPlugin(private var channel: MethodChannel? = null) : val carbs = call.argument("carbohydrates") as Double? val protein = call.argument("protein") as Double? val fat = call.argument("fatTotal") as Double? + val caffeine = call.argument("caffeine") as Double? val name = call.argument("name") val mealType = call.argument("mealType")!! @@ -636,6 +637,7 @@ class HealthPlugin(private var channel: MethodChannel? = null) : totalCarbohydrate = carbs?.grams, protein = protein?.grams, totalFat = fat?.grams, + caffeine = caffeine?.grams, startTime = startTime, startZoneOffset = null, endTime = endTime,