From 66d8a38c80f39ddaf2954d3400a731ec5c7e4c0b Mon Sep 17 00:00:00 2001
From: Loren Burkholder <computersemiexpert@outlook.com>
Date: Mon, 13 Feb 2023 20:44:42 -0500
Subject: [PATCH] Blurhash images when the privacy screen is active

---
 resources/qml/ChatPage.qml               |  3 +++
 resources/qml/PrivacyScreen.qml          |  3 +--
 resources/qml/RoomList.qml               |  8 ++++++--
 resources/qml/TimelineView.qml           |  1 +
 resources/qml/delegates/ImageMessage.qml | 26 ++++++++++++------------
 5 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/resources/qml/ChatPage.qml b/resources/qml/ChatPage.qml
index 3d76616a3..2c0f988fe 100644
--- a/resources/qml/ChatPage.qml
+++ b/resources/qml/ChatPage.qml
@@ -128,6 +128,7 @@ Rectangle {
                 TimelineView {
                     id: timeline
 
+                    privacyScreen: privacyScreen
                     showBackButton: adaptiveView.singlePageMode
                     room: Rooms.currentRoom
                     roomPreview: Rooms.currentRoomPreview.roomid ? Rooms.currentRoomPreview : null
@@ -140,6 +141,8 @@ Rectangle {
     }
 
     PrivacyScreen {
+        id: privacyScreen
+
         anchors.fill: parent
         visible: Settings.privacyScreen
         screenTimeout: Settings.privacyScreenTimeout
diff --git a/resources/qml/PrivacyScreen.qml b/resources/qml/PrivacyScreen.qml
index bc1283026..11ab27bd2 100644
--- a/resources/qml/PrivacyScreen.qml
+++ b/resources/qml/PrivacyScreen.qml
@@ -12,6 +12,7 @@ import im.nheko 1.0
 Item {
     id: privacyScreen
 
+    readonly property bool active: screenSaver.state === "Visible"
     property var timelineRoot
     property int screenTimeout
 
@@ -61,7 +62,6 @@ Item {
                     target: screenSaver
                     opacity: 1
                 }
-
             },
             State {
                 name: "Invisible"
@@ -75,7 +75,6 @@ Item {
                     target: screenSaver
                     visible: false
                 }
-
             }
         ]
         transitions: [
diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index f06fb15e4..7dc89cc96 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -110,17 +110,21 @@ Page {
                 }
 
                 TimelineView {
-                    id: timelineView
+                    id: timeline
+
+                    privacyScreen: privacyScreen
                     anchors.fill: parent
                     room: roomWindowW.room
                     roomPreview: roomWindowW.roomPreview.roomid ? roomWindowW.roomPreview : null
                 }
 
                 PrivacyScreen {
+                    id: privacyScreen
+
                     anchors.fill: parent
                     visible: Settings.privacyScreen
                     screenTimeout: Settings.privacyScreenTimeout
-                    timelineRoot: timelineView
+                    timelineRoot: timeline
                     windowTarget: roomWindowW
                 }
 
diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 0d47746c2..9124c1583 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -26,6 +26,7 @@ Item {
     property var roomPreview: null
     property bool showBackButton: false
     property bool shouldEffectsRun: false
+    required property PrivacyScreen privacyScreen
     clip: true
 
     onRoomChanged: if (room != null) room.triggerSpecialEffects()
diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml
index af69b9837..bb22d0ee6 100644
--- a/resources/qml/delegates/ImageMessage.qml
+++ b/resources/qml/delegates/ImageMessage.qml
@@ -31,18 +31,6 @@ AbstractButton {
     property int metadataWidth
     property bool fitsMetadata: (parent.width - width) > metadataWidth+4
 
-    Image {
-        id: blurhash_
-
-        anchors.fill: parent
-        visible: img.status != Image.Ready
-        source: blurhash ? ("image://blurhash/" + blurhash) : ("image://colorimage/:/icons/icons/ui/image-failed.svg?" + Nheko.colors.buttonText)
-        asynchronous: true
-        fillMode: Image.PreserveAspectFit
-        sourceSize.width: parent.width * Screen.devicePixelRatio
-        sourceSize.height: parent.height * Screen.devicePixelRatio
-    }
-
     Image {
         id: img
 
@@ -68,7 +56,19 @@ AbstractButton {
         eventId: parent.eventId
     }
 
-    onClicked :Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId, originalWidth, proportionalHeight);
+    Image {
+        id: blurhash_
+
+        anchors.fill: parent
+        visible: img.status != Image.Ready || timeline.privacyScreen.active
+        source: blurhash ? ("image://blurhash/" + blurhash) : ("image://colorimage/:/icons/icons/ui/image-failed.svg?" + Nheko.colors.buttonText)
+        asynchronous: true
+        fillMode: Image.PreserveAspectFit
+        sourceSize.width: parent.width * Screen.devicePixelRatio
+        sourceSize.height: parent.height * Screen.devicePixelRatio
+    }
+
+    onClicked: Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId, originalWidth, proportionalHeight);
 
     Item {
         id: overlay
-- 
GitLab