Address comments

- Add additional states to preview.
- Add TODO description for commented code
- Move showUserDefinedSettingStyle from the node to the view for testability.
This commit is contained in:
David Langley 2023-10-24 16:27:26 +01:00
parent 463ceba52c
commit 39af4d5e1b
9 changed files with 47 additions and 15 deletions

View file

@ -89,6 +89,7 @@ fun NotificationSettingsView(
onGroupChatsClicked = { onOpenEditDefault(false) }, onGroupChatsClicked = { onOpenEditDefault(false) },
onDirectChatsClicked = { onOpenEditDefault(true) }, onDirectChatsClicked = { onOpenEditDefault(true) },
onMentionNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetAtRoomNotificationsEnabled(it)) }, onMentionNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetAtRoomNotificationsEnabled(it)) },
// TODO We are removing the call notification toggle until support for call notifications has been added
// onCallsNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetCallNotificationsEnabled(it)) }, // onCallsNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetCallNotificationsEnabled(it)) },
) )
} }
@ -116,6 +117,7 @@ private fun NotificationSettingsContentView(
onGroupChatsClicked: () -> Unit, onGroupChatsClicked: () -> Unit,
onDirectChatsClicked: () -> Unit, onDirectChatsClicked: () -> Unit,
onMentionNotificationsChanged: (Boolean) -> Unit, onMentionNotificationsChanged: (Boolean) -> Unit,
// TODO We are removing the call notification toggle until support for call notifications has been added
// onCallsNotificationsChanged: (Boolean) -> Unit, // onCallsNotificationsChanged: (Boolean) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -166,7 +168,7 @@ private fun NotificationSettingsContentView(
onCheckedChange = onMentionNotificationsChanged onCheckedChange = onMentionNotificationsChanged
) )
} }
// We are removing the call notification toggle until call support has been added // TODO We are removing the call notification toggle until support for call notifications has been added
// PreferenceCategory(title = stringResource(id = CommonStrings.screen_notification_settings_additional_settings_section_title)) { // PreferenceCategory(title = stringResource(id = CommonStrings.screen_notification_settings_additional_settings_section_title)) {
// PreferenceSwitch( // PreferenceSwitch(
// modifier = Modifier, // modifier = Modifier,

View file

