From 3d679c73e7a4c79d4fd8746df7b23f3e4d4f86fc Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 28 Nov 2025 14:30:15 +0100 Subject: [PATCH 01/28] [skip ci] impl draft Signed-off-by: Armin Schrenk --- pom.xml | 2 +- src/main/java/module-info.java | 3 ++ .../integrationsbase/JavaFXNotifyService.java | 30 +++++++++++ .../integrationsbase/NotificationApp.java | 52 +++++++++++++++++++ .../NotificationWindowController.java | 20 +++++++ .../HandleNotificationCallbackMessage.java | 22 ++++++++ .../java/org/cryptomator/ipc/IpcMessage.java | 5 +- .../cryptomator/ipc/IpcMessageListener.java | 3 ++ .../resources/fxml/notification_window.fxml | 17 ++++++ 9 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/cryptomator/integrationsbase/JavaFXNotifyService.java create mode 100644 src/main/java/org/cryptomator/integrationsbase/NotificationApp.java create mode 100644 src/main/java/org/cryptomator/integrationsbase/NotificationWindowController.java create mode 100644 src/main/java/org/cryptomator/ipc/HandleNotificationCallbackMessage.java create mode 100644 src/main/resources/fxml/notification_window.fxml diff --git a/pom.xml b/pom.xml index 24f35de0a..b11524a5e 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ 2.9.0 - 1.8.0-beta1 + 1.8.0-SNAPSHOT 1.5.1 1.5.0-beta1 1.7.0-beta1 diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index f1f2aa5c6..a74e4b903 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,4 +1,6 @@ import ch.qos.logback.classic.spi.Configurator; +import org.cryptomator.integrations.notify.NotifyService2; +import org.cryptomator.integrationsbase.JavaFXNotifyService; import org.cryptomator.networking.SSLContextWithPKCS12TrustStore; import org.cryptomator.common.locationpresets.DropboxLinuxLocationPresetsProvider; import org.cryptomator.common.locationpresets.DropboxMacLocationPresetsProvider; @@ -64,6 +66,7 @@ open module org.cryptomator.desktop { provides TrayMenuController with AwtTrayMenuController; provides Configurator with LogbackConfiguratorFactory; provides SSLContextProvider with SSLContextWithWindowsCertStore, SSLContextWithMacKeychain, SSLContextWithPKCS12TrustStore; + provides NotifyService2 with JavaFXNotifyService; provides LocationPresetsProvider with // DropboxWindowsLocationPresetsProvider, DropboxMacLocationPresetsProvider, DropboxLinuxLocationPresetsProvider, // GoogleDriveMacLocationPresetsProvider, GoogleDriveWindowsLocationPresetsProvider, // diff --git a/src/main/java/org/cryptomator/integrationsbase/JavaFXNotifyService.java b/src/main/java/org/cryptomator/integrationsbase/JavaFXNotifyService.java new file mode 100644 index 000000000..a9b822d99 --- /dev/null +++ b/src/main/java/org/cryptomator/integrationsbase/JavaFXNotifyService.java @@ -0,0 +1,30 @@ +package org.cryptomator.integrationsbase; + +import org.cryptomator.integrations.common.DisplayName; +import org.cryptomator.integrations.common.Priority; +import org.cryptomator.integrations.notify.NotifyService; +import org.cryptomator.integrations.notify.NotifyService2; +import org.cryptomator.integrations.notify.NotifyServiceException; + +import java.util.ArrayList; + +@Priority(Priority.FALLBACK) +//@LocalizedDisplayName(bundle = "strings", key ="") +@DisplayName("Cryptomator App Window") +public class JavaFXNotifyService implements NotifyService2 { + + //TODO: ipcMessageFile! + + @Override + public void sendNotification(String header, String description, NotifyService2.Action... actions) throws NotifyServiceException { + var argList = new ArrayList(); + argList.add(header); + argList.add(description); + for(var action: actions) { + argList.add(action.label()); + argList.add(action.returnMessage()); + } + NotificationApp.main(argList.toArray(new String[] {})); + } + +} diff --git a/src/main/java/org/cryptomator/integrationsbase/NotificationApp.java b/src/main/java/org/cryptomator/integrationsbase/NotificationApp.java new file mode 100644 index 000000000..c02a0057a --- /dev/null +++ b/src/main/java/org/cryptomator/integrationsbase/NotificationApp.java @@ -0,0 +1,52 @@ +package org.cryptomator.integrationsbase; + +import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.ui.common.FxmlLoaderFactory; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import javafx.util.BuilderFactory; +import java.io.IOException; +import java.util.ResourceBundle; + + +public class NotificationApp extends Application { + + + private static final KeyCodeCombination ALT_F4 = new KeyCodeCombination(KeyCode.F4, KeyCombination.ALT_DOWN); + private static final KeyCodeCombination SHORTCUT_W = new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN); + + @Override + public void start(Stage stage) throws IOException { + var args = getParameters(); + String javaVersion = System.getProperty("java.version"); + var url = getClass().getResource("/fxml/notification_window.fxml"); + var root = FXMLLoader.load(url, ResourceBundle.getBundle("i18n.strings")); + var scene = new Scene(root); + stage.setScene(scene); + setupDefaultAccelerators(scene, stage); + stage.show(); + stage.requestFocus(); + } + + public static void main(String[] args) { + //assert args.length >= 2; + launch(args); + } + + private void setupDefaultAccelerators(Scene scene, Stage stage) { + if (SystemUtils.IS_OS_WINDOWS) { + scene.getAccelerators().put(ALT_F4, stage::close); + } else { + scene.getAccelerators().put(SHORTCUT_W, stage::close); + } + } +} diff --git a/src/main/java/org/cryptomator/integrationsbase/NotificationWindowController.java b/src/main/java/org/cryptomator/integrationsbase/NotificationWindowController.java new file mode 100644 index 000000000..e6aca952a --- /dev/null +++ b/src/main/java/org/cryptomator/integrationsbase/NotificationWindowController.java @@ -0,0 +1,20 @@ +package org.cryptomator.integrationsbase; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; + +public class NotificationWindowController { + + public NotificationWindowController() { + + } + + @FXML + public void initialize() { + System.out.println("Hello"); + } + + public void handleButtonAction(ActionEvent actionEvent) { + System.out.println("OKAY"); + } +} diff --git a/src/main/java/org/cryptomator/ipc/HandleNotificationCallbackMessage.java b/src/main/java/org/cryptomator/ipc/HandleNotificationCallbackMessage.java new file mode 100644 index 000000000..cfd8cfdb2 --- /dev/null +++ b/src/main/java/org/cryptomator/ipc/HandleNotificationCallbackMessage.java @@ -0,0 +1,22 @@ +package org.cryptomator.ipc; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; + +record HandleNotificationCallbackMessage(String content) implements IpcMessage { + + @Override + public MessageType getMessageType() { + return MessageType.HANDLE_NOTIFICATION_CALLBACK; + } + + @Override + public ByteBuffer encodePayload() { + return ByteBuffer.wrap(content.getBytes(StandardCharsets.UTF_8)); + } + + public static IpcMessage decode(ByteBuffer byteBuffer) { + var content = StandardCharsets.UTF_8.decode(byteBuffer).toString(); + return new HandleNotificationCallbackMessage(content); + } +} diff --git a/src/main/java/org/cryptomator/ipc/IpcMessage.java b/src/main/java/org/cryptomator/ipc/IpcMessage.java index 7f76da295..928f79c69 100644 --- a/src/main/java/org/cryptomator/ipc/IpcMessage.java +++ b/src/main/java/org/cryptomator/ipc/IpcMessage.java @@ -10,11 +10,12 @@ import java.nio.channels.WritableByteChannel; import java.util.function.Function; //TODO can the enum be removed? -sealed interface IpcMessage permits HandleLaunchArgsMessage, RevealRunningAppMessage { +sealed interface IpcMessage permits HandleLaunchArgsMessage, RevealRunningAppMessage, HandleNotificationCallbackMessage { enum MessageType { REVEAL_RUNNING_APP(RevealRunningAppMessage::decode), - HANDLE_LAUNCH_ARGS(HandleLaunchArgsMessage::decode); + HANDLE_LAUNCH_ARGS(HandleLaunchArgsMessage::decode), + HANDLE_NOTIFICATION_CALLBACK(HandleNotificationCallbackMessage::decode); private final Function decoder; diff --git a/src/main/java/org/cryptomator/ipc/IpcMessageListener.java b/src/main/java/org/cryptomator/ipc/IpcMessageListener.java index 756305cbe..bab4c2e8e 100644 --- a/src/main/java/org/cryptomator/ipc/IpcMessageListener.java +++ b/src/main/java/org/cryptomator/ipc/IpcMessageListener.java @@ -8,6 +8,7 @@ public interface IpcMessageListener { switch (message) { case RevealRunningAppMessage m -> revealRunningApp(); // TODO: rename to _ with JEP 443 case HandleLaunchArgsMessage m -> handleLaunchArgs(m.args()); + case HandleNotificationCallbackMessage m -> handleNotificationCallback(m.content()); } } @@ -15,4 +16,6 @@ public interface IpcMessageListener { void handleLaunchArgs(List args); + void handleNotificationCallback(String content); + } diff --git a/src/main/resources/fxml/notification_window.fxml b/src/main/resources/fxml/notification_window.fxml new file mode 100644 index 000000000..7ad99337c --- /dev/null +++ b/src/main/resources/fxml/notification_window.fxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + +