From e5bd1363852ccbcf7744304415881ca22eeb8aa3 Mon Sep 17 00:00:00 2001 From: Thomas Kuehne Date: Sat, 2 May 2026 21:27:31 +0000 Subject: [PATCH] Garmin: add BUNDLE_EXTRA_INSTALL_TASK_NAME and BUNDLE_EXTRA_INSTALL_BYTES for onInstallApp --- .../garmin/GarminFitFileInstallHandler.java | 16 +++++++++++++ .../service/AbstractDeviceSupport.java | 12 ++++++++-- .../service/devices/garmin/GarminSupport.java | 23 +++++++++++++++---- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminFitFileInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminFitFileInstallHandler.java index 3c331fef7f..335871b863 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminFitFileInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/garmin/GarminFitFileInstallHandler.java @@ -16,6 +16,8 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.devices.garmin; +import static nodomain.freeyourgadget.gadgetbridge.service.AbstractDeviceSupport.BUNDLE_EXTRA_INSTALL_BYTES; + import android.app.Activity; import android.content.Context; import android.net.Uri; @@ -62,6 +64,20 @@ public class GarminFitFileInstallHandler implements InstallHandler { public GarminFitFileInstallHandler(final Uri uri, final Bundle options, final Context context) { this.mContext = context; + if (options != null && options.containsKey(BUNDLE_EXTRA_INSTALL_BYTES)) { + try { + rawBytes = options.getByteArray(BUNDLE_EXTRA_INSTALL_BYTES); + fitFile = FitFile.parseIncoming(rawBytes); + fileType = fitFile.getFileType(); + return; + } catch (final FitParseException e) { + LOG.error("bundle fit bytes are corrupted", e); + fitParseException = e; + } catch (final Exception e) { + LOG.error("failed to read bundle fit bytes", e); + } + } + final UriHelper uriHelper; try { uriHelper = UriHelper.get(uri, context); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java index f9a5e60c3a..a1a7a454cd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/AbstractDeviceSupport.java @@ -1,7 +1,7 @@ -/* Copyright (C) 2015-2024 Alicia Hormann, Andreas Böhler, Andreas Shimokawa, +/* Copyright (C) 2015-2026 Alicia Hormann, Andreas Böhler, Andreas Shimokawa, Arjan Schrijver, Carsten Pfeiffer, Daniele Gobbetti, Davis Mosenkovs, Dmitriy Bogdanov, foxstidious, Ganblejs, José Rebelo, Pauli Salmenrinne, - Petr Vaněk, Taavi Eomäe, Yoran Vulker + Petr Vaněk, Taavi Eomäe, Yoran Vulker, Thomas Kuehne This file is part of Gadgetbridge. @@ -71,7 +71,13 @@ public abstract class AbstractDeviceSupport implements DeviceSupport { private Context context; private boolean autoReconnect, scanReconnect; + /// an optional {@link Bundle} extra of type {@code byte[]} used to pass + /// small transient data to {@link #onInstallApp(Uri, Bundle)} + public static final String BUNDLE_EXTRA_INSTALL_BYTES = "install_handler_bytes"; + /// an optional {@link Bundle} extra of type {@code String} used to pass + /// a task name for logging to {@link #onInstallApp(Uri, Bundle)} + public static final String BUNDLE_EXTRA_INSTALL_TASK_NAME = "install_handler_task_name"; @Override public void setContext(GBDevice gbDevice, BluetoothAdapter btAdapter, Context context) { @@ -368,6 +374,8 @@ public abstract class AbstractDeviceSupport implements DeviceSupport { * * @param uri reference to a watch app file * @param options a bundle of custom options + * @see #BUNDLE_EXTRA_INSTALL_BYTES + * @see #BUNDLE_EXTRA_INSTALL_TASK_NAME */ @Override public void onInstallApp(Uri uri, @NonNull final Bundle options) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java index 09483e6257..19a0205b22 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/GarminSupport.java @@ -1328,13 +1328,15 @@ public class GarminSupport extends AbstractBTLESingleDeviceSupport implements IC public void onInstallApp(Uri uri, @NonNull final Bundle options) { final GarminFitFileInstallHandler fitFileInstallHandler = new GarminFitFileInstallHandler(uri, options, getContext()); if (fitFileInstallHandler.isValid()) { + final FileType.FILETYPE fileType = fitFileInstallHandler.getFileType(); communicator.sendMessage( - "upload fit file", + options.getString(BUNDLE_EXTRA_INSTALL_TASK_NAME, "upload " + fileType + " file"), fileTransferHandler.initiateUpload( fitFileInstallHandler.getRawBytes(), - fitFileInstallHandler.getFileType() + fileType ).getOutgoingMessage() ); + return; } final GarminGpxRouteInstallHandler garminGpxRouteInstallHandler = new GarminGpxRouteInstallHandler(uri, getContext()); @@ -1346,19 +1348,30 @@ public class GarminSupport extends AbstractBTLESingleDeviceSupport implements IC ); final FitFile convertedFile = gpxRouteFileConverter.getConvertedFile(); final FileType.FILETYPE fileType = convertedFile.getFileType(); - communicator.sendMessage("upload " + fileType + " file", fileTransferHandler.initiateUpload(convertedFile.getOutgoingMessage(), fileType).getOutgoingMessage()); + communicator.sendMessage( + options.getString(BUNDLE_EXTRA_INSTALL_TASK_NAME, "upload " + fileType + " file"), + fileTransferHandler.initiateUpload( + convertedFile.getOutgoingMessage(), + fileType + ).getOutgoingMessage() + ); + return; } final GarminPrgFileInstallHandler prgFileInstallHandler = new GarminPrgFileInstallHandler(uri, getContext()); if (prgFileInstallHandler.isValid()) { + final FileType.FILETYPE fileType = FileType.FILETYPE.PRG; communicator.sendMessage( - "upload prg file", + options.getString(BUNDLE_EXTRA_INSTALL_TASK_NAME, "upload " + fileType + " file"), fileTransferHandler.initiateUpload( prgFileInstallHandler.getRawBytes(), - FileType.FILETYPE.PRG + fileType ).getOutgoingMessage() ); + return; } + + LOG.warn("no install handler found for {} {}", uri, options.getString(BUNDLE_EXTRA_INSTALL_TASK_NAME)); } @Override