Skip to content

Commit

Permalink
Merge pull request #924 from shubhamsinghmutualmobile/feat/caffeine_s…
Browse files Browse the repository at this point in the history
…upport

Add Caffeine (Nutrition) Support
  • Loading branch information
bardram authored Mar 25, 2024
2 parents 38519c1 + 6254f87 commit 19cc183
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,7 @@ class HealthPlugin(private var channel: MethodChannel? = null) :
val carbs = call.argument<Double>("carbohydrates") as Double?
val protein = call.argument<Double>("protein") as Double?
val fat = call.argument<Double>("fatTotal") as Double?
val caffeine = call.argument<Double>("caffeine") as Double?
val name = call.argument<String>("name")
val mealType = call.argument<String>("mealType")!!

Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion packages/health/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ class _HealthAppState extends State<HealthApp> {
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];
Expand Down
1 change: 1 addition & 0 deletions packages/health/example/lib/util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const List<HealthDataType> 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,
Expand Down
15 changes: 14 additions & 1 deletion packages/health/ios/Classes/SwiftHealthPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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(
Expand Down
3 changes: 3 additions & 0 deletions packages/health/lib/src/data_types.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -78,6 +79,7 @@ const List<HealthDataType> _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,
Expand Down Expand Up @@ -161,6 +163,7 @@ const Map<HealthDataType, HealthDataUnit> _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,
Expand Down
2 changes: 2 additions & 0 deletions packages/health/lib/src/health_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -402,6 +403,7 @@ class HealthFactory {
'protein': protein,
'fatTotal': fatTotal,
'name': name,
'caffeine': caffeine,
'mealType': mealType.name,
};
bool? success = await _channel.invokeMethod('writeMeal', args);
Expand Down
14 changes: 12 additions & 2 deletions packages/health/lib/src/health_value_types.dart
Original file line number Diff line number Diff line change
Expand Up @@ -290,17 +290,19 @@ 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;
double? _calories;
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;
Expand All @@ -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;

Expand All @@ -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,
);
}
Expand All @@ -338,6 +344,7 @@ class NutritionHealthValue extends HealthValue {
'fat': _fat,
'name': _name,
'carbs': _carbs,
'caffeine': _caffeine,
'mealType': _mealType,
};

Expand All @@ -348,6 +355,7 @@ class NutritionHealthValue extends HealthValue {
fat: ${fat.toString()},
name: ${name.toString()},
carbs: ${carbs.toString()},
caffeine: ${caffeine.toString()},
mealType: $mealType""";
}

Expand All @@ -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.
Expand Down

0 comments on commit 19cc183

Please sign in to comment.