diff --git a/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java b/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java index f19d4a8f1..19ead9702 100644 --- a/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java +++ b/app/src/main/java/io/xpipe/app/action/ActionShortcutComp.java @@ -82,9 +82,7 @@ public class ActionShortcutComp extends SimpleComp { private Comp createMacroComp() { var button = new ButtonComp( - AppI18n.observable("createMacro"), new FontIcon("mdi2c-clipboard-multiple-outline"), () -> { - onCreateMacro.run(); - }); + AppI18n.observable("createMacro"), new FontIcon("mdi2c-clipboard-multiple-outline"), onCreateMacro); return button; } } diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenDirectoryActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenDirectoryActionProvider.java index 61548b8ac..387d06313 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenDirectoryActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenDirectoryActionProvider.java @@ -18,7 +18,7 @@ public class OpenDirectoryActionProvider implements BrowserActionProvider { public static class Action extends BrowserAction { @Override - public void executeImpl() throws Exception { + public void executeImpl() { var first = getEntries().getFirst(); model.cdSync(first.getRawFileEntry().getPath().toString()); } diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileDefaultActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileDefaultActionProvider.java index 943dd957d..8ef809211 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileDefaultActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileDefaultActionProvider.java @@ -19,7 +19,7 @@ public class OpenFileDefaultActionProvider implements BrowserActionProvider { public static class Action extends BrowserAction { @Override - public void executeImpl() throws Exception { + public void executeImpl() { for (var entry : getEntries()) { BrowserFileOpener.openInDefaultApplication(model, entry.getRawFileEntry()); } diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java index 40f6910cf..d195951b7 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/OpenFileWithActionProvider.java @@ -20,7 +20,7 @@ public class OpenFileWithActionProvider implements BrowserActionProvider { public static class Action extends BrowserAction { @Override - public void executeImpl() throws Exception { + public void executeImpl() { for (var entry : getEntries()) { BrowserFileOpener.openWithAnyApplication(model, entry.getRawFileEntry()); } diff --git a/app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBrowserActionProvider.java b/app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBrowserActionProvider.java index ab7bde0a4..0f23c6f23 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBrowserActionProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/action/impl/RunCommandInBrowserActionProvider.java @@ -30,7 +30,7 @@ public class RunCommandInBrowserActionProvider implements BrowserActionProvider } @Override - public void executeImpl() throws Exception { + public void executeImpl() { var builder = CommandBuilder.of().addFile(command); for (BrowserEntry entry : getEntries()) { builder.addFile(entry.getRawFileEntry().getPath()); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java index 99e7af2fc..b58797f01 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOutput.java @@ -8,7 +8,7 @@ import java.util.Optional; public interface BrowserFileOutput { - public static BrowserFileOutput none() { + static BrowserFileOutput none() { return new BrowserFileOutput() { @Override @@ -22,7 +22,7 @@ public interface BrowserFileOutput { } @Override - public OutputStream open() throws IOException { + public OutputStream open() { return null; } }; 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 bedda015c..766d2ed4c 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 @@ -49,7 +49,6 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab terminalRequests = FXCollections.observableArrayList(); private final BooleanProperty transferCancelled = new SimpleBooleanProperty(); - @NonNull private FileSystem fileSystem; private BrowserFileSystemSavedState savedState; @@ -144,7 +143,6 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab entries) throws Exception { + public void execute(BrowserFileSystemTabModel model, List entries) { model.backSync(1); } diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/ChgrpMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/ChgrpMenuProvider.java index af3486fe4..e4e52b4a4 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/ChgrpMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/ChgrpMenuProvider.java @@ -147,7 +147,7 @@ public class ChgrpMenuProvider implements BrowserMenuBranchProvider { } @Override - public void execute(BrowserFileSystemTabModel model, List entries) throws Exception { + public void execute(BrowserFileSystemTabModel model, List entries) { var group = new SimpleStringProperty(); var modal = ModalOverlay.of( "groupName", diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/ChmodMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/ChmodMenuProvider.java index 1c5dc40ea..5964295f9 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/ChmodMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/ChmodMenuProvider.java @@ -145,7 +145,7 @@ public class ChmodMenuProvider implements BrowserMenuBranchProvider { } @Override - public void execute(BrowserFileSystemTabModel model, List entries) throws Exception { + public void execute(BrowserFileSystemTabModel model, List entries) { var permissions = new SimpleStringProperty(); var modal = ModalOverlay.of( "chmodPermissions", diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/ChownMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/ChownMenuProvider.java index f49e9381b..a796e1288 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/ChownMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/ChownMenuProvider.java @@ -146,7 +146,7 @@ public class ChownMenuProvider implements BrowserMenuBranchProvider { } @Override - public void execute(BrowserFileSystemTabModel model, List entries) throws Exception { + public void execute(BrowserFileSystemTabModel model, List entries) { var user = new SimpleStringProperty(); var modal = ModalOverlay.of( "userName", diff --git a/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java b/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java index f883e89e8..76a1e7a73 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/AppMainWindowContentComp.java @@ -3,8 +3,6 @@ package io.xpipe.app.comp.base; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.SimpleComp; import io.xpipe.app.core.*; -import io.xpipe.app.core.AppImages; -import io.xpipe.app.core.AppResources; import io.xpipe.app.core.window.AppDialog; import io.xpipe.app.core.window.AppMainWindow; import io.xpipe.app.issue.TrackEvent; diff --git a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java index 5d2584407..d97a32091 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayComp.java @@ -8,7 +8,6 @@ import io.xpipe.app.core.AppLogs; import io.xpipe.app.util.PlatformThread; import io.xpipe.core.process.OsType; -import javafx.animation.*; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.Property; diff --git a/app/src/main/java/io/xpipe/app/core/AppCache.java b/app/src/main/java/io/xpipe/app/core/AppCache.java index d8f67eeee..4d07a9f8a 100644 --- a/app/src/main/java/io/xpipe/app/core/AppCache.java +++ b/app/src/main/java/io/xpipe/app/core/AppCache.java @@ -5,6 +5,7 @@ import io.xpipe.core.util.JacksonMapper; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Getter; +import lombok.NonNull; import lombok.Setter; import org.apache.commons.io.FileUtils; @@ -72,7 +73,7 @@ public class AppCache { FileUtils.deleteQuietly(path.toFile()); } } - return notPresent != null ? notPresent.get() : null; + return notPresent.get(); } public static boolean getBoolean(String key, boolean notPresent) { diff --git a/app/src/main/java/io/xpipe/app/core/AppProperties.java b/app/src/main/java/io/xpipe/app/core/AppProperties.java index 6f1e08210..3ada43394 100644 --- a/app/src/main/java/io/xpipe/app/core/AppProperties.java +++ b/app/src/main/java/io/xpipe/app/core/AppProperties.java @@ -146,7 +146,7 @@ public class AppProperties { // We require the user dir from here AppUserDirectoryCheck.check(dataDir); AppCache.setBasePath(dataDir.resolve("cache")); - UUID id = AppCache.getNonNull("uuid", UUID.class, null); + UUID id = AppCache.getNonNull("uuid", UUID.class, () -> null); if (id == null) { uuid = UUID.randomUUID(); AppCache.update("uuid", uuid); diff --git a/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java b/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java index 2a930ed72..98b516bb1 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppMainWindow.java @@ -3,7 +3,6 @@ package io.xpipe.app.core.window; import io.xpipe.app.comp.base.AppLayoutComp; import io.xpipe.app.comp.base.AppMainWindowContentComp; import io.xpipe.app.core.*; -import io.xpipe.app.core.AppImages; import io.xpipe.app.core.mode.OperationMode; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.issue.TrackEvent; diff --git a/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java b/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java index ea854de45..e1b931201 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppWindowHelper.java @@ -1,8 +1,6 @@ package io.xpipe.app.core.window; import io.xpipe.app.core.*; -import io.xpipe.app.core.AppImages; -import io.xpipe.app.core.AppResources; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.util.InputHelper; import io.xpipe.app.util.PlatformInit; diff --git a/app/src/main/java/io/xpipe/app/hub/action/BatchHubProvider.java b/app/src/main/java/io/xpipe/app/hub/action/BatchHubProvider.java index d4df95645..898c9befe 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/BatchHubProvider.java +++ b/app/src/main/java/io/xpipe/app/hub/action/BatchHubProvider.java @@ -24,7 +24,7 @@ public interface BatchHubProvider extends ActionProvider { return true; } - default void execute(List> refs) throws Exception { + default void execute(List> refs) { createBatchAction(refs).executeAsync(); } diff --git a/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java b/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java index 9dd065cea..81fe3d43f 100644 --- a/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java +++ b/app/src/main/java/io/xpipe/app/hub/action/BatchStoreAction.java @@ -19,7 +19,7 @@ import java.util.stream.Collectors; @Getter public final class BatchStoreAction extends SerializableAction implements StoreContextAction { - protected final List> actions; + private final List> actions; @Override public void executeImpl() throws Exception { diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java index 384fe7a98..5e3cf9e93 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryComp.java @@ -7,11 +7,7 @@ import io.xpipe.app.comp.SimpleCompStructure; import io.xpipe.app.comp.augment.ContextMenuAugment; import io.xpipe.app.comp.augment.GrowAugment; import io.xpipe.app.comp.base.*; -import io.xpipe.app.comp.base.IconButtonComp; -import io.xpipe.app.comp.base.LazyTextFieldComp; -import io.xpipe.app.comp.base.LoadingOverlayComp; import io.xpipe.app.core.*; -import io.xpipe.app.core.AppResources; import io.xpipe.app.hub.action.HubBranchProvider; import io.xpipe.app.hub.action.HubLeafProvider; import io.xpipe.app.hub.action.HubMenuItemProvider; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java index 7d9e4515d..5a2c4800c 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreEntryWrapper.java @@ -341,7 +341,7 @@ public class StoreEntryWrapper { }); } - public void executeDefaultAction() throws Exception { + public void executeDefaultAction() { if (entry.getValidity() == DataStoreEntry.Validity.LOAD_FAILED) { return; } diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreViewState.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreViewState.java index 84a72dfb7..61bccd7ae 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreViewState.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreViewState.java @@ -177,11 +177,11 @@ public class StoreViewState { } private void initSortMode() { - String global = AppCache.getNonNull("globalSortMode", String.class, null); + String global = AppCache.getNonNull("globalSortMode", String.class, () -> null); var globalMode = global != null ? StoreSectionSortMode.fromId(global).orElse(null) : null; globalSortMode.setValue(globalMode != null ? globalMode : StoreSectionSortMode.INDEX_ASC); - String tie = AppCache.getNonNull("tieSortMode", String.class, null); + String tie = AppCache.getNonNull("tieSortMode", String.class, () -> null); var tieMode = global != null ? StoreSectionSortMode.fromId(tie).orElse(null) : null; tieSortMode.setValue(tieMode != null ? tieMode : StoreSectionSortMode.DATE_DESC); } diff --git a/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java b/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java index 80a6106d0..1018e7bbd 100644 --- a/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java +++ b/app/src/main/java/io/xpipe/app/icon/SystemIconCache.java @@ -23,7 +23,7 @@ import javax.imageio.ImageIO; public class SystemIconCache { - private static enum ImageColorScheme { + private enum ImageColorScheme { TRANSPARENT, MIXED, LIGHT, diff --git a/app/src/main/java/io/xpipe/app/icon/SystemIconSourceFile.java b/app/src/main/java/io/xpipe/app/icon/SystemIconSourceFile.java index a1436a2cc..4320c4303 100644 --- a/app/src/main/java/io/xpipe/app/icon/SystemIconSourceFile.java +++ b/app/src/main/java/io/xpipe/app/icon/SystemIconSourceFile.java @@ -7,10 +7,10 @@ import java.nio.file.Path; @Value public class SystemIconSourceFile { - public static enum ColorSchemeData { + public enum ColorSchemeData { LIGHT, DARK, - DEFAULT; + DEFAULT } SystemIconSource source; diff --git a/app/src/main/java/io/xpipe/app/issue/UserReportComp.java b/app/src/main/java/io/xpipe/app/issue/UserReportComp.java index 70287ba35..396650fef 100644 --- a/app/src/main/java/io/xpipe/app/issue/UserReportComp.java +++ b/app/src/main/java/io/xpipe/app/issue/UserReportComp.java @@ -3,7 +3,6 @@ package io.xpipe.app.issue; import io.xpipe.app.comp.Comp; import io.xpipe.app.comp.base.*; import io.xpipe.app.core.*; -import io.xpipe.app.core.AppResources; import javafx.beans.property.*; import javafx.collections.FXCollections; diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefsComp.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefsComp.java index 3d616ca89..8a898026d 100644 --- a/app/src/main/java/io/xpipe/app/prefs/AppPrefsComp.java +++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefsComp.java @@ -11,8 +11,6 @@ import javafx.geometry.Insets; import javafx.scene.control.ScrollPane; import javafx.scene.layout.*; -import lombok.val; - public class AppPrefsComp extends SimpleComp { @Override diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java index b6117f4f0..0269e7239 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java @@ -17,9 +17,9 @@ import java.util.Optional; public interface ExternalApplicationType extends PrefsValue { - public abstract boolean isAvailable(); + boolean isAvailable(); - public interface MacApplication extends ExternalApplicationType { + interface MacApplication extends ExternalApplicationType { default CommandControl launchCommand(CommandBuilder builder, boolean args) { if (args) { @@ -84,7 +84,7 @@ public interface ExternalApplicationType extends PrefsValue { } } - public interface PathApplication extends ExternalApplicationType { + interface PathApplication extends ExternalApplicationType { String getExecutable(); @@ -118,11 +118,11 @@ public interface ExternalApplicationType extends PrefsValue { } } - public interface InstallLocationType extends ExternalApplicationType { + interface InstallLocationType extends ExternalApplicationType { String getExecutable(); - public abstract Optional determineInstallation(); + Optional determineInstallation(); default Optional determineFromPath() { // Try to locate if it is in the Path @@ -164,7 +164,7 @@ public interface ExternalApplicationType extends PrefsValue { } } - public interface WindowsType extends InstallLocationType { + interface WindowsType extends InstallLocationType { boolean detach(); diff --git a/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java b/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java index a34d14003..177118bf1 100644 --- a/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java +++ b/app/src/main/java/io/xpipe/app/pwman/KeePassXcProxyClient.java @@ -28,7 +28,7 @@ import java.util.regex.Pattern; * Client for communicating with KeePassXC using the native messaging protocol. * This implementation communicates with the actual running KeePassXC-proxy process * via stdin and stdout. - * + *

* Native messaging uses length-prefixed JSON messages over stdin/stdout. */ public class KeePassXcProxyClient { @@ -75,7 +75,6 @@ public class KeePassXcProxyClient { * Connects to KeePassXC via the provided input and output streams. * In a real application, these would be the streams connecting to KeePassXC. * - * @return True if connection was successful, false otherwise * @throws IOException If there's an error connecting to KeePassXC */ public void connect() throws IOException { @@ -92,7 +91,6 @@ public class KeePassXcProxyClient { /** * Performs a key exchange with KeePassXC. * - * @return True if the key exchange was successful, false otherwise * @throws IOException If there's an error communicating with KeePassXC */ public void exchangeKeys() throws IOException { @@ -162,7 +160,6 @@ public class KeePassXcProxyClient { /** * Tests the association with KeePassXC. * - * @return True if associated, false otherwise * @throws IOException If there's an error communicating with KeePassXC */ public void testAssociation() throws IOException { @@ -437,7 +434,6 @@ public class KeePassXcProxyClient { /** * Associate with KeePassXC. * - * @return True if successful, false otherwise * @throws IOException If there's an error communicating with KeePassXC */ public void associate() throws IOException { diff --git a/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java index 76a72ec54..4b2271c8b 100644 --- a/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/PasswordManager.java @@ -32,7 +32,7 @@ public interface PasswordManager { } @Value - static class CredentialResult { + class CredentialResult { String username; SecretValue password; diff --git a/app/src/main/java/io/xpipe/app/pwman/TweetNaClHelper.java b/app/src/main/java/io/xpipe/app/pwman/TweetNaClHelper.java index 26dbb47ca..7ab945be8 100644 --- a/app/src/main/java/io/xpipe/app/pwman/TweetNaClHelper.java +++ b/app/src/main/java/io/xpipe/app/pwman/TweetNaClHelper.java @@ -13,7 +13,7 @@ import java.util.Base64; /** * Cryptographic helper for KeePassXC communication. - * + *

* This implementation properly mimics TweetNaCl.js behavior using BouncyCastle, * implementing X25519 key exchange and XSalsa20-Poly1305 authenticated encryption * which is what KeePassXC expects. @@ -69,7 +69,7 @@ public class TweetNaClHelper { /** * Encrypt a message using NaCl box. - * + *

* This uses X25519 for key exchange and XSalsa20-Poly1305 for authenticated encryption. * Follows the TweetNaCl.js implementation exactly. */ diff --git a/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java index 099ffac97..667c5d538 100644 --- a/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java @@ -89,7 +89,6 @@ public interface AlacrittyTerminalType extends ExternalTerminalType, TrackableTe .addQuoted(configuration.getCleanTitle()) .add("-e") .addFile(configuration.getScriptFile()); - ; launch(b); } } diff --git a/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java index 0e93ef7cd..f9c83b5f1 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java @@ -11,9 +11,9 @@ import java.nio.file.Path; public interface WarpTerminalType extends ExternalTerminalType, TrackableTerminalType { - static WarpTerminalType WINDOWS = new Windows(); - static WarpTerminalType LINUX = new Linux(); - static WarpTerminalType MACOS = new MacOs(); + WarpTerminalType WINDOWS = new Windows(); + WarpTerminalType LINUX = new Linux(); + WarpTerminalType MACOS = new MacOs(); class Windows implements WarpTerminalType { diff --git a/app/src/main/java/io/xpipe/app/update/UpdateNagDialog.java b/app/src/main/java/io/xpipe/app/update/UpdateNagDialog.java index 5015e5f30..84706f506 100644 --- a/app/src/main/java/io/xpipe/app/update/UpdateNagDialog.java +++ b/app/src/main/java/io/xpipe/app/update/UpdateNagDialog.java @@ -24,7 +24,7 @@ public class UpdateNagDialog { return; } - Instant lastCheck = AppCache.getNonNull("lastUpdateNag", Instant.class, null); + Instant lastCheck = AppCache.getNonNull("lastUpdateNag", Instant.class, () -> null); if (lastCheck == null) { AppCache.update("lastUpdateNag", Instant.now()); return; diff --git a/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java b/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java index dbac379c9..53683fab9 100644 --- a/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java +++ b/app/src/main/java/io/xpipe/app/util/AppJacksonModule.java @@ -1,6 +1,5 @@ package io.xpipe.app.util; -import io.xpipe.app.action.*; import io.xpipe.app.ext.LocalStore; import io.xpipe.app.pwman.PasswordManager; import io.xpipe.app.storage.*; diff --git a/app/src/main/java/io/xpipe/app/util/BindingsHelper.java b/app/src/main/java/io/xpipe/app/util/BindingsHelper.java index 57305fc54..971b17d19 100644 --- a/app/src/main/java/io/xpipe/app/util/BindingsHelper.java +++ b/app/src/main/java/io/xpipe/app/util/BindingsHelper.java @@ -10,7 +10,6 @@ import java.lang.ref.WeakReference; import java.util.WeakHashMap; import java.util.function.Function; -@SuppressWarnings("InfiniteLoopStatement") public class BindingsHelper { private static final WeakHashMap REFERENCES = new WeakHashMap<>(); diff --git a/app/src/main/java/io/xpipe/app/util/Check.java b/app/src/main/java/io/xpipe/app/util/Check.java index b2cd35670..9e87e619d 100644 --- a/app/src/main/java/io/xpipe/app/util/Check.java +++ b/app/src/main/java/io/xpipe/app/util/Check.java @@ -25,17 +25,17 @@ import java.util.function.Function; */ public class Check { - private Map> dependencies = new HashMap<>(1); + private final Map> dependencies = new HashMap<>(1); private Consumer checkMethod; - private ReadOnlyObjectWrapper validationResultProperty = new ReadOnlyObjectWrapper<>(); + private final ReadOnlyObjectWrapper validationResultProperty = new ReadOnlyObjectWrapper<>(); private ValidationResult nextValidationResult = new ValidationResult(); @Getter - private List targets = new ArrayList<>(1); + private final List targets = new ArrayList<>(1); - private List decorations = new ArrayList<>(); + private final List decorations = new ArrayList<>(); private Function decorationFactory; - private ChangeListener dependencyListener; + private final ChangeListener dependencyListener; public class Context { @@ -81,7 +81,7 @@ public class Check { return this; } - public Check dependsOn(String key, ObservableValue dependency) { + public Check dependsOn(String key, ObservableValue dependency) { dependencies.put(key, dependency); return this; } @@ -100,7 +100,7 @@ public class Check { * This method must be called last. */ public Check immediate() { - for (ObservableValue dependency : dependencies.values()) { + for (ObservableValue dependency : dependencies.values()) { dependency.addListener(dependencyListener); } Platform.runLater(this::recheck); // to circumvent problems with decoration pane vs. dialog diff --git a/app/src/main/java/io/xpipe/app/util/FileOpener.java b/app/src/main/java/io/xpipe/app/util/FileOpener.java index 7bde95d9d..f9036efc2 100644 --- a/app/src/main/java/io/xpipe/app/util/FileOpener.java +++ b/app/src/main/java/io/xpipe/app/util/FileOpener.java @@ -134,7 +134,7 @@ public class FileOpener { } @Override - public OutputStream open() throws Exception { + public OutputStream open() { return new ByteArrayOutputStream(s.length()) { @Override public void close() throws IOException { diff --git a/app/src/main/java/io/xpipe/app/util/ScanMultiDialogComp.java b/app/src/main/java/io/xpipe/app/util/ScanMultiDialogComp.java index 5ec2064fe..8d3e748a3 100644 --- a/app/src/main/java/io/xpipe/app/util/ScanMultiDialogComp.java +++ b/app/src/main/java/io/xpipe/app/util/ScanMultiDialogComp.java @@ -58,7 +58,6 @@ class ScanMultiDialogComp extends ModalOverlayContentComp { .apply(struc -> { VBox.setVgrow(struc.get().getChildren().getFirst(), ALWAYS); }); - ; return b.createRegion(); } } diff --git a/dist/changelogs/17.0.md b/dist/changelogs/17.0.md index 4b03d1398..3b13d0ba5 100644 --- a/dist/changelogs/17.0.md +++ b/dist/changelogs/17.0.md @@ -1,3 +1,4 @@ +XPipe 17 is a large-scale rework of many existing parts of XPipe. It focuses on fixing many longstanding issues and limitations, so that future updates can easily bring new integrations without having to deal with that baggage. ## File browser @@ -15,22 +16,12 @@ ## Connection hub +Proper functionality to organize a collection of hundreds of connections was always somewhat limited until now. There is now an additional index-based organization mechanism where you can assign and move indices of connections to have them listed at a certain place in relation to other connections. This can also be combined with the existing sorting methods like time and alphabetical sorting. + +Furthermore, there are also more improvements in the connection hub: - Renaming connection entries can now be done quickly without having to open the configuration dialog - You can now set connection configurations to be frozen, meaning that the connection entry can't be modified or deleted. This is helpful for templating and team vault setups - When editing an incomplete connection configuration, the focus will automatically jump to the first incomplete/invalid value. This makes keyboard usage easier -- Password managers now support retrieving both username and password of an entry. For that, you can now create password manager identities that automatically provide the username and password - -## VNC - -Up until now, the internal VNC implementation of XPipe did a somewhat acceptable job for most connections. However, it is not able to match dedicated VNC clients when it comes to more advanced features and authentication methods. There's simply not Le development capacity to maintain all of these additional VNC features. For this reason, there is now support to also use an external VNC client with XPipe, it just as with any other tool integrations. - -The current integrations include: -- TigerVNC -- TightVNC -- RealVNC -- Remmina -- macOS screen sharing -- A custom command ## SSH @@ -46,18 +37,27 @@ There is now a new action system, which maps most UI actions to fixed schemas. E Furthermore, it is also now possible to control how all of these actions are run. For production systems, for example, you can configure that all actions that perform some kind of modification, like deleting a file, have to be confirmed first. This gives you an added layer of protection to double-check any operation before actually executing it. +## VNC + +Up until now, the internal VNC implementation of XPipe did a somewhat acceptable job for most connections. However, it is not able to match dedicated VNC clients when it comes to more advanced features and authentication methods. There's simply not Le development capacity to maintain all of these additional VNC features. For this reason, there is now support to also use an external VNC client with XPipe, it just as with any other tool integrations. + +The current integrations include: +- TigerVNC +- TightVNC +- RealVNC +- Remmina +- macOS screen sharing +- A custom command + ## macOS 26 Tahoe XPipe adopts many of the new features of macOS 26 right away. if you are using the macOS beta, you have access to these right away. The application window now uses the new Liquid Glass theming. The application icon has also been reworked with Liquid Glass in mind. There's also support for the new apple containers framework, which has just been released. Searching for available connections on the local machine will make apple containers show up if you have installed the package. -## Connection organization - -Proper functionality to organize a collection of hundreds of connections was always somewhat limited until now. There is now an additional index-based organization mechanism where you can assign and move indices of connections to have them listed at a certain place in relation to other connections. This can also be combined with the existing sorting methods like time and alphabetical sorting. - ## Other +- Password managers now support retrieving both username and password of an entry. For that, you can now create password manager identities that automatically provide the username and password - Terminal connections now enable truecolor mode if possible - The option to open a connection in VSCode remote has been expanded to also support Cursor and Windsurf - Implement various performance improvements diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java index 3a0ffb424..07d591451 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/PasswordManagerIdentityStore.java @@ -119,7 +119,7 @@ public class PasswordManagerIdentityStore extends IdentityStore implements Inter } @Override - public void validate() throws Exception { + public void validate() { retrieveCredentials(); } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/UsernameStrategy.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/UsernameStrategy.java index ce115c491..a93139d23 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/UsernameStrategy.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/UsernameStrategy.java @@ -12,7 +12,7 @@ public interface UsernameStrategy { String retrieveUsername() throws Exception; - static class None implements UsernameStrategy { + class None implements UsernameStrategy { @Override public boolean hasUser() { @@ -30,7 +30,7 @@ public interface UsernameStrategy { } } - static class Fixed implements UsernameStrategy { + class Fixed implements UsernameStrategy { private final String username; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java index 9a25cab51..72ec72a70 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/RunScriptActionProviderMenu.java @@ -238,7 +238,7 @@ public class RunScriptActionProviderMenu implements HubBranchProvider, BatchHubProvider { @Override - public void execute(List> dataStoreEntryRefs) throws Exception { + public void execute(List> dataStoreEntryRefs) { var cat = StoreViewState.get().getAllScriptsCategory(); cat.select(); } @@ -284,7 +284,7 @@ public class RunScriptActionProviderMenu implements HubBranchProvider, BatchHubProvider { @Override - public void execute(List> dataStoreEntryRefs) throws Exception { + public void execute(List> dataStoreEntryRefs) { var cat = StoreViewState.get() .getCategoryWrapper(DataStorage.get() .getStoreCategory(dataStoreEntryRefs.getFirst().get()));