Skip to content

Commit 2100d61

Browse files
authored
Merge pull request #41 from CodeDead/release/v1.0.3
Release/v1.0.3
2 parents 68f6dcb + 8617fbc commit 2100d61

36 files changed

+332
-86
lines changed

build.gradle

+7-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group 'com.codedead'
12-
version '1.0.2'
12+
version '1.0.3'
1313

1414
def currentOS = DefaultNativePlatform.currentOperatingSystem
1515

@@ -112,13 +112,13 @@ if (currentOS.isWindows()) {
112112
}
113113

114114
dependencies {
115-
implementation "org.openjfx:javafx-base:18:${platform}"
116-
implementation "org.openjfx:javafx-controls:18:${platform}"
117-
implementation "org.openjfx:javafx-graphics:18:${platform}"
118-
implementation "org.openjfx:javafx-fxml:18:${platform}"
119-
implementation "org.openjfx:javafx-media:18:${platform}"
115+
implementation "org.openjfx:javafx-base:18.0.1:${platform}"
116+
implementation "org.openjfx:javafx-controls:18.0.1:${platform}"
117+
implementation "org.openjfx:javafx-graphics:18.0.1:${platform}"
118+
implementation "org.openjfx:javafx-fxml:18.0.1:${platform}"
119+
implementation "org.openjfx:javafx-media:18.0.1:${platform}"
120120
implementation 'org.apache.logging.log4j:log4j-core:2.17.2'
121-
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.2.2'
121+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
122122
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
123123
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
124124
}

src/main/java/com/codedead/opal/OpalApplication.java

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.codedead.opal.controller.UpdateController;
44
import com.codedead.opal.utils.FxUtils;
55
import com.codedead.opal.utils.SharedVariables;
6+
import javafx.application.Platform;
67
import org.apache.logging.log4j.Level;
78
import org.apache.logging.log4j.LogManager;
89
import org.apache.logging.log4j.Logger;
@@ -69,6 +70,7 @@ public void start(final Stage primaryStage) {
6970
} catch (final IOException ex) {
7071
FxUtils.showErrorAlert("Exception occurred", ex.getMessage(), getClass().getResourceAsStream(SharedVariables.ICON_URL));
7172
logger.error("Unable to initialize the SettingsController", ex);
73+
Platform.exit();
7274
return;
7375
}
7476

@@ -89,6 +91,7 @@ public void start(final Stage primaryStage) {
8991
root = loader.load();
9092
} catch (final IOException ex) {
9193
logger.error("Unable to load FXML for MainWindow", ex);
94+
Platform.exit();
9295
return;
9396
}
9497

src/main/java/com/codedead/opal/controller/AboutWindowController.java

+4-24
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@
33
import com.codedead.opal.interfaces.IRunnableHelper;
44
import com.codedead.opal.utils.*;
55
import javafx.application.Platform;
6+
import javafx.event.ActionEvent;
67
import javafx.fxml.FXML;
7-
import javafx.scene.control.Label;
8-
import javafx.scene.image.Image;
9-
import javafx.scene.image.ImageView;
8+
import javafx.scene.control.Button;
109
import javafx.stage.Stage;
1110
import org.apache.logging.log4j.LogManager;
1211
import org.apache.logging.log4j.Logger;
1312

1413
import java.io.IOException;
15-
import java.io.InputStream;
1614
import java.util.Locale;
1715
import java.util.Properties;
1816
import java.util.ResourceBundle;
@@ -21,14 +19,8 @@
2119

2220
public final class AboutWindowController {
2321

24-
@FXML
25-
private Label aboutLabel;
26-
@FXML
27-
private ImageView aboutImageView;
28-
2922
private SettingsController settingsController;
3023
private ResourceBundle translationBundle;
31-
3224
private final HelpUtils helpUtils;
3325
private final Logger logger;
3426

@@ -77,27 +69,15 @@ public void setSettingsController(final SettingsController settingsController) {
7769
@FXML
7870
private void initialize() {
7971
logger.info("Initializing AboutWindow");
80-
81-
aboutImageView.setFitHeight(96);
82-
aboutImageView.setFitWidth(96);
83-
84-
final InputStream inputStream = getClass().getResourceAsStream("/images/opal.png");
85-
if (inputStream != null) {
86-
aboutImageView.setImage(new Image(inputStream));
87-
} else {
88-
aboutImageView.setImage(null);
89-
}
9072
}
9173

9274
/**
9375
* Method that is called when the close button is selected
9476
*/
9577
@FXML
96-
private void closeAction() {
78+
private void closeAction(final ActionEvent event) {
9779
logger.info("Closing AboutWindow");
98-
99-
final Stage stage = (Stage) aboutLabel.getScene().getWindow();
100-
stage.close();
80+
((Stage) (((Button) event.getSource()).getScene().getWindow())).close();
10181
}
10282

10383
/**

src/main/java/com/codedead/opal/controller/AudioController.java

+11-7
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public AudioController(final IAudioTimer audioTimer) throws URISyntaxException {
4040
logger = LogManager.getLogger(AudioController.class);
4141

4242
logger.info("Initializing new AudioController object");
43-
logger.info("Initializing MediaPlayer objects");
4443

4544
mediaPlayers = new HashMap<>();
4645
mediaPlayers.put("rain", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/rain.mp3")).toURI().toString())));
@@ -62,6 +61,12 @@ public AudioController(final IAudioTimer audioTimer) throws URISyntaxException {
6261
mediaPlayers.put("zen", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/zen.mp3")).toURI().toString())));
6362
mediaPlayers.put("coffee", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/coffee.mp3")).toURI().toString())));
6463
mediaPlayers.put("zoo", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/zoo.mp3")).toURI().toString())));
64+
mediaPlayers.put("networking", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/networking.mp3")).toURI().toString())));
65+
mediaPlayers.put("tribal", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/tribal.mp3")).toURI().toString())));
66+
mediaPlayers.put("drumtribal", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/tribal2.mp3")).toURI().toString())));
67+
mediaPlayers.put("football", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/football.mp3")).toURI().toString())));
68+
mediaPlayers.put("sleepy", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/sleepy.mp3")).toURI().toString())));
69+
mediaPlayers.put("gong", new MediaPlayer(new Media(Objects.requireNonNull(getClass().getResource("/audio/gong.mp3")).toURI().toString())));
6570

6671
mediaVolumes = new HashMap<>();
6772
for (final Map.Entry<String, MediaPlayer> entry : mediaPlayers.entrySet()) {
@@ -93,7 +98,7 @@ public void playMedia(final String key) {
9398
throw new NullPointerException(String.format("MediaPlayer with key %s cannot be found!", key));
9499

95100
if (!player.getStatus().equals(MediaPlayer.Status.PLAYING)) {
96-
logger.info("Playing media for MediaPlayer with key {}", key);
101+
logger.info("Playing Media for MediaPlayer with key {}", key);
97102
player.play();
98103
}
99104
}
@@ -109,7 +114,7 @@ public void stopMedia(final String key) {
109114
if (key.isEmpty())
110115
throw new IllegalArgumentException("Key cannot be empty!");
111116

112-
logger.info("Stopping media for MediaPlayer with key {}", key);
117+
logger.info("Stopping Media for MediaPlayer with key {}", key);
113118

114119
final MediaPlayer player = mediaPlayers.get(key);
115120

@@ -138,7 +143,6 @@ public void setPlayerVolume(final String key, final double newVolume) {
138143
logger.debug("Setting volume for MediaPlayer with key {} to {}", key, newVolume);
139144

140145
final MediaPlayer player = mediaPlayers.get(key);
141-
142146
if (player == null)
143147
throw new NullPointerException(String.format("MediaPlayer with key %s cannot be found!", key));
144148

@@ -220,7 +224,7 @@ public void loadSoundPreset(final String path) throws IOException {
220224

221225
mediaVolumes = objectMapper.readValue(actual, typeRef);
222226

223-
for (Map.Entry<String, Double> entry : mediaVolumes.entrySet()) {
227+
for (final Map.Entry<String, Double> entry : mediaVolumes.entrySet()) {
224228
setPlayerVolume(entry.getKey(), entry.getValue());
225229
}
226230
}
@@ -274,8 +278,8 @@ public void cancelTimer() {
274278
*
275279
* @param delay The delay in milliseconds before the {@link Timer} object executes its function
276280
*/
277-
public void scheduleTimer(long delay) {
278-
if (delay <= 1)
281+
public void scheduleTimer(final long delay) {
282+
if (delay < 1)
279283
throw new IllegalArgumentException("Delay cannot be smaller than 1");
280284

281285
logger.info("Scheduling the Timer to stop all MediaPlayer objects after {} millisecond(s)", delay);

src/main/java/com/codedead/opal/controller/MainWindowController.java

+41-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codedead.opal.controller;
22

3+
import com.codedead.opal.domain.InvalidHttpResponseCodeException;
34
import com.codedead.opal.domain.OsCheck;
45
import com.codedead.opal.domain.PlatformUpdate;
56
import com.codedead.opal.domain.SoundPane;
@@ -12,8 +13,6 @@
1213
import javafx.scene.Parent;
1314
import javafx.scene.Scene;
1415
import javafx.scene.control.*;
15-
import javafx.scene.control.Menu;
16-
import javafx.scene.control.MenuItem;
1716
import javafx.scene.image.Image;
1817
import javafx.scene.image.ImageView;
1918
import javafx.scene.input.DragEvent;
@@ -34,6 +33,18 @@
3433

3534
public final class MainWindowController implements IAudioTimer {
3635

36+
@FXML
37+
private SoundPane snpGong;
38+
@FXML
39+
private SoundPane snpDrumTribal;
40+
@FXML
41+
private SoundPane snpSleepy;
42+
@FXML
43+
private SoundPane snpFootball;
44+
@FXML
45+
private SoundPane snpTribal;
46+
@FXML
47+
private SoundPane snpNetworkingEvent;
3748
@FXML
3849
private SoundPane snpZoo;
3950
@FXML
@@ -207,11 +218,14 @@ private void checkForUpdates(final boolean showNoUpdates) {
207218
} else {
208219
logger.info("No updates available");
209220
if (showNoUpdates) {
210-
final Alert alert = new Alert(Alert.AlertType.INFORMATION, translationBundle.getString("NoUpdateAvailable"), ButtonType.OK);
211-
alert.showAndWait();
221+
FxUtils.showInformationAlert(translationBundle.getString("NoUpdateAvailable"), null);
212222
}
213223
}
214-
} catch (final Exception ex) {
224+
} catch (final InterruptedException ex) {
225+
logger.error("Unable to check for updates", ex);
226+
FxUtils.showErrorAlert(translationBundle.getString("UpdateError"), ex.getMessage(), getClass().getResourceAsStream(SharedVariables.ICON_URL));
227+
Thread.currentThread().interrupt();
228+
} catch (final IOException | InvalidHttpResponseCodeException ex) {
215229
logger.error("Unable to check for updates", ex);
216230
FxUtils.showErrorAlert(translationBundle.getString("UpdateError"), ex.getMessage(), getClass().getResourceAsStream(SharedVariables.ICON_URL));
217231
}
@@ -300,6 +314,14 @@ private void initialize() {
300314
snpZen.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("zen", newValue.doubleValue() / 100));
301315
snpCoffee.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("coffee", newValue.doubleValue() / 100));
302316
snpZoo.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("zoo", newValue.doubleValue() / 100));
317+
snpSleepy.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("sleepy", newValue.doubleValue() / 100));
318+
snpGong.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("gong", newValue.doubleValue() / 100));
319+
320+
// Audiences
321+
snpNetworkingEvent.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("networking", newValue.doubleValue() / 100));
322+
snpTribal.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("tribal", newValue.doubleValue() / 100));
323+
snpDrumTribal.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("drumtribal", newValue.doubleValue() / 100));
324+
snpFootball.getSlider().valueProperty().addListener((observableValue, oldValue, newValue) -> audioController.setPlayerVolume("football", newValue.doubleValue() / 100));
303325

