From 976987e6aa42b1ed34ec745c4be98ee9f6303469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Thu, 20 Nov 2025 19:53:11 +0000 Subject: [PATCH] Fix OpenTracks icon mapping --- .../opentracks/OpenTracksActivityType.java | 137 ++++++++++++++++++ .../opentracks/OpenTracksController.java | 32 ++-- 2 files changed, 147 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksActivityType.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksActivityType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksActivityType.java new file mode 100644 index 0000000000..fd36e7987c --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksActivityType.java @@ -0,0 +1,137 @@ +package nodomain.freeyourgadget.gadgetbridge.externalevents.opentracks; + +import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; + +/** + * As per ActivityType.java + */ +public enum OpenTracksActivityType { + AIRPLANE("airplane"), + ATV("ATV"), + BIKING("biking"), + BLIMP("blimp"), + BOAT("boat"), + CLIMBING("climbing"), + COMMERCIAL_AIRPLANE("commercial airplane"), + CROSS_COUNTRY_SKIING("cross-country skiing"), + CYCLING("cycling"), + DIRT_BIKE("dirt bike"), + DONKEY_BACK_RIDING("donkey back riding"), + DRIVING("driving"), + DRIVING_BUS("driving bus"), + DRIVING_CAR("driving car"), + ESCOOTER("escooter"), + FERRY("ferry"), + FRISBEE("frisbee"), + GLIDING("gliding"), + HANG_GLIDING("hang gliding"), + HELICOPTER("helicopter"), + HIKING("hiking"), + HORSE_BACK_RIDING("horse back riding"), + HOT_AIR_BALLOON("hot air balloon"), + ICE_SAILING("ice sailing"), + INLINE_SKATING("inline skating"), + KAYAKING("kayaking"), + KITE_SURFING("kite surfing"), + LAND_SAILING("land sailing"), + MIXED_TYPE("mixed type"), + MOTOR_BIKE("motor bike"), + MOTOR_BOATING("motor boating"), + MOUNTAIN_BIKING("mountain biking"), + OFF_TRAIL_HIKING("off trail hiking"), + OTHER("other"), + PADDLING("paddling"), + PARA_GLIDING("para gliding"), + RC_AIRPLANE("RC airplane"), + RC_BOAT("RC boat"), + RC_HELICOPTER("RC helicopter"), + RIDING("riding"), + ROAD_BIKING("road biking"), + ROLLER_SKIING("roller skiing"), + ROWING("rowing"), + RUNNING("running"), + SAILING("sailing"), + KICKSCOOTER("kickscooter"), + SEAPLANE("seaplane"), + SKATE_BOARDING("skateboarding"), + SKATING("skating"), + SKIING("skiing"), + SKY_JUMPING("sky jumping"), + SLED("sled"), + SNOW_BOARDING("snowboarding"), + SNOW_SHOEING("snow shoeing"), + SPEED_WALKING("speed walking"), + STREET_RUNNING("street running"), + SURFING("surfing"), + TRACK_CYCLING("track cycling"), + TRACK_RUNNING("track running"), + TRAIL_HIKING("trail hiking"), + TRAIL_RUNNING("trail running"), + TRAIN("train"), + ULTIMATE_FRISBEE("ultimate frisbee"), + WAKEBOARDING("wakeboarding"), + WALKING("walking"), + WATER_SKIING("water skiing"), + WIND_SURFING("wind surfing"), + SWIMMING("swimming"), + SWIMMING_OPEN("swimming in open water"), + WORKOUT("workout"), + UNKNOWN("unknown"), + ; + + private final String id; + + OpenTracksActivityType(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public static OpenTracksActivityType fromActivityKind(final ActivityKind activityKind) { + return switch (activityKind) { + case ATV -> ATV; + case CYCLING, INDOOR_CYCLING, OUTDOOR_CYCLING, HANDCYCLING -> BIKING; + case BOATING, DRAGON_BOAT, POWERBOATING -> BOAT; + case CLIMBING -> CLIMBING; + case CROSS_COUNTRY_SKIING -> CROSS_COUNTRY_SKIING; + case DRIVING -> DRIVING; + case FRISBEE -> FRISBEE; + case HANG_GLIDING -> HANG_GLIDING; + case HIKING -> HIKING; + case HORSE_RIDING -> HORSE_BACK_RIDING; + case ICE_SKATING -> ICE_SAILING; + case INLINE_SKATING -> INLINE_SKATING; + case KAYAKING -> KAYAKING; + case KITESURFING -> KITE_SURFING; + case MOTORCYCLING -> MOTOR_BIKE; + case MOUNTAIN_BIKE -> MOUNTAIN_BIKING; + case PADDLING -> PADDLING; + case PARAGLIDING -> PARA_GLIDING; + case ROAD_BIKE -> ROAD_BIKING; + case ROWING -> ROWING; + case RUNNING -> RUNNING; + case SAILING -> SAILING; + case SKATEBOARDING -> SKATE_BOARDING; + case SKATING -> SKATING; + case SKIING -> SKIING; + case SKY_DIVING -> SKY_JUMPING; + case SLEDDING -> SLED; + case SNOWBOARDING -> SNOW_BOARDING; + case SNOWSHOE -> SNOW_SHOEING; + case SURFING -> SURFING; + case TRACK_RUN -> TRACK_RUNNING; + case TRAIL_RUN -> TRAIL_RUNNING; + case TRAINING -> TRAIN; + case ULTIMATE_DISC -> ULTIMATE_FRISBEE; + case WAKEBOARDING -> WAKEBOARDING; + case WALKING -> WALKING; + case WATER_SKIING -> WATER_SKIING; + case WINDSURFING -> WIND_SURFING; + case SWIMMING -> SWIMMING; + case SWIMMING_OPENWATER -> SWIMMING_OPEN; + default -> UNKNOWN; + }; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksController.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksController.java index 78649e0290..f50e32d305 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksController.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/opentracks/OpenTracksController.java @@ -54,7 +54,7 @@ public class OpenTracksController extends Activity { * their documentation here: https://github.com/OpenTracksApp/OpenTracks#api * `startRecording()` sends an explicit Intent to OpenTracks signalling it * to start recording. It passes along the package name and class name of - * our `OpenTracksController` which OpenTracks will use to send the + * our `OpenTracksController` which OpenTracks will use to send the * statistics URIs to. After starting the recording service, OpenTracks * uses a new explicit Intent to start our `OpenTracksController` and passes * along the URIs and the read permissions for those URIs (using @@ -86,8 +86,8 @@ public class OpenTracksController extends Activity { } Uri tracksUri = uris.get(0); Uri trackpointsUri = uris.get(1); - LOG.info("Registering OpenTracksContentObserver with tracks URI: " + tracksUri); - LOG.info("Registering OpenTracksContentObserver with trackpoints URI: " + trackpointsUri); + LOG.info("Registering OpenTracksContentObserver with tracks URI: {}", tracksUri); + LOG.info("Registering OpenTracksContentObserver with trackpoints URI: {}", trackpointsUri); gbApp.setOpenTracksObserver(new OpenTracksContentObserver(this, tracksUri, trackpointsUri, protocolVersion)); try { getContentResolver().registerContentObserver(tracksUri, false, gbApp.getOpenTracksObserver()); @@ -99,7 +99,7 @@ public class OpenTracksController extends Activity { moveTaskToBack(true); } - public static void sendIntent(Context context, String className, String category, String icon) { + public static void sendIntent(Context context, String className, String category, OpenTracksActivityType openTracksActivityType) { Prefs prefs = GBApplication.getPrefs(); String packageName = prefs.getString("opentracks_packagename", "de.dennisguse.opentracks"); Intent intent = new Intent(); @@ -110,8 +110,8 @@ public class OpenTracksController extends Activity { if (category != null) { intent.putExtra("TRACK_CATEGORY", category); } - if (icon != null) { - intent.putExtra("TRACK_ICON", icon); + if (openTracksActivityType != null) { + intent.putExtra("TRACK_ICON", openTracksActivityType.getId()); } try { context.startActivity(intent); @@ -126,24 +126,12 @@ public class OpenTracksController extends Activity { public static void startRecording(Context context, ActivityKind activityKind) { final String category = activityKind.getLabel(context); - final String icon; - switch (activityKind) { - case CYCLING: - icon = "BIKE"; - break; - case HIKING: - case WALKING: - icon = "WALK"; - break; - case RUNNING: - icon = "RUN"; - break; - default: - LOG.warn("Unmapped activity kind icon for {}", activityKind); - icon = null; + final OpenTracksActivityType openTracksActivityType = OpenTracksActivityType.fromActivityKind(activityKind); + if (openTracksActivityType == OpenTracksActivityType.UNKNOWN) { + LOG.warn("Unmapped activity kind icon for {}", activityKind); } - sendIntent(context, "de.dennisguse.opentracks.publicapi.StartRecording", category, icon); + sendIntent(context, "de.dennisguse.opentracks.publicapi.StartRecording", category, openTracksActivityType); } public static void stopRecording(Context context) {