@ -21,10 +21,14 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.ClickableText
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import io.element.android.features.roomdetails.impl.R
import io.element.android.features.roomdetails.impl.R
@ -34,9 +38,9 @@ import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.buildAnnotatedStringWithStyledPart
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.aliasScreenTitle
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.Text
@ -50,6 +54,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
fun RoomNotificationSettingsView (
fun RoomNotificationSettingsView (
state : RoomNotificationSettingsState ,
state : RoomNotificationSettingsState ,
modifier : Modifier = Modifier ,
modifier : Modifier = Modifier ,
onShowGlobalNotifications : ( ) -> Unit = { } ,
onBackPressed : ( ) -> Unit = { } ,
onBackPressed : ( ) -> Unit = { } ,
) {
) {
if ( state . showUserDefinedSettingStyle ) {
if ( state . showUserDefinedSettingStyle ) {
@ -88,40 +93,62 @@ private fun RoomSpecificNotificationSettingsView(
. consumeWindowInsets ( padding ) ,
. consumeWindowInsets ( padding ) ,
verticalArrangement = Arrangement . spacedBy ( 16. dp ) ,
verticalArrangement = Arrangement . spacedBy ( 16. dp ) ,
) {
) {
val subtitle = when ( state . defaultRoomNotificationMode ) {
RoomNotificationMode . ALL _MESSAGES -> stringResource ( id = R . string . screen _room _notification _settings _mode _all _messages )
RoomNotificationMode . MENTIONS _AND _KEYWORDS _ONLY -> stringResource ( id = R . string . screen _room _notification _settings _mode _mentions _and _keywords )
RoomNotificationMode . MUTE -> stringResource ( id = CommonStrings . common _mute )
null -> " "
}
val roomNotificationSettings = state . roomNotificationSettings . dataOrNull ( )
val roomNotificationSettings = state . roomNotificationSettings . dataOrNull ( )
PreferenceCategory ( title = stringResource ( id = R . string . screen _room _notification _settings _custom _settings _title ) ) {
PreferenceSwitch (
PreferenceSwitch (
isChecked = state . displayIsDefault . orTrue ( ) ,
isChecked = ! state . displayIsDefault . orTrue ( ) ,
onCheckedChange = {
onCheckedChange = {
state . eventSink ( RoomNotificationSettingsEvents . SetNotificationMode ( it ) )
state . eventSink ( RoomNotificationSettingsEvents . SetNotificationMode ( ! it ) )
} ,
} ,
title = " Match default setting " ,
subtitle = subtitle ,
enabled = roomNotificationSettings != null
)
PreferenceText (
title = stringResource ( id = R . string . screen _room _notification _settings _allow _custom ) ,
title = stringResource ( id = R . string . screen _room _notification _settings _allow _custom ) ,
subtitle = stringResource ( id = R . string . screen _room _notification _settings _allow _custom _footnote ) ,
subtitle = stringResource ( id = R . string . screen _room _notification _settings _allow _custom _footnote ) ,
enabled = ! state . displayIsDefault . orTrue ( ) ,
enabled = roomNotificationSettings != null
)
)
if ( state . displayIsDefault . orTrue ( ) ) {
if ( roomNotificationSettings != null && state . displayNotificationMode != null ) {
PreferenceCategory ( title = stringResource ( id = R . string . screen _room _notification _settings _default _setting _title ) ) {
val text = buildAnnotatedStringWithStyledPart (
R . string . screen _room _notification _settings _default _setting _footnote ,
R . string . screen _room _notification _settings _default _setting _footnote _content _link ,
color = Color . Unspecified ,
underline = false ,
bold = true ,
)
ClickableText (
text = text ,
onClick = {
onShowGlobalNotifications ( )
} ,
modifier = Modifier
. padding ( start = 16. dp , bottom = 16. dp , end = 16. dp ) ,
style = ElementTheme . typography . fontBodyMdRegular
. copy (
color = MaterialTheme . colorScheme . secondary ,
textAlign = TextAlign . Center ,
)
)
if ( state . defaultRoomNotificationMode != null ) {
val defaultModeTitle = when ( state . defaultRoomNotificationMode ) {
RoomNotificationMode . ALL _MESSAGES -> stringResource ( id = R . string . screen _room _notification _settings _mode _all _messages )
RoomNotificationMode . MENTIONS _AND _KEYWORDS _ONLY -> {
stringResource ( id = R . string . screen _room _notification _settings _mode _mentions _and _keywords )
}
RoomNotificationMode . MUTE -> stringResource ( id = CommonStrings . common _mute )
}
RoomNotificationSettingsOption (
roomNotificationSettingsItem = RoomNotificationSettingsItem ( state . defaultRoomNotificationMode , defaultModeTitle ) ,
isSelected = true ,
onOptionSelected = { } ,
enabled = true
)
}
}
} else {
PreferenceCategory ( title = stringResource ( id = R . string . screen _room _notification _settings _custom _settings _title ) ) {
RoomNotificationSettingsOptions (
RoomNotificationSettingsOptions (
selected = state . displayNotificationMode ,
selected = state . displayNotificationMode ,
enabled = ! state . displayIsDefault . orTrue ( ) ,
enabled = ! state . displayIsDefault . orTrue ( ) ,
onOptionSelected = {
onOptionSelected = {
state . eventSink ( RoomNotificationSettingsEvents . RoomNotificationModeChanged ( it . mode ) )
state . eventSink ( RoomNotificationSettingsEvents . RoomNotificationModeChanged ( it . mode ) )
} ,
} , )
)
}
}
}
}