From 8c88cc992af927c207e1e6f5b2ac3f8ffea25f5d Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Fri, 3 May 2024 10:22:43 +0200 Subject: [PATCH] Introduce device specific writable directory (MAC address) Also adds temporary method to move the fetched files from the legacy path to the new one which does not include the device name. Also moves the FileIndex to the end of the cached files to allow for easier sorting. Cherry-picked from 525b395c01ce57449ee9a8f74af663595223279e and adapted --- .../devices/AbstractDeviceCoordinator.java | 13 ++++++ .../devices/DeviceCoordinator.java | 5 +++ .../devices/garmin/FileTransferHandler.java | 2 +- .../service/devices/garmin/GarminSupport.java | 42 +++++++++++++++---- 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java index a82ed4d85..5918746af 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java @@ -80,6 +80,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.StressSample; import nodomain.freeyourgadget.gadgetbridge.model.TemperatureSample; import nodomain.freeyourgadget.gadgetbridge.service.ServiceDeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.SleepAsAndroidSender; +import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; @@ -296,6 +297,18 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator { return null; } + @Override + public File getWritableExportDirectory(final GBDevice device) throws IOException { + File dir; + dir = new File(FileUtils.getExternalFilesDir() + File.separator + device.getAddress()); + if (!dir.isDirectory()) { + if (!dir.mkdir()) { + throw new IOException("Cannot create device specific directory for " + device.getName()); + } + } + return dir; + } + @Override public String getAppCacheSortFilename() { return null; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java index 80899dbdb..c4dc3dd01 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java @@ -458,6 +458,11 @@ public interface DeviceCoordinator { */ File getAppCacheDir() throws IOException; + /** + * Returns the dedicated writable export directory for this device. + */ + File getWritableExportDirectory(GBDevice device) throws IOException; + /** * Returns a String containing the device app sort order filename. */ 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 f9a6681a6..2aa2e36f4 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 @@ -338,7 +338,7 @@ 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() + "_" + getFileIndex() + "_" + dateString + (getFiletype().isFitFile() ? ".fit" : ".bin"); + return getFiletype().name() + "_" + dateString + "_" + getFileIndex() + (getFiletype().isFitFile() ? ".fit" : ".bin"); } @NonNull 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 9ef4e99bd..9c5f1317e 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 @@ -445,6 +445,9 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni } private void processDownloadQueue() { + + moveFilesFromLegacyCache(); //TODO: remove before merging + if (!filesToDownload.isEmpty() && !fileTransferHandler.isDownloading()) { if (!gbDevice.isBusy()) { GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data), "", true, 0, getContext()); @@ -484,6 +487,36 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni } } + private void moveFilesFromLegacyCache() { //TODO: remove before merging + File legacyDir; + try { + legacyDir = new File(FileUtils.getExternalFilesDir() + "/" + FileUtils.makeValidFileName(getDevice().getName() + "_" + getDevice().getAddress())); + + if (legacyDir.isDirectory()) { + final File newDir = getWritableExportDirectory(); + File[] files = legacyDir.listFiles(); + + for (File file : files) { + if (file.isFile()) { + File destFile = new File(newDir, file.getName()); + boolean success = file.renameTo(destFile); + if (!success) { + LOG.error("Failed to move file {}", file.getName()); + } else { + LOG.info("Moved file {} to new cache directory", file.getName()); + } + } + } + boolean removed = legacyDir.delete(); + if (!removed) { + LOG.error("Failed to remove legacy directory: {}", legacyDir); + } + } + } catch (IOException e) { + LOG.error(e.getMessage()); + } + } + private void enableBatteryLevelUpdate() { final ProtobufMessage batteryLevelProtobufRequest = protocolBufferHandler.prepareProtobufRequest(GdiSmartProto.Smart.newBuilder() .setDeviceStatusService( @@ -597,14 +630,7 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni } public File getWritableExportDirectory() throws IOException { - File dir; - dir = new File(FileUtils.getExternalFilesDir() + "/" + FileUtils.makeValidFileName(getDevice().getName() + "_" + getDevice().getAddress())); - if (!dir.isDirectory()) { - if (!dir.mkdir()) { - throw new IOException("Cannot create device specific directory for " + getDevice().getName()); - } - } - return dir; + return getDevice().getDeviceCoordinator().getWritableExportDirectory(getDevice()); } @Override