From ab2e9aa114567bbf5bddd69a5cbe25e9c8ad1931 Mon Sep 17 00:00:00 2001 From: delvh Date: Tue, 13 Oct 2020 11:30:19 +0200 Subject: [PATCH] Add Image Caching (#95) Add image caching Co-authored-by: kske Reviewed-on: https://git.kske.dev/zdm/envoy/pulls/95 Reviewed-by: kske Reviewed-by: DieGurke --- .../envoy/client/ui/controller/ChatScene.java | 10 +++---- .../main/java/envoy/client/util/IconUtil.java | 26 ++++++++++++------- client/src/main/resources/fxml/ChatScene.fxml | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/client/src/main/java/envoy/client/ui/controller/ChatScene.java b/client/src/main/java/envoy/client/ui/controller/ChatScene.java index da4323e..c2b0ef1 100644 --- a/client/src/main/java/envoy/client/ui/controller/ChatScene.java +++ b/client/src/main/java/envoy/client/ui/controller/ChatScene.java @@ -132,7 +132,6 @@ public final class ChatScene implements EventListener, Restorable { private Chat currentChat; private FilteredList chats; - private boolean recording; private Attachment pendingAttachment; private boolean postingPermanentlyDisabled; private boolean isCustomAttachmentImage; @@ -354,7 +353,8 @@ public final class ChatScene implements EventListener, Restorable { // Discard the pending attachment if (recorder.isRecording()) { recorder.cancel(); - recording = false; + voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE))); + voiceButton.setText(null); } pendingAttachment = null; updateAttachmentView(false); @@ -414,18 +414,16 @@ public final class ChatScene implements EventListener, Restorable { private void voiceButtonClicked() { new Thread(() -> { try { - if (!recording) { - recording = true; + if (!recorder.isRecording()) { Platform.runLater(() -> { voiceButton.setText("Recording"); voiceButton.setGraphic(new ImageView(IconUtil.loadIcon("microphone_recording", DEFAULT_ICON_SIZE))); }); recorder.start(); } else { - pendingAttachment = new Attachment(recorder.finish(), "Voice_recording_" + pendingAttachment = new Attachment(recorder.finish(), "Voice_recording_" + DateTimeFormatter.ofPattern("yyyy_MM_dd-HH_mm_ss").format(LocalDateTime.now()) + "." + AudioRecorder.FILE_FORMAT, AttachmentType.VOICE); - recording = false; Platform.runLater(() -> { voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE))); voiceButton.setText(null); diff --git a/client/src/main/java/envoy/client/util/IconUtil.java b/client/src/main/java/envoy/client/util/IconUtil.java index 42a8554..3445b42 100644 --- a/client/src/main/java/envoy/client/util/IconUtil.java +++ b/client/src/main/java/envoy/client/util/IconUtil.java @@ -21,6 +21,10 @@ import envoy.util.EnvoyLog; */ public final class IconUtil { + private static final HashMap cache = new HashMap<>(); + private static final HashMap scaledCache = new HashMap<>(); + private static final HashMap awtCache = new HashMap<>(); + private IconUtil() {} /** @@ -30,7 +34,7 @@ public final class IconUtil { * @return the loaded image * @since Envoy Client v0.1-beta */ - public static Image load(String path) { return new Image(IconUtil.class.getResource(path).toExternalForm()); } + public static Image load(String path) { return cache.computeIfAbsent(path, p -> new Image(IconUtil.class.getResource(p).toExternalForm())); } /** * Loads an image from the resource folder and scales it to the given size. @@ -41,12 +45,13 @@ public final class IconUtil { * @since Envoy Client v0.1-beta */ public static Image load(String path, int size) { - return new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true); + return scaledCache.computeIfAbsent(path + size, p -> new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true)); } /** * Loads a {@code .png} image from the sub-folder {@code /icons/} of the - * resource folder.
+ * resource folder. + *

* The suffix {@code .png} is automatically appended. * * @param name the image name without the .png suffix @@ -138,13 +143,14 @@ public final class IconUtil { * @since Envoy Client v0.2-beta */ public static BufferedImage loadAWTCompatible(String path) { - BufferedImage image = null; - try { - image = ImageIO.read(IconUtil.class.getResource(path)); - } catch (final IOException e) { - EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e); - } - return image; + return awtCache.computeIfAbsent(path, p -> { + try { + return ImageIO.read(IconUtil.class.getResource(path)); + } catch (IOException e) { + EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e); + return null; + } + }); } /** diff --git a/client/src/main/resources/fxml/ChatScene.fxml b/client/src/main/resources/fxml/ChatScene.fxml index ec6db63..d3fb6e9 100644 --- a/client/src/main/resources/fxml/ChatScene.fxml +++ b/client/src/main/resources/fxml/ChatScene.fxml @@ -175,7 +175,7 @@ - +