diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index 938f93687..6c5068684 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -45,6 +45,7 @@ public enum FxmlFile { RECOVERYKEY_RESET_PASSWORD("/fxml/recoverykey_reset_password.fxml"), // RECOVERYKEY_RESET_PASSWORD_SUCCESS("/fxml/recoverykey_reset_password_success.fxml"), // RECOVERYKEY_SUCCESS("/fxml/recoverykey_success.fxml"), // + REMOVE_CERT("/fxml/remove_cert.fxml"), // REMOVE_VAULT("/fxml/remove_vault.fxml"), // SHARE_VAULT("/fxml/share_vault.fxml"), // UPDATE_REMINDER("/fxml/update_reminder.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java index e454835cf..485e89304 100644 --- a/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java +++ b/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java @@ -17,6 +17,7 @@ public enum FontAwesome5Icon { COGS("\uF085"), // COPY("\uF0C5"), // CROWN("\uF521"), // + DONATE("\uF4B9"), // EDIT("\uF044"), // EXCHANGE_ALT("\uF362"), // EXCLAMATION("\uF12A"), // @@ -49,6 +50,7 @@ public enum FontAwesome5Icon { SEARCH("\uF002"), // SHARE("\uF064"), // SPINNER("\uF110"), // + SPONSORS("\uF2B5"), // STETHOSCOPE("\uF0f1"), // SYNC("\uF021"), // TIMES("\uF00D"), // diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java index 0b8b6c70f..0d542b8fe 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationModule.java @@ -14,6 +14,7 @@ import org.cryptomator.ui.lock.LockComponent; import org.cryptomator.ui.mainwindow.MainWindowComponent; import org.cryptomator.ui.preferences.PreferencesComponent; import org.cryptomator.ui.quit.QuitComponent; +import org.cryptomator.ui.removecert.RemoveCertComponent; import org.cryptomator.ui.sharevault.ShareVaultComponent; import org.cryptomator.ui.traymenu.TrayMenuComponent; import org.cryptomator.ui.unlock.UnlockComponent; @@ -35,6 +36,7 @@ import java.io.InputStream; HealthCheckComponent.class, // UpdateReminderComponent.class, // DokanySupportEndComponent.class, // + RemoveCertComponent.class, // ShareVaultComponent.class}) abstract class FxApplicationModule { diff --git a/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java b/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java index 2d569970d..136479bc0 100644 --- a/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java +++ b/src/main/java/org/cryptomator/ui/preferences/PreferencesComponent.java @@ -31,7 +31,7 @@ public interface PreferencesComponent { Stage stage = window(); stage.setScene(scene().get()); stage.setMinWidth(420); - stage.setMinHeight(300); + stage.setMinHeight(400); stage.show(); stage.requestFocus(); return stage; diff --git a/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java b/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java index bff56bc3c..e587e5f27 100644 --- a/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java +++ b/src/main/java/org/cryptomator/ui/preferences/SupporterCertificateController.java @@ -5,6 +5,7 @@ import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.removecert.RemoveCertComponent; import javax.inject.Inject; import javafx.application.Application; @@ -12,22 +13,31 @@ import javafx.beans.value.ObservableValue; import javafx.fxml.FXML; import javafx.scene.control.TextArea; import javafx.scene.control.TextFormatter; +import javafx.stage.Stage; @PreferencesScoped public class SupporterCertificateController implements FxController { + private static final String DONATE_URI = "https://cryptomator.org/donate"; + private static final String SPONSORS_URI = "https://cryptomator.org/sponsors"; private static final String SUPPORTER_URI = "https://store.cryptomator.org/desktop"; private final Application application; + private final Stage window; private final LicenseHolder licenseHolder; private final Settings settings; - public TextArea supporterCertificateField; + private final RemoveCertComponent.Builder removeCert; + + @FXML + private TextArea supporterCertificateField; @Inject - SupporterCertificateController(Application application, LicenseHolder licenseHolder, Settings settings) { + SupporterCertificateController(Application application, @PreferencesWindow Stage window, LicenseHolder licenseHolder, Settings settings, RemoveCertComponent.Builder removeCert) { this.application = application; + this.window = window; this.licenseHolder = licenseHolder; this.settings = settings; + this.removeCert = removeCert; } @FXML @@ -35,6 +45,11 @@ public class SupporterCertificateController implements FxController { supporterCertificateField.setText(licenseHolder.getLicenseKey().orElse(null)); supporterCertificateField.textProperty().addListener(this::registrationKeyChanged); supporterCertificateField.setTextFormatter(new TextFormatter<>(this::removeWhitespaces)); + settings.licenseKey.addListener((_, _, newValue) -> { + if (newValue == null) { + supporterCertificateField.setText(null); + } + }); } private TextFormatter.Change removeWhitespaces(TextFormatter.Change change) { @@ -57,6 +72,21 @@ public class SupporterCertificateController implements FxController { application.getHostServices().showDocument(SUPPORTER_URI); } + @FXML + public void showDonate() { + application.getHostServices().showDocument(DONATE_URI); + } + + @FXML + public void showSponsors() { + application.getHostServices().showDocument(SPONSORS_URI); + } + + @FXML + void didClickRemoveCert() { + removeCert.build().showRemoveCert(window); + } + public LicenseHolder getLicenseHolder() { return licenseHolder; } diff --git a/src/main/java/org/cryptomator/ui/removecert/RemoveCertComponent.java b/src/main/java/org/cryptomator/ui/removecert/RemoveCertComponent.java new file mode 100644 index 000000000..40fc867f9 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/removecert/RemoveCertComponent.java @@ -0,0 +1,34 @@ +package org.cryptomator.ui.removecert; + +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; + +@RemoveCertScoped +@Subcomponent(modules = {RemoveCertModule.class}) +public interface RemoveCertComponent { + + @RemoveCertWindow + Stage window(); + + @FxmlScene(FxmlFile.REMOVE_CERT) + Lazy scene(); + + default void showRemoveCert(Stage owner) { + Stage stage = window(); + stage.setScene(scene().get()); + stage.sizeToScene(); + stage.initOwner(owner); + stage.show(); + } + + @Subcomponent.Builder + interface Builder { + RemoveCertComponent build(); + } + +} diff --git a/src/main/java/org/cryptomator/ui/removecert/RemoveCertController.java b/src/main/java/org/cryptomator/ui/removecert/RemoveCertController.java new file mode 100644 index 000000000..2ac08a02d --- /dev/null +++ b/src/main/java/org/cryptomator/ui/removecert/RemoveCertController.java @@ -0,0 +1,32 @@ +package org.cryptomator.ui.removecert; + +import org.cryptomator.common.settings.Settings; +import org.cryptomator.ui.common.FxController; + +import javax.inject.Inject; +import javafx.fxml.FXML; +import javafx.stage.Stage; + +@RemoveCertScoped +public class RemoveCertController implements FxController { + + private final Stage window; + private final Settings settings; + + @Inject + public RemoveCertController(@RemoveCertWindow Stage window, Settings settings) { + this.window = window; + this.settings = settings; + } + + @FXML + public void close() { + window.close(); + } + + @FXML + public void remove() { + settings.licenseKey.set(null); + window.close(); + } +} diff --git a/src/main/java/org/cryptomator/ui/removecert/RemoveCertModule.java b/src/main/java/org/cryptomator/ui/removecert/RemoveCertModule.java new file mode 100644 index 000000000..fb4b8d22a --- /dev/null +++ b/src/main/java/org/cryptomator/ui/removecert/RemoveCertModule.java @@ -0,0 +1,56 @@ +package org.cryptomator.ui.removecert; + +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 RemoveCertModule { + + @Provides + @RemoveCertWindow + @RemoveCertScoped + static FxmlLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) { + return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle); + } + + @Provides + @RemoveCertWindow + @RemoveCertScoped + static Stage provideStage(StageFactory factory, ResourceBundle resourceBundle) { + Stage stage = factory.create(); + stage.setTitle(resourceBundle.getString("removeCert.title")); + stage.setResizable(false); + stage.initModality(Modality.WINDOW_MODAL); + return stage; + } + + @Provides + @FxmlScene(FxmlFile.REMOVE_CERT) + @RemoveCertScoped + static Scene provideRemoveCertScene(@RemoveCertWindow FxmlLoaderFactory fxmlLoaders) { + return fxmlLoaders.createScene(FxmlFile.REMOVE_CERT); + } + + // ------------------ + + @Binds + @IntoMap + @FxControllerKey(RemoveCertController.class) + abstract FxController bindRemoveCertController(RemoveCertController controller); +} diff --git a/src/main/java/org/cryptomator/ui/removecert/RemoveCertScoped.java b/src/main/java/org/cryptomator/ui/removecert/RemoveCertScoped.java new file mode 100644 index 000000000..d7df8b80c --- /dev/null +++ b/src/main/java/org/cryptomator/ui/removecert/RemoveCertScoped.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.removecert; + +import javax.inject.Scope; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Scope +@Documented +@Retention(RetentionPolicy.RUNTIME) +public @interface RemoveCertScoped { + +} diff --git a/src/main/java/org/cryptomator/ui/removecert/RemoveCertWindow.java b/src/main/java/org/cryptomator/ui/removecert/RemoveCertWindow.java new file mode 100644 index 000000000..cd226d794 --- /dev/null +++ b/src/main/java/org/cryptomator/ui/removecert/RemoveCertWindow.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.removecert; + +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 RemoveCertWindow { + +} diff --git a/src/main/resources/css/dark_theme.css b/src/main/resources/css/dark_theme.css index 72af57751..dae0d1898 100644 --- a/src/main/resources/css/dark_theme.css +++ b/src/main/resources/css/dark_theme.css @@ -100,6 +100,7 @@ .label-extra-large { -fx-font-family: 'Open Sans SemiBold'; + -fx-fill: TEXT_FILL; -fx-font-size: 1.5em; } diff --git a/src/main/resources/fxml/preferences_contribute.fxml b/src/main/resources/fxml/preferences_contribute.fxml index 55d40b495..a6a52bf4e 100644 --- a/src/main/resources/fxml/preferences_contribute.fxml +++ b/src/main/resources/fxml/preferences_contribute.fxml @@ -3,13 +3,18 @@ + + + + + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + +