From b2aa61e1822b214188e9a888f44fcb6e7f417874 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 12 Jun 2023 12:20:43 +0100 Subject: [PATCH] Changed NavigationSpec's distance into a String. Previously we used an integer (in meters) but when using Google Maps navigation, Google Maps picks units based on locale *and* the distance - it might report "100m" or "20km". Then we carefully undo all that work, and for PineTime we just as "m" so you may well have "20000m" or more displayed, which is not ideal. I imagine at some point that will change, but we probably want to be able to handle that in the OSMAnd side of Gadgetbridge so all watches that implement navigation will benefit (and won't duplicate code). --- .../externalevents/OsmandEventReceiver.java | 2 +- .../GoogleMapsNotificationHandler.java | 17 ++--------------- .../gadgetbridge/model/NavigationInfoSpec.java | 2 +- .../service/DeviceCommunicationService.java | 2 +- .../devices/pinetime/PineTimeJFSupport.java | 6 ++++-- 5 files changed, 9 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/OsmandEventReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/OsmandEventReceiver.java index 93517dde6..dcb9ada87 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/OsmandEventReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/OsmandEventReceiver.java @@ -61,7 +61,7 @@ public class OsmandEventReceiver { @Override public void updateNavigationInfo(ADirectionInfo directionInfo) { navigationInfoSpec.nextAction = directionInfo.getTurnType(); - navigationInfoSpec.distanceToTurn = directionInfo.getDistanceTo(); + navigationInfoSpec.distanceToTurn = directionInfo.getDistanceTo()+"m"; if (shouldSendNavigation()) { GBApplication.deviceService().onSetNavigationInfo(navigationInfoSpec); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/notifications/GoogleMapsNotificationHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/notifications/GoogleMapsNotificationHandler.java index 914b05b3a..7e0e2f3c4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/notifications/GoogleMapsNotificationHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/notifications/GoogleMapsNotificationHandler.java @@ -958,21 +958,8 @@ public class GoogleMapsNotificationHandler { if (matchedIcon>=0) navInfo.nextAction = matchedIcon; navInfo.instruction = instruction; - if (distance != null) { - float distanceMultiplier = 1; - String distanceUnit = distance.replaceAll("[\\d.\\s]", "").toLowerCase(); - if (distanceUnit.equals("m")) distanceMultiplier = 1; - else if (distanceUnit.equals("mi")) distanceMultiplier = 1609.34f; - else if (distanceUnit.equals("yd")) distanceMultiplier = 0.9144f; - else if (distanceUnit.equals("ft")) distanceMultiplier = 0.3048f; - else if (distanceUnit.equals("km")) distanceMultiplier = 1000; - else LOG.info("Unknown distance unit '"+distanceUnit+"'"); - try { - navInfo.distanceToTurn = Math.round(distanceMultiplier * Float.parseFloat(distance.replaceAll("[^\\d.]", ""))); - } catch (NumberFormatException e) { - LOG.info("Couldn't parse distance"); - } - } + if (distance != null) + navInfo.distanceToTurn = distance; if (navLines[2].contains("ETA")) navInfo.ETA = navLines[2].replace("ETA","").trim(); GBApplication.deviceService().onSetNavigationInfo(navInfo); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NavigationInfoSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NavigationInfoSpec.java index 0ce24836c..297861fbc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NavigationInfoSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/NavigationInfoSpec.java @@ -37,7 +37,7 @@ public class NavigationInfoSpec { // ETA? Total Distance? public String instruction; - public int distanceToTurn; ///< Distance to turn (in metres?) + public String distanceToTurn; ///< Distance to turn (as a string, eg "100m") public int nextAction; ///< One of the ACTION_ constants public String ETA; ///< Estimated time of Arrival } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 29a5026c8..95a069557 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -890,7 +890,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere NavigationInfoSpec navigationInfoSpec = new NavigationInfoSpec(); navigationInfoSpec.instruction = intent.getStringExtra(EXTRA_NAVIGATION_INSTRUCTION); navigationInfoSpec.nextAction = intent.getIntExtra(EXTRA_NAVIGATION_NEXT_ACTION,0); - navigationInfoSpec.distanceToTurn = intent.getIntExtra(EXTRA_NAVIGATION_DISTANCE_TO_TURN,0); + navigationInfoSpec.distanceToTurn = intent.getStringExtra(EXTRA_NAVIGATION_DISTANCE_TO_TURN); navigationInfoSpec.ETA = intent.getStringExtra(EXTRA_NAVIGATION_ETA); deviceSupport.onSetNavigationInfo(navigationInfoSpec); break; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pinetime/PineTimeJFSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pinetime/PineTimeJFSupport.java index 52cef2e88..97a0611a4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pinetime/PineTimeJFSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pinetime/PineTimeJFSupport.java @@ -326,9 +326,11 @@ public class PineTimeJFSupport extends AbstractBTLEDeviceSupport implements DfuL if (navigationInfoSpec.instruction == null) { navigationInfoSpec.instruction = ""; } - + if (navigationInfoSpec.distanceToTurn == null) { + navigationInfoSpec.distanceToTurn = ""; + } safeWriteToCharacteristic(builder, PineTimeJFConstants.UUID_CHARACTERISTICS_NAVIGATION_NARRATIVE, navigationInfoSpec.instruction.getBytes(StandardCharsets.UTF_8)); - safeWriteToCharacteristic(builder, PineTimeJFConstants.UUID_CHARACTERISTICS_NAVIGATION_MAN_DISTANCE, (navigationInfoSpec.distanceToTurn + "m").getBytes(StandardCharsets.UTF_8)); + safeWriteToCharacteristic(builder, PineTimeJFConstants.UUID_CHARACTERISTICS_NAVIGATION_MAN_DISTANCE, navigationInfoSpec.distanceToTurn.getBytes(StandardCharsets.UTF_8)); String iconname; switch (navigationInfoSpec.nextAction) { case NavigationInfoSpec.ACTION_CONTINUE: