Add checkbox preference, remove PushRulePreference, Split adavanced fragment to new 3 new fragments and inherit common function

This commit is contained in:
langleyd 2021-07-12 14:07:27 +01:00
parent 2948f03978
commit d6f1f276c2
14 changed files with 383 additions and 335 deletions

View file

@ -111,7 +111,6 @@ import im.vector.app.features.roomprofile.settings.RoomSettingsFragment
import im.vector.app.features.roomprofile.uploads.RoomUploadsFragment import im.vector.app.features.roomprofile.uploads.RoomUploadsFragment
import im.vector.app.features.roomprofile.uploads.files.RoomUploadsFilesFragment import im.vector.app.features.roomprofile.uploads.files.RoomUploadsFilesFragment
import im.vector.app.features.roomprofile.uploads.media.RoomUploadsMediaFragment import im.vector.app.features.roomprofile.uploads.media.RoomUploadsMediaFragment
import im.vector.app.features.settings.VectorSettingsAdvancedNotificationPreferenceFragment
import im.vector.app.features.settings.VectorSettingsGeneralFragment import im.vector.app.features.settings.VectorSettingsGeneralFragment
import im.vector.app.features.settings.VectorSettingsHelpAboutFragment import im.vector.app.features.settings.VectorSettingsHelpAboutFragment
import im.vector.app.features.settings.VectorSettingsLabsFragment import im.vector.app.features.settings.VectorSettingsLabsFragment
@ -390,10 +389,10 @@ interface FragmentModule {
@FragmentKey(VectorSettingsNotificationsTroubleshootFragment::class) @FragmentKey(VectorSettingsNotificationsTroubleshootFragment::class)
fun bindVectorSettingsNotificationsTroubleshootFragment(fragment: VectorSettingsNotificationsTroubleshootFragment): Fragment fun bindVectorSettingsNotificationsTroubleshootFragment(fragment: VectorSettingsNotificationsTroubleshootFragment): Fragment
@Binds // @Binds
@IntoMap // @IntoMap
@FragmentKey(VectorSettingsAdvancedNotificationPreferenceFragment::class) // @FragmentKey(VectorSettingsAdvancedNotificationPreferenceFragment::class)
fun bindVectorSettingsAdvancedNotificationPreferenceFragment(fragment: VectorSettingsAdvancedNotificationPreferenceFragment): Fragment // fun bindVectorSettingsAdvancedNotificationPreferenceFragment(fragment: VectorSettingsAdvancedNotificationPreferenceFragment): Fragment
@Binds @Binds
@IntoMap @IntoMap

View file

@ -0,0 +1,92 @@
/*
* Copyright (c) 2021 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.core.preference
import android.animation.Animator
import android.animation.ArgbEvaluator
import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.widget.TextView
import androidx.core.animation.doOnEnd
import androidx.preference.CheckBoxPreference
import androidx.preference.PreferenceViewHolder
import im.vector.app.R
import im.vector.app.features.themes.ThemeUtils
open class VectorCheckboxPreference : CheckBoxPreference {
// Note: @JvmOverload does not work here...
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context) : super(context)
init {
// Set to false to remove the space when there is no icon
isIconSpaceReserved = true
}
var isHighlighted = false
set(value) {
field = value
notifyChanged()
}
var currentHighlightAnimator: Animator? = null
override fun onBindViewHolder(holder: PreferenceViewHolder) {
// display the title in multi-line to avoid ellipsis.
(holder.findViewById(android.R.id.title) as? TextView)?.isSingleLine = false
// cancel existing animation (find a way to resume if happens during anim?)
currentHighlightAnimator?.cancel()
val itemView = holder.itemView
if (isHighlighted) {
val colorFrom = Color.TRANSPARENT
val colorTo = ThemeUtils.getColor(itemView.context, R.attr.colorControlHighlight)
currentHighlightAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorFrom, colorTo).apply {
duration = 250 // milliseconds
addUpdateListener { animator ->
itemView.setBackgroundColor(animator.animatedValue as Int)
}
doOnEnd {
currentHighlightAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorTo, colorFrom).apply {
duration = 250 // milliseconds
addUpdateListener { animator ->
itemView.setBackgroundColor(animator.animatedValue as Int)
}
doOnEnd {
isHighlighted = false
}
start()
}
}
startDelay = 200
start()
}
} else {
itemView.setBackgroundColor(Color.TRANSPARENT)
}
super.onBindViewHolder(holder)
}
}

View file

@ -1,105 +0,0 @@
/*
* Copyright 2018 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.settings
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import im.vector.app.R
import im.vector.app.core.preference.PushRulePreference
import im.vector.app.core.preference.VectorPreference
import im.vector.app.core.utils.toast
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.pushrules.RuleIds
import org.matrix.android.sdk.api.pushrules.rest.PushRuleAndKind
import javax.inject.Inject
class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor()
: VectorSettingsBaseFragment() {
override var titleRes: Int = R.string.settings_notification_advanced
override val preferenceXmlRes = R.xml.vector_settings_notification_advanced_preferences
override fun bindPref() {
for (preferenceKey in prefKeyToPushRuleId.keys) {
val preference = findPreference<VectorPreference>(preferenceKey)
if (preference is PushRulePreference) {
// preference.isEnabled = null != rules && isConnected && pushManager.areDeviceNotificationsAllowed()
val ruleAndKind: PushRuleAndKind? = session.getPushRules().findDefaultRule(prefKeyToPushRuleId[preferenceKey])
if (ruleAndKind == null) {
// The rule is not defined, hide the preference
preference.isVisible = false
} else {
preference.isVisible = true
preference.setPushRule(ruleAndKind)
preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
val newRule = preference.createNewRule(newValue as Int)
if (newRule != null) {
displayLoadingView()
lifecycleScope.launch {
val result = runCatching {
session.updatePushRuleActions(ruleAndKind.kind,
preference.ruleAndKind?.pushRule ?: ruleAndKind.pushRule,
newRule)
}
if (!isAdded) {
return@launch
}
hideLoadingView()
result.onSuccess {
preference.setPushRule(ruleAndKind.copy(pushRule = newRule))
}
result.onFailure { failure ->
// Restore the previous value
refreshDisplay()
activity?.toast(errorFormatter.toHumanReadable(failure))
}
}
}
false
}
}
}
}
}
private fun refreshDisplay() {
listView?.adapter?.notifyDataSetChanged()
}
/* ==========================================================================================
* Companion
* ========================================================================================== */
companion object {
// preference name <-> rule Id
private val prefKeyToPushRuleId = mapOf(
"SETTINGS_PUSH_RULE_CONTAINING_MY_DISPLAY_NAME_PREFERENCE_KEY" to RuleIds.RULE_ID_CONTAIN_DISPLAY_NAME,
"SETTINGS_PUSH_RULE_CONTAINING_MY_USER_NAME_PREFERENCE_KEY" to RuleIds.RULE_ID_CONTAIN_USER_NAME,
"SETTINGS_PUSH_RULE_MESSAGES_IN_ONE_TO_ONE_PREFERENCE_KEY" to RuleIds.RULE_ID_ONE_TO_ONE_ROOM,
"SETTINGS_PUSH_RULE_MESSAGES_IN_GROUP_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS,
"SETTINGS_PUSH_RULE_INVITED_TO_ROOM_PREFERENCE_KEY" to RuleIds.RULE_ID_INVITE_ME,
"SETTINGS_PUSH_RULE_CALL_INVITATIONS_PREFERENCE_KEY" to RuleIds.RULE_ID_CALL,
"SETTINGS_PUSH_RULE_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY" to RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS,
"SETTINGS_PUSH_RULE_MESSAGES_CONTAINING_AT_ROOM_PREFERENCE_KEY" to RuleIds.RULE_ID_ROOM_NOTIF,
"SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_ONE_ONE_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ONE_TO_ONE_ENCRYPTED_ROOM,
"SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_GROUP_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ENCRYPTED,
"SETTINGS_PUSH_RULE_ROOMS_UPGRADED_KEY" to RuleIds.RULE_ID_TOMBSTONE
)
}
}

View file

@ -0,0 +1,38 @@
/*
* Copyright (c) 2021 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.settings
import im.vector.app.R
import org.matrix.android.sdk.api.pushrules.RuleIds
import javax.inject.Inject
class VectorSettingsGlobalNotificationPreferenceFragment @Inject constructor()
: VectorSettingsPushRuleNotificationPreferenceFragment() {
override var titleRes: Int = R.string.settings_notification_global
override val preferenceXmlRes = R.xml.vector_settings_notification_global
override val prefKeyToPushRuleId: Map<String, String>
get() = mapOf(
"SETTINGS_PUSH_RULE_MESSAGES_IN_ONE_TO_ONE_PREFERENCE_KEY" to RuleIds.RULE_ID_ONE_TO_ONE_ROOM,
"SETTINGS_PUSH_RULE_MESSAGES_IN_GROUP_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS,
"SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_ONE_ONE_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ONE_TO_ONE_ENCRYPTED_ROOM,
"SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_GROUP_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ENCRYPTED
)
}

View file

@ -0,0 +1,36 @@
/*
* Copyright (c) 2021 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.settings
import im.vector.app.R
import org.matrix.android.sdk.api.pushrules.RuleIds
import javax.inject.Inject
class VectorSettingsKeywordAndMentionsNotificationPreferenceFragment @Inject constructor()
: VectorSettingsPushRuleNotificationPreferenceFragment() {
override var titleRes: Int = R.string.settings_notification_mentions_and_keywords
override val preferenceXmlRes = R.xml.vector_settings_notification_mentions_and_keywords
override val prefKeyToPushRuleId: Map<String, String>
get() = mapOf(
"SETTINGS_PUSH_RULE_CONTAINING_MY_DISPLAY_NAME_PREFERENCE_KEY" to RuleIds.RULE_ID_CONTAIN_DISPLAY_NAME,
"SETTINGS_PUSH_RULE_CONTAINING_MY_USER_NAME_PREFERENCE_KEY" to RuleIds.RULE_ID_CONTAIN_USER_NAME,
"SETTINGS_PUSH_RULE_MESSAGES_CONTAINING_AT_ROOM_PREFERENCE_KEY" to RuleIds.RULE_ID_ROOM_NOTIF
)
}

View file

@ -0,0 +1,37 @@
/*
* Copyright (c) 2021 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.settings
import im.vector.app.R
import org.matrix.android.sdk.api.pushrules.RuleIds
import javax.inject.Inject
class VectorSettingsOtherNotificationPreferenceFragment @Inject constructor()
: VectorSettingsPushRuleNotificationPreferenceFragment() {
override var titleRes: Int = R.string.settings_notification_other
override val preferenceXmlRes = R.xml.vector_settings_notification_other
override val prefKeyToPushRuleId: Map<String, String>
get() = mapOf(
"SETTINGS_PUSH_RULE_INVITED_TO_ROOM_PREFERENCE_KEY" to RuleIds.RULE_ID_INVITE_ME,
"SETTINGS_PUSH_RULE_CALL_INVITATIONS_PREFERENCE_KEY" to RuleIds.RULE_ID_CALL,
"SETTINGS_PUSH_RULE_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY" to RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS,
"SETTINGS_PUSH_RULE_ROOMS_UPGRADED_KEY" to RuleIds.RULE_ID_TOMBSTONE
)
}

View file

@ -1,5 +1,5 @@
/* /*
* Copyright 2018 New Vector Ltd * Copyright (c) 2021 New Vector Ltd
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -14,43 +14,39 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.app.core.preference package im.vector.app.features.settings
import android.content.Context import androidx.lifecycle.lifecycleScope
import android.util.AttributeSet import androidx.preference.Preference
import android.view.View import im.vector.app.core.preference.VectorCheckboxPreference
import android.widget.RadioGroup import im.vector.app.core.utils.toast
import androidx.preference.PreferenceViewHolder import kotlinx.coroutines.launch
import im.vector.app.R
import org.matrix.android.sdk.api.pushrules.Action import org.matrix.android.sdk.api.pushrules.Action
import org.matrix.android.sdk.api.pushrules.RuleIds import org.matrix.android.sdk.api.pushrules.RuleIds
import org.matrix.android.sdk.api.pushrules.RuleSetKey import org.matrix.android.sdk.api.pushrules.RuleSetKey
import org.matrix.android.sdk.api.pushrules.rest.PushRule import org.matrix.android.sdk.api.pushrules.rest.PushRule
import org.matrix.android.sdk.api.pushrules.rest.PushRuleAndKind import org.matrix.android.sdk.api.pushrules.rest.PushRuleAndKind
class PushRulePreference : VectorPreference { abstract class VectorSettingsPushRuleNotificationPreferenceFragment
: VectorSettingsBaseFragment() {
/**
* @return the selected push rule and its kind
*/
var ruleAndKind: PushRuleAndKind? = null
private set
constructor(context: Context) : super(context) fun indexFromBooleanPreference(pushRuleOn: Boolean): Int {
return if (pushRuleOn) {
NOTIFICATION_NOISY_INDEX
} else {
NOTIFICATION_OFF_INDEX
}
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) fun booleanPreferenceFromIndex(index: Int): Boolean {
return index != NOTIFICATION_OFF_INDEX
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
init {
layoutResource = R.layout.vector_preference_push_rule
} }
/** /**
* @return the bing rule status index * @return the bing rule status index
*/ */
private val ruleStatusIndex: Int fun ruleStatusIndexFor(ruleAndKind: PushRuleAndKind? ): Int {
get() {
val safeRule = ruleAndKind?.pushRule ?: return NOTIFICATION_OFF_INDEX val safeRule = ruleAndKind?.pushRule ?: return NOTIFICATION_OFF_INDEX
if (safeRule.ruleId == RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS) { if (safeRule.ruleId == RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS) {
@ -78,36 +74,16 @@ class PushRulePreference : VectorPreference {
return NOTIFICATION_OFF_INDEX return NOTIFICATION_OFF_INDEX
} }
/**
* Update the push rule.
*
* @param pushRule
*/
fun setPushRule(pushRuleAndKind: PushRuleAndKind?) {
ruleAndKind = pushRuleAndKind
refreshSummary()
}
/**
* Refresh the summary
*/
private fun refreshSummary() {
summary = context.getString(when (ruleStatusIndex) {
NOTIFICATION_OFF_INDEX -> R.string.notification_off
NOTIFICATION_SILENT_INDEX -> R.string.notification_silent
else -> R.string.notification_noisy
})
}
/** /**
* Create a push rule with the updated required at index. * Create a push rule with the updated required at index.
* *
* @param index index * @param index index
* @return a push rule with the updated flags / null if there is no update * @return a push rule with the updated flags / null if there is no update
*/ */
fun createNewRule(index: Int): PushRule? { fun createNewRule(ruleAndKind: PushRuleAndKind?, index: Int): PushRule? {
val safeRule = ruleAndKind?.pushRule ?: return null val safeRule = ruleAndKind?.pushRule ?: return null
val safeKind = ruleAndKind?.kind ?: return null val safeKind = ruleAndKind.kind
val ruleStatusIndex = ruleStatusIndexFor(ruleAndKind)
return if (index != ruleStatusIndex) { return if (index != ruleStatusIndex) {
if (safeRule.ruleId == RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS) { if (safeRule.ruleId == RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS) {
@ -126,7 +102,7 @@ class PushRulePreference : VectorPreference {
.setNotify(true) .setNotify(true)
.setNotificationSound() .setNotificationSound()
} }
else -> safeRule else -> safeRule
} }
} else { } else {
if (NOTIFICATION_OFF_INDEX == index) { if (NOTIFICATION_OFF_INDEX == index) {
@ -160,43 +136,67 @@ class PushRulePreference : VectorPreference {
} }
} }
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
holder.findViewById(android.R.id.summary)?.visibility = View.GONE override fun bindPref() {
holder.itemView.setOnClickListener(null) for (preferenceKey in prefKeyToPushRuleId.keys) {
holder.itemView.setOnLongClickListener(null) val preference = findPreference<VectorCheckboxPreference>(preferenceKey)!!
// preference.isEnabled = null != rules && isConnected && pushManager.areDeviceNotificationsAllowed()
val ruleAndKind: PushRuleAndKind? = session.getPushRules().findDefaultRule(prefKeyToPushRuleId[preferenceKey])
val radioGroup = holder.findViewById(R.id.bingPreferenceRadioGroup) as? RadioGroup if (ruleAndKind == null) {
radioGroup?.setOnCheckedChangeListener(null) // The rule is not defined, hide the preference
preference.isVisible = false
} else {
preference.isVisible = true
when (ruleStatusIndex) { val index = ruleStatusIndexFor(ruleAndKind)
NOTIFICATION_OFF_INDEX -> { val boolPreference = booleanPreferenceFromIndex(index)
radioGroup?.check(R.id.bingPreferenceRadioBingRuleOff) preference.isChecked = boolPreference
} preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
NOTIFICATION_SILENT_INDEX -> { val newIndex = indexFromBooleanPreference(newValue as Boolean)
radioGroup?.check(R.id.bingPreferenceRadioBingRuleSilent) val newRule = createNewRule(ruleAndKind, newIndex)
}
else -> {
radioGroup?.check(R.id.bingPreferenceRadioBingRuleNoisy)
}
}
radioGroup?.setOnCheckedChangeListener { _, checkedId -> if (newRule != null) {
when (checkedId) { displayLoadingView()
R.id.bingPreferenceRadioBingRuleOff -> {
onPreferenceChangeListener?.onPreferenceChange(this, NOTIFICATION_OFF_INDEX) lifecycleScope.launch {
} val result = runCatching {
R.id.bingPreferenceRadioBingRuleSilent -> { session.updatePushRuleActions(
onPreferenceChangeListener?.onPreferenceChange(this, NOTIFICATION_SILENT_INDEX) ruleAndKind.kind,
} ruleAndKind.pushRule,
R.id.bingPreferenceRadioBingRuleNoisy -> { newRule
onPreferenceChangeListener?.onPreferenceChange(this, NOTIFICATION_NOISY_INDEX) )
}
if (!isAdded) {
return@launch
}
hideLoadingView()
result.onSuccess {
preference.isChecked = newValue
}
result.onFailure { failure ->
// Restore the previous value
refreshDisplay()
activity?.toast(errorFormatter.toHumanReadable(failure))
}
}
}
false
} }
} }
} }
} }
private fun refreshDisplay() {
listView?.adapter?.notifyDataSetChanged()
}
/* ==========================================================================================
* Companion
* ========================================================================================== */
abstract val prefKeyToPushRuleId: Map<String, String>
companion object { companion object {
// index in mRuleStatuses // index in mRuleStatuses

View file

@ -1,79 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:baselineAligned="false"
android:clipToPadding="false"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:orientation="vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingLeft"
android:paddingEnd="?android:attr/listPreferredItemPaddingRight">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp">
<TextView
android:id="@android:id/title"
style="@style/Widget.Vector.TextView.Body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textAppearance="?textAppearanceListItem"
android:textColor="?vctr_content_primary"
tools:text="Title" />
<TextView
android:id="@android:id/summary"
style="@style/Widget.Vector.TextView.Body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignStart="@android:id/title"
android:maxLines="2"
android:paddingTop="6dp"
android:textAppearance="?textAppearanceListItemSecondary"
android:textColor="?vctr_content_secondary"
tools:text="Summary"
tools:visibility="visible" />
</RelativeLayout>
<RadioGroup
android:id="@+id/bingPreferenceRadioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
android:orientation="horizontal"
android:paddingTop="6dp"
android:paddingBottom="16dp">
<RadioButton
android:id="@+id/bingPreferenceRadioBingRuleOff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notification_off"
tools:checked="true" />
<RadioButton
android:id="@+id/bingPreferenceRadioBingRuleSilent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notification_silent" />
<RadioButton
android:id="@+id/bingPreferenceRadioBingRuleNoisy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notification_noisy" />
</RadioGroup>
</LinearLayout>

View file

@ -1075,6 +1075,12 @@
<string name="settings_notification_advanced">Advanced Notification Settings</string> <string name="settings_notification_advanced">Advanced Notification Settings</string>
<string name="settings_notification_by_event">Notification importance by event</string> <string name="settings_notification_by_event">Notification importance by event</string>
<string name="settings_notification_global">Global Notifications</string>
<string name="settings_notification_mentions_and_keywords">Mentions and Keywords</string>
<string name="settings_notification_other">Other</string>
<string name="settings_notification_notify_me_for">Notify me for</string>
<string name="settings_notification_privacy">Notification privacy</string> <string name="settings_notification_privacy">Notification privacy</string>
<string name="settings_notification_troubleshoot">Troubleshoot Notifications</string> <string name="settings_notification_troubleshoot">Troubleshoot Notifications</string>
<string name="settings_troubleshoot_diagnostic">Troubleshooting diagnostics</string> <string name="settings_troubleshoot_diagnostic">Troubleshooting diagnostics</string>

View file

@ -1,67 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<im.vector.app.core.preference.VectorPreferenceCategory
android:key="SETTINGS_NOTIFICATION_LEVEL"
android:title="@string/settings_notification_by_event">
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_CONTAINING_MY_DISPLAY_NAME_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_containing_my_display_name" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_CONTAINING_MY_USER_NAME_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_containing_my_user_name" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_CONTAINING_AT_ROOM_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_at_room" />
<!-- TODO Support message with keywords rule -->
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_ONE_TO_ONE_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_one_to_one" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_ONE_ONE_CHAT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_e2e_one_to_one" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_GROUP_CHAT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_group_chat" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_GROUP_CHAT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_e2e_group_chat" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_INVITED_TO_ROOM_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_invited_to_room" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_CALL_INVITATIONS_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_call_invitations" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_sent_by_bot" />
<im.vector.app.core.preference.PushRulePreference
android:key="SETTINGS_PUSH_RULE_ROOMS_UPGRADED_KEY"
android:persistent="false"
android:title="@string/settings_when_rooms_are_upgraded" />
</im.vector.app.core.preference.VectorPreferenceCategory>
</androidx.preference.PreferenceScreen>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<im.vector.app.core.preference.VectorPreferenceCategory
android:key="SETTINGS_OTHER"
android:title="@string/settings_notification_notify_me_for">
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_ONE_TO_ONE_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_one_to_one" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_ONE_ONE_CHAT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_e2e_one_to_one" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_GROUP_CHAT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_group_chat" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_GROUP_CHAT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_in_e2e_group_chat" />
</im.vector.app.core.preference.VectorPreferenceCategory>
</PreferenceScreen>

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<im.vector.app.core.preference.VectorPreferenceCategory
android:key="SETTINGS_KEYWORDS_AND_MENTIONS"
android:title="@string/settings_notification_notify_me_for">
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_CONTAINING_MY_DISPLAY_NAME_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_containing_my_display_name" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_CONTAINING_MY_USER_NAME_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_containing_my_user_name" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_CONTAINING_AT_ROOM_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_at_room" />
</im.vector.app.core.preference.VectorPreferenceCategory>
</PreferenceScreen>

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<im.vector.app.core.preference.VectorPreferenceCategory
android:key="SETTINGS_OTHER"
android:title="@string/settings_notification_notify_me_for">
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_INVITED_TO_ROOM_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_invited_to_room" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_CALL_INVITATIONS_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_call_invitations" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY"
android:persistent="false"
android:title="@string/settings_messages_sent_by_bot" />
<im.vector.app.core.preference.VectorCheckboxPreference
android:key="SETTINGS_PUSH_RULE_ROOMS_UPGRADED_KEY"
android:persistent="false"
android:title="@string/settings_when_rooms_are_upgraded" />
</im.vector.app.core.preference.VectorPreferenceCategory>
</PreferenceScreen>

View file

@ -22,11 +22,24 @@
<im.vector.app.core.preference.VectorPreference <im.vector.app.core.preference.VectorPreference
android:dependency="SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY" android:dependency="SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY"
android:key="SETTINGS_NOTIFICATION_ADVANCED_PREFERENCE_KEY" android:key="SETTINGS_NOTIFICATION_GLOBAL_PREFERENCE_KEY"
android:persistent="false" android:persistent="false"
android:summary="@string/settings_notification_advanced_summary" android:title="@string/settings_notification_global"
android:title="@string/settings_notification_advanced" app:fragment="im.vector.app.features.settings.VectorSettingsGlobalNotificationPreferenceFragment" />
app:fragment="im.vector.app.features.settings.VectorSettingsAdvancedNotificationPreferenceFragment" />
<!-- <im.vector.app.core.preference.VectorPreference-->
<!-- android:dependency="SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY"-->
<!-- android:key="SETTINGS_NOTIFICATION_KEYWORD_AND_MENTIONS_PREFERENCE_KEY"-->
<!-- android:persistent="false"-->
<!-- android:title="@string/settings_notification_mentions_and_keywords"-->
<!-- app:fragment="im.vector.app.features.settings.VectorSettingsKeywordAndMentionsNotificationPreferenceFragment" />-->
<!-- <im.vector.app.core.preference.VectorPreference-->
<!-- android:dependency="SETTINGS_ENABLE_THIS_DEVICE_PREFERENCE_KEY"-->
<!-- android:key="SETTINGS_NOTIFICATION_OTHER_PREFERENCE_KEY"-->
<!-- android:persistent="false"-->
<!-- android:title="@string/settings_notification_other"-->
<!-- app:fragment="im.vector.app.features.settings.VectorSettingsOtherNotificationPreferenceFragment" />-->
</im.vector.app.core.preference.VectorPreferenceCategory> </im.vector.app.core.preference.VectorPreferenceCategory>