From 8d7e3b6544e752cd8d1c25b3c8012210c7bdf7b9 Mon Sep 17 00:00:00 2001 From: David Langley Date: Tue, 3 Aug 2021 09:52:36 +0100 Subject: [PATCH 01/15] add keyword checkbox preference and chip/edit text for modificying keywords --- .../res/color/keyword_background_selector.xml | 5 + .../res/color/keyword_foreground_selector.xml | 5 + .../src/main/res/values/styles_keyword.xml | 12 ++ .../src/main/res/values/theme_dark.xml | 2 +- .../src/main/res/values/theme_light.xml | 2 +- .../sdk/api/pushrules/PushRuleService.kt | 5 +- .../android/sdk/api/pushrules/RuleIds.kt | 2 + .../notification/DefaultPushRuleService.kt | 21 ++- .../session/pushers/RemovePushRuleTask.kt | 4 +- .../SetRoomNotificationStateTask.kt | 2 +- vector/build.gradle | 4 +- .../app/core/preference/KeywordPreference.kt | 111 ++++++++++++++ .../notifications/PushRuleDefinitions.kt | 6 + ...dMentionsNotificationPreferenceFragment.kt | 141 ++++++++++++++++++ ...sPushRuleNotificationPreferenceFragment.kt | 60 ++++---- .../layout/vector_preference_chip_group.xml | 45 ++++++ vector/src/main/res/values/strings.xml | 3 + .../res/xml/vector_settings_keyword_view.xml | 6 + .../vector_settings_notification_default.xml | 4 - ...ngs_notification_mentions_and_keywords.xml | 11 +- 20 files changed, 406 insertions(+), 45 deletions(-) create mode 100644 library/ui-styles/src/main/res/color/keyword_background_selector.xml create mode 100644 library/ui-styles/src/main/res/color/keyword_foreground_selector.xml create mode 100644 library/ui-styles/src/main/res/values/styles_keyword.xml create mode 100644 vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt create mode 100644 vector/src/main/res/layout/vector_preference_chip_group.xml create mode 100644 vector/src/main/res/xml/vector_settings_keyword_view.xml diff --git a/library/ui-styles/src/main/res/color/keyword_background_selector.xml b/library/ui-styles/src/main/res/color/keyword_background_selector.xml new file mode 100644 index 0000000000..3420cfeaba --- /dev/null +++ b/library/ui-styles/src/main/res/color/keyword_background_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/library/ui-styles/src/main/res/color/keyword_foreground_selector.xml b/library/ui-styles/src/main/res/color/keyword_foreground_selector.xml new file mode 100644 index 0000000000..bd8eb2f564 --- /dev/null +++ b/library/ui-styles/src/main/res/color/keyword_foreground_selector.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/library/ui-styles/src/main/res/values/styles_keyword.xml b/library/ui-styles/src/main/res/values/styles_keyword.xml new file mode 100644 index 0000000000..b4aaeb2dda --- /dev/null +++ b/library/ui-styles/src/main/res/values/styles_keyword.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/library/ui-styles/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml index 9d2d37d331..d21b86c71d 100644 --- a/library/ui-styles/src/main/res/values/theme_dark.xml +++ b/library/ui-styles/src/main/res/values/theme_dark.xml @@ -134,7 +134,7 @@ @style/Widget.Vector.Button.Outlined.SocialLogin.Gitlab.Dark @style/Widget.Vector.JumpToUnread.Dark - + @style/Widget.Vector.Keyword \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt index 83c4a8e90f..5b14e97d5e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt @@ -35,6 +35,9 @@ object RuleIds { // Default Content Rules const val RULE_ID_CONTAIN_USER_NAME = ".m.rule.contains_user_name" + // The keywords rule id is not a "real" id in that it does not exist server-side. + // It is used client-side as a placeholder for rendering the keyword push rule setting + // alongside the others. A similar approach and naming is used on Web and iOS. const val RULE_ID_KEYWORDS = "_keywords" // Default Underride Rules diff --git a/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt b/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt index c082860a87..c3377f63f9 100644 --- a/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt @@ -107,9 +107,6 @@ class KeywordPreference : VectorPreference { private fun addChipToGroup(keyword: String, chipGroup: ChipGroup) { val chip = Chip(context, null, R.attr.vctr_keyword_style) chip.text = keyword - chip.isClickable = true - chip.isCheckable = false - chip.isCloseIconVisible = true chipGroup.addView(chip) chip.setOnCloseIconClickListener { diff --git a/vector/src/main/res/xml/vector_settings_notification_default.xml b/vector/src/main/res/xml/vector_settings_notification_default.xml index b743294753..fb565d2230 100644 --- a/vector/src/main/res/xml/vector_settings_notification_default.xml +++ b/vector/src/main/res/xml/vector_settings_notification_default.xml @@ -6,18 +6,22 @@ diff --git a/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml b/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml index 0ee24798d4..2de189cf7f 100644 --- a/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml +++ b/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml @@ -6,18 +6,22 @@ @@ -26,11 +30,13 @@ android:title="@string/settings_notification_your_keywords"> From ce9acd440e06d1a8dc00d97faa7cec3b01b73d37 Mon Sep 17 00:00:00 2001 From: David Langley Date: Wed, 25 Aug 2021 17:54:23 +0100 Subject: [PATCH 08/15] Enabled Notifications V2 --- vector/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/build.gradle b/vector/build.gradle index bf98ab3d77..ed3634a7ec 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -143,7 +143,7 @@ android { resValue "bool", "useLoginV2", "false" // NotificationSettingsV2 is disabled. To be released in conjunction with iOS/Web - def useNotificationSettingsV2 = false + def useNotificationSettingsV2 = true buildConfigField "Boolean", "USE_NOTIFICATION_SETTINGS_V2", "${useNotificationSettingsV2}" resValue "bool", "useNotificationSettingsV1", "${!useNotificationSettingsV2}" resValue "bool", "useNotificationSettingsV2", "${useNotificationSettingsV2}" From 1127a05a3e5592a0f819f8d5c1e1bdeb97734539 Mon Sep 17 00:00:00 2001 From: David Langley Date: Fri, 27 Aug 2021 11:40:15 +0100 Subject: [PATCH 09/15] Enable keywords by default if none exist. Add "Add" Button. --- .../app/core/preference/KeywordPreference.kt | 22 ++++++++++++++----- ...dMentionsNotificationPreferenceFragment.kt | 6 ++--- .../layout/vector_preference_chip_group.xml | 10 +++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt b/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt index c3377f63f9..37d9a598e7 100644 --- a/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt @@ -19,6 +19,7 @@ package im.vector.app.core.preference import android.content.Context import android.util.AttributeSet import android.view.inputmethod.EditorInfo +import android.widget.Button import android.widget.EditText import androidx.core.view.children import androidx.preference.PreferenceViewHolder @@ -75,6 +76,7 @@ class KeywordPreference : VectorPreference { val chipEditText = holder.findViewById(R.id.chipEditText) as? EditText ?: return val chipGroup = holder.findViewById(R.id.chipGroup) as? ChipGroup ?: return + val addKeywordButton = holder.findViewById(R.id.addKeywordButton) as? Button ?: return chipEditText.text = null chipGroup.removeAllViews() @@ -87,20 +89,28 @@ class KeywordPreference : VectorPreference { chipGroup.isEnabled = keywordsEnabled chipGroup.children.forEach { it.isEnabled = keywordsEnabled } - chipEditText.setOnEditorActionListener { _, actionId, _ -> - if (actionId != EditorInfo.IME_ACTION_DONE) { - return@setOnEditorActionListener false - } + fun addKeyword(): Boolean { val keyword = chipEditText.text.toString().trim() if (keyword.isEmpty()) { - return@setOnEditorActionListener false + return false } _keywords.add(keyword) listener?.didAddKeyword(keyword) onPreferenceChangeListener?.onPreferenceChange(this, _keywords) notifyChanged() chipEditText.text = null - return@setOnEditorActionListener true + return true + } + + chipEditText.setOnEditorActionListener { _, actionId, _ -> + if (actionId != EditorInfo.IME_ACTION_DONE) { + return@setOnEditorActionListener false + } + return@setOnEditorActionListener addKeyword() + } + + addKeywordButton.setOnClickListener { + addKeyword() } } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt index 71daaadc15..82663ae910 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt @@ -55,14 +55,14 @@ class VectorSettingsKeywordAndMentionsNotificationPreferenceFragment yourKeywordsCategory.isIconSpaceReserved = false val keywordRules = session.getPushRules().content?.filter { !it.ruleId.startsWith(".") }.orEmpty() - val anyEnabledKeywords = keywordRules.any(PushRule::enabled) + val enableKeywords = keywordRules.isEmpty() || keywordRules.any(PushRule::enabled) val editKeywordPreference = findPreference("SETTINGS_KEYWORD_EDIT")!! - editKeywordPreference.isEnabled = anyEnabledKeywords + editKeywordPreference.isEnabled = enableKeywords val keywordPreference = findPreference("SETTINGS_PUSH_RULE_MESSAGES_CONTAINING_KEYWORDS_PREFERENCE_KEY")!! keywordPreference.isIconSpaceReserved = false - keywordPreference.isChecked = anyEnabledKeywords + keywordPreference.isChecked = enableKeywords val footerPreference = findPreference("SETTINGS_KEYWORDS_FOOTER")!! footerPreference.isIconSpaceReserved = false diff --git a/vector/src/main/res/layout/vector_preference_chip_group.xml b/vector/src/main/res/layout/vector_preference_chip_group.xml index 33cf6dcf37..5cc90d8002 100644 --- a/vector/src/main/res/layout/vector_preference_chip_group.xml +++ b/vector/src/main/res/layout/vector_preference_chip_group.xml @@ -31,6 +31,16 @@ +