Add distributor selection in advanced settings

This commit is contained in:
Benoit Marty
2024-05-06 22:32:54 +02:00
committed by Benoit Marty
parent eb0dcd6b8c
commit 591df14450
6 changed files with 89 additions and 0 deletions

View File

@@ -57,6 +57,7 @@ dependencies {
implementation(projects.libraries.mediaupload.api)
implementation(projects.libraries.permissions.api)
implementation(projects.libraries.push.api)
implementation(projects.libraries.pushproviders.api)
implementation(projects.features.rageshake.api)
implementation(projects.features.lockscreen.api)
implementation(projects.features.analytics.api)

View File

@@ -24,4 +24,7 @@ sealed interface AdvancedSettingsEvents {
data object ChangeTheme : AdvancedSettingsEvents
data object CancelChangeTheme : AdvancedSettingsEvents
data class SetTheme(val theme: Theme) : AdvancedSettingsEvents
data object ChangePushProvider : AdvancedSettingsEvents
data object CancelChangePushProvider : AdvancedSettingsEvents
data class SetPushProvider(val distributorName: String) : AdvancedSettingsEvents
}

View File

@@ -17,8 +17,10 @@
package io.element.android.features.preferences.impl.advanced
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@@ -28,12 +30,17 @@ import io.element.android.compound.theme.mapToTheme
import io.element.android.features.preferences.api.store.AppPreferencesStore
import io.element.android.features.preferences.api.store.SessionPreferencesStore
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.push.api.PushService
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
import javax.inject.Inject
class AdvancedSettingsPresenter @Inject constructor(
private val appPreferencesStore: AppPreferencesStore,
private val sessionPreferencesStore: SessionPreferencesStore,
private val matrixClient: MatrixClient,
private val pushService: PushService,
) : Presenter<AdvancedSettingsState> {
@Composable
override fun present(): AdvancedSettingsState {
@@ -49,6 +56,21 @@ class AdvancedSettingsPresenter @Inject constructor(
}
.collectAsState(initial = Theme.System)
var showChangeThemeDialog by remember { mutableStateOf(false) }
var currentPushProvider by remember { mutableStateOf<String?>(null) }
var distributors by remember { mutableStateOf<List<String>>(emptyList()) }
var refreshPushProvider by remember { mutableIntStateOf(0) }
LaunchedEffect(refreshPushProvider) {
val p = pushService.getCurrentPushProvider()
currentPushProvider = p?.getCurrentDistributor(matrixClient)?.name
distributors = pushService.getAvailablePushProviders()
.flatMap { pushProvider ->
pushProvider.getDistributors().map { it.name }
}
}
var showChangePushProviderDialog by remember { mutableStateOf(false) }
fun handleEvents(event: AdvancedSettingsEvents) {
when (event) {
is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch {
@@ -63,6 +85,25 @@ class AdvancedSettingsPresenter @Inject constructor(
appPreferencesStore.setTheme(event.theme.name)
showChangeThemeDialog = false
}
AdvancedSettingsEvents.ChangePushProvider -> showChangePushProviderDialog = true
AdvancedSettingsEvents.CancelChangePushProvider -> showChangePushProviderDialog = false
is AdvancedSettingsEvents.SetPushProvider -> {
localCoroutineScope.launch {
// Retrieve the push provider
// TODO rework this
val pushProvider = pushService.getAvailablePushProviders().firstOrNull { pushProvider ->
pushProvider.getDistributors().any { it.name == event.distributorName }
} ?: return@launch
val distributor = pushProvider.getDistributors().firstOrNull { it.name == event.distributorName } ?: return@launch
pushService.registerWith(
matrixClient,
pushProvider = pushProvider,
distributor = distributor
)
showChangePushProviderDialog = false
refreshPushProvider++
}
}
}
}
@@ -71,6 +112,9 @@ class AdvancedSettingsPresenter @Inject constructor(
isSharePresenceEnabled = isSharePresenceEnabled,
theme = theme,
showChangeThemeDialog = showChangeThemeDialog,
pushDistributor = currentPushProvider ?: "",
pushDistributors = distributors.toImmutableList(),
showChangePushProviderDialog = showChangePushProviderDialog,
eventSink = { handleEvents(it) }
)
}

View File

@@ -17,11 +17,15 @@
package io.element.android.features.preferences.impl.advanced
import io.element.android.compound.theme.Theme
import kotlinx.collections.immutable.ImmutableList
data class AdvancedSettingsState(
val isDeveloperModeEnabled: Boolean,
val isSharePresenceEnabled: Boolean,
val theme: Theme,
val showChangeThemeDialog: Boolean,
val pushDistributor: String,
val pushDistributors: ImmutableList<String>,
val showChangePushProviderDialog: Boolean,
val eventSink: (AdvancedSettingsEvents) -> Unit
)

View File

@@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.advanced
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.compound.theme.Theme
import kotlinx.collections.immutable.toImmutableList
open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSettingsState> {
override val values: Sequence<AdvancedSettingsState>
@@ -26,6 +27,7 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSett
aAdvancedSettingsState(isDeveloperModeEnabled = true),
aAdvancedSettingsState(showChangeThemeDialog = true),
aAdvancedSettingsState(isSendPublicReadReceiptsEnabled = true),
aAdvancedSettingsState(showChangePushProviderDialog = true),
)
}
@@ -33,10 +35,16 @@ fun aAdvancedSettingsState(
isDeveloperModeEnabled: Boolean = false,
isSendPublicReadReceiptsEnabled: Boolean = false,
showChangeThemeDialog: Boolean = false,
pushDistributor: String = "Firebase",
pushDistributors: List<String> = listOf("Firebase", "ntfy"),
showChangePushProviderDialog: Boolean = false,
) = AdvancedSettingsState(
isDeveloperModeEnabled = isDeveloperModeEnabled,
isSharePresenceEnabled = isSendPublicReadReceiptsEnabled,
theme = Theme.System,
showChangeThemeDialog = showChangeThemeDialog,
pushDistributor = pushDistributor,
pushDistributors = pushDistributors.toImmutableList(),
showChangePushProviderDialog = showChangePushProviderDialog,
eventSink = {}
)

View File

@@ -81,6 +81,18 @@ fun AdvancedSettingsView(
),
onClick = { state.eventSink(AdvancedSettingsEvents.SetSharePresenceEnabled(!state.isSharePresenceEnabled)) }
)
ListItem(
headlineContent = {
// TODO i18n
Text(text = "Push provider")
},
trailingContent = ListItemContent.Text(
state.pushDistributor
),
onClick = {
state.eventSink(AdvancedSettingsEvents.ChangePushProvider)
}
)
}
if (state.showChangeThemeDialog) {
@@ -97,6 +109,23 @@ fun AdvancedSettingsView(
onDismissRequest = { state.eventSink(AdvancedSettingsEvents.CancelChangeTheme) },
)
}
if (state.showChangePushProviderDialog) {
SingleSelectionDialog(
options = state.pushDistributors.map {
ListOption(title = it)
}.toImmutableList(),
initialSelection = state.pushDistributors.indexOf(state.pushDistributor),
onOptionSelected = {
state.eventSink(
AdvancedSettingsEvents.SetPushProvider(
state.pushDistributors[it]
)
)
},
onDismissRequest = { state.eventSink(AdvancedSettingsEvents.CancelChangePushProvider) },
)
}
}
@Composable