304326
mniTimerEnabled.setOnAction(e ->
305327
{
@@ -319,7 +341,7 @@ private void initialize() {
319341
*/
320342
@FXML
321343
private void openSoundPresetAction() {
322-
logger.info("Attempting to open a sound preset");
344+
logger.info("Opening a sound preset");
323345
final FileChooser chooser = new FileChooser();
324346

325347
final FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("JSON (*.json)", "*.json");
@@ -329,8 +351,6 @@ private void openSoundPresetAction() {
329351

330352
if (file != null && file.exists()) {
331353
openSoundPreset(file.getAbsolutePath());
332-
} else {
333-
logger.info("Cancelled opening a sound preset");
334354
}
335355
}
336356

@@ -363,6 +383,12 @@ private void openSoundPreset(final String filePath) {
363383
case "zen" -> snpZen.getSlider().setValue(entry.getValue() * 100);
364384
case "coffee" -> snpCoffee.getSlider().setValue(entry.getValue() * 100);
365385
case "zoo" -> snpZoo.getSlider().setValue(entry.getValue() * 100);
386+
case "networking" -> snpNetworkingEvent.getSlider().setValue(entry.getValue() * 100);
387+
case "tribal" -> snpTribal.getSlider().setValue(entry.getValue() * 100);
388+
case "football" -> snpFootball.getSlider().setValue(entry.getValue() * 100);
389+
case "sleepy" -> snpSleepy.getSlider().setValue(entry.getValue() * 100);
390+
case "drumtribal" -> snpDrumTribal.getSlider().setValue(entry.getValue() * 100);
391+
case "gong" -> snpGong.getSlider().setValue(entry.getValue() * 100);
366392
default -> logger.info("Unknown key found: {}", entry.getKey());
367393
}
368394
}
@@ -427,6 +453,12 @@ private void resetAction() {
427453
snpZen.getSlider().setValue(0);
428454
snpCoffee.getSlider().setValue(0);
429455
snpZoo.getSlider().setValue(0);
456+
snpNetworkingEvent.getSlider().setValue(0);
457+
snpTribal.getSlider().setValue(0);
458+
snpFootball.getSlider().setValue(0);
459+
snpSleepy.getSlider().setValue(0);
460+
snpDrumTribal.getSlider().setValue(0);
461+
snpGong.getSlider().setValue(0);
430462
}
431463

432464
/**
@@ -660,7 +692,7 @@ private void onDragOver(final DragEvent dragEvent) {
660692
* @param dragEvent The {@link DragEvent} object
661693
*/
662694
@FXML
663-
public void onDragDropped(final DragEvent dragEvent) {
695+
private void onDragDropped(final DragEvent dragEvent) {
664696
final Dragboard db = dragEvent.getDragboard();
665697
boolean success = false;
666698

src/main/java/com/codedead/opal/controller/SettingsController.java

+2-7
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ public void createDefaultProperties() throws IOException {
5959
if (is != null) {
6060
logger.info("Creating default properties file at {}", getPropertiesFileLocation());
6161
Files.copy(is, propertiesPath);
62-
logger.info("Default properties file created");
6362
} else {
6463
throw new IOException(String.format("Could not load default properties from application resources (%s)!", getPropertiesResourceLocation()));
6564
}
@@ -132,11 +131,10 @@ public void setProperties(final Properties properties) {
132131
* @throws IOException When the Properties object could not be stored
133132
*/
134133
public void saveProperties() throws IOException {
135-
logger.info("Attempting to store the Properties object");
134+
logger.info("Storing the Properties object");
136135
try (final FileOutputStream fos = new FileOutputStream(getPropertiesFileLocation())) {
137136
properties.store(fos, null);
138137
}
139-
logger.info("Properties object stored");
140138
}
141139

142140
/**
@@ -146,13 +144,10 @@ public void saveProperties() throws IOException {
146144
* @throws IOException When the properties file could not be loaded
147145
*/
148146
public Properties readPropertiesFile() throws IOException {
149-
logger.info("Attempting to load the Properties object");
147+
logger.info("Loading the Properties object");
150148
try (final FileInputStream fis = new FileInputStream(getPropertiesFileLocation())) {
151149
final Properties prop = new Properties();
152-
153150
prop.load(fis);
154-
155-
logger.info("Properties object loaded");
156151
return prop;
157152
}
158153
}

src/main/java/com/codedead/opal/controller/SettingsWindowController.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ private void initialize() {
5959
}
6060

6161
/**
62-
* Set the {@link com.codedead.opal.controller.SettingsController} object
62+
* Set the {@link SettingsController} object
6363
*
64-
* @param settingsController The {@link com.codedead.opal.controller.SettingsController} object
64+
* @param settingsController The {@link SettingsController} object
6565
*/
6666
public void setSettingsController(final SettingsController settingsController) {
6767
if (settingsController == null)
@@ -91,14 +91,19 @@ private void loadSettings() {
9191
long timerDelay = Long.parseLong(properties.getProperty("timerDelay", "3600000"));
9292
final int delayType = Integer.parseInt(properties.getProperty("timerDelayType", "0"));
9393

94+
if (timerDelay < 1) {
95+
timerDelay = 1;
96+
}
97+
9498
chbAutoUpdate.setSelected(autoUpdate);
9599
chbTimerApplicationShutdown.setSelected(Boolean.parseBoolean(properties.getProperty("timerApplicationShutdown", "false")));
96100

97101
switch (locale.toLowerCase()) {
98-
case "es-es" -> cboLanguage.getSelectionModel().select(1);
99-
case "fr-fr" -> cboLanguage.getSelectionModel().select(2);
100-
case "nl-nl" -> cboLanguage.getSelectionModel().select(3);
101-
case "ru-ru" -> cboLanguage.getSelectionModel().select(4);
102+
case "de-de" -> cboLanguage.getSelectionModel().select(1);
103+
case "es-es" -> cboLanguage.getSelectionModel().select(2);
104+
case "fr-fr" -> cboLanguage.getSelectionModel().select(3);
105+
case "nl-nl" -> cboLanguage.getSelectionModel().select(4);
106+
case "ru-ru" -> cboLanguage.getSelectionModel().select(5);
102107
default -> cboLanguage.getSelectionModel().select(0);
103108
}
104109

@@ -166,10 +171,11 @@ private void saveSettingsAction() {
166171
showAlertIfLanguageMismatch(properties.getProperty("locale", DEFAULT_LOCALE));
167172

168173
switch (cboLanguage.getSelectionModel().getSelectedIndex()) {
169-
case 1 -> properties.setProperty("locale", "es-es");
170-
case 2 -> properties.setProperty("locale", "fr-FR");
171-
case 3 -> properties.setProperty("locale", "nl-NL");
172-
case 4 -> properties.setProperty("locale", "ru-RU");
174+
case 1 -> properties.setProperty("locale", "de-DE");
175+
case 2 -> properties.setProperty("locale", "es-es");
176+
case 3 -> properties.setProperty("locale", "fr-FR");
177+
case 4 -> properties.setProperty("locale", "nl-NL");
178+
case 5 -> properties.setProperty("locale", "ru-RU");
173179
default -> properties.setProperty("locale", DEFAULT_LOCALE);
174180
}
175181

0 commit comments

Comments
 (0)