diff --git a/app/src/main/java/io/xpipe/app/action/AbstractAction.java b/app/src/main/java/io/xpipe/app/action/AbstractAction.java index 27ec08518..c270bfe74 100644 --- a/app/src/main/java/io/xpipe/app/action/AbstractAction.java +++ b/app/src/main/java/io/xpipe/app/action/AbstractAction.java @@ -9,6 +9,8 @@ import io.xpipe.app.core.window.AppDialog; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.platform.LabelGraphic; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.DataStoreFormatter; import io.xpipe.app.util.LicensedFeature; import io.xpipe.app.util.ThreadHelper; @@ -116,9 +118,32 @@ public abstract class AbstractAction { }); } - public boolean executeSyncImpl(boolean confirm) { - if (confirm && !ActionConfirmation.confirmAction(this)) { - return false; + private List getEntryContext() { + if (this instanceof StoreContextAction ca) { + return ca.getStoreEntryContext(); + } + + return List.of(); + } + + private boolean hasEnabledConfirmAllModifications() { + var context = getEntryContext(); + return context.stream().anyMatch(dataStoreEntry -> { + var config = DataStorage.get().getEffectiveCategoryConfig(dataStoreEntry); + return config.getConfirmAllModifications() != null && config.getConfirmAllModifications(); + }); + } + + public boolean requiresConfirmation() { + return forceConfirmation() || (isMutation() && hasEnabledConfirmAllModifications()); + } + + public boolean executeSyncImpl(boolean checkConfirm) { + if (checkConfirm && requiresConfirmation()) { + var r = ActionConfirmation.confirmAction(this); + if (!r) { + return false; + } } if (closed) { diff --git a/app/src/main/java/io/xpipe/app/action/ActionConfirmation.java b/app/src/main/java/io/xpipe/app/action/ActionConfirmation.java index 81df45972..a2248be42 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionConfirmation.java +++ b/app/src/main/java/io/xpipe/app/action/ActionConfirmation.java @@ -12,10 +12,6 @@ import java.util.List; public class ActionConfirmation { public static boolean confirmAction(AbstractAction action) { - if (!action.forceConfirmation() && (!action.isMutation() || !confirmAllModifications(action))) { - return true; - } - var ok = new SimpleBooleanProperty(false); var modal = ModalOverlay.of("confirmAction", new ActionConfirmComp(action).prefWidth(550)); modal.addButton(ModalButton.cancel()); @@ -23,20 +19,4 @@ public class ActionConfirmation { modal.showAndWait(); return ok.get(); } - - private static boolean confirmAllModifications(AbstractAction action) { - var context = getContext(action); - return context.stream().anyMatch(dataStoreEntry -> { - var config = DataStorage.get().getEffectiveCategoryConfig(dataStoreEntry); - return config.getConfirmAllModifications() != null && config.getConfirmAllModifications(); - }); - } - - private static List getContext(AbstractAction action) { - if (action instanceof StoreContextAction ca) { - return ca.getStoreEntryContext(); - } - - return List.of(); - } } diff --git a/app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java b/app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java index 5670db62b..2d277f539 100644 --- a/app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java +++ b/app/src/main/java/io/xpipe/app/action/XPipeUrlProvider.java @@ -1,6 +1,7 @@ package io.xpipe.app.action; import io.xpipe.app.core.AppCache; +import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppRestart; import io.xpipe.app.core.window.AppDialog; import io.xpipe.app.ext.ProcModuleProvider; @@ -27,17 +28,25 @@ public class XPipeUrlProvider implements LauncherUrlProvider { } if ("action".equals(a)) { - if (!checkPermission()) { + if (!checkEnabled()) { return null; } var query = uri.getQuery(); var action = ActionUrls.parse(query); + + if (action.isPresent() && !action.get().requiresConfirmation()) { + var r = ActionConfirmation.confirmAction(action.get()); + if (!r) { + return null; + } + } + return action.orElse(null); } if ("sync".equals(a)) { - if (!checkPermission()) { + if (!checkEnabled()) { return null; } @@ -49,6 +58,11 @@ public class XPipeUrlProvider implements LauncherUrlProvider { return null; } + var confirm = AppDialog.confirm("syncUrlSetTitle", AppI18n.observable("syncUrlSetContent", repo)); + if (!confirm) { + return null; + } + AppPrefs.get().setFromExternal(AppPrefs.get().storageGitRemote(), repo); AppPrefs.get().setFromExternal(AppPrefs.get().enableGitStorage(), true); AppPrefs.get().save(); @@ -59,7 +73,7 @@ public class XPipeUrlProvider implements LauncherUrlProvider { return null; } - private boolean checkPermission() { + private boolean checkEnabled() { var cache = AppCache.getBoolean("externalUrlsPermitted", false); if (cache) { return true;