From 8be679d1fd2112eea336669575664552a66ac58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sun, 5 May 2024 14:04:31 +0100 Subject: [PATCH] Garmin: Overwrite files if local size is 0, omit date if equal to garmin epoch --- .../devices/garmin/FileTransferHandler.java | 12 +++-- .../service/devices/garmin/GarminSupport.java | 44 ++++++++++++++----- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileTransferHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileTransferHandler.java index fcae3a741..62869af47 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileTransferHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileTransferHandler.java @@ -13,6 +13,7 @@ import java.nio.ByteOrder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.deviceevents.FileDownloadedDeviceEvent; @@ -312,6 +313,8 @@ public class FileTransferHandler implements MessageHandler { } public static class DirectoryEntry { + private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.ROOT); + private final int fileIndex; private final FileType.FILETYPE filetype; private final int fileNumber; @@ -339,9 +342,12 @@ public class FileTransferHandler implements MessageHandler { } public String getFileName() { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); - String dateString = dateFormat.format(fileDate); - return getFiletype().name() + "_" + dateString + "_" + getFileIndex() + (getFiletype().isFitFile() ? ".fit" : ".bin"); + final StringBuilder sb = new StringBuilder(getFiletype().name()); + if (fileDate.getTime() != GarminTimeUtils.GARMIN_TIME_EPOCH * 1000L) { + sb.append("_").append(SDF.format(fileDate)); + } + sb.append("_").append(getFileIndex()).append(getFiletype().isFitFile() ? ".fit" : ".bin"); + return sb.toString(); } public String getLegacyFileName() { 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 446513283..6f671006a 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 @@ -81,6 +81,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.Syst import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.status.NotificationSubscriptionStatusMessage; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; +import nodomain.freeyourgadget.gadgetbridge.util.Optional; import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_ALLOW_HIGH_MTU; @@ -484,7 +485,7 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni while (!filesToDownload.isEmpty()) { final FileTransferHandler.DirectoryEntry directoryEntry = filesToDownload.remove(); - if (checkFileExists(directoryEntry.getFileName()) || checkFileExists(directoryEntry.getLegacyFileName())) { + if (alreadyDownloaded(directoryEntry)) { LOG.debug("File: {} already downloaded, not downloading again.", directoryEntry.getFileName()); if (!getKeepActivityDataOnDevice()) { // delete file from watch if already downloaded sendOutgoingMessage(new SetFileFlagsMessage(directoryEntry.getFileIndex(), SetFileFlagsMessage.FileFlags.ARCHIVE)); @@ -493,12 +494,9 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni } final DownloadRequestMessage downloadRequestMessage = fileTransferHandler.downloadDirectoryEntry(directoryEntry); - if (downloadRequestMessage != null) { - sendOutgoingMessage(downloadRequestMessage); - return; - } else { - LOG.debug("File: {} already downloaded, not downloading again, from inside.", directoryEntry.getFileName()); - } + LOG.debug("Will download file: {}", directoryEntry.getFileName()); + sendOutgoingMessage(downloadRequestMessage); + return; } } @@ -698,17 +696,39 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni } } - private boolean checkFileExists(String fileName) { + private boolean alreadyDownloaded(final FileTransferHandler.DirectoryEntry entry) { + final Optional file = getFile(entry.getFileName()); + if (file.isPresent()) { + if (file.get().length() == 0) { + LOG.warn("File {} is empty", entry.getFileName()); + return false; + } + return true; + } + + final Optional legacyFile = getFile(entry.getLegacyFileName()); + if (legacyFile.isPresent()) { + if (legacyFile.get().length() == 0) { + LOG.warn("Legacy file {} is empty", entry.getFileName()); + return false; + } + return true; + } + + return false; + } + + private Optional getFile(final String fileName) { File dir; try { dir = getWritableExportDirectory(); File outputFile = new File(dir, fileName); - if (outputFile.exists()) //do not download again already downloaded file - return true; + if (outputFile.exists()) + return Optional.of(outputFile); } catch (IOException e) { - LOG.error("IOException: " + e); + LOG.error("Failed to get file", e); } - return false; + return Optional.empty(); } public File getWritableExportDirectory() throws IOException {