Files
Solian/lib/services/fitness_data.dart

196 lines
7.9 KiB
Dart

import 'package:health/health.dart';
import 'package:easy_localization/easy_localization.dart';
/// Represents a fitness workout with structured data
class FitnessWorkout {
final DateTime startTime;
final DateTime endTime;
final HealthWorkoutActivityType workoutType;
final double? totalEnergyBurned;
final HealthDataUnit? totalEnergyBurnedUnit;
final double? totalDistance;
final HealthDataUnit? totalDistanceUnit;
final double? totalSteps;
final HealthDataUnit? totalStepsUnit;
FitnessWorkout({
required this.startTime,
required this.endTime,
required this.workoutType,
this.totalEnergyBurned,
this.totalEnergyBurnedUnit,
this.totalDistance,
this.totalDistanceUnit,
this.totalSteps,
this.totalStepsUnit,
});
/// Convert workout type to human-readable string
String get workoutTypeString {
switch (workoutType) {
case HealthWorkoutActivityType.BADMINTON:
return 'fitnessWorkoutTypeBadminton'.tr();
case HealthWorkoutActivityType.BASEBALL:
return 'fitnessWorkoutTypeBaseball'.tr();
case HealthWorkoutActivityType.BASKETBALL:
return 'fitnessWorkoutTypeBasketball'.tr();
case HealthWorkoutActivityType.BIKING:
return 'fitnessWorkoutTypeBiking'.tr();
case HealthWorkoutActivityType.CALISTHENICS:
return 'fitnessWorkoutTypeCalisthenics'.tr();
case HealthWorkoutActivityType.CRICKET:
return 'fitnessWorkoutTypeCricket'.tr();
case HealthWorkoutActivityType.DANCING:
return 'fitnessWorkoutTypeDancing'.tr();
case HealthWorkoutActivityType.ELLIPTICAL:
return 'fitnessWorkoutTypeElliptical'.tr();
case HealthWorkoutActivityType.FENCING:
return 'fitnessWorkoutTypeFencing'.tr();
case HealthWorkoutActivityType.FRISBEE_DISC:
return 'fitnessWorkoutTypeFrisbeeDisc'.tr();
case HealthWorkoutActivityType.GOLF:
return 'fitnessWorkoutTypeGolf'.tr();
case HealthWorkoutActivityType.GYMNASTICS:
return 'fitnessWorkoutTypeGymnastics'.tr();
case HealthWorkoutActivityType.HIKING:
return 'fitnessWorkoutTypeHiking'.tr();
case HealthWorkoutActivityType.HOCKEY:
return 'fitnessWorkoutTypeHockey'.tr();
case HealthWorkoutActivityType.JUMP_ROPE:
return 'fitnessWorkoutTypeJumpRope'.tr();
case HealthWorkoutActivityType.KICKBOXING:
return 'fitnessWorkoutTypeKickboxing'.tr();
case HealthWorkoutActivityType.LACROSSE:
return 'fitnessWorkoutTypeLacrosse'.tr();
case HealthWorkoutActivityType.MARTIAL_ARTS:
return 'fitnessWorkoutTypeMartialArts'.tr();
case HealthWorkoutActivityType.MIND_AND_BODY:
return 'fitnessWorkoutTypeMindAndBody'.tr();
case HealthWorkoutActivityType.PILATES:
return 'fitnessWorkoutTypePilates'.tr();
case HealthWorkoutActivityType.ROWING:
return 'fitnessWorkoutTypeRowing'.tr();
case HealthWorkoutActivityType.ROWING_MACHINE:
return 'fitnessWorkoutTypeRowingMachine'.tr();
case HealthWorkoutActivityType.RUGBY:
return 'fitnessWorkoutTypeRugby'.tr();
case HealthWorkoutActivityType.RUNNING:
return 'fitnessWorkoutTypeRunning'.tr();
case HealthWorkoutActivityType.SAILING:
return 'fitnessWorkoutTypeSailing'.tr();
case HealthWorkoutActivityType.SKIING:
return 'fitnessWorkoutTypeSkiing'.tr();
case HealthWorkoutActivityType.SNOW_SPORTS:
return 'fitnessWorkoutTypeSnowSports'.tr();
case HealthWorkoutActivityType.SOFTBALL:
return 'fitnessWorkoutTypeSoftball'.tr();
case HealthWorkoutActivityType.STAIR_CLIMBING:
return 'fitnessWorkoutTypeStairClimbing'.tr();
case HealthWorkoutActivityType.STAIR_CLIMBING_MACHINE:
return 'fitnessWorkoutTypeStairClimbingMachine'.tr();
case HealthWorkoutActivityType.STEP_TRAINING:
return 'fitnessWorkoutTypeStepTraining'.tr();
case HealthWorkoutActivityType.SURFING:
return 'fitnessWorkoutTypeSurfing'.tr();
case HealthWorkoutActivityType.SWIMMING:
return 'fitnessWorkoutTypeSwimming'.tr();
case HealthWorkoutActivityType.TABLE_TENNIS:
return 'fitnessWorkoutTypeTableTennis'.tr();
case HealthWorkoutActivityType.TENNIS:
return 'fitnessWorkoutTypeTennis'.tr();
case HealthWorkoutActivityType.CROSS_TRAINING:
return 'fitnessWorkoutTypeCrossTraining'.tr();
case HealthWorkoutActivityType.CURLING:
return 'fitnessWorkoutTypeCurling'.tr();
case HealthWorkoutActivityType.CROSS_COUNTRY_SKIING:
return 'fitnessWorkoutTypeCrossCountrySkiing'.tr();
case HealthWorkoutActivityType.EQUESTRIAN_SPORTS:
return 'fitnessWorkoutTypeEquestrianSports'.tr();
case HealthWorkoutActivityType.FISHING:
return 'fitnessWorkoutTypeFishing'.tr();
case HealthWorkoutActivityType.FUNCTIONAL_STRENGTH_TRAINING:
return 'fitnessWorkoutTypeFunctionalStrengthTraining'.tr();
case HealthWorkoutActivityType.HAND_CYCLING:
return 'fitnessWorkoutTypeHandCycling'.tr();
case HealthWorkoutActivityType.MIXED_CARDIO:
return 'fitnessWorkoutTypeMixedCardio'.tr();
case HealthWorkoutActivityType.OTHER:
return 'fitnessWorkoutTypeOther'.tr();
case HealthWorkoutActivityType.PADDLE_SPORTS:
return 'fitnessWorkoutTypePaddleSports'.tr();
case HealthWorkoutActivityType.PICKLEBALL:
return 'fitnessWorkoutTypePickleball'.tr();
case HealthWorkoutActivityType.RACQUETBALL:
return 'fitnessWorkoutTypeRacquetball'.tr();
case HealthWorkoutActivityType.ROCK_CLIMBING:
return 'fitnessWorkoutTypeRockClimbing'.tr();
case HealthWorkoutActivityType.SKATING:
return 'fitnessWorkoutTypeSkating'.tr();
case HealthWorkoutActivityType.SNOWBOARDING:
return 'fitnessWorkoutTypeSnowboarding'.tr();
case HealthWorkoutActivityType.SOCCER:
return 'fitnessWorkoutTypeSoccer'.tr();
case HealthWorkoutActivityType.SQUASH:
return 'fitnessWorkoutTypeSquash'.tr();
case HealthWorkoutActivityType.STRENGTH_TRAINING:
return 'fitnessWorkoutTypeStrengthTraining'.tr();
case HealthWorkoutActivityType.VOLLEYBALL:
return 'fitnessWorkoutTypeVolleyball'.tr();
case HealthWorkoutActivityType.WALKING:
return 'fitnessWorkoutTypeWalking'.tr();
case HealthWorkoutActivityType.WEIGHTLIFTING:
return 'fitnessWorkoutTypeWeightlifting'.tr();
case HealthWorkoutActivityType.YOGA:
return 'fitnessWorkoutTypeYoga'.tr();
default:
return 'fitnessWorkoutTypeDefault'.tr();
}
}
/// Get formatted duration string
String get durationString {
final duration = endTime.difference(startTime);
final hours = duration.inHours;
final minutes = duration.inMinutes.remainder(60);
final seconds = duration.inSeconds.remainder(60);
if (hours > 0) {
return '${hours}h ${minutes}m ${seconds}s';
} else if (minutes > 0) {
return '${minutes}m ${seconds}s';
} else {
return '${seconds}s';
}
}
/// Get formatted energy burned string
String get energyBurnedString {
if (totalEnergyBurned == null || totalEnergyBurnedUnit == null) {
return '';
}
return '${totalEnergyBurned!.toStringAsFixed(2)} ${totalEnergyBurnedUnit!.name}';
}
/// Get formatted distance string
String get distanceString {
if (totalDistance == null || totalDistanceUnit == null) {
return '';
}
return '${totalDistance!.toStringAsFixed(2)} ${totalDistanceUnit!.name}';
}
/// Get formatted steps string
String get stepsString {
if (totalSteps == null || totalStepsUnit == null) {
return '';
}
return '${totalSteps!.toStringAsFixed(0)} ${totalStepsUnit!.name}';
}
}
/// Enum for different types of fitness data
enum FitnessDataType { workout, steps, distance, calories, heartRate, sleep }
/// Enum for permission status
enum FitnessPermissionStatus { granted, denied, restricted, notDetermined }