diff --git a/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java b/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java index 21b4a131f..e07b8317a 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java +++ b/app/src/main/java/io/xpipe/app/action/ActionJacksonMapper.java @@ -72,7 +72,9 @@ public class ActionJacksonMapper { var makeMulti = ref != null && ref.isArray() && MultiStoreAction.class.isAssignableFrom(clazz.get()); if (makeMulti) { - validateRef(provider.get(), ref.asString()); + for (JsonNode singleRef : ref) { + validateRef(provider.get(), singleRef.asString()); + } object.remove("ref"); object.set("refs", ref); var action = mapper.treeToValue(object, clazz.get()); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java index eb39ff0ec..60ea385e7 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java @@ -87,7 +87,7 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab { var suffix = fileSystemNameSuffix.get(); return name.getValue() + (suffix != null ? " [" + suffix + "]" : ""); - }); + }, name, fileSystemNameSuffix); } public void updateProgress(BrowserTransferProgress n) { diff --git a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java index 743e067c6..e8a93380e 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceChoiceComp.java @@ -117,6 +117,10 @@ public class ContextualFileReferenceChoiceComp extends RegionBuilder { var source = rawSource.get(); var target = sync.getTargetLocation().apply(source); + if (target == null) { + return; + } + var shouldCopy = AppDialog.confirm("confirmGitShare"); if (!shouldCopy) { return; @@ -135,7 +139,9 @@ public class ContextualFileReferenceChoiceComp extends RegionBuilder { .asLocalPath(); if (Files.exists(pubSource)) { var pubTarget = sync.getTargetLocation().apply(pubSource); - handler.addDataFile(pubSource, pubTarget, sync.getScope().get()); + if (pubTarget != null) { + handler.addDataFile(pubSource, pubTarget, sync.getScope().get()); + } } var ppkSource = Path.of(sourceBase + ".ppk"); diff --git a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceSync.java b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceSync.java index 93a873f58..490adc50e 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceSync.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ContextualFileReferenceSync.java @@ -34,6 +34,7 @@ public class ContextualFileReferenceSync { while (true) { var target = dir.resolve(name); if (Files.exists(target)) { + var replace = new AtomicBoolean(false); var rename = new AtomicBoolean(false); var event = ErrorEventFactory.fromMessage(AppI18n.get("syncFileExists", target)) .customAction(new ErrorAction() { @@ -49,6 +50,7 @@ public class ContextualFileReferenceSync { @Override public boolean handle(ErrorEvent event) { + replace.set(true); return true; } }) @@ -81,6 +83,12 @@ public class ContextualFileReferenceSync { name = newName.get(); continue; } + + if (replace.get()) { + return target; + } else { + return null; + } } return target; diff --git a/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java b/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java index 95471183a..9aba87eca 100644 --- a/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java +++ b/app/src/main/java/io/xpipe/app/core/AppSystemInfo.java @@ -340,7 +340,7 @@ public abstract class AppSystemInfo { ErrorEventFactory.fromThrowable(e).handle(); } - var fallback = getUserHome().resolve("Desktop"); + var fallback = getUserHome().resolve("Downloads"); return (downloads = fallback); } diff --git a/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationMenu.java b/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationMenu.java index 62bd03004..b5e1258e3 100644 --- a/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationMenu.java +++ b/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationMenu.java @@ -106,7 +106,7 @@ public class StoreCreationMenu { .getRoot() .equals(allCat); }, - StoreViewState.get().getAllEntries().getList()); + StoreViewState.get().getAllEntries().getList(), StoreViewState.get().getActiveCategory()); automatically.disableProperty().bind(disableSearch); items.add(new SeparatorMenuItem()); diff --git a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java index 19fb3b54f..421cf4c37 100644 --- a/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/IconsCategory.java @@ -118,6 +118,15 @@ public class IconsCategory extends AppPrefsCategory { } catch (Exception ignored) { } + // Prevent name duplicates + var finalId = id; + var conflict = sources.stream().anyMatch(systemIconSource -> { + return systemIconSource.getId().equals(finalId); + }); + if (conflict) { + id = null; + } + if (id == null) { id = UUID.randomUUID().toString(); } diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageElement.java b/app/src/main/java/io/xpipe/app/storage/DataStorageElement.java index 3cbbcd60f..fc824dd1b 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageElement.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageElement.java @@ -187,19 +187,11 @@ public abstract class DataStorageElement { } public void setLastModified(Instant lastModified) { - if (lastModified.equals(this.lastModified)) { - return; - } - - notifyUpdate(false, true); + this.lastModified = lastModified; } public void setLastUsed(Instant lastUsed) { - if (lastUsed.equals(this.lastUsed)) { - return; - } - - notifyUpdate(true, false); + this.lastUsed = lastUsed; } public interface Listener { diff --git a/app/src/main/java/io/xpipe/app/store/NetworkTunnelStore.java b/app/src/main/java/io/xpipe/app/store/NetworkTunnelStore.java index c152d852f..01a9e6241 100644 --- a/app/src/main/java/io/xpipe/app/store/NetworkTunnelStore.java +++ b/app/src/main/java/io/xpipe/app/store/NetworkTunnelStore.java @@ -30,7 +30,7 @@ public interface NetworkTunnelStore extends DataStore, SelfReferentialStore { return HostAddress.empty(); } - default Optional> getUnsupportedParent() { + default Optional> getUnsupportedParent() { DataStoreEntryRef current = getSelfEntry().ref(); while (true) { var p = current.getStore().getNetworkParent(); @@ -41,7 +41,7 @@ public interface NetworkTunnelStore extends DataStore, SelfReferentialStore { if (p.getStore() instanceof NetworkTunnelStore) { current = p.asNeeded(); } else { - return Optional.of(current); + return Optional.of(p); } } }