196 lines
7.9 KiB
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 }
|