From bc361ea592d021bcb1d8d10230fab30229d9d583 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Mon, 10 Jul 2023 13:04:07 +0200 Subject: [PATCH] added ui elements for update reminder --- .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../cryptomator/ui/fxapp/FxApplication.java | 3 + .../ui/fxapp/FxApplicationModule.java | 10 +++- .../ui/fxapp/FxApplicationWindows.java | 18 +++++- .../UpdateReminderComponent.java | 37 ++++++++++++ .../UpdateReminderController.java | 42 +++++++++++++ .../updatereminder/UpdateReminderModule.java | 59 +++++++++++++++++++ .../updatereminder/UpdateReminderScoped.java | 13 ++++ .../updatereminder/UpdateReminderWindow.java | 14 +++++ src/main/resources/fxml/update_reminder.fxml | 54 +++++++++++++++++ src/main/resources/i18n/strings.properties | 8 ++- 11 files changed, 256 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderComponent.java create mode 100644 src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderController.java create mode 100644 src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderModule.java create mode 100644 src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderScoped.java create mode 100644 src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderWindow.java create mode 100644 src/main/resources/fxml/update_reminder.fxml diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index 3bec75899..ea1209473 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -41,6 +41,7 @@ public enum FxmlFile { RECOVERYKEY_RESET_PASSWORD_SUCCESS("/fxml/recoverykey_reset_password_success.fxml"), // RECOVERYKEY_SUCCESS("/fxml/recoverykey_success.fxml"), // REMOVE_VAULT("/fxml/remove_vault.fxml"), // + UPDATE_REMINDER("/fxml/update_reminder.fxml"), // UNLOCK_ENTER_PASSWORD("/fxml/unlock_enter_password.fxml"), UNLOCK_INVALID_MOUNT_POINT("/fxml/unlock_invalid_mount_point.fxml"), // UNLOCK_SELECT_MASTERKEYFILE("/fxml/unlock_select_masterkeyfile.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index b71da265c..47f18d702 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -67,6 +67,9 @@ public class FxApplication { LOG.error("Failed to show main window", error); return null; }); + if(!settings.checkForUpdates.getValue()){ + appWindows.showUpdateReminderWindow(); + } launchEventHandler.startHandlingLaunchEvents(); autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES); diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index 877675b9c..b61ec980d 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -15,12 +15,13 @@ import org.cryptomator.ui.quit.QuitComponent; import org.cryptomator.ui.traymenu.TrayMenuComponent; import org.cryptomator.ui.unlock.UnlockComponent; +import org.cryptomator.ui.updatereminder.UpdateReminderComponent; import javafx.scene.image.Image; import java.io.IOException; import java.io.InputStream; -@Module(includes = {UpdateCheckerModule.class}, subcomponents = {TrayMenuComponent.class, MainWindowComponent.class, PreferencesComponent.class, UnlockComponent.class, LockComponent.class, QuitComponent.class, ErrorComponent.class}) +@Module(includes = {UpdateCheckerModule.class}, subcomponents = {TrayMenuComponent.class, MainWindowComponent.class, PreferencesComponent.class, UnlockComponent.class, LockComponent.class, QuitComponent.class, ErrorComponent.class, UpdateReminderComponent.class}) abstract class FxApplicationModule { private static Image createImageFromResource(String resourceName) throws IOException { @@ -52,4 +53,11 @@ abstract class FxApplicationModule { static QuitComponent provideQuitComponent(QuitComponent.Builder builder) { return builder.build(); } + + @Provides + @FxApplicationScoped + static UpdateReminderComponent provideUpdateReminderComponent(UpdateReminderComponent.Builder builder) { + return builder.build(); + } + } \ No newline at end of file diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java index 000954bd5..45cd7d2cb 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java @@ -13,6 +13,7 @@ import org.cryptomator.ui.preferences.SelectedPreferencesTab; import org.cryptomator.ui.quit.QuitComponent; import org.cryptomator.ui.unlock.UnlockComponent; import org.cryptomator.ui.unlock.UnlockWorkflow; +import org.cryptomator.ui.updatereminder.UpdateReminderComponent; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,19 +44,30 @@ public class FxApplicationWindows { private final Lazy preferencesWindow; private final QuitComponent.Builder quitWindowBuilder; private final UnlockComponent.Factory unlockWorkflowFactory; + private final UpdateReminderComponent.Builder updateReminderWindowBuilder; private final LockComponent.Factory lockWorkflowFactory; private final ErrorComponent.Factory errorWindowFactory; private final ExecutorService executor; private final FilteredList visibleWindows; @Inject - public FxApplicationWindows(@PrimaryStage Stage primaryStage, Optional trayIntegration, Lazy mainWindow, Lazy preferencesWindow, QuitComponent.Builder quitWindowBuilder, UnlockComponent.Factory unlockWorkflowFactory, LockComponent.Factory lockWorkflowFactory, ErrorComponent.Factory errorWindowFactory, ExecutorService executor) { + public FxApplicationWindows(@PrimaryStage Stage primaryStage, + Optional trayIntegration, // + Lazy mainWindow, // + Lazy preferencesWindow, // + QuitComponent.Builder quitWindowBuilder, // + UnlockComponent.Factory unlockWorkflowFactory, // + UpdateReminderComponent.Builder updateReminderWindowBuilder, // + LockComponent.Factory lockWorkflowFactory, // + ErrorComponent.Factory errorWindowFactory, // + ExecutorService executor) { this.primaryStage = primaryStage; this.trayIntegration = trayIntegration; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; this.quitWindowBuilder = quitWindowBuilder; this.unlockWorkflowFactory = unlockWorkflowFactory; + this.updateReminderWindowBuilder = updateReminderWindowBuilder; this.lockWorkflowFactory = lockWorkflowFactory; this.errorWindowFactory = errorWindowFactory; this.executor = executor; @@ -109,6 +121,10 @@ public class FxApplicationWindows { CompletableFuture.runAsync(() -> quitWindowBuilder.build().showQuitWindow(response,forced), Platform::runLater); } + public void showUpdateReminderWindow() { + CompletableFuture.runAsync(() -> updateReminderWindowBuilder.build().showUpdateReminderWindow(), Platform::runLater); + } + public CompletionStage startUnlockWorkflow(Vault vault, @Nullable Stage owner) { return CompletableFuture.supplyAsync(() -> { Preconditions.checkState(vault.stateProperty().transition(VaultState.Value.LOCKED, VaultState.Value.PROCESSING), "Vault not locked."); diff --git a/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderComponent.java b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderComponent.java new file mode 100644 index 000000000..de49e325f --- /dev/null +++ b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderComponent.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the accompanying LICENSE file. + *******************************************************************************/ +package org.cryptomator.ui.updatereminder; + +import dagger.Lazy; +import dagger.Subcomponent; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javafx.scene.Scene; +import javafx.stage.Stage; + +@UpdateReminderScoped +@Subcomponent(modules = {UpdateReminderModule.class}) +public interface UpdateReminderComponent { + + @UpdateReminderWindow + Stage window(); + + @FxmlScene(FxmlFile.UPDATE_REMINDER) + Lazy updateReminderScene(); + + default void showUpdateReminderWindow() { + Stage stage = window(); + stage.setScene(updateReminderScene().get()); + stage.sizeToScene(); + stage.show(); + } + + @Subcomponent.Builder + interface Builder { + UpdateReminderComponent build(); + } +} \ No newline at end of file diff --git a/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderController.java b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderController.java new file mode 100644 index 000000000..8a5403411 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderController.java @@ -0,0 +1,42 @@ +package org.cryptomator.ui.updatereminder; + +import org.cryptomator.common.settings.Settings; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.fxapp.UpdateChecker; + +import javax.inject.Inject; +import javafx.fxml.FXML; +import javafx.stage.Stage; + +@UpdateReminderScoped +public class UpdateReminderController implements FxController { + + private final Stage window; + private final Settings settings; + private final UpdateChecker updateChecker; + + + @Inject + UpdateReminderController(@UpdateReminderWindow Stage window, Settings settings, UpdateChecker updateChecker) { + this.window = window; + this.settings = settings; + this.updateChecker = updateChecker; + } + + @FXML + public void cancel() { + window.close(); + } + @FXML + public void once() { + updateChecker.checkForUpdatesNow(); + window.close(); + } + @FXML + public void automatically() { + settings.checkForUpdates.set(true); + updateChecker.checkForUpdatesNow(); + window.close(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderModule.java b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderModule.java new file mode 100644 index 000000000..9fe95c1e5 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderModule.java @@ -0,0 +1,59 @@ +package org.cryptomator.ui.updatereminder; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import org.cryptomator.ui.common.DefaultSceneFactory; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlLoaderFactory; +import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.common.StageFactory; + +import javax.inject.Provider; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; +import java.util.Map; +import java.util.ResourceBundle; + +@Module +abstract class UpdateReminderModule { + + @Provides + @UpdateReminderWindow + @UpdateReminderScoped + static FxmlLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) { + return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle); + } + + @Provides + @UpdateReminderWindow + @UpdateReminderScoped + static Stage provideStage(StageFactory factory, ResourceBundle resourceBundle) { + Stage stage = factory.create(); + stage.setTitle(resourceBundle.getString("updateReminder.title")); + stage.setMinWidth(450); + stage.setMinHeight(100); + stage.initModality(Modality.APPLICATION_MODAL); + return stage; + } + + @Provides + @FxmlScene(FxmlFile.UPDATE_REMINDER) + @UpdateReminderScoped + static Scene provideUpdateReminderScene(@UpdateReminderWindow FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.UPDATE_REMINDER); + } + + + // ------------------ + + @Binds + @IntoMap + @FxControllerKey(UpdateReminderController.class) + abstract FxController bindUpdateReminderController(UpdateReminderController controller); + +} diff --git a/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderScoped.java b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderScoped.java new file mode 100644 index 000000000..13133af2a --- /dev/null +++ b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderScoped.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.updatereminder; + +import javax.inject.Scope; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Scope +@Documented +@Retention(RetentionPolicy.RUNTIME) +@interface UpdateReminderScoped { + +} diff --git a/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderWindow.java b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderWindow.java new file mode 100644 index 000000000..f7c9b9d2c --- /dev/null +++ b/src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderWindow.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.updatereminder; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Documented +@Retention(RUNTIME) +@interface UpdateReminderWindow { + +} diff --git a/src/main/resources/fxml/update_reminder.fxml b/src/main/resources/fxml/update_reminder.fxml new file mode 100644 index 000000000..f45ded50a --- /dev/null +++ b/src/main/resources/fxml/update_reminder.fxml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +