From d7da78fc07bf46fd6a07cee4eefa14ba8a9cd7b4 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Sun, 3 Apr 2022 15:26:04 +0200 Subject: [PATCH] adjust to latest API --- pom.xml | 2 +- src/main/java/module-info.java | 1 + .../cryptomator/ui/fxapp/FxApplication.java | 2 +- .../ui/traymenu/AwtTrayMenuController.java | 19 +++++++++++----- .../ui/traymenu/TrayMenuBuilder.java | 22 +++++++++++++------ .../ui/traymenu/TrayMenuComponent.java | 9 ++++---- 6 files changed, 36 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 51203f0e5..98994551d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.4.0 - 1.1.0-beta2 + 1.1.0-beta3 1.1.0-beta1 1.1.0-beta1 1.1.0-beta1 diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index e8ee1c871..dd3d7680b 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -29,6 +29,7 @@ module org.cryptomator.desktop { requires logback.classic; requires logback.core; + exports org.cryptomator.ui.traymenu to org.cryptomator.integrations.api; provides TrayMenuController with AwtTrayMenuController; opens org.cryptomator.common.settings to com.google.gson; diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index 55f76d321..f3109e7bf 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -44,7 +44,7 @@ public class FxApplication { // init system tray final boolean hasTrayIcon; - if (SystemTray.isSupported() && settings.showTrayIcon().get()) { + if (settings.showTrayIcon().get() && trayMenu.get().isSupported()) { trayMenu.get().initializeTrayIcon(); Platform.setImplicitExit(false); // don't quit when closing all windows hasTrayIcon = true; diff --git a/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java b/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java index 034847913..6f791321f 100644 --- a/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java +++ b/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java @@ -1,11 +1,13 @@ package org.cryptomator.ui.traymenu; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.integrations.common.CheckAvailability; import org.cryptomator.integrations.common.Priority; import org.cryptomator.integrations.tray.ActionItem; import org.cryptomator.integrations.tray.SeparatorItem; import org.cryptomator.integrations.tray.SubMenuItem; import org.cryptomator.integrations.tray.TrayMenuController; +import org.cryptomator.integrations.tray.TrayMenuException; import org.cryptomator.integrations.tray.TrayMenuItem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,18 +23,23 @@ import java.io.IOException; import java.io.InputStream; import java.util.List; +@CheckAvailability @Priority(Priority.FALLBACK) public class AwtTrayMenuController implements TrayMenuController { private static final Logger LOG = LoggerFactory.getLogger(AwtTrayMenuController.class); - private TrayIcon trayIcon; - private PopupMenu menu = new PopupMenu(); + private final PopupMenu menu = new PopupMenu(); + + @CheckAvailability + public static boolean isAvailable() { + return SystemTray.isSupported(); + } @Override - public void showTrayIcon(InputStream rawImageData, Runnable defaultAction, String tooltip) throws IOException { - var image = Toolkit.getDefaultToolkit().createImage(rawImageData.readAllBytes()); - trayIcon = new TrayIcon(image, tooltip, menu); + public void showTrayIcon(byte[] rawImageData, Runnable defaultAction, String tooltip) { + var image = Toolkit.getDefaultToolkit().createImage(rawImageData); + var trayIcon = new TrayIcon(image, tooltip, menu); trayIcon.setImageAutoSize(true); if (SystemUtils.IS_OS_WINDOWS) { @@ -59,7 +66,7 @@ public class AwtTrayMenuController implements TrayMenuController { if (item instanceof ActionItem a) { var menuItem = new MenuItem(a.title()); menuItem.addActionListener(evt -> a.action().run()); - // TODO menuItem.setEnabled(a.enabled()); + menuItem.setEnabled(a.enabled()); menu.add(menuItem); } else if (item instanceof SeparatorItem) { menu.addSeparator(); diff --git a/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java b/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java index b8e5d8c2b..ea8599b51 100644 --- a/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java +++ b/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java @@ -7,11 +7,14 @@ import org.cryptomator.integrations.tray.ActionItem; import org.cryptomator.integrations.tray.SeparatorItem; import org.cryptomator.integrations.tray.SubMenuItem; import org.cryptomator.integrations.tray.TrayMenuController; +import org.cryptomator.integrations.tray.TrayMenuException; import org.cryptomator.integrations.tray.TrayMenuItem; import org.cryptomator.ui.common.VaultService; import org.cryptomator.ui.fxapp.FxApplicationTerminator; import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.preferences.SelectedPreferencesTab; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Inject; import javafx.application.Platform; @@ -27,6 +30,7 @@ import java.util.ResourceBundle; @TrayMenuScoped public class TrayMenuBuilder { + private static final Logger LOG = LoggerFactory.getLogger(TrayMenuBuilder.class); private static final String TRAY_ICON_MAC = "/img/tray_icon_mac.png"; private static final String TRAY_ICON = "/img/tray_icon.png"; @@ -56,15 +60,16 @@ public class TrayMenuBuilder { vaults.forEach(v -> { v.displayNameProperty().addListener(this::vaultListChanged); }); - rebuildMenu(); try (var image = getClass().getResourceAsStream(SystemUtils.IS_OS_MAC_OSX ? TRAY_ICON_MAC : TRAY_ICON)) { - trayMenu.showTrayIcon(image, this::showMainWindow, "Cryptomator"); + trayMenu.showTrayIcon(image.readAllBytes(), this::showMainWindow, "Cryptomator"); + rebuildMenu(); + initialized = true; } catch (IOException e) { throw new UncheckedIOException("Failed to load embedded resource", e); + } catch (TrayMenuException e) { + LOG.error("Adding tray icon failed", e); } - - initialized = true; } public boolean isInitialized() { @@ -88,11 +93,14 @@ public class TrayMenuBuilder { menu.add(new SubMenuItem(label, submenu)); } menu.add(new SeparatorItem()); - menu.add(new ActionItem(resourceBundle.getString("traymenu.lockAllVaults"), this::lockAllVaults)); + menu.add(new ActionItem(resourceBundle.getString("traymenu.lockAllVaults"), this::lockAllVaults, vaults.stream().anyMatch(Vault::isUnlocked))); menu.add(new ActionItem(resourceBundle.getString("traymenu.quitApplication"), this::quitApplication)); -// lockAllItem.setEnabled(!vaults.filtered(Vault::isUnlocked).isEmpty()); - trayMenu.updateTrayMenu(menu); + try { + trayMenu.updateTrayMenu(menu); + } catch (TrayMenuException e) { + LOG.error("Updating tray menu failed", e); + } } private List buildSubmenu(Vault vault) { diff --git a/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java b/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java index 61861e12c..ba84171b3 100644 --- a/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java +++ b/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java @@ -24,8 +24,7 @@ public interface TrayMenuComponent { * @return true if a tray icon can be installed */ default boolean isSupported() { - // TODO add isSupported to API and move SystemTray.isSupported() to impl - return trayMenuController().isPresent() && SystemTray.isSupported(); + return trayMenuController().isPresent(); } /** @@ -38,11 +37,13 @@ public interface TrayMenuComponent { /** * Installs a tray icon to the system tray. * - * @throws IllegalStateException If already added + * @throws IllegalStateException If not {@link #isSupported() supported} */ default void initializeTrayIcon() throws IllegalStateException { Preconditions.checkState(isSupported(), "system tray not supported"); - trayMenuBuilder().initTrayMenu(); + if (!trayMenuBuilder().isInitialized()) { + trayMenuBuilder().initTrayMenu(); + } } @Subcomponent.Builder