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