@ -27,11 +27,12 @@ open class EditDefaultNotificationSettingStateProvider: PreviewParameterProvider
override val values: Sequence<EditDefaultNotificationSettingState> override val values: Sequence<EditDefaultNotificationSettingState>
get() = sequenceOf( get() = sequenceOf(
anEditDefaultNotificationSettingsState(), anEditDefaultNotificationSettingsState(),
anEditDefaultNotificationSettingsState(isOneToOne = true)
) )
} }
fun anEditDefaultNotificationSettingsState() = EditDefaultNotificationSettingState( fun anEditDefaultNotificationSettingsState(isOneToOne: Boolean = false) = EditDefaultNotificationSettingState(
isOneToOne = false, isOneToOne = isOneToOne,
mode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY, mode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
roomsWithUserDefinedMode = listOf(aRoomSummary()), roomsWithUserDefinedMode = listOf(aRoomSummary()),
changeNotificationSettingAction = Async.Uninitialized, changeNotificationSettingAction = Async.Uninitialized,

View file

@ -35,7 +35,7 @@ import io.element.android.services.analytics.api.AnalyticsService
class RoomNotificationSettingsNode @AssistedInject constructor( class RoomNotificationSettingsNode @AssistedInject constructor(
@Assisted buildContext: BuildContext, @Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>, @Assisted plugins: List<Plugin>,
private val presenter: RoomNotificationSettingsPresenter, presenterFactory: RoomNotificationSettingsPresenter.Factory,
private val analyticsService: AnalyticsService, private val analyticsService: AnalyticsService,
) : Node(buildContext, plugins = plugins) { ) : Node(buildContext, plugins = plugins) {
@ -45,6 +45,7 @@ class RoomNotificationSettingsNode @AssistedInject constructor(
private val inputs = inputs<RoomNotificationSettingInput>() private val inputs = inputs<RoomNotificationSettingInput>()
private val presenter = presenterFactory.create(inputs.showUserDefinedSettingStyle)
init { init {
lifecycle.subscribe( lifecycle.subscribe(
onResume = { onResume = {
@ -56,18 +57,10 @@ class RoomNotificationSettingsNode @AssistedInject constructor(
@Composable @Composable
override fun View(modifier: Modifier) { override fun View(modifier: Modifier) {
val state = presenter.present() val state = presenter.present()
if(inputs.showUserDefinedSettingStyle) {
UserDefinedRoomNotificationSettingsView(
state = state,
modifier = modifier,
onBackPressed = this::navigateUp,
)
} else {
RoomNotificationSettingsView( RoomNotificationSettingsView(
state = state, state = state,
modifier = modifier, modifier = modifier,
onBackPressed = this::navigateUp, onBackPressed = this::navigateUp,
) )
}
} }
} }

View file

@ -23,6 +23,9 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Async
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.architecture.runCatchingUpdatingState
@ -36,13 +39,19 @@ import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
class RoomNotificationSettingsPresenter @Inject constructor( class RoomNotificationSettingsPresenter @AssistedInject constructor(
private val room: MatrixRoom, private val room: MatrixRoom,
private val notificationSettingsService: NotificationSettingsService, private val notificationSettingsService: NotificationSettingsService,
@Assisted private val showUserDefinedSettingStyle: Boolean,
) : Presenter<RoomNotificationSettingsState> { ) : Presenter<RoomNotificationSettingsState> {
@AssistedFactory
interface Factory {
fun create(showUserDefinedSettingStyle: Boolean): RoomNotificationSettingsPresenter
}
@Composable @Composable
override fun present(): RoomNotificationSettingsState { override fun present(): RoomNotificationSettingsState {
val defaultRoomNotificationMode: MutableState<RoomNotificationMode?> = rememberSaveable { val defaultRoomNotificationMode: MutableState<RoomNotificationMode?> = rememberSaveable {
@ -107,6 +116,7 @@ class RoomNotificationSettingsPresenter @Inject constructor(
} }
return RoomNotificationSettingsState( return RoomNotificationSettingsState(
showUserDefinedSettingStyle = showUserDefinedSettingStyle,
roomName = room.displayName, roomName = room.displayName,
roomNotificationSettings = roomNotificationSettings.value, roomNotificationSettings = roomNotificationSettings.value,
pendingRoomNotificationMode = pendingRoomNotificationMode.value, pendingRoomNotificationMode = pendingRoomNotificationMode.value,

View file

@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.RoomNotificationSettings import io.element.android.libraries.matrix.api.room.RoomNotificationSettings
data class RoomNotificationSettingsState( data class RoomNotificationSettingsState(
val showUserDefinedSettingStyle: Boolean,
val roomName: String, val roomName: String,
val roomNotificationSettings: Async<RoomNotificationSettings>, val roomNotificationSettings: Async<RoomNotificationSettings>,
val pendingRoomNotificationMode: RoomNotificationMode?, val pendingRoomNotificationMode: RoomNotificationMode?,

View file

@ -25,6 +25,7 @@ internal class RoomNotificationSettingsStateProvider : PreviewParameterProvider<
override val values: Sequence<RoomNotificationSettingsState> override val values: Sequence<RoomNotificationSettingsState>
get() = sequenceOf( get() = sequenceOf(
RoomNotificationSettingsState( RoomNotificationSettingsState(
showUserDefinedSettingStyle = false,
roomName = "Room 1", roomName = "Room 1",
Async.Success(RoomNotificationSettings( Async.Success(RoomNotificationSettings(
mode = RoomNotificationMode.MUTE, mode = RoomNotificationMode.MUTE,

View file

@ -45,11 +45,33 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.theme.ElementTheme import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
fun RoomNotificationSettingsView( fun RoomNotificationSettingsView(
state: RoomNotificationSettingsState, state: RoomNotificationSettingsState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {}, onBackPressed: () -> Unit = {},
) {
if(state.showUserDefinedSettingStyle) {
UserDefinedRoomNotificationSettingsView(
state = state,
modifier = modifier,
onBackPressed = onBackPressed,
)
} else {
RoomSpecificNotificationSettingsView(
state = state,
modifier = modifier,
onBackPressed = onBackPressed,
)
}
}
@Composable
private fun RoomSpecificNotificationSettingsView(
state: RoomNotificationSettingsState,
modifier: Modifier = Modifier,
onBackPressed: () -> Unit = {},
) { ) {
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,

View file

@ -25,6 +25,7 @@ internal class UserDefinedRoomNotificationSettingsStateProvider : PreviewParamet
override val values: Sequence<RoomNotificationSettingsState> override val values: Sequence<RoomNotificationSettingsState>
get() = sequenceOf( get() = sequenceOf(
RoomNotificationSettingsState( RoomNotificationSettingsState(
showUserDefinedSettingStyle = false,
roomName = "Room 1", roomName = "Room 1",
Async.Success( Async.Success(
RoomNotificationSettings( RoomNotificationSettings(

View file

@ -136,7 +136,8 @@ class RoomNotificationSettingsPresenterTests {
val room = aMatrixRoom(notificationSettingsService = notificationSettingsService) val room = aMatrixRoom(notificationSettingsService = notificationSettingsService)
return RoomNotificationSettingsPresenter( return RoomNotificationSettingsPresenter(
room = room, room = room,
notificationSettingsService = notificationSettingsService notificationSettingsService = notificationSettingsService,
showUserDefinedSettingStyle = false,
) )
} }
} }