Add distributor selection in advanced settings
This commit is contained in:
parent
eb0dcd6b8c
commit
591df14450
6 changed files with 89 additions and 0 deletions
|
|
@ -57,6 +57,7 @@ dependencies {
|
||||||
implementation(projects.libraries.mediaupload.api)
|
implementation(projects.libraries.mediaupload.api)
|
||||||
implementation(projects.libraries.permissions.api)
|
implementation(projects.libraries.permissions.api)
|
||||||
implementation(projects.libraries.push.api)
|
implementation(projects.libraries.push.api)
|
||||||
|
implementation(projects.libraries.pushproviders.api)
|
||||||
implementation(projects.features.rageshake.api)
|
implementation(projects.features.rageshake.api)
|
||||||
implementation(projects.features.lockscreen.api)
|
implementation(projects.features.lockscreen.api)
|
||||||
implementation(projects.features.analytics.api)
|
implementation(projects.features.analytics.api)
|
||||||
|
|
|
||||||
|
|
@ -24,4 +24,7 @@ sealed interface AdvancedSettingsEvents {
|
||||||
data object ChangeTheme : AdvancedSettingsEvents
|
data object ChangeTheme : AdvancedSettingsEvents
|
||||||
data object CancelChangeTheme : AdvancedSettingsEvents
|
data object CancelChangeTheme : AdvancedSettingsEvents
|
||||||
data class SetTheme(val theme: Theme) : AdvancedSettingsEvents
|
data class SetTheme(val theme: Theme) : AdvancedSettingsEvents
|
||||||
|
data object ChangePushProvider : AdvancedSettingsEvents
|
||||||
|
data object CancelChangePushProvider : AdvancedSettingsEvents
|
||||||
|
data class SetPushProvider(val distributorName: String) : AdvancedSettingsEvents
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,10 @@
|
||||||
package io.element.android.features.preferences.impl.advanced
|
package io.element.android.features.preferences.impl.advanced
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableIntStateOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
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
|
||||||
|
|
@ -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.AppPreferencesStore
|
||||||
import io.element.android.features.preferences.api.store.SessionPreferencesStore
|
import io.element.android.features.preferences.api.store.SessionPreferencesStore
|
||||||
import io.element.android.libraries.architecture.Presenter
|
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 kotlinx.coroutines.launch
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class AdvancedSettingsPresenter @Inject constructor(
|
class AdvancedSettingsPresenter @Inject constructor(
|
||||||
private val appPreferencesStore: AppPreferencesStore,
|
private val appPreferencesStore: AppPreferencesStore,
|
||||||
private val sessionPreferencesStore: SessionPreferencesStore,
|
private val sessionPreferencesStore: SessionPreferencesStore,
|
||||||
|
private val matrixClient: MatrixClient,
|
||||||
|
private val pushService: PushService,
|
||||||
) : Presenter<AdvancedSettingsState> {
|
) : Presenter<AdvancedSettingsState> {
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): AdvancedSettingsState {
|
override fun present(): AdvancedSettingsState {
|
||||||
|
|
@ -49,6 +56,21 @@ class AdvancedSettingsPresenter @Inject constructor(
|
||||||
}
|
}
|
||||||
.collectAsState(initial = Theme.System)
|
.collectAsState(initial = Theme.System)
|
||||||
var showChangeThemeDialog by remember { mutableStateOf(false) }
|
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) {
|
fun handleEvents(event: AdvancedSettingsEvents) {
|
||||||
when (event) {
|
when (event) {
|
||||||
is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch {
|
is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch {
|
||||||
|
|
@ -63,6 +85,25 @@ class AdvancedSettingsPresenter @Inject constructor(
|
||||||
appPreferencesStore.setTheme(event.theme.name)
|
appPreferencesStore.setTheme(event.theme.name)
|
||||||
showChangeThemeDialog = false
|
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,
|
isSharePresenceEnabled = isSharePresenceEnabled,
|
||||||
theme = theme,
|
theme = theme,
|
||||||
showChangeThemeDialog = showChangeThemeDialog,
|
showChangeThemeDialog = showChangeThemeDialog,
|
||||||
|
pushDistributor = currentPushProvider ?: "",
|
||||||
|
pushDistributors = distributors.toImmutableList(),
|
||||||
|
showChangePushProviderDialog = showChangePushProviderDialog,
|
||||||
eventSink = { handleEvents(it) }
|
eventSink = { handleEvents(it) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,15 @@
|
||||||
package io.element.android.features.preferences.impl.advanced
|
package io.element.android.features.preferences.impl.advanced
|
||||||
|
|
||||||
import io.element.android.compound.theme.Theme
|
import io.element.android.compound.theme.Theme
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
||||||
data class AdvancedSettingsState(
|
data class AdvancedSettingsState(
|
||||||
val isDeveloperModeEnabled: Boolean,
|
val isDeveloperModeEnabled: Boolean,
|
||||||
val isSharePresenceEnabled: Boolean,
|
val isSharePresenceEnabled: Boolean,
|
||||||
val theme: Theme,
|
val theme: Theme,
|
||||||
val showChangeThemeDialog: Boolean,
|
val showChangeThemeDialog: Boolean,
|
||||||
|
val pushDistributor: String,
|
||||||
|
val pushDistributors: ImmutableList<String>,
|
||||||
|
val showChangePushProviderDialog: Boolean,
|
||||||
val eventSink: (AdvancedSettingsEvents) -> Unit
|
val eventSink: (AdvancedSettingsEvents) -> Unit
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.advanced
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import io.element.android.compound.theme.Theme
|
import io.element.android.compound.theme.Theme
|
||||||
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSettingsState> {
|
open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSettingsState> {
|
||||||
override val values: Sequence<AdvancedSettingsState>
|
override val values: Sequence<AdvancedSettingsState>
|
||||||
|
|
@ -26,6 +27,7 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSett
|
||||||
aAdvancedSettingsState(isDeveloperModeEnabled = true),
|
aAdvancedSettingsState(isDeveloperModeEnabled = true),
|
||||||
aAdvancedSettingsState(showChangeThemeDialog = true),
|
aAdvancedSettingsState(showChangeThemeDialog = true),
|
||||||
aAdvancedSettingsState(isSendPublicReadReceiptsEnabled = true),
|
aAdvancedSettingsState(isSendPublicReadReceiptsEnabled = true),
|
||||||
|
aAdvancedSettingsState(showChangePushProviderDialog = true),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -33,10 +35,16 @@ fun aAdvancedSettingsState(
|
||||||
isDeveloperModeEnabled: Boolean = false,
|
isDeveloperModeEnabled: Boolean = false,
|
||||||
isSendPublicReadReceiptsEnabled: Boolean = false,
|
isSendPublicReadReceiptsEnabled: Boolean = false,
|
||||||
showChangeThemeDialog: Boolean = false,
|
showChangeThemeDialog: Boolean = false,
|
||||||
|
pushDistributor: String = "Firebase",
|
||||||
|
pushDistributors: List<String> = listOf("Firebase", "ntfy"),
|
||||||
|
showChangePushProviderDialog: Boolean = false,
|
||||||
) = AdvancedSettingsState(
|
) = AdvancedSettingsState(
|
||||||
isDeveloperModeEnabled = isDeveloperModeEnabled,
|
isDeveloperModeEnabled = isDeveloperModeEnabled,
|
||||||
isSharePresenceEnabled = isSendPublicReadReceiptsEnabled,
|
isSharePresenceEnabled = isSendPublicReadReceiptsEnabled,
|
||||||
theme = Theme.System,
|
theme = Theme.System,
|
||||||
showChangeThemeDialog = showChangeThemeDialog,
|
showChangeThemeDialog = showChangeThemeDialog,
|
||||||
|
pushDistributor = pushDistributor,
|
||||||
|
pushDistributors = pushDistributors.toImmutableList(),
|
||||||
|
showChangePushProviderDialog = showChangePushProviderDialog,
|
||||||
eventSink = {}
|
eventSink = {}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,18 @@ fun AdvancedSettingsView(
|
||||||
),
|
),
|
||||||
onClick = { state.eventSink(AdvancedSettingsEvents.SetSharePresenceEnabled(!state.isSharePresenceEnabled)) }
|
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) {
|
if (state.showChangeThemeDialog) {
|
||||||
|
|
@ -97,6 +109,23 @@ fun AdvancedSettingsView(
|
||||||
onDismissRequest = { state.eventSink(AdvancedSettingsEvents.CancelChangeTheme) },
|
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
|
@Composable
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue