fix(windows): use QML's OS notification for Windows
Fixes #4943 The custom OS notifications we have in place make it possible to click the notification and go to the right place in the app, but it causes a big issue in Windows; it breaks the tray icon, it becomes no longer clickable. The easy fix I did here is the go back to using the QML sendMessage function. It works fine to send the notif and the tray icon keeps working. The only downside is we lose context when clicking on the notification, so it doesn't navigate to the chat. IMO, this is a good tradeoff.
This commit is contained in:
parent
a94750fb2d
commit
2f338ecb09
|
@ -16,6 +16,7 @@ const NOTIFICATION_SOUND = "qrc:/imports/assets/audio/notification.wav"
|
||||||
# Signals which may be emitted by this class:
|
# Signals which may be emitted by this class:
|
||||||
const SIGNAL_ADD_NOTIFICATION_TO_ACTIVITY_CENTER* = "addNotificationToActivityCenter"
|
const SIGNAL_ADD_NOTIFICATION_TO_ACTIVITY_CENTER* = "addNotificationToActivityCenter"
|
||||||
const SIGNAL_DISPLAY_APP_NOTIFICATION* = "displayAppNotification"
|
const SIGNAL_DISPLAY_APP_NOTIFICATION* = "displayAppNotification"
|
||||||
|
const SIGNAL_DISPLAY_WINDOWS_OS_NOTIFICATION* = "displayWindowsOsNotification"
|
||||||
const SIGNAL_OS_NOTIFICATION_CLICKED* = "osNotificationClicked"
|
const SIGNAL_OS_NOTIFICATION_CLICKED* = "osNotificationClicked"
|
||||||
|
|
||||||
# Notification preferences
|
# Notification preferences
|
||||||
|
@ -32,6 +33,7 @@ type
|
||||||
NotificationArgs* = ref object of Args
|
NotificationArgs* = ref object of Args
|
||||||
title*: string
|
title*: string
|
||||||
message*: string
|
message*: string
|
||||||
|
identifier*: string
|
||||||
details*: NotificationDetails
|
details*: NotificationDetails
|
||||||
|
|
||||||
ClickedNotificationArgs* = ref object of Args
|
ClickedNotificationArgs* = ref object of Args
|
||||||
|
@ -85,6 +87,10 @@ QtObject:
|
||||||
self.notificationSetUp = true
|
self.notificationSetUp = true
|
||||||
|
|
||||||
proc showOSNotification(self: NotificationsManager, title: string, message: string, identifier: string) =
|
proc showOSNotification(self: NotificationsManager, title: string, message: string, identifier: string) =
|
||||||
|
if defined(windows):
|
||||||
|
let data = NotificationArgs(title: title, message: message)
|
||||||
|
self.events.emit(SIGNAL_DISPLAY_WINDOWS_OS_NOTIFICATION, data)
|
||||||
|
else:
|
||||||
## This method will add new notification to the OS Notification center. Param
|
## This method will add new notification to the OS Notification center. Param
|
||||||
## "identifier" is used to uniquely define notification bubble.
|
## "identifier" is used to uniquely define notification bubble.
|
||||||
self.osNotification.showNotification(title, message, identifier)
|
self.osNotification.showNotification(title, message, identifier)
|
||||||
|
|
|
@ -238,6 +238,11 @@ proc init*(self: Controller) =
|
||||||
var args = ClickedNotificationArgs(e)
|
var args = ClickedNotificationArgs(e)
|
||||||
self.delegate.osNotificationClicked(args.details)
|
self.delegate.osNotificationClicked(args.details)
|
||||||
|
|
||||||
|
if defined(windows):
|
||||||
|
self.events.on(SIGNAL_DISPLAY_WINDOWS_OS_NOTIFICATION) do(e: Args):
|
||||||
|
var args = NotificationArgs(e)
|
||||||
|
self.delegate.displayWindowsOsNotification(args.title, args.message)
|
||||||
|
|
||||||
self.events.on(SIGNAL_DISPLAY_APP_NOTIFICATION) do(e: Args):
|
self.events.on(SIGNAL_DISPLAY_APP_NOTIFICATION) do(e: Args):
|
||||||
var args = NotificationArgs(e)
|
var args = NotificationArgs(e)
|
||||||
self.delegate.displayEphemeralNotification(args.title, args.message, args.details)
|
self.delegate.displayEphemeralNotification(args.title, args.message, args.details)
|
||||||
|
|
|
@ -135,6 +135,9 @@ method mnemonicBackedUp*(self: AccessInterface) {.base.} =
|
||||||
method osNotificationClicked*(self: AccessInterface, details: NotificationDetails) {.base.} =
|
method osNotificationClicked*(self: AccessInterface, details: NotificationDetails) {.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
|
method displayWindowsOsNotification*(self: AccessInterface, title: string, message: string) {.base.} =
|
||||||
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
||||||
method displayEphemeralNotification*(self: AccessInterface, title: string, subTitle: string, details: NotificationDetails)
|
method displayEphemeralNotification*(self: AccessInterface, title: string, subTitle: string, details: NotificationDetails)
|
||||||
{.base.} =
|
{.base.} =
|
||||||
raise newException(ValueError, "No implementation available")
|
raise newException(ValueError, "No implementation available")
|
||||||
|
|
|
@ -851,6 +851,10 @@ method mnemonicBackedUp*[T](self: Module[T]) =
|
||||||
self.calculateProfileSectionHasNotification(),
|
self.calculateProfileSectionHasNotification(),
|
||||||
notificationsCount = 0)
|
notificationsCount = 0)
|
||||||
|
|
||||||
|
method displayWindowsOsNotification*[T](self: Module[T], title: string,
|
||||||
|
message: string) =
|
||||||
|
self.view.displayWindowsOsNotification(title, message)
|
||||||
|
|
||||||
method osNotificationClicked*[T](self: Module[T], details: NotificationDetails) =
|
method osNotificationClicked*[T](self: Module[T], details: NotificationDetails) =
|
||||||
if(details.notificationType == NotificationType.NewContactRequest):
|
if(details.notificationType == NotificationType.NewContactRequest):
|
||||||
self.controller.switchTo(details.sectionId, "", "")
|
self.controller.switchTo(details.sectionId, "", "")
|
||||||
|
|
|
@ -128,6 +128,8 @@ QtObject:
|
||||||
|
|
||||||
proc mailserverNotWorking*(self:View) {.signal.}
|
proc mailserverNotWorking*(self:View) {.signal.}
|
||||||
|
|
||||||
|
proc displayWindowsOsNotification*(self:View, title: string, message: string) {.signal.}
|
||||||
|
|
||||||
proc emitMailservernotWorking*(self: View) =
|
proc emitMailservernotWorking*(self: View) =
|
||||||
self.mailserverNotWorking()
|
self.mailserverNotWorking()
|
||||||
|
|
||||||
|
|
19
ui/main.qml
19
ui/main.qml
|
@ -122,6 +122,15 @@ StatusWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
id: windowsOsNotificationsConnection
|
||||||
|
enabled: false
|
||||||
|
target: Global.mainModuleInst
|
||||||
|
function onDisplayWindowsOsNotification(title, message) {
|
||||||
|
systemTray.showMessage(title, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: startupModule
|
target: startupModule
|
||||||
|
|
||||||
|
@ -143,6 +152,10 @@ StatusWindow {
|
||||||
else if(state === Constants.appState.main) {
|
else if(state === Constants.appState.main) {
|
||||||
// We set main module to the Global singleton once user is logged in and we move to the main app.
|
// We set main module to the Global singleton once user is logged in and we move to the main app.
|
||||||
Global.mainModuleInst = mainModule
|
Global.mainModuleInst = mainModule
|
||||||
|
if (Qt.platform.os === Constants.windows) {
|
||||||
|
windowsOsNotificationsConnection.enabled = true
|
||||||
|
}
|
||||||
|
|
||||||
loader.sourceComponent = app
|
loader.sourceComponent = app
|
||||||
|
|
||||||
if(localAccountSensitiveSettings.recentEmojis === "") {
|
if(localAccountSensitiveSettings.recentEmojis === "") {
|
||||||
|
@ -246,6 +259,12 @@ StatusWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onMessageClicked: {
|
||||||
|
if (Qt.platform.os === Constants.windows) {
|
||||||
|
applicationWindow.makeStatusAppActive()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
menu: Menu {
|
menu: Menu {
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: qsTr("Open Status")
|
text: qsTr("Open Status")
|
||||||
|
|
Loading…
Reference in New Issue