diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java index 4f05cdcfe..bde41f36a 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileTransferOperation.java @@ -161,6 +161,12 @@ public class BrowserFileTransferOperation { reinitFileSystemsIfNeeded(); + if (target.getKind() != FileKind.DIRECTORY) { + throw new IllegalStateException("Target " + target.getPath() + " is not a directory"); + } + + BrowserFileSystemHelper.validateDirectoryPath(target.getFileSystem(), target.getPath(), true); + cancelled.set(false); var same = files.getFirst().getFileSystem().equals(target.getFileSystem()); @@ -244,12 +250,6 @@ public class BrowserFileTransferOperation { } private void handleSingleAcrossFileSystems(FileEntry source) throws Exception { - if (target.getKind() != FileKind.DIRECTORY) { - throw new IllegalStateException("Target " + target.getPath() + " is not a directory"); - } - - BrowserFileSystemHelper.validateDirectoryPath(target.getFileSystem(), target.getPath(), true); - var flatFiles = new LinkedHashMap(); // Prevent dropping directory into itself @@ -263,11 +263,14 @@ public class BrowserFileTransferOperation { // Source might have been deleted meanwhile var exists = source.getFileSystem().directoryExists(source.getPath()); if (!exists) { + progress.accept(BrowserTransferProgress.finished(source.getName(), 0)); return; } var directoryName = source.getPath().getFileName(); - flatFiles.put(source, FilePath.of(directoryName)); + if (!source.getPath().isRoot()) { + flatFiles.put(source, FilePath.of(directoryName)); + } var baseRelative = source.getPath().getParent().toDirectory(); var list = new ArrayList(); @@ -288,16 +291,21 @@ public class BrowserFileTransferOperation { list.add(fileEntry); return true; }); - } else { + } else if (source.getKind() == FileKind.FILE) { // Source might have been deleted meanwhile var exists = source.getFileSystem().fileExists(source.getPath()); if (!exists) { + progress.accept(BrowserTransferProgress.finished(source.getName(), 0)); return; } flatFiles.put(source, FilePath.of(source.getPath().getFileName())); // If we don't have a size, it doesn't matter that much as the total size is only for display totalSize.addAndGet(source.getFileSizeLong().orElse(0)); + } else { + // Unsupported type, e.g. a socket + progress.accept(BrowserTransferProgress.finished(source.getName(), 0)); + return; } var originalSourceFs = flatFiles.keySet().iterator().next().getFileSystem(); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java index d36485f4d..19e78f4f9 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java @@ -106,13 +106,14 @@ public class BrowserTransferModel { public void drop(BrowserFileSystemTabModel model, List entries) { synchronized (items) { entries.forEach(entry -> { - var name = entry.getFileName(); + var resolved = entry.getRawFileEntry().resolved(); + var name = resolved.getName(); if (items.stream().anyMatch(item -> item.getName().equals(name))) { return; } var fixedFile = OsFileSystem.ofLocal() - .makeFileSystemCompatible(entry.getRawFileEntry().getPath()); + .makeFileSystemCompatible(resolved.getPath()); Path file = TEMP.resolve(fixedFile.getFileName()); var item = new Item(model, name, entry, file); items.add(item); @@ -145,7 +146,7 @@ public class BrowserTransferModel { transferring.setValue(true); var op = new BrowserFileTransferOperation( BrowserLocalFileSystem.getLocalFileEntry(TEMP), - List.of(item.getBrowserEntry().getRawFileEntry()), + List.of(item.getBrowserEntry().getRawFileEntry().resolved()), BrowserFileTransferMode.COPY, false, progress -> { @@ -192,6 +193,7 @@ public class BrowserTransferModel { var files = toMove.stream().map(item -> item.getLocalFile()).toList(); var downloads = getDownloadsTargetDirectory(); Files.createDirectories(downloads); + Path firstToOpen = null; for (Path file : files) { if (!Files.exists(file)) { continue; @@ -207,10 +209,13 @@ public class BrowserTransferModel { } else { Files.move(file, target, StandardCopyOption.REPLACE_EXISTING); } + + if (firstToOpen == null) { + firstToOpen = target; + } } - if (open) { - DesktopHelper.browseFileInDirectory( - downloads.resolve(files.getFirst().getFileName())); + if (open && firstToOpen != null) { + DesktopHelper.browseFileInDirectory(firstToOpen); } }