From: Debayan Sutradhar Date: Fri, 28 May 2021 12:36:01 +0530 Subject: Added screen saver --- Added screen saver --- --- 'a/pom.xml' +++ b/pom.xml @@ -146,7 +146,7 @@ javafx-maven-plugin 0.0.5 - -DStream-Pi.defaultFullScreenMode=false + -DStream-Pi.defaultFullScreenMode=false -DStream-Pi.enableScreenSaverFeature=false --- 'a/src/main/java/com/stream_pi/client/Main.java' +++ b/src/main/java/com/stream_pi/client/Main.java @@ -48,6 +48,9 @@ public class Main extends Application { case "-DStream-Pi.defaultFullScreenMode": ClientInfo.getInstance().setDefaultFullscreenMode(val.equals("true")); break; + case "-DStream-Pi.enableScreenSaverFeature": + ClientInfo.getInstance().setEnableScreenSaverFeature(val.equals("true")); + break; } } --- 'a/src/main/java/com/stream_pi/client/controller/Controller.java' +++ b/src/main/java/com/stream_pi/client/controller/Controller.java @@ -32,6 +32,7 @@ import javafx.beans.value.ChangeListener import javafx.geometry.Orientation; import javafx.scene.Node; import javafx.scene.input.KeyCombination; +import javafx.scene.layout.StackPane; import javafx.stage.Screen; import javafx.util.Duration; @@ -50,6 +51,7 @@ public class Controller extends Base private boolean firstRun = true; + private ScreenSaver screenSaver = null; @Override public void init() @@ -59,6 +61,18 @@ public class Controller extends Base if(firstRun) initBase(); + if (screenSaver != null) + { + screenSaver.stop(); + getChildren().remove(screenSaver); + } + + screenSaver = new ScreenSaver(getConfig().isScreenSaverEnabled(), this, getConfig().getScreenSaverTimeout()); + + getChildren().add(screenSaver); + screenSaver.toBack(); + + if(getClientInfo().getPlatform() != com.stream_pi.util.platform.Platform.ANDROID) { @@ -215,13 +229,13 @@ public class Controller extends Base if(isConnected()) client.exit(); + screenSaver.stop(); if(!getClientInfo().isPhone() && !getConfig().getIsFullScreenMode()) { getConfig().setStartupWindowSize(getStageWidth(), getStageHeight()); getConfig().save(); } - } catch (SevereException e) { @@ -331,8 +345,6 @@ public class Controller extends Base - - @Override public void handleMinorException(MinorException e) { --- /dev/null +++ b/src/main/java/com/stream_pi/client/controller/ScreenSaver.java @@ -0,0 +1,121 @@ +package com.stream_pi.client.controller; + +import com.stream_pi.client.window.Base; +import com.stream_pi.util.exception.SevereException; +import javafx.animation.*; +import javafx.application.Platform; +import javafx.concurrent.Task; +import javafx.scene.Node; +import javafx.scene.layout.StackPane; +import javafx.util.Duration; + +import java.util.Timer; +import java.util.TimerTask; + +public class ScreenSaver extends StackPane +{ + private boolean isEnabled = false; + private Timer timer; + + private Timeline showScreenSaverTimeline; + private long timeout; + + public ScreenSaver(boolean isEnabled, Base base, int timeout) + { + this.isEnabled = isEnabled; + this.timeout = timeout* 1000L; + + + setOpacity(0); + getStyleClass().add("screensaver"); + + if(isEnabled) + { + + showScreenSaverTimeline = new Timeline(); + showScreenSaverTimeline.setCycleCount(1); + + + showScreenSaverTimeline.getKeyFrames().addAll( + new KeyFrame(Duration.millis(0.0D), + new KeyValue(opacityProperty(), + 0.0D, Interpolator.EASE_IN)), + new KeyFrame(Duration.seconds(15D), + new KeyValue(opacityProperty(), + 1.0D, Interpolator.LINEAR)) + ); + + startTimer(); + + base.setOnMouseClicked(mouseEvent -> { + close(); + restartTimer(); + }); + + + } + } + + public void stop() + { + stopTimer(); + setOpacity(0); + toBack(); + } + + public boolean isEnabled() { + return isEnabled; + } + + + private void show() + { + Platform.runLater(()->{ + setOpacity(0); + toFront(); + showScreenSaverTimeline.play(); + }); + } + + private void close() + { + Platform.runLater(()->{ + if(showScreenSaverTimeline.getStatus() == Animation.Status.RUNNING) + { + showScreenSaverTimeline.stop(); + } + + + setOpacity(0.0); + toBack(); + }); + + restartTimer(); + } + + private void restartTimer() + { + stopTimer(); + startTimer(); + } + + private void stopTimer() + { + if(timer != null) + { + timer.cancel(); + timer.purge(); + } + } + + private void startTimer() + { + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + show(); + } + },timeout); + } +} --- 'a/src/main/java/com/stream_pi/client/info/ClientInfo.java' +++ b/src/main/java/com/stream_pi/client/info/ClientInfo.java @@ -184,4 +184,16 @@ public class ClientInfo { { return defaultFullscreenMode; } + + private boolean enableScreenSaverFeature = false; + + public void setEnableScreenSaverFeature(boolean enableScreenSaverFeature) + { + this.enableScreenSaverFeature = enableScreenSaverFeature; + } + + public boolean isEnableScreenSaverFeature() + { + return enableScreenSaverFeature; + } } --- 'a/src/main/java/com/stream_pi/client/io/Config.java' +++ b/src/main/java/com/stream_pi/client/io/Config.java @@ -433,4 +433,35 @@ public class Config { getOthersElement().getElementsByTagName("try-connecting-when-action-clicked").item(0).setTextContent(value+""); } + + + public boolean getDefaultScreenSaverEnabled() + { + return false; + } + + public boolean isScreenSaverEnabled() + { + return XMLConfigHelper.getBooleanProperty(getOthersElement(), "screen-saver", getDefaultScreenSaverEnabled(), false, true, document, configFile); + } + + public void setScreenSaverEnabled(boolean value) + { + getOthersElement().getElementsByTagName("screen-saver").item(0).setTextContent(value+""); + } + + public int getDefaultScreenSaverTimeout() + { + return 60; + } + + public int getScreenSaverTimeout() + { + return XMLConfigHelper.getIntProperty(getOthersElement(), "screen-saver-timeout-seconds", getDefaultScreenSaverTimeout(), false, true, document, configFile); + } + + public void setScreenSaverTimeout(String value) + { + getOthersElement().getElementsByTagName("screen-saver-timeout-seconds").item(0).setTextContent(value); + } } --- 'a/src/main/java/com/stream_pi/client/window/Base.java' +++ b/src/main/java/com/stream_pi/client/window/Base.java @@ -1,6 +1,7 @@ package com.stream_pi.client.window; import com.stream_pi.client.controller.ClientListener; +import com.stream_pi.client.controller.ScreenSaver; import com.stream_pi.client.io.Config; import com.stream_pi.client.info.ClientInfo; @@ -159,6 +160,8 @@ public abstract class Base extends Stack firstTimeUse = new FirstTimeUse(this, this); getChildren().clear(); + + getChildren().addAll(alertStackPane); if(getClientInfo().isPhone()) @@ -178,7 +181,6 @@ public abstract class Base extends Stack config = Config.getInstance(); - if(config.isFirstTimeUse()) { clearStylesheets(); --- 'a/src/main/java/com/stream_pi/client/window/settings/GeneralTab.java' +++ b/src/main/java/com/stream_pi/client/window/settings/GeneralTab.java @@ -31,6 +31,7 @@ import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; +import org.w3c.dom.Text; import java.io.File; @@ -43,6 +44,8 @@ public class GeneralTab extends VBox private TextField serverPortTextField; private TextField serverHostNameOrIPTextField; + private TextField screenTimeoutTextField; + private StreamPiComboBox clientProfileComboBox; private StreamPiComboBox themeComboBox; @@ -54,6 +57,8 @@ public class GeneralTab extends VBox private ToggleButton startOnBootToggleButton; + private ToggleButton screenSaverToggleButton; + private ToggleButton tryConnectingToServerIfActionClickedToggleButton; private ToggleButton connectOnStartupToggleButton; @@ -70,6 +75,8 @@ public class GeneralTab extends VBox private final Button checkForUpdatesButton; + private HBoxInputBox screenTimeoutSecondsHBoxInputBox; + public GeneralTab(ExceptionAndAlertHandler exceptionAndAlertHandler, ClientListener clientListener, HostServices hostServices) { @@ -78,6 +85,9 @@ public class GeneralTab extends VBox this.hostServices = hostServices; serverPortTextField = new TextField(); + screenTimeoutTextField = new TextField(); + + serverHostNameOrIPTextField = new TextField(); nickNameTextField = new TextField(); @@ -118,6 +128,9 @@ public class GeneralTab extends VBox startOnBootToggleButton = new ToggleButton("Start On Boot"); startOnBootToggleButton.managedProperty().bind(startOnBootToggleButton.visibleProperty()); + screenSaverToggleButton = new ToggleButton("Screen Saver"); + screenSaverToggleButton.managedProperty().bind(screenSaverToggleButton.visibleProperty()); + tryConnectingToServerIfActionClickedToggleButton = new ToggleButton("Try Connecting to Server If not connected on Action click"); tryConnectingToServerIfActionClickedToggleButton.setWrapText(true); tryConnectingToServerIfActionClickedToggleButton.managedProperty().bind(tryConnectingToServerIfActionClickedToggleButton.visibleProperty()); @@ -150,6 +163,10 @@ public class GeneralTab extends VBox checkForUpdatesButton = new Button("Check for updates"); checkForUpdatesButton.setOnAction(event->checkForUpdates()); + + screenTimeoutSecondsHBoxInputBox = new HBoxInputBox("Screen Timeout (seconds)", screenTimeoutTextField, prefWidth); + screenTimeoutSecondsHBoxInputBox.managedProperty().bind(screenTimeoutSecondsHBoxInputBox.visibleProperty()); + VBox vBox = new VBox( new HBoxInputBox("Device Name", nickNameTextField, prefWidth), new HBoxInputBox("Host Name/IP", serverHostNameOrIPTextField, prefWidth), @@ -166,7 +183,8 @@ public class GeneralTab extends VBox ), themesPathInputBox, iconsPathInputBox, - profilesPathInputBox + profilesPathInputBox, + screenTimeoutSecondsHBoxInputBox ); @@ -214,6 +232,7 @@ public class GeneralTab extends VBox connectOnStartupToggleButton, vibrateOnActionPressToggleButton, checkForUpdatesButton, + screenSaverToggleButton, startOnBootToggleButton, showCursorToggleButton ); @@ -243,7 +262,6 @@ public class GeneralTab extends VBox Platform platform = ClientInfo.getInstance().getPlatform(); - System.out.println("PLATFORRRM : "+platform.getUIName()+"232323232323"); if(platform == Platform.ANDROID || platform == Platform.IOS) { @@ -264,14 +282,14 @@ public class GeneralTab extends VBox } vibrateOnActionPressToggleButton.setVisible(false); - buttonBar.getChildren().add(exitButton); - } - if(!ClientInfo.getInstance().isShowFullScreenToggleButton()) - { - fullScreenModeToggleButton.setVisible(false); + fullScreenModeToggleButton.setVisible(ClientInfo.getInstance().isShowFullScreenToggleButton()); + screenTimeoutSecondsHBoxInputBox.setVisible(ClientInfo.getInstance().isShowFullScreenToggleButton()); + + buttonBar.getChildren().add(exitButton); } + screenSaverToggleButton.setVisible(ClientInfo.getInstance().isEnableScreenSaverFeature()); } private void checkForUpdates() @@ -360,6 +378,11 @@ public class GeneralTab extends VBox serverHostNameOrIPTextField.setText(config.getSavedServerHostNameOrIP()); serverPortTextField.setText(config.getSavedServerPort()+""); + screenTimeoutTextField.setText(config.getScreenSaverTimeout()+""); + screenSaverToggleButton.setSelected(config.isScreenSaverEnabled()); + + screenTimeoutSecondsHBoxInputBox.setVisible(config.isScreenSaverEnabled()); + clientProfileComboBox.setOptions(clientListener.getClientProfiles().getClientProfiles()); int ind = 0; @@ -422,6 +445,20 @@ public class GeneralTab extends VBox } + int screenSaverTimeout = -1; + try + { + screenSaverTimeout = Integer.parseInt(serverPortTextField.getText()); + + if(screenSaverTimeout < 15) + errors.append("* Screen Timeout cannot be below 15 seconds.\n"); + } + catch (NumberFormatException exception) + { + errors.append("* Screen Timeout should be a number.\n"); + } + + if(serverHostNameOrIPTextField.getText().isBlank()) { errors.append("* Server IP cannot be empty.\n"); @@ -539,6 +576,16 @@ public class GeneralTab extends VBox config.setProfilesPath(profilesPathTextField.getText()); + if(config.isScreenSaverEnabled() != screenSaverToggleButton.isSelected()) + toBeReloaded = true; + + config.setScreenSaverEnabled(screenSaverToggleButton.isSelected()); + + if(!(screenSaverTimeout+"").equals(screenTimeoutTextField.getText())) + toBeReloaded = true; + + config.setScreenSaverTimeout(screenTimeoutTextField.getText()); + config.setConnectOnStartup(connectOnStartupToggleButton.isSelected()); boolean isVibrateOnActionClicked = vibrateOnActionPressToggleButton.isSelected(); Binary files 'a/src/main/resources/com/stream_pi/client/Default.zip' and b/src/main/resources/com/stream_pi/client/Default.zip differ --- 'a/src/main/resources/com/stream_pi/client/style.css' +++ b/src/main/resources/com/stream_pi/client/style.css @@ -205,4 +205,9 @@ { -fx-padding : 10 0 0 0; -fx-font-size : 25; +} + +.screensaver +{ + -fx-background-color: black; } \ No newline at end of file