Push Rule Model Rework
This is a significant rework of the handling of push rules. Rather than using a lot of boilerplate code for the default models `KeywordNotificationModel` has been converted to `PushRuleModel` and now handles all push rules. The new model has the following features: - Handles all push rules - Has special handling for the names of default keywords (i.e. it still gives the same text as previously for showing in the settings menus) - Push rules for blocking individuals or room overrides are still there but hidden so will be available for developer tools (to follow) - Room specific keywords are now supported. The notification settings pages have also been refactored to take advantage of the new models. Each section is now just a repeater with a filter for the rules that it should contain. The push rule delegate has now been cleaned up and uses required properties. Implements network/neochat#574
This commit is contained in:
@@ -56,93 +56,6 @@ class NotificationsManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
/**
|
||||
* @brief The global notification state.
|
||||
*
|
||||
* If this rule is set to off all push notifications are disabled regardless
|
||||
* of other settings.
|
||||
*/
|
||||
Q_PROPERTY(bool globalNotificationsEnabled MEMBER m_globalNotificationsEnabled WRITE setGlobalNotificationsEnabled NOTIFY globalNotificationsEnabledChanged)
|
||||
|
||||
/**
|
||||
* @brief Whether the global notification state has been retrieved from the server.
|
||||
*
|
||||
* This is different to the others below as globalNotificationsEnabled is only
|
||||
* a bool rather than a PushNotificationAction::Action so a separate property
|
||||
* is required to track if the state has been retrieved from the server.
|
||||
*
|
||||
* @sa globalNotificationsEnabled, PushNotificationAction::Action
|
||||
*/
|
||||
Q_PROPERTY(bool globalNotificationsSet MEMBER m_globalNotificationsSet NOTIFY globalNotificationsSetChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for direct chats.
|
||||
*
|
||||
* @note Encrypted direct chats have a separate setting.
|
||||
*
|
||||
* @sa encryptedOneToOneNotificationAction
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action oneToOneNotificationAction MEMBER m_oneToOneNotificationAction WRITE setOneToOneNotificationAction NOTIFY
|
||||
oneToOneNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for encrypted direct chats.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action encryptedOneToOneNotificationAction MEMBER m_encryptedOneToOneNotificationAction WRITE
|
||||
setEncryptedOneToOneNotificationAction NOTIFY encryptedOneToOneNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for group chats.
|
||||
*
|
||||
* @note Encrypted group chats have a separate setting.
|
||||
*
|
||||
* @sa encryptedGroupChatNotificationAction
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action groupChatNotificationAction MEMBER m_groupChatNotificationAction WRITE setGroupChatNotificationAction NOTIFY
|
||||
groupChatNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for encrypted group chats.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action encryptedGroupChatNotificationAction MEMBER m_encryptedGroupChatNotificationAction WRITE
|
||||
setEncryptedGroupChatNotificationAction NOTIFY encryptedGroupChatNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for events containing the local user's display name.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action displayNameNotificationAction MEMBER m_displayNameNotificationAction WRITE setDisplayNameNotificationAction NOTIFY
|
||||
displayNameNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for room events.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action roomNotificationAction MEMBER m_roomNotificationAction WRITE setRoomNotificationAction NOTIFY
|
||||
roomNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for keyword push rules.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action keywordNotificationAction MEMBER m_keywordNotificationAction WRITE setKeywordNotificationAction NOTIFY
|
||||
keywordNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for invites to chats.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action inviteNotificationAction MEMBER m_inviteNotificationAction WRITE setInviteNotificationAction NOTIFY
|
||||
inviteNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for voice calls.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action callInviteNotificationAction MEMBER m_callInviteNotificationAction WRITE setCallInviteNotificationAction NOTIFY
|
||||
callInviteNotificationActionChanged)
|
||||
|
||||
/**
|
||||
* @brief The notification action for room upgrade events.
|
||||
*/
|
||||
Q_PROPERTY(PushNotificationAction::Action tombstoneNotificationAction MEMBER m_tombstoneNotificationAction WRITE setTombstoneNotificationAction NOTIFY
|
||||
tombstoneNotificationActionChanged)
|
||||
|
||||
public:
|
||||
static NotificationsManager &instance();
|
||||
|
||||
@@ -164,30 +77,6 @@ public:
|
||||
*/
|
||||
void clearInvitationNotification(const QString &roomId);
|
||||
|
||||
/**
|
||||
* @brief Set the initial keyword notification action.
|
||||
*
|
||||
* This is only required if no keyword rules exist and one is created. The default
|
||||
* action is PushNotificationAction::Action::Highlight.
|
||||
*
|
||||
* @sa PushNotificationAction::Action
|
||||
*/
|
||||
void initializeKeywordNotificationAction();
|
||||
|
||||
/**
|
||||
* @brief Set the keyword notification action to PushNotificationAction::Action::Off.
|
||||
*
|
||||
* This is only required the last keyword rule is deleted.
|
||||
*
|
||||
* @sa PushNotificationAction::Action
|
||||
*/
|
||||
void deactivateKeywordNotificationAction();
|
||||
|
||||
/**
|
||||
* @brief Return the keyword notification action in a form required for the server push rule.
|
||||
*/
|
||||
QVector<QVariant> getKeywordNotificationActions();
|
||||
|
||||
#ifdef QUOTIENT_07
|
||||
/**
|
||||
* @brief Handle the notifications for the given connection.
|
||||
@@ -208,52 +97,6 @@ private:
|
||||
QHash<QString, KNotification *> m_notifications;
|
||||
QHash<QString, QPointer<KNotification>> m_invitations;
|
||||
|
||||
bool m_globalNotificationsEnabled = false;
|
||||
bool m_globalNotificationsSet = false;
|
||||
PushNotificationAction::Action m_oneToOneNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_encryptedOneToOneNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_groupChatNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_encryptedGroupChatNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_displayNameNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_roomNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_keywordNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_inviteNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_callInviteNotificationAction = PushNotificationAction::Unknown;
|
||||
PushNotificationAction::Action m_tombstoneNotificationAction = PushNotificationAction::Unknown;
|
||||
|
||||
void setGlobalNotificationsEnabled(bool enabled);
|
||||
void setOneToOneNotificationAction(PushNotificationAction::Action action);
|
||||
void setEncryptedOneToOneNotificationAction(PushNotificationAction::Action action);
|
||||
void setGroupChatNotificationAction(PushNotificationAction::Action action);
|
||||
void setEncryptedGroupChatNotificationAction(PushNotificationAction::Action action);
|
||||
void setDisplayNameNotificationAction(PushNotificationAction::Action action);
|
||||
void setRoomNotificationAction(PushNotificationAction::Action action);
|
||||
void setKeywordNotificationAction(PushNotificationAction::Action action);
|
||||
void setInviteNotificationAction(PushNotificationAction::Action action);
|
||||
void setCallInviteNotificationAction(PushNotificationAction::Action action);
|
||||
void setTombstoneNotificationAction(PushNotificationAction::Action action);
|
||||
|
||||
void setNotificationRuleEnabled(const QString &kind, const QString &ruleId, bool enabled);
|
||||
void setNotificationRuleActions(const QString &kind, const QString &ruleId, PushNotificationAction::Action action);
|
||||
PushNotificationAction::Action toAction(const QJsonObject &rule);
|
||||
QVector<QVariant> toActions(PushNotificationAction::Action action, const QString &sound = "default");
|
||||
|
||||
private Q_SLOTS:
|
||||
void processNotificationJob(QPointer<Quotient::Connection> connection, Quotient::GetNotificationsJob *job, bool initialization);
|
||||
|
||||
void updateNotificationRules(const QString &type);
|
||||
|
||||
Q_SIGNALS:
|
||||
void globalNotificationsEnabledChanged(bool newState);
|
||||
void globalNotificationsSetChanged(bool newState);
|
||||
void oneToOneNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void encryptedOneToOneNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void groupChatNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void encryptedGroupChatNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void displayNameNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void roomNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void keywordNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void inviteNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void callInviteNotificationActionChanged(PushNotificationAction::Action action);
|
||||
void tombstoneNotificationActionChanged(PushNotificationAction::Action action);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user