Files
Gadgetbridge/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityKind.java
T
835884ab16 Add device-agnostic FIT activity export (#6268)
Adds FIT file export for activity tracks, alongside the existing GPX export:

- **`FitExporter`** — builds a valid FIT activity (file_id / session / lap / record, plus length / split / set when present) from an `ActivityTrack` + `ActivitySummaryData`.
- **`AutoFitExporter`** + **`AutoExportFitSettingsActivity`** — opt-in auto-export on sync, mirroring the GPX auto-export setting (per-device or all-devices).
- **"Share FIT File"** action in the workout detail menu.

Export is fed device-agnostically: `GarminWorkoutParser` and the shared model (`ActivityTrack` / `ActivityPoint` / `ActivitySummaryEntries` / `ActivityKind`) carry laps, segments, per-length swim, splits/sets, running dynamics and HR zones.
The Garmin FIT codec (`messages`, `baseTypes`, `NativeFITMessage`, `RecordData`) is extended to encode them.

`AutoFitExporter.doExport(...)` is wired beside `AutoGpxExporter` in the Garmin, CMF, Huawei, BangleJS, Huami and Xiaomi activity paths; `FitImporter` also honours the FIT auto-export toggle.

## Testing

`:app:testMainlineDebugUnitTest` — FIT/export subset green:

- `FitExporterReadmeRoundTripTest` — round-trips the curated README sample **and** the full `Activity/<year>/` corpus for years ≥ 2015 from  https://github.com/ThomasKuehne/FIT-test-files (3482 files): parse → export → re-parse, asserting GPS/altitude/HR/speed/cadence/distance/power/temp and session aggregates survive.
- `FitExporterPaceTest`, `BaseTypeEncodeRoundTripTest`, `GarminSportTest`, `GPXExporterTest`, `FitImporterTest`, `GpxRouteFileConverterTest`, `FitWeatherTest`.

Thanks a lot to @ThomasKuehne for the initial review

Co-authored-by: Dany Mestas <94061157+DanyPM@users.noreply.github.com>
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6268
2026-06-21 23:35:20 +02:00

540 lines
32 KiB
Java

/* Copyright (C) 2015-2024 Andreas Shimokawa, Carsten Pfeiffer, Daniele
Gobbetti, José Rebelo, Petr Vaněk, Sebastian Krey, Your Name
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.model;
import android.content.Context;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import nodomain.freeyourgadget.gadgetbridge.R;
public enum ActivityKind {
NOT_MEASURED(-1, R.string.activity_type_not_measured, R.drawable.ic_activity_not_measured),
UNKNOWN(0x00000000, R.string.activity_type_unknown),
ACTIVITY(0x00000001, R.string.activity_type_activity),
LIGHT_SLEEP(0x00000002, R.string.activity_type_light_sleep, R.drawable.ic_activity_sleep),
DEEP_SLEEP(0x00000004, R.string.activity_type_deep_sleep, R.drawable.ic_activity_sleep),
NOT_WORN(0x00000008, R.string.activity_type_not_worn),
RUNNING(0x00000010, R.string.activity_type_running, R.drawable.ic_activity_running),
WALKING(0x00000020, R.string.activity_type_walking, R.drawable.ic_activity_walking),
SWIMMING(0x00000040, R.string.activity_type_swimming, R.drawable.ic_activity_swimming),
CYCLING(0x00000080, R.string.activity_type_biking, R.drawable.ic_activity_biking),
TREADMILL(0x00000100, R.string.activity_type_treadmill, R.drawable.ic_activity_threadmill),
EXERCISE(0x00000200, R.string.activity_type_exercise, R.drawable.ic_activity_exercise),
SWIMMING_OPENWATER(0x00000400, R.string.activity_type_swimming_openwater, R.drawable.ic_activity_swimming),
INDOOR_CYCLING(0x00000800, R.string.activity_type_indoor_cycling, R.drawable.ic_activity_bike_trainer),
ELLIPTICAL_TRAINER(0x00001000, R.string.activity_type_elliptical_trainer, R.drawable.ic_activity_eliptical),
JUMP_ROPING(0x00002000, R.string.activity_type_jump_roping, R.drawable.ic_activity_rope_jump),
YOGA(0x00004000, R.string.activity_type_yoga, R.drawable.ic_activity_yoga),
SOCCER(0x00008000, R.string.activity_type_soccer, R.drawable.ic_activity_soccer),
ROWING_MACHINE(0x00010000, R.string.activity_type_rowing_machine, R.drawable.ic_activity_rowing),
CRICKET(0x00020000, R.string.activity_type_cricket, R.drawable.ic_activity_cricket),
BASKETBALL(0x00040000, R.string.activity_type_basketball, R.drawable.ic_activity_basketball),
PINGPONG(0x00080000, R.string.activity_type_pingpong, R.drawable.ic_activity_pingpong),
BADMINTON(0x00100000, R.string.activity_type_badminton, R.drawable.ic_activity_badmington),
STRENGTH_TRAINING(0x00200000, R.string.activity_type_strength_training, R.drawable.ic_activity_dumbbell),
HIKING(0x00400000, R.string.activity_type_hiking, R.drawable.ic_activity_hiking),
CLIMBING(0x00800000, R.string.activity_type_climbing, R.drawable.ic_activity_climbing),
REM_SLEEP(0x01000000, R.string.abstract_chart_fragment_kind_rem_sleep, R.drawable.ic_activity_sleep),
SLEEP_ANY(0x00000002 | 0x00000004 | 0x01000000 | 0x02000000, R.string.menuitem_sleep, R.drawable.ic_activity_sleep),
AWAKE_SLEEP(0x02000000, R.string.abstract_chart_fragment_kind_awake_sleep, R.drawable.ic_activity_sleep),
// FIXME: Deprecate these - they're just kept around while we do not support reading from the old db
VIVOMOVE_HR_TRANSITION(0x00000001 | 0x00000010 | 0x00000020 | 0x00000200 | 0x00000040, R.string.transition),
// Non-legacy activity kinds after 0x04000000
NAVIGATE(0x04000000, R.string.activity_type_navigate, R.drawable.ic_navigation),
INDOOR_TRACK_RUNNING(0x04000001, R.string.activity_type_indoor_track, R.drawable.ic_run_circle),
HANDCYCLING(0x04000002, R.string.activity_type_handcycling),
E_BIKE(0x04000003, R.string.activity_type_e_bike, R.drawable.ic_activity_electric_bike),
BIKE_COMMUTE(0x04000004, R.string.activity_type_bike_commute, R.drawable.ic_activity_bike_lane),
HANDCYCLING_INDOOR(0x04000005, R.string.activity_type_handcycling_indoor),
TRANSITION(0x04000006, R.string.activity_type_transition),
FITNESS_EQUIPMENT(0x04000007, R.string.activity_type_fitness_equipment),
STAIR_STEPPER(0x04000008, R.string.activity_type_stair_stepper, R.drawable.ic_activity_stair_stepper),
PILATES(0x04000009, R.string.activity_type_pilates, R.drawable.ic_activity_pilates),
POOL_SWIM(0x0400000a, R.string.activity_type_pool_swimming, R.drawable.ic_activity_swimming),
TENNIS(0x0400000b, R.string.activity_type_tennis, R.drawable.ic_activity_tennis),
PLATFORM_TENNIS(0x0400000c, R.string.activity_type_platform_tennis),
TABLE_TENNIS(0x0400000d, R.string.activity_type_table_tennis, R.drawable.ic_activity_pingpong),
AMERICAN_FOOTBALL(0x0400000e, R.string.activity_type_american_football, R.drawable.ic_activity_football),
TRAINING(0x0400000f, R.string.activity_type_training),
CARDIO(0x04000010, R.string.activity_type_cardio, R.drawable.ic_heartrate),
BREATHWORK(0x04000011, R.string.activity_type_breathwork, R.drawable.ic_pulmonology),
INDOOR_WALKING(0x04000012, R.string.activity_type_indoor_walking, R.drawable.ic_activity_walking),
XC_CLASSIC_SKI(0x04000013, R.string.activity_type_xc_classic_ski, R.drawable.ic_activity_skiing),
SKIING(0x04000014, R.string.activity_type_skiing, R.drawable.ic_activity_skiing),
SNOWBOARDING(0x04000015, R.string.activity_type_snowboarding, R.drawable.ic_activity_snowboarding),
ROWING(0x04000016, R.string.activity_type_rowing, R.drawable.ic_activity_rowing),
MOUNTAINEERING(0x04000017, R.string.activity_type_mountaineering, R.drawable.ic_activity_climbing),
MULTISPORT(0x04000019, R.string.activity_type_multisport),
PADDLING(0x0400001a, R.string.activity_type_paddling, R.drawable.ic_activity_rowing),
FLYING(0x0400001b, R.string.activity_type_flying),
MOTORCYCLING(0x0400001d, R.string.activity_type_motorcycling, R.drawable.ic_activity_motorcycling),
BOATING(0x0400001e, R.string.activity_type_boating, R.drawable.ic_activity_boating),
DRIVING(0x0400001f, R.string.activity_type_driving, R.drawable.ic_activity_driving),
GOLF(0x04000020, R.string.activity_type_golf, R.drawable.ic_activity_golf),
HANG_GLIDING(0x04000021, R.string.activity_type_hang_gliding, R.drawable.ic_activity_paragliding),
HUNTING(0x04000023, R.string.activity_type_hunting),
FISHING(0x04000024, R.string.activity_type_fishing, R.drawable.ic_activity_fishing),
INLINE_SKATING(0x04000025, R.string.activity_type_inline_skating, R.drawable.ic_activity_roller_skating),
ROCK_CLIMBING(0x04000026, R.string.activity_type_rock_climbing, R.drawable.ic_activity_rock_climbing),
CLIMB_INDOOR(0x04000027, R.string.activity_type_climb_indoor, R.drawable.ic_activity_climbing_indoor),
BOULDERING(0x04000028, R.string.activity_type_bouldering, R.drawable.ic_activity_climbing_indoor),
SAIL_RACE(0x0400002a, R.string.activity_type_sail_race, R.drawable.ic_activity_sailing),
SAIL_EXPEDITION(0x0400002b, R.string.activity_type_sail_expedition, R.drawable.ic_activity_sailing),
ICE_SKATING(0x0400002c, R.string.activity_type_ice_skating, R.drawable.ic_activity_ice_skating),
SKY_DIVING(0x0400002d, R.string.activity_type_sky_diving),
SNOWSHOE(0x0400002e, R.string.activity_type_snowshoe, R.drawable.ic_activity_snowshoe),
SNOWMOBILING(0x0400002f, R.string.activity_type_snowmobiling, R.drawable.ic_activity_snowmobiling),
STAND_UP_PADDLEBOARDING(0x04000030, R.string.activity_type_stand_up_paddleboarding, R.drawable.ic_activity_sup),
SURFING(0x04000031, R.string.activity_type_surfing, R.drawable.ic_activity_surfing),
WAKEBOARDING(0x04000032, R.string.activity_type_wakeboarding, R.drawable.ic_activity_wakeboarding),
WATER_SKIING(0x04000033, R.string.activity_type_water_skiing, R.drawable.ic_activity_waterskiing),
KAYAKING(0x04000034, R.string.activity_type_kayaking, R.drawable.ic_activity_rowing),
RAFTING(0x04000035, R.string.activity_type_rafting, R.drawable.ic_activity_rowing),
WINDSURFING(0x04000036, R.string.activity_type_windsurfing, R.drawable.ic_activity_windsurfing),
KITESURFING(0x04000037, R.string.activity_type_kitesurfing, R.drawable.ic_activity_kitesurfing),
TACTICAL(0x04000038, R.string.activity_type_tactical, R.drawable.ic_activity_tactical),
JUMPMASTER(0x04000039, R.string.activity_type_jumpmaster, R.drawable.ic_activity_paragliding),
BOXING(0x0400003a, R.string.activity_type_boxing, R.drawable.ic_activity_mma),
FLOOR_CLIMBING(0x0400003b, R.string.activity_type_floor_climbing, R.drawable.ic_acticvity_stairs),
BASEBALL(0x0400003c, R.string.activity_type_baseball, R.drawable.ic_activity_baseball),
SOFTBALL(0x0400003d, R.string.activity_type_softball),
SOFTBALL_SLOW_PITCH(0x0400003e, R.string.activity_type_softball_slow_pitch),
SHOOTING(0x0400003f, R.string.activity_type_shooting, R.drawable.ic_activity_shooting),
AUTO_RACING(0x04000040, R.string.activity_type_auto_racing, R.drawable.ic_steering_wheel),
WINTER_SPORT(0x04000041, R.string.activity_type_winter_sport, R.drawable.ic_activity_winter),
GRINDING(0x04000042, R.string.activity_type_grinding),
HEALTH_SNAPSHOT(0x04000043, R.string.activity_type_health_snapshot, R.drawable.ic_activity_health_snapshot),
MARINE(0x04000044, R.string.activity_type_marine, R.drawable.ic_activity_water),
HIIT(0x04000045, R.string.activity_type_hiit),
VIDEO_GAMING(0x04000046, R.string.activity_type_video_gaming, R.drawable.ic_videogame),
RACKET(0x04000047, R.string.activity_type_racket),
PICKLEBALL(0x04000048, R.string.activity_type_pickleball),
PADEL(0x04000049, R.string.activity_type_padel),
SQUASH(0x0400004a, R.string.activity_type_squash),
RACQUETBALL(0x0400004b, R.string.activity_type_racquetball),
PUSH_WALK_SPEED(0x0400004c, R.string.activity_type_push_walk_speed),
INDOOR_PUSH_WALK_SPEED(0x0400004d, R.string.activity_type_indoor_push_walk_speed),
PUSH_RUN_SPEED(0x0400004e, R.string.activity_type_push_run_speed),
INDOOR_PUSH_RUN_SPEED(0x0400004f, R.string.activity_type_indoor_push_run_speed),
MEDITATION(0x04000050, R.string.activity_type_meditation, R.drawable.ic_activity_meditation),
PARA_SPORT(0x04000051, R.string.activity_type_para_sport),
DISC_GOLF(0x04000052, R.string.activity_type_disc_golf),
ULTIMATE_DISC(0x04000053, R.string.activity_type_ultimate_disc),
TEAM_SPORT(0x04000054, R.string.activity_type_team_sport),
RUGBY(0x04000055, R.string.activity_type_rugby, R.drawable.ic_activity_rugby),
HOCKEY(0x04000056, R.string.activity_type_hockey, R.drawable.ic_activity_hockey),
LACROSSE(0x04000057, R.string.activity_type_lacrosse),
VOLLEYBALL(0x04000058, R.string.activity_type_volleyball, R.drawable.ic_activity_volleyball),
WATER_TUBING(0x04000059, R.string.activity_type_water_tubing, R.drawable.ic_activity_watertubing),
WAKESURFING(0x0400005a, R.string.activity_type_wakesurfing, R.drawable.ic_activity_wakesurfing),
MIXED_MARTIAL_ARTS(0x0400005b, R.string.activity_type_mixed_martial_arts, R.drawable.ic_activity_mma), // aka MMA
DANCE(0x0400005c, R.string.activity_type_dance),
MOUNTAIN_HIKE(0x040000e2, R.string.activity_type_mountain_hike, R.drawable.ic_activity_climbing),
CROSS_TRAINER(0x0400005d, R.string.activity_type_cross_trainer),
FREE_TRAINING(0x0400005e, R.string.activity_type_free_training, R.drawable.ic_activity_free_training),
DYNAMIC_CYCLE(0x0400005f, R.string.activity_type_dynamic_cycle),
KICKBOXING(0x04000060, R.string.activity_type_kickboxing, R.drawable.ic_activity_mma),
FITNESS_EXERCISES(0x04000061, R.string.activity_type_fitness_exercises),
CROSSFIT(0x04000062, R.string.activity_type_crossfit),
FUNCTIONAL_TRAINING(0x04000063, R.string.activity_type_functional_training),
PHYSICAL_TRAINING(0x04000064, R.string.activity_type_physical_training, R.drawable.ic_activity_free_training),
TAEKWONDO(0x04000065, R.string.activity_type_taekwondo, R.drawable.ic_activity_martial_arts),
TAE_BO(0x04000066, R.string.activity_type_tae_bo, R.drawable.ic_activity_martial_arts),
CROSS_COUNTRY_RUNNING(0x04000067, R.string.activity_type_cross_country_running, R.drawable.ic_activity_running),
KARATE(0x04000068, R.string.activity_type_karate, R.drawable.ic_activity_martial_arts),
FENCING(0x04000069, R.string.activity_type_fencing),
CORE_TRAINING(0x0400006a, R.string.activity_type_core_training),
KENDO(0x0400006b, R.string.activity_type_kendo),
HORIZONTAL_BAR(0x0400006c, R.string.activity_type_horizontal_bar),
PARALLEL_BAR(0x0400006d, R.string.activity_type_parallel_bar),
COOLDOWN(0x0400006e, R.string.activity_type_cooldown),
CROSS_TRAINING(0x0400006f, R.string.activity_type_cross_training),
SIT_UPS(0x04000070, R.string.activity_type_sit_ups),
FITNESS_GAMING(0x04000071, R.string.activity_type_fitness_gaming),
AEROBIC_EXERCISE(0x04000072, R.string.activity_type_aerobic_exercise),
ROLLING(0x04000073, R.string.activity_type_rolling),
FLEXIBILITY(0x04000074, R.string.activity_type_flexibility),
GYMNASTICS(0x04000075, R.string.activity_type_gymnastics, R.drawable.ic_activity_gymnastics),
TRACK_AND_FIELD(0x04000076, R.string.activity_type_track_and_field),
PUSH_UPS(0x04000077, R.string.activity_type_push_ups),
BATTLE_ROPE(0x04000078, R.string.activity_type_battle_rope),
SMITH_MACHINE(0x04000079, R.string.activity_type_smith_machine),
PULL_UPS(0x0400007a, R.string.activity_type_pull_ups),
PLANK(0x0400007b, R.string.activity_type_plank),
JAVELIN(0x0400007c, R.string.activity_type_javelin),
LONG_JUMP(0x0400007d, R.string.activity_type_long_jump),
HIGH_JUMP(0x0400007e, R.string.activity_type_high_jump),
TRAMPOLINE(0x0400007f, R.string.activity_type_trampoline),
DUMBBELL(0x04000080, R.string.activity_type_dumbbell, R.drawable.ic_activity_dumbbell),
BELLY_DANCE(0x04000081, R.string.activity_type_belly_dance),
JAZZ_DANCE(0x04000082, R.string.activity_type_jazz_dance),
LATIN_DANCE(0x04000083, R.string.activity_type_latin_dance),
BALLET(0x04000084, R.string.activity_type_ballet),
STREET_DANCE(0x04000085, R.string.activity_type_street_dance),
ZUMBA(0x04000086, R.string.activity_type_zumba),
ROLLER_SKATING(0x04000087, R.string.activity_type_roller_skating, R.drawable.ic_activity_roller_skating),
MARTIAL_ARTS(0x04000088, R.string.activity_type_martial_arts, R.drawable.ic_activity_martial_arts),
TAI_CHI(0x04000089, R.string.activity_type_tai_chi),
HULA_HOOPING(0x0400008a, R.string.activity_type_hula_hooping, R.drawable.ic_activity_hula_hoop),
DISC_SPORTS(0x0400008b, R.string.activity_type_disc_sports),
DARTS(0x0400008c, R.string.activity_type_darts, R.drawable.ic_activity_darts),
ARCHERY(0x0400008d, R.string.activity_type_archery, R.drawable.ic_activity_archery),
HORSE_RIDING(0x0400008e, R.string.activity_type_horse_riding),
KITE_FLYING(0x0400008f, R.string.activity_type_kite_flying),
SWING(0x04000090, R.string.activity_type_swing),
STAIRS(0x04000091, R.string.activity_type_stairs, R.drawable.ic_activity_stairs),
MIND_AND_BODY(0x04000092, R.string.activity_type_mind_and_body, R.drawable.ic_activity_mind_and_body),
WRESTLING(0x04000093, R.string.activity_type_wrestling),
KABADDI(0x04000094, R.string.activity_type_kabaddi, R.drawable.ic_activity_kabaddi),
KARTING(0x04000095, R.string.activity_type_karting),
BILLIARDS(0x04000096, R.string.activity_type_billiards, R.drawable.ic_activity_billiards),
BOWLING(0x04000097, R.string.activity_type_bowling, R.drawable.ic_activity_bowling),
SHUTTLECOCK(0x04000098, R.string.activity_type_shuttlecock),
HANDBALL(0x04000099, R.string.activity_type_handball, R.drawable.ic_activity_handball),
DODGEBALL(0x0400009a, R.string.activity_type_dodgeball),
AUSTRALIAN_FOOTBALL(0x0400009b, R.string.activity_type_australian_football, R.drawable.ic_activity_football),
LACROSS(0x0400009c, R.string.activity_type_lacross),
SHOT(0x0400009d, R.string.activity_type_shot),
BEACH_SOCCER(0x0400009e, R.string.activity_type_beach_soccer, R.drawable.ic_activity_soccer),
BEACH_VOLLEYBALL(0x0400009f, R.string.activity_type_beach_volleyball, R.drawable.ic_activity_volleyball),
GATEBALL(0x040000a0, R.string.activity_type_gateball),
SEPAK_TAKRAW(0x040000a1, R.string.activity_type_sepak_takraw),
SAILING(0x040000a2, R.string.activity_type_sailing, R.drawable.ic_activity_sailing),
JET_SKIING(0x040000a3, R.string.activity_type_jet_skiing, R.drawable.ic_activity_water),
SKATING(0x040000a4, R.string.activity_type_skating, R.drawable.ic_activity_roller_skating),
ICE_HOCKEY(0x040000a5, R.string.activity_type_ice_hockey, R.drawable.ic_activity_hockey),
CURLING(0x040000a6, R.string.activity_type_curling, R.drawable.ic_activity_curling),
CROSS_COUNTRY_SKIING(0x040000a8, R.string.activity_type_cross_country_skiing, R.drawable.ic_activity_skiing),
SNOW_SPORTS(0x040000a9, R.string.activity_type_snow_sports, R.drawable.ic_activity_winter),
LUGE(0x040000ab, R.string.activity_type_luge),
SKATEBOARDING(0x040000ac, R.string.activity_type_skateboarding, R.drawable.ic_activity_skateboarding),
PARACHUTING(0x040000ae, R.string.activity_type_parachuting, R.drawable.ic_activity_paragliding),
PARKOUR(0x040000af, R.string.activity_type_parkour),
INDOOR_RUNNING(0x040000b0, R.string.activity_type_indoor_running, R.drawable.ic_activity_indoor_running),
OUTDOOR_RUNNING(0x040000b1, R.string.activity_type_outdoor_running, R.drawable.ic_activity_running),
OUTDOOR_WALKING(0x040000b2, R.string.activity_type_outdoor_walking, R.drawable.ic_activity_outdoor_walking),
OUTDOOR_CYCLING(0x040000b3, R.string.activity_type_outdoor_cycling, R.drawable.ic_activity_biking),
AEROBIC_COMBO(0x040000b4, R.string.activity_type_aerobic_combo),
AEROBICS(0x040000b5, R.string.activity_type_aerobics),
AIR_WALKER(0x040000b6, R.string.activity_type_air_walker),
ARTISTIC_SWIMMING(0x040000b7, R.string.activity_type_artistic_swimming),
BALLROOM_DANCE(0x040000b8, R.string.activity_type_ballroom_dance),
BMX(0x040000b9, R.string.activity_type_bmx),
BOARD_GAME(0x040000ba, R.string.activity_type_board_game),
BOCCE(0x040000bb, R.string.activity_type_bocce),
BREAKING(0x040000bc, R.string.activity_type_breaking),
BRIDGE(0x040000bd, R.string.activity_type_bridge),
CARDIO_COMBAT(0x040000be, R.string.activity_type_cardio_combat, R.drawable.ic_activity_martial_arts),
CHECKERS(0x040000bf, R.string.activity_type_checkers),
CHESS(0x040000c0, R.string.activity_type_chess, R.drawable.ic_activity_chess),
DRAGON_BOAT(0x040000c1, R.string.activity_type_dragon_boat),
ESPORTS(0x040000c2, R.string.activity_type_esports, R.drawable.ic_activity_esports),
FINSWIMMING(0x040000c3, R.string.activity_type_finswimming),
FLOWRIDING(0x040000c4, R.string.activity_type_flowriding),
FOLK_DANCE(0x040000c5, R.string.activity_type_folk_dance),
FRISBEE(0x040000c6, R.string.activity_type_frisbee, R.drawable.ic_activity_frisbee),
FUTSAL(0x040000c7, R.string.activity_type_futsal),
HACKY_SACK(0x040000c8, R.string.activity_type_hacky_sack),
HIP_HOP(0x040000c9, R.string.activity_type_hip_hop),
HULA_HOOP(0x040000ca, R.string.activity_type_hula_hoop, R.drawable.ic_activity_hula_hoop),
INDOOR_FITNESS(0x040000cb, R.string.activity_type_indoor_fitness),
INDOOR_ICE_SKATING(0x040000cc, R.string.activity_type_indoor_ice_skating, R.drawable.ic_activity_ice_skating),
JAI_ALAI(0x040000cd, R.string.activity_type_jai_alai),
JUDO(0x040000ce, R.string.activity_type_judo, R.drawable.ic_activity_martial_arts),
JUJITSU(0x040000cf, R.string.activity_type_jujitsu, R.drawable.ic_activity_martial_arts),
MASS_GYMNASTICS(0x040000d0, R.string.activity_type_mass_gymnastics, R.drawable.ic_activity_gymnastics),
MODERN_DANCE(0x040000d1, R.string.activity_type_modern_dance),
MUAY_THAI(0x040000d2, R.string.activity_type_muay_thai, R.drawable.ic_activity_martial_arts),
PARALLEL_BARS(0x040000d3, R.string.activity_type_parallel_bars),
POLE_DANCE(0x040000d4, R.string.activity_type_pole_dance),
RACE_WALKING(0x040000d5, R.string.activity_type_race_walking),
SHUFFLEBOARD(0x040000d6, R.string.activity_type_shuffleboard),
SNORKELING(0x040000d7, R.string.activity_type_snorkeling, R.drawable.ic_activity_snorkeling),
SOMATOSENSORY_GAME(0x040000d8, R.string.activity_type_somatosensory_game),
SPINNING(0x040000d9, R.string.activity_type_spinning),
SQUARE_DANCE(0x040000da, R.string.activity_type_square_dance),
STAIR_CLIMBER(0x040000db, R.string.activity_type_stair_climber, R.drawable.ic_acticvity_stairs),
STEPPER(0x040000dc, R.string.activity_type_stepper),
STRETCHING(0x040000dd, R.string.activity_type_stretching, R.drawable.ic_activity_stretching),
TABLE_FOOTBALL(0x040000de, R.string.activity_type_table_football),
TUG_OF_WAR(0x040000df, R.string.activity_type_tug_of_war),
WALL_BALL(0x040000e0, R.string.activity_type_wall_ball),
WATER_POLO(0x040000e1, R.string.activity_type_water_polo),
WEIQI(0x040000e3, R.string.activity_type_weiqi),
FREE_SPARRING(0x040000e4, R.string.activity_type_free_sparring),
BODY_COMBAT(0x040000e5, R.string.activity_type_body_combat),
PLAZA_DANCING(0x040000e6, R.string.activity_type_plaza_dancing),
LASER_TAG(0x040000e7, R.string.activity_type_laser_tag),
OBSTACLE_RACE(0x040000e8, R.string.activity_type_obstacle_race, R.drawable.ic_activity_obstacle_race),
BILLIARD_POOL(0x040000e9, R.string.activity_type_billiard_pool, R.drawable.ic_activity_billiard_pool),
CANOEING(0x040000ea, R.string.activity_type_canoeing, R.drawable.ic_activity_kayaking),
WATER_SCOOTER(0x040000eb, R.string.activity_type_water_scooter, R.drawable.ic_activity_water),
BOBSLEIGH(0x040000ec, R.string.activity_type_bobsleigh, R.drawable.ic_activity_sledding),
SLEDDING(0x040000ed, R.string.activity_type_sledding, R.drawable.ic_activity_sledding),
BIATHLON(0x040000ee, R.string.activity_type_biathlon),
BUNGEE_JUMPING(0x040000ef, R.string.activity_type_bungee_jumping),
ORIENTEERING(0x040000f0, R.string.activity_type_orienteering, R.drawable.ic_activity_orienteering),
TREKKING(0x040000f1, R.string.activity_type_trekking, R.drawable.ic_activity_hiking),
TRAIL_RUN(0x040000f2, R.string.activity_type_trail_run, R.drawable.ic_activity_trail_run),
UPPER_BODY(0x040000f3, R.string.activity_type_upper_body),
TRAIL_HIKE(0x040000f4, R.string.activity_type_trail_hike, R.drawable.ic_activity_hiking),
MMA_HIIT(0x040000f5, R.string.activity_type_mma_hiit, R.drawable.ic_activity_mma),
LOWER_BODY(0x040000ff, R.string.activity_type_lower_body),
BARBELL(0x04000100, R.string.activity_type_barbell, R.drawable.ic_activity_barbell),
TRIATHLON(0x04000101, R.string.activity_type_triathlon),
OTHER_WATER_SPORTS(0x04000102, R.string.activity_type_other_water_sports, R.drawable.ic_activity_water),
OTHER_WINTER_SPORTS(0x04000103, R.string.activity_type_other_winter_sports, R.drawable.ic_activity_winter),
POWERBOATING(0x04000104, R.string.activity_type_powerboating, R.drawable.ic_activity_boating),
DIVING(0x04000105, R.string.activity_type_diving, R.drawable.ic_activity_diving),
ATV(0x04000106, R.string.activity_type_atv, R.drawable.ic_activity_atv),
PARAGLIDING(0x04000107, R.string.activity_type_paragliding, R.drawable.ic_activity_paragliding),
WEIGHTLIFTING(0x04000109, R.string.activity_type_weightlifting, R.drawable.ic_weight),
DEADLIFT(0x0400010a, R.string.activity_type_deadlift),
BURPEE(0x0400010b, R.string.activity_type_burpee),
ABS(0x0400010c, R.string.activity_type_abs),
BACK(0x0400010d, R.string.activity_type_back),
STEP_AEROBICS(0x0400010e, R.string.activity_type_step_aerobics),
EQUESTRIAN(0x0400010f, R.string.activity_type_equestrian),
ATHLETICS(0x04000110, R.string.activity_type_athletics),
FREE_DIVING(0x04000111, R.string.activity_type_free_diving, R.drawable.ic_activity_diving),
APNEA_TRAINING(0x04000112, R.string.activity_type_apnea_training),
APNEA_TEST(0x04000113, R.string.activity_type_apnea_test),
SCUBA_DIVING(0x04000114, R.string.activity_type_scuba_diving, R.drawable.ic_activity_diving),
ADVENTURE_RACE(0x04000115, R.string.activity_type_adventure_race, R.drawable.ic_travel_explore),
ANCHOR(0x04000116, R.string.activity_type_anchor, R.drawable.ic_anchor),
BACKCOUNTRY_SKIING(0x04000117, R.string.activity_type_backcountry_skiing, R.drawable.ic_activity_skiing),
BACKCOUNTRY_SNOWBOARDING(0x04000118, R.string.activity_type_backcountry_snowboarding, R.drawable.ic_activity_snowboarding),
BIKE_TOUR(0x04000119, R.string.activity_type_bike_tour, R.drawable.ic_directions_bike),
CYCLO_CROSS(0x04000120, R.string.activity_type_cyclo_cross, R.drawable.ic_directions_bike),
EXPEDITION(0x04000121, R.string.activity_type_expedition, R.drawable.ic_explore),
E_MOUNTAIN_BIKE(0x04000122, R.string.activity_type_e_mountain_bike, R.drawable.ic_electric_bike),
GRAVEL_BIKE(0x04000123, R.string.activity_type_gravel_bike, R.drawable.ic_directions_bike),
MAP(0x04000124, R.string.menuitem_map, R.drawable.ic_map),
MOTOCROSS(0x04000125, R.string.activity_type_motocross, R.drawable.ic_activity_motorcycling),
MOUNTAIN_BIKE(0x04000126, R.string.activity_type_mountain_bike, R.drawable.ic_directions_bike),
OVERLANDING(0x04000127, R.string.activity_type_overlanding, R.drawable.ic_unpaved_road), // aka 4WD Touring
ROAD_BIKE(0x04000128, R.string.activity_type_road_bike, R.drawable.ic_activity_bike_lane),
TRACK_ME(0x04000129, R.string.activity_type_track_me, R.drawable.ic_familiar_face_and_zone),
TRACK_RUN(0x04000130, R.string.activity_type_track_run, R.drawable.ic_laps),
TROLLING_MOTOR(0x04000131, R.string.activity_type_trolling_motor, R.drawable.ic_mode_fan),
ULTRA_RUN(0x04000132, R.string.activity_type_ultra_run, R.drawable.ic_activity_trail_run),
VIRTUAL_RUN(0x04000133, R.string.activity_type_virtual_run, R.drawable.ic_activity_indoor_running),
XC_SKATE_SKI(0x04000134, R.string.activity_type_xc_skate_ski, R.drawable.ic_activity_skiing),
STREET_RUNNING(0x04000135, R.string.activity_type_street_running, R.drawable.ic_activity_road),
STOP_WATCH(0x04000136, R.string.activity_type_stop_watch, R.drawable.ic_timer),
CCR_DIVING(0x04000137, R.string.activity_type_ccr_diving, R.drawable.ic_activity_diving),
FLOORBALL(0x04000138, R.string.activity_type_floorball, R.drawable.ic_activity_hockey),
GEOCACHING(0x04000139, R.string.activity_type_geocaching, R.drawable.ic_travel_explore),
MOBILITY(0x0400013A, R.string.activity_type_mobility),
MOTOR_SPORT(0x0400013B, R.string.activity_type_motor_sport, R.drawable.ic_sports_motorsports),
CYCLING_DOWNHILL(0x0400013C, R.string.activity_type_cycling_downhill, R.drawable.ic_landscape),
INDOOR_SKIING(0x0400013D, R.string.activity_type_indoor_skiing, R.drawable.ic_activity_skiing),
;
private final int code;
private final int label;
private final int icon;
ActivityKind(final int code) {
this(code, R.string.activity_type_unknown);
}
ActivityKind(final int code, @StringRes final int label) {
this(code, label, R.drawable.ic_activity_unknown_small);
}
ActivityKind(final int code, @StringRes final int label, @DrawableRes final int icon) {
this.code = code;
this.label = label;
this.icon = icon;
}
public int getCode() {
return code;
}
@StringRes
public int getLabel() {
return label;
}
public String getLabel(final Context context) {
return context.getString(label);
}
@DrawableRes
public int getIcon() {
return icon;
}
public static ActivityKind fromCode(final int code) {
for (final ActivityKind kind : ActivityKind.values()) {
if (kind.code == code) {
return kind;
}
}
//throw new IllegalArgumentException("Unknown ActivityKind code " + code);
return UNKNOWN;
}
public static boolean isSleep(final ActivityKind activityKind) {
return activityKind == ActivityKind.SLEEP_ANY
|| activityKind == ActivityKind.LIGHT_SLEEP
|| activityKind == ActivityKind.DEEP_SLEEP
|| activityKind == ActivityKind.REM_SLEEP
|| activityKind == ActivityKind.AWAKE_SLEEP;
}
public static boolean isPaceActivity(final ActivityKind activityKind) {
return activityKind.name().contains("RUN") || activityKind.name().contains("SWIM") ||
activityKind.name().contains("TREADMILL") || activityKind.name().contains("WALK");
}
public static boolean isNauticalActivity(final ActivityKind activityKind) {
return activityKind == SAILING
|| activityKind == SAIL_RACE
|| activityKind == SAIL_EXPEDITION
|| activityKind == BOATING
|| activityKind == POWERBOATING
|| activityKind == MARINE
|| activityKind == ANCHOR
|| activityKind == TROLLING_MOTOR
|| activityKind == WINDSURFING;
}
public static boolean isSwimActivity(final ActivityKind activityKind) {
return activityKind.name().contains("SWIM");
}
public static boolean isDiving(final ActivityKind activityKind) {
return activityKind.name().contains("DIVING") || activityKind.name().contains("APNEA");
}
public static CycleUnit getCycleUnit(final ActivityKind activityKind) {
switch (activityKind) {
case BUNGEE_JUMPING:
case JUMP_ROPING:
case JUMPMASTER:
case TRAMPOLINE:
return CycleUnit.JUMPS;
case BIKE_COMMUTE:
case CYCLING:
case E_BIKE:
case HANDCYCLING:
case HANDCYCLING_INDOOR:
case INDOOR_CYCLING:
case OUTDOOR_CYCLING:
case SPINNING:
case DYNAMIC_CYCLE:
case BMX:
case BIKE_TOUR:
case CYCLO_CROSS:
case E_MOUNTAIN_BIKE:
case GRAVEL_BIKE:
case MOUNTAIN_BIKE:
case ROAD_BIKE:
case CYCLING_DOWNHILL:
return CycleUnit.REVOLUTIONS;
case FLEXIBILITY:
case BARBELL:
case BATTLE_ROPE:
case CORE_TRAINING:
case CROSSFIT:
case DUMBBELL:
case FITNESS_EXERCISES:
case FUNCTIONAL_TRAINING:
case PILATES:
case PLANK:
case PULL_UPS:
case PUSH_UPS:
case SIT_UPS:
case SMITH_MACHINE:
case STRENGTH_TRAINING:
case YOGA:
return CycleUnit.REPS;
case ARTISTIC_SWIMMING:
case KAYAKING:
case KITESURFING:
case PADDLING:
case POOL_SWIM:
case RAFTING:
case ROWING:
case ROWING_MACHINE:
case STAND_UP_PADDLEBOARDING:
case SURFING:
case SWIMMING:
case SWIMMING_OPENWATER:
case WAKEBOARDING:
case WATER_SKIING:
case WINDSURFING:
return CycleUnit.STROKES;
case BADMINTON:
case GOLF:
case HOCKEY:
case LACROSSE:
case PICKLEBALL:
case PINGPONG:
case RACKET:
case RACQUETBALL:
case SHUTTLECOCK:
case SQUASH:
case TABLE_TENNIS:
case TENNIS:
case BASEBALL:
case CRICKET:
case SOFTBALL:
return CycleUnit.SWINGS;
case DIVING:
case SCUBA_DIVING:
case FREE_DIVING:
case APNEA_TRAINING:
case APNEA_TEST:
return CycleUnit.NONE;
}
return CycleUnit.STEPS;
}
public enum CycleUnit {
NONE("n_a"),
UNKNOWN("unknown"),
STEPS("steps"),
STROKES("strokes"),
JUMPS("Jumps"),
REPS("workout_set_reps"),
REVOLUTIONS("workout_revolutions"),
SWINGS("workout_swings"),
;
private final String name;
CycleUnit(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}