Переглянути джерело

added mac native function for listening to system interface theme changes and changing the tray icon accordingly [ci skip]

Tobias Hagemann 5 роки тому
батько
коміт
5c26c23619

+ 5 - 1
main/commons/pom.xml

@@ -27,7 +27,11 @@
 			<groupId>org.cryptomator</groupId>
 			<artifactId>webdav-nio-adapter</artifactId>
 		</dependency>
-		
+		<dependency>
+			<groupId>org.cryptomator</groupId>
+			<artifactId>jni</artifactId>
+		</dependency>
+
 		<!-- JavaFx -->
 		<dependency>
 			<groupId>org.openjfx</groupId>

+ 29 - 0
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<MacFunctions> provideOptionalMacFunctions() {
+		return JniFunctions.macFunctions();
+	}
+
+	@Provides
+	Optional<WinFunctions> provideOptionalWinFunctions() {
+		return JniFunctions.winFunctions();
+	}
+
+}

+ 1 - 5
main/keychain/pom.xml

@@ -23,11 +23,7 @@
 			<groupId>com.google.code.gson</groupId>
 			<artifactId>gson</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.cryptomator</groupId>
-			<artifactId>jni</artifactId>
-		</dependency>
-		
+
 		<!-- Google -->
 		<dependency>
 			<groupId>com.google.guava</groupId>

+ 5 - 17
main/keychain/src/main/java/org/cryptomator/keychain/KeychainModule.java

@@ -5,29 +5,17 @@
  *******************************************************************************/
 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
-public class KeychainModule {
-
-	@Provides
-	Optional<MacFunctions> provideOptionalMacFunctions() {
-		return JniFunctions.macFunctions();
-	}
+import java.util.Optional;
+import java.util.Set;
 
-	@Provides
-	Optional<WinFunctions> provideOptionalWinFunctions() {
-		return JniFunctions.winFunctions();
-	}
+@Module(includes = {JniModule.class})
+public class KeychainModule {
 
 	@Provides
 	@ElementsIntoSet

+ 1 - 1
main/pom.xml

@@ -26,7 +26,7 @@
 		<!-- dependency versions -->
 		<cryptomator.cryptolib.version>1.2.1</cryptomator.cryptolib.version>
 		<cryptomator.cryptofs.version>1.8.7</cryptomator.cryptofs.version>
-		<cryptomator.jni.version>2.1.0</cryptomator.jni.version>
+		<cryptomator.jni.version>2.2.0-SNAPSHOT</cryptomator.jni.version>
 		<cryptomator.fuse.version>1.2.0</cryptomator.fuse.version>
 		<cryptomator.dokany.version>1.1.11</cryptomator.dokany.version>
 		<cryptomator.webdav.version>1.0.10</cryptomator.webdav.version>

+ 7 - 10
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> macFunctions;
 
 	@Inject
-	TrayIconController(Settings settings, TrayImageFactory imageFactory, TrayMenuController trayMenuController) {
-		this.settings = settings;
+	TrayIconController(TrayImageFactory imageFactory, TrayMenuController trayMenuController, Optional<MacFunctions> 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());
 	}
 

+ 11 - 5
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> macFunctions;
 
 	@Inject
-	TrayImageFactory(Settings settings) {
-		this.settings = settings;
+	TrayImageFactory(Optional<MacFunctions> 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:

+ 2 - 1
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 {
 
 }