From 8592e3667bff5d59d56d28e386c0ff627ff91a1d Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 9 Mar 2021 18:55:35 +0100 Subject: [PATCH] Applying a SystemListener when the notify gets called with SLEEP --- .../cryptomator/ui/fxapp/FxApplication.java | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index 73c04fe5f..7b1adb47a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -1,10 +1,23 @@ package org.cryptomator.ui.fxapp; import dagger.Lazy; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.BooleanBinding; +import javafx.beans.value.ObservableValue; +import javafx.collections.ObservableList; +import javafx.stage.Stage; +import javafx.stage.Window; import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; import org.cryptomator.common.vaults.Vault; +import org.cryptomator.common.vaults.VaultListManager; +import org.cryptomator.common.vaults.Volume; +import org.cryptomator.integrations.autolock.AutoLockException; +import org.cryptomator.integrations.autolock.AutoLockProvider; +import org.cryptomator.integrations.autolock.SystemState; import org.cryptomator.integrations.tray.TrayIntegrationProvider; import org.cryptomator.integrations.uiappearance.Theme; import org.cryptomator.integrations.uiappearance.UiAppearanceException; @@ -22,15 +35,9 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Provider; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.beans.binding.Bindings; -import javafx.beans.binding.BooleanBinding; -import javafx.beans.value.ObservableValue; -import javafx.collections.ObservableList; -import javafx.stage.Stage; -import javafx.stage.Window; import java.awt.desktop.QuitResponse; +import java.awt.desktop.SystemSleepEvent; +import java.awt.desktop.SystemSleepListener; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -53,9 +60,11 @@ public class FxApplication extends Application { private final ObservableList visibleWindows; private final BooleanBinding hasVisibleWindows; private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; + private final VaultListManager vaultListManager; + private final Optional autoLockProvider; @Inject - FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder) { + FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, VaultListManager vaultListManager, Optional autoLockProvider) { this.settings = settings; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; @@ -68,6 +77,8 @@ public class FxApplication extends Application { this.licenseHolder = licenseHolder; this.visibleWindows = Stage.getWindows().filtered(Window::isShowing); this.hasVisibleWindows = Bindings.isNotEmpty(visibleWindows); + this.vaultListManager = vaultListManager; + this.autoLockProvider = autoLockProvider; } public void start() { @@ -78,6 +89,7 @@ public class FxApplication extends Application { settings.theme().addListener(this::appThemeChanged); loadSelectedStyleSheet(settings.theme().get()); + applySystemListener(); } @Override @@ -192,4 +204,30 @@ public class FxApplication extends Application { }); } + private void applySystemListener() { + autoLockProvider.ifPresent(autoLockProvider -> { + try { + autoLockProvider.addListener(this::systemInterfaceStateChanged); + } catch (AutoLockException e) { + LOG.error("Failed to listen to changing System Power and Lock states."); + } + }); + } + + private void systemInterfaceStateChanged(SystemState systemState) { + vaultListManager.getVaultList().forEach(vault -> { + switch (systemState) { + case SLEEP -> { + if (vault.getVaultSettings().lockOnSleep().get()) { + try { + vault.lock(true); + } catch (Volume.VolumeException e) { + e.printStackTrace(); + } + } + } + } + }); + } + }