diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d7b93c2e3..9c75e475f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -86,6 +86,11 @@ jobs: release_name: ${{ github.ref }} body: | :construction: Work in Progress + + TODO: + * [ ] add Linux appimage, zsync file and signature file + * [ ] add Windows installer and signature file + * [ ] add MacOs disk image and signature file draft: true prerelease: false - name: Upload buildkit-linux.zip to GitHub Releases diff --git a/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainManager.java b/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainManager.java index 537b83577..64db08018 100644 --- a/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainManager.java +++ b/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainManager.java @@ -68,6 +68,11 @@ public class KeychainManager implements KeychainAccessProvider { return keychain.getValue() != null; } + @Override + public boolean isLocked() { + return keychain.getValue() == null || keychain.get().isLocked(); + } + /** * Checks if the keychain knows a passphrase for the given key. *

diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java b/main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java index 8df1e7f89..62fe714e4 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java @@ -8,7 +8,7 @@ public enum UiTheme { AUTOMATIC("preferences.general.theme.automatic"); public static UiTheme[] applicableValues() { - if (SystemUtils.IS_OS_MAC) { + if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_WINDOWS) { return values(); } else { return new UiTheme[]{LIGHT, DARK}; diff --git a/main/commons/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java b/main/commons/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java index c571ad716..1b2bedfce 100644 --- a/main/commons/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java +++ b/main/commons/src/test/java/org/cryptomator/common/keychain/MapKeychainAccess.java @@ -44,4 +44,9 @@ class MapKeychainAccess implements KeychainAccessProvider { return true; } + @Override + public boolean isLocked() { + return false; + } + } diff --git a/main/pom.xml b/main/pom.xml index 0d6866531..ef4bde25b 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -22,16 +22,17 @@ UTF-8 + 14 2.0.0-beta3 - 0.1.6 - 0.2.1 - 0.1.0-beta3 - 0.1.1 - 1.2.8 - 1.2.3 - 1.1.1 + 1.0.0-beta2 + 1.0.0-beta2 + 1.0.0-beta2 + 1.0.0-beta1 + 1.2.9 + 1.2.4 + 1.1.3 15 @@ -39,7 +40,7 @@ 3.12.0 2.1.0 30.1-jre - 2.31 + 2.32 2.8.6 1.7.30 1.2.3 @@ -50,13 +51,6 @@ 2.2 - - - jcenter - https://jcenter.bintray.com - - - @@ -437,7 +431,7 @@ maven-compiler-plugin - 14 + ${project.jdk.version} com.google.dagger 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 65e6d1c6c..73c04fe5f 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 @@ -137,13 +137,13 @@ public class FxApplication extends Application { } private void appThemeChanged(@SuppressWarnings("unused") ObservableValue observable, @SuppressWarnings("unused") UiTheme oldValue, UiTheme newValue) { - appearanceProvider.ifPresent(appearanceProvider -> { + if (appearanceProvider.isPresent() && oldValue == UiTheme.AUTOMATIC && newValue != UiTheme.AUTOMATIC) { try { - appearanceProvider.removeListener(systemInterfaceThemeListener); + appearanceProvider.get().removeListener(systemInterfaceThemeListener); } catch (UiAppearanceException e) { LOG.error("Failed to disable automatic theme switching."); } - }); + } loadSelectedStyleSheet(newValue); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java index e7da43938..bc2f2100a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java @@ -5,6 +5,7 @@ import org.cryptomator.common.keychain.KeychainManager; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.FxApplication; +import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab; import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; import javax.inject.Inject; @@ -47,7 +48,12 @@ public class VaultDetailLockedController implements FxController { @FXML public void showVaultOptions() { - vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(); + vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(SelectedVaultOptionsTab.ANY); + } + + @FXML + public void showKeyVaultOptions() { + vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(SelectedVaultOptionsTab.KEY); } /* Getter/Setter */ diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java new file mode 100644 index 000000000..86945374a --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java @@ -0,0 +1,23 @@ +package org.cryptomator.ui.vaultoptions; + +public enum SelectedVaultOptionsTab { + /** + * Let the controller decide which tab to show. + */ + ANY, + + /** + * Show general tab + */ + GENERAL, + + /** + * Show mounting tab + */ + MOUNT, + + /** + * Show password tab + */ + KEY, +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java index 09b362aff..e56c30f5c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java @@ -12,6 +12,7 @@ import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; +import javafx.beans.property.ObjectProperty; import javafx.scene.Scene; import javafx.stage.Stage; @@ -25,7 +26,10 @@ public interface VaultOptionsComponent { @FxmlScene(FxmlFile.VAULT_OPTIONS) Lazy scene(); - default void showVaultOptionsWindow() { + ObjectProperty selectedTabProperty(); + + default void showVaultOptionsWindow(SelectedVaultOptionsTab selectedTab) { + selectedTabProperty().set(selectedTab); Stage stage = window(); stage.setScene(scene().get()); stage.show(); diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index ab71d08b7..15879e316 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -1,13 +1,67 @@ package org.cryptomator.ui.vaultoptions; import org.cryptomator.ui.common.FxController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javafx.beans.property.ObjectProperty; +import javafx.fxml.FXML; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; @VaultOptionsScoped public class VaultOptionsController implements FxController { + private static final Logger LOG = LoggerFactory.getLogger(VaultOptionsController.class); + + private final Stage window; + private final ObjectProperty selectedTabProperty; + public TabPane tabPane; + public Tab generalTab; + public Tab mountTab; + public Tab keyTab; + @Inject - VaultOptionsController() {} + VaultOptionsController(@VaultOptionsWindow Stage window, ObjectProperty selectedTabProperty) { + this.window = window; + this.selectedTabProperty = selectedTabProperty; + } + + @FXML + public void initialize() { + window.setOnShowing(this::windowWillAppear); + selectedTabProperty.addListener(observable -> this.selectChosenTab()); + tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged()); + } + + private void selectChosenTab() { + Tab toBeSelected = getTabToSelect(selectedTabProperty.get()); + tabPane.getSelectionModel().select(toBeSelected); + } + + private Tab getTabToSelect(SelectedVaultOptionsTab selectedTab) { + return switch (selectedTab) { + case ANY, GENERAL -> generalTab; + case MOUNT -> mountTab; + case KEY -> keyTab; + }; + } + + private void selectedTabChanged() { + Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + try { + SelectedVaultOptionsTab selectedVaultOptionsTab = SelectedVaultOptionsTab.valueOf(selectedTab.getId()); + selectedTabProperty.set(selectedVaultOptionsTab); + } catch (IllegalArgumentException e) { + LOG.error("Unknown vault options tab id: {}", selectedTab.getId()); + } + } + + private void windowWillAppear(@SuppressWarnings("unused") WindowEvent windowEvent) { + selectChosenTab(); + } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java index bf47c294c..fb248f38e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java @@ -7,16 +7,18 @@ import dagger.multibindings.IntoMap; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.changepassword.ChangePasswordComponent; import org.cryptomator.ui.common.DefaultSceneFactory; -import org.cryptomator.ui.common.FxmlLoaderFactory; 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 org.cryptomator.ui.mainwindow.MainWindow; import org.cryptomator.ui.recoverykey.RecoveryKeyComponent; import javax.inject.Provider; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; @@ -26,6 +28,12 @@ import java.util.ResourceBundle; @Module(subcomponents = {ChangePasswordComponent.class, RecoveryKeyComponent.class}) abstract class VaultOptionsModule { + @Provides + @VaultOptionsScoped + static ObjectProperty provideSelectedTabProperty() { + return new SimpleObjectProperty<>(SelectedVaultOptionsTab.ANY); + } + @Provides @VaultOptionsWindow @VaultOptionsScoped diff --git a/main/ui/src/main/resources/fxml/vault_detail_locked.fxml b/main/ui/src/main/resources/fxml/vault_detail_locked.fxml index aa4f5e855..d4bbc7e4a 100644 --- a/main/ui/src/main/resources/fxml/vault_detail_locked.fxml +++ b/main/ui/src/main/resources/fxml/vault_detail_locked.fxml @@ -3,7 +3,6 @@ - @@ -25,18 +24,20 @@ - + - + + - -