From 1924a7dec980aefb44da4f220d15ffd06e479030 Mon Sep 17 00:00:00 2001 From: jellemdekker Date: Fri, 6 Jul 2018 17:34:39 +0200 Subject: [PATCH 1/4] Implemented that a different system tray icon is shown to indicate when one or more vaults are unlocked. The unlocked icons are placeholders and will updated visually in following commits. --- .../java/org/cryptomator/ui/ExitUtil.java | 31 +++++++++++++----- .../ui/controllers/MainController.java | 1 + .../src/main/resources/tray_icon_unlocked.png | Bin 0 -> 588 bytes .../tray_icon_unlocked_mac_black.png | Bin 0 -> 350 bytes .../tray_icon_unlocked_mac_black@2x.png | Bin 0 -> 692 bytes .../tray_icon_unlocked_mac_white.png | Bin 0 -> 359 bytes .../tray_icon_unlocked_mac_white@2x.png | Bin 0 -> 707 bytes 7 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 main/ui/src/main/resources/tray_icon_unlocked.png create mode 100644 main/ui/src/main/resources/tray_icon_unlocked_mac_black.png create mode 100644 main/ui/src/main/resources/tray_icon_unlocked_mac_black@2x.png create mode 100644 main/ui/src/main/resources/tray_icon_unlocked_mac_white.png create mode 100644 main/ui/src/main/resources/tray_icon_unlocked_mac_white@2x.png diff --git a/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java b/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java index 6694c21b4..3106692db 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java +++ b/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java @@ -53,6 +53,7 @@ public class ExitUtil { private final Localization localization; private final Settings settings; private final Optional macFunctions; + private TrayIcon trayIcon; @Inject public ExitUtil(@Named("mainWindow") Stage mainWindow, Localization localization, Settings settings, Optional macFunctions) { @@ -82,7 +83,7 @@ public class ExitUtil { } private void initTrayIconExitHandler(Runnable exitCommand) { - final TrayIcon trayIcon = createTrayIcon(exitCommand); + trayIcon = createTrayIcon(exitCommand); try { // double clicking tray icon should open Cryptomator if (SystemUtils.IS_OS_WINDOWS) { @@ -118,14 +119,7 @@ public class ExitUtil { exitItem.addActionListener(e -> exitCommand.run()); popup.add(exitItem); - final Image image; - if (SystemUtils.IS_OS_MAC_OSX && isMacMenuBarDarkMode()) { - image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/tray_icon_mac_white.png")); - } else if (SystemUtils.IS_OS_MAC_OSX) { - image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/tray_icon_mac_black.png")); - } else { - image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/tray_icon.png")); - } + final Image image = getAppropriateTrayIconImage(true); return new TrayIcon(image, localization.getString("app.name"), popup); } @@ -202,4 +196,23 @@ public class ExitUtil { }); } + public void updateTrayIcon(boolean areAllVaultsLocked) { + if (trayIcon != null) { + Image image = getAppropriateTrayIconImage(areAllVaultsLocked); + trayIcon.setImage(image); + } + } + + private Image getAppropriateTrayIconImage(boolean areAllVaultsLocked) { + String resourceName; + if (SystemUtils.IS_OS_MAC_OSX && isMacMenuBarDarkMode()) { + resourceName = areAllVaultsLocked ? "/tray_icon_mac_white.png" : "/tray_icon_unlocked_mac_white.png"; + } else if (SystemUtils.IS_OS_MAC_OSX) { + resourceName = areAllVaultsLocked ? "/tray_icon_mac_black.png" : "/tray_icon_unlocked_mac_black.png"; + } else { + resourceName = areAllVaultsLocked ? "/tray_icon.png" : "/tray_icon_unlocked.png"; + } + return Toolkit.getDefaultToolkit().getImage(getClass().getResource(resourceName)); + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java index 9cb42f13d..33782e83c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/MainController.java @@ -125,6 +125,7 @@ public class MainController implements ViewController { this.upgradeStrategyForSelectedVault = EasyBind.monadic(selectedVault).map(upgradeStrategies::getUpgradeStrategy); this.areAllVaultsLocked = Bindings.isEmpty(FXCollections.observableList(vaults, Vault::observables).filtered(Vault.NOT_LOCKED)); + EasyBind.subscribe(areAllVaultsLocked, exitUtil::updateTrayIcon); EasyBind.subscribe(areAllVaultsLocked, Platform::setImplicitExit); autoUnlocker.unlockAllSilently(); diff --git a/main/ui/src/main/resources/tray_icon_unlocked.png b/main/ui/src/main/resources/tray_icon_unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..766b601e0f2bed50cec9e8a188d0a43063f34484 GIT binary patch literal 588 zcmV-S0<-;zP)(v_l+)nd#_QsTrGZC5bM-o6W6N?1ZEwoOnR8Y9&lYd@A)Nxz+h+)>(udO zr!jt*x|BoTz6zEeC5U(F^h#>ABz;%VGB3Y+pk13bmT+i}hh-iG+O~Oa3_D(#BF>kN zSoFESHTT#Y4lXB#*e?atZsmw^V_tOV-ShIIWec!&-72hFvjQtuF9$s@U$q3C`t-U& z46$DcgeIfA$H0D1Y~k?jL7Vb1VVe%NNcfb&?>jqXyBz~Ir^6Zv-6MwBPX$!{8liS= zj!A6RLu{AMd-m<$g#8CL!xjx+;H!Ue|A8%__qIK{9U+ET%6t&0U9LWS&tLLzOt|e3 z_v$`N1z5Jb58Pb%oR?$HE#2K4{g+C?3^eT`hFG=R)%$}WQ!F{cS9N=lQrV~6pjaHA zmiTJoRujf8Y4>!(lFrX2u6M#cq9p`2*=nBYNi1bP2+{#4D^p@786UEuO?EuKsX{-CVNC@a%JV=_uo@0tB$?@o+c0s_z#Qe aFV5H6Esm(f+NUM}0000}$90l-S?djIG&80S{YN~C8Yi!$D;_D9>ykR+2=REiu{x|GaAS^7$ZokA{G09Pi z+vgXkRBo!(;I`3;x9S;gC+*7Fpqz=C77&a?1*fSTJ}s;q)f-R#p$TjlwbyIK!CAcPmZ zXk}KxG)&91m0s|I5FXGi*SaX2H^Dl)vkJyyY^LqD)&%E;i>}orE0XmCa5}5t6}*~h zr@;qOzvZBkKHd%XWfgpbZ!&EkxF?k=aun5t&@>y2&yMHYc)LYu8V}|qXH8K?!7)|g zF(9u(2Ria*0FMb(#}u@%+)Zw=!7f7qoM@@ycHG{goCGk`E*sq9Cd&cf(=>!T6aWlS z7u|-sApi>QNE7lY0CR<-*0@j83GDTqs>`C+P`3*wG~H*7qrzN(Q^FJ!)bzu3ic akL5>l4yi-Q3~8PK0000sGqh(+>bY^(sxhm`fL6i)M!e}B^hag;?@=o%*FV}yC$DPQYdS^SI8x&diMH_pI8jes?T-U=)zc~9qi72Q z0rRpwOAU-7a{Z+YV zHZ#6-ZPWBoW;veF(GJRdsbIM;mD$Ho`>ODD>B#mvdKAl*=@X4}GvGnnYTmXg05?Zt zbhHp~yInMI7qeP5ND*=^uXwgF}O4m0YStkP?w}I5>&iA?01|A2T9F21$c+ykW zlbRM`n$&up^dz`38sl_}vCuf1+Cyq&gppEv*u*#svDoR+5bFXyh$6>JJs;r(spE4K zg7soW$^lnLk$t3oi135dK2hWvKzaO`4r)Om8z9Cg$a^!woAL_AM3MOlphkyCY3FcN zxGOU0BdCl}N&1?MyHMqD?IO?G&UJw;?51C2!qM_Bjc}>FVuu~XEQpL_F*!mz zHM&H2Tg$y2p|cw8B22=uk#QzjEWK@(P8MmoMLL@0tt_@UD>4o&twc{*)j)aYs* Date: Fri, 6 Jul 2018 17:43:43 +0200 Subject: [PATCH 2/4] Created the unlocked version of the tray icon for every operating system except macOS. Uses the free-for-commercial-use 'Lock, open icon' from the Hawcons icon set by Yannick Lung over at Iconfinder.com: https://www.iconfinder.com/icons/314694/lock_open_icon --- .../src/main/resources/tray_icon_unlocked.png | Bin 588 -> 699 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/main/ui/src/main/resources/tray_icon_unlocked.png b/main/ui/src/main/resources/tray_icon_unlocked.png index 766b601e0f2bed50cec9e8a188d0a43063f34484..fb516b24d3409a8d95da15737fa2545ed7022d52 100644 GIT binary patch delta 675 zcmV;U0$lyf1iJ;0B!7ZQL_t(Ijm1(+Pg7ACoO65H-oB8&RBW}S63Qb&)ffUHK^F=e zWl#e#fkFr|F=9c~S}c~9mh$M6w)foQMj$1) zaOEr~Gn34GAMn3H0DyB|LH7CvoQVXjTVczO$h^*b2nE#86tj=xs$ zboY>}o$W)}T;3z9RM#k_%ANd%f)K)0f?ifDl~Q)MFm2H30`I10?|pnT&MPW3)wymp zIGuOnsZ{bpvwvHo6SZKn49+>3jN65YmdNo02~CACCRj%NlR<- zglKAeiz;fv%u8!H#LpQbX1C>f^DxGDe5x1g9vG!5Q^f|J?jFHqxB2FSOFzuU>Yts4 zA+&1ykP$4}q^enW!^Lph(Tf)PEfL-ki!Qs(=jrYd4u1j~-1jM^`WlOQj8@0DCf7y~ zE6+isWu`)zW!Wm;M@Ml?JHKsJq$en)dQYQ!1OOBOU~)JgsFli%mFU`5B9X7w+aqUn z27#o=B~7Th*D&agmfzk(pTr*Q*Nz zW*w?bdYHlABz;%VGB3Y+ zpk13bmT+i}hh-iG+O~Oa3_D(#BF>kNSoFESHTT#Y4lXB#*e?atZsmw^V_tOV-ShII zWec!&-72hFvjQtuF9$s@U$q3C`t-U&46$DcgeIfA$H0D1Y~k?jL7Vb1VVe%NNcfb& z?>jqXyBz~Ir+>p53Ed-x*iQvi{TiWmZH`H7)tx*Z{gSjv15s9ml;e9vFD8~v9`!3;F* zB8FJC+tvGnAX6+k!dG>Bky6>G+@M$-pO*M);#L#JEq`hEbi$I(&nB*S!abrT1UA`f zp6N*}Wj+Yf1j2nu6_um1M55KjDiu_IHQG;Q2o5QFrSvI5|1w45rNmO^ zgCMD*qG@7zMcpikWM#2Rja;b|d2->MSTDz#SWnNI0#()he3=aNk7pJWOPQ}GQo2Am zB3CARL@Z}=W#!@b-%~29j=le$CJ+qx4~yw9&ez&4j;O@irzQXZ002ovPDHLkV1n4O B7f%2H From 6a5a1e5baedd6e1959c42f5eecd295a3923d0dac Mon Sep 17 00:00:00 2001 From: jellemdekker Date: Mon, 9 Jul 2018 14:56:22 +0200 Subject: [PATCH 3/4] Replaced spaces in indentation with tabs. --- main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java b/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java index 3106692db..eca371bbf 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java +++ b/main/ui/src/main/java/org/cryptomator/ui/ExitUtil.java @@ -204,15 +204,15 @@ public class ExitUtil { } private Image getAppropriateTrayIconImage(boolean areAllVaultsLocked) { - String resourceName; + String resourceName; if (SystemUtils.IS_OS_MAC_OSX && isMacMenuBarDarkMode()) { - resourceName = areAllVaultsLocked ? "/tray_icon_mac_white.png" : "/tray_icon_unlocked_mac_white.png"; + resourceName = areAllVaultsLocked ? "/tray_icon_mac_white.png" : "/tray_icon_unlocked_mac_white.png"; } else if (SystemUtils.IS_OS_MAC_OSX) { - resourceName = areAllVaultsLocked ? "/tray_icon_mac_black.png" : "/tray_icon_unlocked_mac_black.png"; + resourceName = areAllVaultsLocked ? "/tray_icon_mac_black.png" : "/tray_icon_unlocked_mac_black.png"; } else { - resourceName = areAllVaultsLocked ? "/tray_icon.png" : "/tray_icon_unlocked.png"; + resourceName = areAllVaultsLocked ? "/tray_icon.png" : "/tray_icon_unlocked.png"; } - return Toolkit.getDefaultToolkit().getImage(getClass().getResource(resourceName)); + return Toolkit.getDefaultToolkit().getImage(getClass().getResource(resourceName)); } } From ccd4cedb0852879b49a8bd0cee78d65085116ca0 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Mon, 9 Jul 2018 17:37:16 +0200 Subject: [PATCH 4/4] Unlocked tray icons for macOS --- .../resources/tray_icon_unlocked_mac_black.png | Bin 350 -> 353 bytes .../tray_icon_unlocked_mac_black@2x.png | Bin 692 -> 705 bytes .../resources/tray_icon_unlocked_mac_white.png | Bin 359 -> 378 bytes .../tray_icon_unlocked_mac_white@2x.png | Bin 707 -> 760 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/main/ui/src/main/resources/tray_icon_unlocked_mac_black.png b/main/ui/src/main/resources/tray_icon_unlocked_mac_black.png index 945626429a67a1ebf01cf4f9cccd445d8a720b6f..1530566e07940572534c1c12d05dbea20d4240b5 100644 GIT binary patch delta 337 zcmV-X0j~bu0^tIX8Gi-<005~MrIr8y0VqjCK~#7FVi*MgPUeB-(l83c=-9Sx=Nj9# zZ7VlM9^1C}ADq?cc|RUswc0z~#p=j0-V(gwARVcyc048WcuYGgZU@0A#^(9AQE`um zA|6q3&$-DB9`Kd>T;m2WDXRs1XDr>AlnkLAgPBBs%I-D6Sbu_iUecWdyyX-7XhGgy z@`!OnhHo6^J9F5>ZH6$EyX>M->j}owmB?_ACOSedUNVuaDLkQ3-yv5=BEv_{cKwEXQuY#9lGUQHtB=7pPQju5=mZDp%{LSSI-m zm;bzdooq!qwJVgZ#y$W5cqD9^wf5U#v5+11TWgxIM*zS=F@ODzNq)m)`ot^*fVmcxEua;_Z%LU0S1yKkROo(Jy8MBu3O+(!G{ z_W&+RvBwsffk*3(O!ewzx*O=3w%8-ZS(xsMY4{Yl9?Ae29tQd+OmoF_0JtO}soQh# gRJWvrOa3s10Du@~Rd%Z2-2eap07*qoM6N<$g15+=cmMzZ diff --git a/main/ui/src/main/resources/tray_icon_unlocked_mac_black@2x.png b/main/ui/src/main/resources/tray_icon_unlocked_mac_black@2x.png index f02eb7b6d2f72bb4529bfda14d3d42eff6e706d7..ae6058522d8386d588dc30fb78c33da09accdc4c 100644 GIT binary patch delta 692 zcmV;l0!#h01;GW78Gi-<0070q$y)#b0*FaOK~#7F?bZX&>}(W9;Sa~QZQHhO+qP}n zwtfG>vnJV1p7foj7zJI)HO8J!^-o$_T3YPtVKFY@4SwOL-9CresDqL=8{eT2Uoj0O zX&w~Q92B+2_zA`I6OB={mO|zhnt-_Ge!ycgD^awrLS{4EHh%^@CUXr%>jRX~dlW61 zANUT%RFEp50jk4m4C=wF3OZsg?wWb%jGFit<On*}cLXZvc+5|c4=0ONsBdl)w z5n5~ffgE0KLI(YY-soeug*M1^6T&zIH6FrEgtirO+<$;qO(?{8On|T#l@Ya(5bh$h z7m#BN+#ZGu+6#TL2UcMQ9fP+J?%=l&1)D^_7WhM9)&*BpPK z0F_YH`GLQngnpw;H+%yeLj`2(6coZsIq}sB!aVfA2K>T0Wa@+$_=xXN9tQo54cLg^ zQ3svr?teci_0hT83G1sL=K{>A^e9Cgr15W4w}665Xm zb0~`wIF-XX+86!etfSTO7Wsp=oJp aIrJC6t+Arjt|l1(0000O=WFzTyz@_Ym*OzaHWCzJ0Kj?-#}Lj;UjG^JoRaIDt}!v9L!GoXl<}i^ca?E zgLOh^Xm(TSI{MB)6Ai>fYYals7#rQ^YY*6By#5MCSZ5-Vw`Yc^XbLYV*{b4mO--Mx z*k_b|&iF!7Y*q5C&{Q!*4?LKL_O#8S*Ra`{lzULOl$=kdN9+*2h8-SBx%0~1&t^w5 zb=cacO3z6Co_}Wc>STJ}s;q)f-R#p$TjlwbyIK!CAcPmZXk}KxG)&91m0s|I5FXGi z*SaX2H^Dl)vkJyyY^LqD)&%E;i>}orE0XmCa5}5t6}*~hr@;qOzvZBkKHd%XWfgpb zZ!&EkxF?k=aun5t&@>y2&yMHYc)LYu8V}|qXH8K?!GAGT;V~euLI*nXW&n=~RmT*x zu-r{`j(+TYLovO>C*HE_$Cp6t>jibU`fK$R06x8&?yQ0tGU6j=nFj+VSaJ?`TylbYi z3!=~Af`5{k-T^~}>j4f5v%!lN8Q${KO{!TnRX4Sihg;-DFk3hbFkH=@nC51TYx!lh zNxt`c+4m-8m(4ibY#Q!VGXj96zBL=jdb+_1;TBK%-cxQ7R#>0)6qxN>OLa{)r~AC6 zraz#+nz!xC=CpUR)qg2F)fM68Z1wxZu9j_o(I5r@Y;ZB(r~mVh##;zT!wrv|h@tof#?{|u-C;8por++!1KgBvaIwr#jMNn0Uf0$(L;5ej1Rtm;h zGx`y#wqcj#^E+!slVGeQYeusWjxZ#k4si%ZD00jlx{3zu!hb9r#38K3IIO`zEVtyl zD*!R7Tn=XAFN#rxUl^t|nuBEQfml6k(SY;#j!3M9S~BVhFWKlo z+`?$>@qOq@h6@%5ziY87Kp2(9`7LM>e*7v75w08mL-nXS0a5rR)$BI|`Tzg`07*qo IM6N<$f+RqtqW}N^ delta 343 zcmV-d0jU1^0_Osd8Gi%-0009XZ5;pr0WL{IK~#7F&CLVMP;nTA@tf^2Yix)^wlU@! zvgYM^*)=w0H!Hg#+s2rUyI=2Te^WZ=;@s!|Y&ZGOqN|g>L=Wp$y4ceX06+CAO}*s2 z>h{>HdaUaui_H{H^OApm(;;WP@YE>>UDK;LZMiSXYNfYM8h>gK&))G>Ht6z#VjVwx zFifEYdGCih`PFK^x@#cdL=+el^sDOm)eSytXat~96a;AyC+qXX8d7KDJqEBg3XBeV zR;ospSWyqNOpVnjAZ(06s!`CXW`$8PR0F(pNIfmh@j(9E57IJDj(A}}s1`?iX=@$$ z3VADN8@<9<5>Tp%w(G9FePDt8ZbkQ72=VTqdl=(GRnAmp4Q_K~#7F?bZX#BTpR0@juVDZQHh@vu*n> zI@`8w+qP}n=Bsa#UoVqpyYK8)L7(K4%nsV8?qAjtNFad(5*iws9Q|o1qn2sMHp+9B5fXrV});{1EMj$)#VwB9ikv(5<3Qas+bRg7xKxEj>PjtpVo-TS9 zY91jG>?8=4m48>N1CHUdIEuE2V5jIDsCk39u#>)WoAGfPu5uFbtrl$rH9zo=#xu77 z3lXHe693EDqsna!Mqbe$Uu5kF{fe)U~!DZ1k@6#4fbV52wWu^V&Pxe{~LA_ zWK{ID(|?C(10uV4*0;el%3inPe8)LtzAs8+B7S3>tQW>Zyu)`8w~Gd05+)-^w`ez+ z&#lZ|LuMJzvinSE{x~exEjnE0Qz&z*QB%gpy-;*N{=t7ZtXs6T%$IcfQ_@_<4`7rn z*yhH2v@)t#d5^}y3oMoExLBxsazDT*i|{{|*<>tQRp=E}J}}QwN}Uhq8C@ntuj4$1 z<2G(-7Tqq)i)zLEJ-QcdW!%d6tbW`sYVxUnj;k_G&iA?01|A2T9F21$c+ykWlbRM`n$&up^dz`38sl_} zvCuf1+Cyq&gppEv*u*#svDoR+5bFXyh$6>JJs;r(spE4Kg7soW$^lnLk$t3oi135d zK2hWvKzaO`4r)Om8z9Cg$a^!woAL_AM3MOlphkyCX@BQ%Rk$lM=_9C&P)YiljJr_f zaP1<`+Rk->E$pUWWWv$%E{$-hykjC0`q|BvE^w~3;}1Sp0GBDfO<%PdSF3OCFE0ZH zpGQ3laF~rWersA z@(9zMA7Qk-4NdT?62F>Y19_t(oNro$%T*f`^{nAX^GdJC+rqlI&;x$;fD5s%&E*Y@ z-8i#X_Dy3NEs$pa884JYi84H!X1_)3rk0Y$wu};6S}d*8 c|NV3Q25m`X_t5g>bpQYW07*qoM6N<$f~81QZU6uP