From 5a99c7bb617239ff2363cb98c7af6026806f37dc Mon Sep 17 00:00:00 2001 From: Vsevolod Golovanov Date: Mon, 12 Dec 2022 21:34:36 +0400 Subject: [PATCH] Unlocked status indicator in tray icon #2557 Now tracking unlockedness and updating the icon accordingly. --- pom.xml | 2 +- .../ui/traymenu/AwtTrayMenuController.java | 13 +++++++-- .../ui/traymenu/TrayMenuBuilder.java | 27 ++++++++++++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 6f34af07f..38ee64dc5 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.5.3 - 1.2.0-beta1 + 1.2.0-beta3 1.1.2 1.1.2 1.1.0 diff --git a/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java b/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java index c82cea239..9e01e1ebf 100644 --- a/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java +++ b/src/main/java/org/cryptomator/ui/traymenu/AwtTrayMenuController.java @@ -39,8 +39,8 @@ public class AwtTrayMenuController implements TrayMenuController { } @Override - public void showTrayIcon(byte[] rawImageData, Runnable defaultAction, String tooltip) throws TrayMenuException { - var image = Toolkit.getDefaultToolkit().createImage(rawImageData); + public void showTrayIcon(byte[] imageData, Runnable defaultAction, String tooltip) throws TrayMenuException { + var image = Toolkit.getDefaultToolkit().createImage(imageData); trayIcon = new TrayIcon(image, tooltip, menu); trayIcon.setImageAutoSize(true); @@ -56,6 +56,15 @@ public class AwtTrayMenuController implements TrayMenuController { } } + @Override + public void updateTrayIcon(byte[] imageData) { + if (trayIcon == null) + throw new IllegalStateException("Failed to update the icon as it has not yet been added"); + + var image = Toolkit.getDefaultToolkit().createImage(imageData); + trayIcon.setImage(image); + } + @Override public void updateTrayMenu(List items) { menu.removeAll(); diff --git a/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java b/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java index db2f93a91..fd0a0d987 100644 --- a/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java +++ b/src/main/java/org/cryptomator/ui/traymenu/TrayMenuBuilder.java @@ -33,7 +33,9 @@ public class TrayMenuBuilder { private static final Logger LOG = LoggerFactory.getLogger(TrayMenuBuilder.class); private static final String TRAY_ICON_MAC = "/img/tray_icon_mac@2x.png"; + private static final String TRAY_ICON_UNLOCKED_MAC = "/img/tray_icon_unlocked_mac@2x.png"; private static final String TRAY_ICON = "/img/tray_icon.png"; + private static final String TRAY_ICON_UNLOCKED = "/img/tray_icon_unlocked.png"; private final ResourceBundle resourceBundle; private final VaultService vaultService; @@ -62,8 +64,8 @@ public class TrayMenuBuilder { v.displayNameProperty().addListener(this::vaultListChanged); }); - try (var image = getClass().getResourceAsStream(SystemUtils.IS_OS_MAC_OSX ? TRAY_ICON_MAC : TRAY_ICON)) { - trayMenu.showTrayIcon(image.readAllBytes(), this::showMainWindow, "Cryptomator"); + try { + trayMenu.showTrayIcon(getAppropriateTrayIconImage(), this::showMainWindow, "Cryptomator"); trayMenu.onBeforeOpenMenu(() -> { for (Vault vault : vaults) { VaultListManager.redetermineVaultState(vault); @@ -71,8 +73,6 @@ public class TrayMenuBuilder { }); 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); } @@ -84,6 +84,7 @@ public class TrayMenuBuilder { private void vaultListChanged(@SuppressWarnings("unused") Observable observable) { assert Platform.isFxApplicationThread(); + trayMenu.updateTrayIcon(getAppropriateTrayIconImage()); rebuildMenu(); } @@ -154,4 +155,22 @@ public class TrayMenuBuilder { appWindows.showPreferencesWindow(SelectedPreferencesTab.ANY); } + private byte[] getAppropriateTrayIconImage() { + boolean isAnyVaultUnlocked = vaults.stream().anyMatch(Vault::isUnlocked); + + String resourceName; + if (SystemUtils.IS_OS_MAC_OSX) { + resourceName = isAnyVaultUnlocked ? TRAY_ICON_UNLOCKED_MAC : TRAY_ICON_MAC; + } else { + resourceName = isAnyVaultUnlocked ? TRAY_ICON_UNLOCKED : TRAY_ICON; + } + + try (var image = getClass().getResourceAsStream(resourceName)) { + assert image != null; + return image.readAllBytes(); + } catch (IOException e) { + throw new UncheckedIOException("Failed to load tray icon image: " + resourceName, e); + } + } + }