From 5c26c23619e44a32439edb6f157b04c9339d4b11 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Mon, 19 Aug 2019 15:55:07 +0200 Subject: [PATCH 1/2] added mac native function for listening to system interface theme changes and changing the tray icon accordingly [ci skip] --- main/commons/pom.xml | 6 +++- .../org/cryptomator/common/JniModule.java | 29 +++++++++++++++++++ main/keychain/pom.xml | 6 +--- .../cryptomator/keychain/KeychainModule.java | 22 ++++---------- main/pom.xml | 2 +- .../ui/traymenu/TrayIconController.java | 17 +++++------ .../ui/traymenu/TrayImageFactory.java | 16 ++++++---- .../ui/traymenu/TrayMenuModule.java | 3 +- 8 files changed, 61 insertions(+), 40 deletions(-) create mode 100644 main/commons/src/main/java/org/cryptomator/common/JniModule.java diff --git a/main/commons/pom.xml b/main/commons/pom.xml index f76e413c0..cbb970d2d 100644 --- a/main/commons/pom.xml +++ b/main/commons/pom.xml @@ -27,7 +27,11 @@ org.cryptomator webdav-nio-adapter - + + org.cryptomator + jni + + org.openjfx diff --git a/main/commons/src/main/java/org/cryptomator/common/JniModule.java b/main/commons/src/main/java/org/cryptomator/common/JniModule.java new file mode 100644 index 000000000..742514bfc --- /dev/null +++ b/main/commons/src/main/java/org/cryptomator/common/JniModule.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2019 Skymatic GmbH. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the accompanying LICENSE file. + *******************************************************************************/ +package org.cryptomator.common; + +import dagger.Module; +import dagger.Provides; +import org.cryptomator.jni.JniFunctions; +import org.cryptomator.jni.MacFunctions; +import org.cryptomator.jni.WinFunctions; + +import java.util.Optional; + +@Module +public class JniModule { + + @Provides + Optional provideOptionalMacFunctions() { + return JniFunctions.macFunctions(); + } + + @Provides + Optional provideOptionalWinFunctions() { + return JniFunctions.winFunctions(); + } + +} diff --git a/main/keychain/pom.xml b/main/keychain/pom.xml index 01e276cc9..4b454f8be 100644 --- a/main/keychain/pom.xml +++ b/main/keychain/pom.xml @@ -23,11 +23,7 @@ com.google.code.gson gson - - org.cryptomator - jni - - + com.google.guava diff --git a/main/keychain/src/main/java/org/cryptomator/keychain/KeychainModule.java b/main/keychain/src/main/java/org/cryptomator/keychain/KeychainModule.java index 90b975b7d..fd622e299 100644 --- a/main/keychain/src/main/java/org/cryptomator/keychain/KeychainModule.java +++ b/main/keychain/src/main/java/org/cryptomator/keychain/KeychainModule.java @@ -5,30 +5,18 @@ *******************************************************************************/ package org.cryptomator.keychain; -import java.util.Optional; -import java.util.Set; - import com.google.common.collect.Sets; import dagger.Module; import dagger.Provides; import dagger.multibindings.ElementsIntoSet; -import org.cryptomator.jni.JniFunctions; -import org.cryptomator.jni.MacFunctions; -import org.cryptomator.jni.WinFunctions; +import org.cryptomator.common.JniModule; -@Module +import java.util.Optional; +import java.util.Set; + +@Module(includes = {JniModule.class}) public class KeychainModule { - @Provides - Optional provideOptionalMacFunctions() { - return JniFunctions.macFunctions(); - } - - @Provides - Optional provideOptionalWinFunctions() { - return JniFunctions.winFunctions(); - } - @Provides @ElementsIntoSet Set provideKeychainAccessStrategies(MacSystemKeychainAccess macKeychain, WindowsProtectedKeychainAccess winKeychain, LinuxSecretServiceKeychainAccess linKeychain) { diff --git a/main/pom.xml b/main/pom.xml index 3e08109a5..279e9cb07 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -26,7 +26,7 @@ 1.2.1 1.8.7 - 2.1.0 + 2.2.0-SNAPSHOT 1.2.0 1.1.11 1.0.10 diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java index 905d6235b..ded374e8c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java @@ -1,8 +1,7 @@ package org.cryptomator.ui.traymenu; -import javafx.beans.Observable; import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.common.settings.Settings; +import org.cryptomator.jni.MacFunctions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,30 +9,28 @@ import javax.inject.Inject; import java.awt.AWTException; import java.awt.SystemTray; import java.awt.TrayIcon; -import java.awt.event.ActionEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import java.util.Optional; @TrayMenuScoped public class TrayIconController { private static final Logger LOG = LoggerFactory.getLogger(TrayIconController.class); - private final Settings settings; private final TrayImageFactory imageFactory; private final TrayMenuController trayMenuController; private final TrayIcon trayIcon; + private final Optional macFunctions; @Inject - TrayIconController(Settings settings, TrayImageFactory imageFactory, TrayMenuController trayMenuController) { - this.settings = settings; + TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController, Optional macFunctions) { this.trayMenuController = trayMenuController; this.imageFactory = imageFactory; this.trayIcon = new TrayIcon(imageFactory.loadImage(), "Cryptomator", trayMenuController.getMenu()); + this.macFunctions = macFunctions; } public void initializeTrayIcon() { - settings.theme().addListener(this::themeChanged); + macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> uiAppearance.addListener(this::macInterfaceThemeChanged)); if (SystemUtils.IS_OS_WINDOWS) { // TODO: test on windows: is this a double click? @@ -50,7 +47,7 @@ public class TrayIconController { trayMenuController.initTrayMenu(); } - private void themeChanged(@SuppressWarnings("unused") Observable observable) { + public void macInterfaceThemeChanged() { trayIcon.setImage(imageFactory.loadImage()); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java index 4f2468de1..7d5031937 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java @@ -1,20 +1,23 @@ package org.cryptomator.ui.traymenu; import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.common.settings.Settings; +import org.cryptomator.jni.MacApplicationUiAppearance; +import org.cryptomator.jni.MacApplicationUiInterfaceStyle; +import org.cryptomator.jni.MacFunctions; import javax.inject.Inject; import java.awt.Image; import java.awt.Toolkit; +import java.util.Optional; @TrayMenuScoped class TrayImageFactory { - private final Settings settings; + private final Optional macFunctions; @Inject - TrayImageFactory(Settings settings) { - this.settings = settings; + TrayImageFactory(Optional macFunctions) { + this.macFunctions = macFunctions; } public Image loadImage() { @@ -23,7 +26,10 @@ class TrayImageFactory { } private String getMacResourceName() { - switch (settings.theme().get()) { + MacApplicationUiInterfaceStyle interfaceStyle = macFunctions.map(MacFunctions::uiAppearance) // + .map(MacApplicationUiAppearance::getCurrentInterfaceStyle) // + .orElse(MacApplicationUiInterfaceStyle.LIGHT); + switch (interfaceStyle) { case DARK: return "/tray_icon_mac_white.png"; default: diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuModule.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuModule.java index 87573e3b0..9fc9cbe96 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuModule.java @@ -1,9 +1,10 @@ package org.cryptomator.ui.traymenu; import dagger.Module; +import org.cryptomator.common.JniModule; import org.cryptomator.ui.fxapp.FxApplicationComponent; -@Module(subcomponents = {FxApplicationComponent.class}) +@Module(includes = {JniModule.class}, subcomponents = {FxApplicationComponent.class}) abstract class TrayMenuModule { } From 5dcdaf459f9f9fa5a3ed50c721a245d77793662b Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Mon, 26 Aug 2019 16:56:23 +0200 Subject: [PATCH 2/2] reverted jni version for merging, kept new code as comment --- main/pom.xml | 2 +- .../ui/traymenu/TrayIconController.java | 18 ++++++++------ .../ui/traymenu/TrayImageFactory.java | 24 ++++++++++--------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/main/pom.xml b/main/pom.xml index 279e9cb07..3e08109a5 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -26,7 +26,7 @@ 1.2.1 1.8.7 - 2.2.0-SNAPSHOT + 2.1.0 1.2.0 1.1.11 1.0.10 diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java index ded374e8c..0da5af2aa 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java @@ -1,7 +1,8 @@ package org.cryptomator.ui.traymenu; +import javafx.beans.Observable; import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.jni.MacFunctions; +import org.cryptomator.common.settings.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,28 +10,30 @@ import javax.inject.Inject; import java.awt.AWTException; import java.awt.SystemTray; import java.awt.TrayIcon; -import java.util.Optional; @TrayMenuScoped public class TrayIconController { private static final Logger LOG = LoggerFactory.getLogger(TrayIconController.class); + private final Settings settings; private final TrayImageFactory imageFactory; private final TrayMenuController trayMenuController; private final TrayIcon trayIcon; - private final Optional macFunctions; + // private final Optional macFunctions; @Inject - TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController, Optional macFunctions) { + TrayIconController(Settings settings, TrayImageFactory imageFactory, TrayMenuController trayMenuController) { + this.settings = settings; this.trayMenuController = trayMenuController; this.imageFactory = imageFactory; this.trayIcon = new TrayIcon(imageFactory.loadImage(), "Cryptomator", trayMenuController.getMenu()); - this.macFunctions = macFunctions; +// this.macFunctions = macFunctions; } public void initializeTrayIcon() { - macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> uiAppearance.addListener(this::macInterfaceThemeChanged)); +// macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> uiAppearance.addListener(this::macInterfaceThemeChanged)); + settings.theme().addListener(this::themeChanged); if (SystemUtils.IS_OS_WINDOWS) { // TODO: test on windows: is this a double click? @@ -47,7 +50,8 @@ public class TrayIconController { trayMenuController.initTrayMenu(); } - public void macInterfaceThemeChanged() { + // public void macInterfaceThemeChanged() { + private void themeChanged(@SuppressWarnings("unused") Observable observable) { trayIcon.setImage(imageFactory.loadImage()); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java index 7d5031937..360b6e95f 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayImageFactory.java @@ -1,23 +1,24 @@ package org.cryptomator.ui.traymenu; import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.jni.MacApplicationUiAppearance; -import org.cryptomator.jni.MacApplicationUiInterfaceStyle; -import org.cryptomator.jni.MacFunctions; +import org.cryptomator.common.settings.Settings; import javax.inject.Inject; import java.awt.Image; import java.awt.Toolkit; -import java.util.Optional; @TrayMenuScoped class TrayImageFactory { - private final Optional macFunctions; + // private final Optional macFunctions; + private final Settings settings; + @Inject - TrayImageFactory(Optional macFunctions) { - this.macFunctions = macFunctions; +// TrayImageFactory(Optional macFunctions) { +// this.macFunctions = macFunctions; + TrayImageFactory(Settings settings) { + this.settings = settings; } public Image loadImage() { @@ -26,10 +27,11 @@ class TrayImageFactory { } private String getMacResourceName() { - MacApplicationUiInterfaceStyle interfaceStyle = macFunctions.map(MacFunctions::uiAppearance) // - .map(MacApplicationUiAppearance::getCurrentInterfaceStyle) // - .orElse(MacApplicationUiInterfaceStyle.LIGHT); - switch (interfaceStyle) { +// MacApplicationUiInterfaceStyle interfaceStyle = macFunctions.map(MacFunctions::uiAppearance) // +// .map(MacApplicationUiAppearance::getCurrentInterfaceStyle) // +// .orElse(MacApplicationUiInterfaceStyle.LIGHT); +// switch (interfaceStyle) { + switch (settings.theme().get()) { case DARK: return "/tray_icon_mac_white.png"; default: