Migrate Wikipedia settings, add wikipedia base url setting

This commit is contained in:
MM20
2022-01-11 22:16:47 +01:00
parent a5cb2e3314
commit b1412d24f1
12 changed files with 238 additions and 88 deletions
@@ -0,0 +1,70 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.TextButton
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.res.stringResource
@Composable
fun TextPreference(
title: String,
value: String,
summary: String? = value,
onValueChanged: (String) -> Unit,
placeholder: String? = null
) {
var showDialog by remember { mutableStateOf(false) }
Preference(
title = title,
summary = summary,
onClick = { showDialog = true }
)
if (showDialog) {
var textFieldValue by remember { mutableStateOf(value) }
AlertDialog(
onDismissRequest = { showDialog = false },
title = {
Text(text = title, style = MaterialTheme.typography.titleLarge)
},
text = {
OutlinedTextField(
value = textFieldValue,
onValueChange = { textFieldValue = it },
placeholder = placeholder?.let {
{
Text(
text = it,
style = MaterialTheme.typography.bodyLarge
)
}
},
)
},
confirmButton = {
TextButton(onClick = {
onValueChanged(textFieldValue)
showDialog = false
}) {
Text(
text = stringResource(android.R.string.ok),
style = MaterialTheme.typography.labelLarge
)
}
},
dismissButton = {
TextButton(onClick = {
showDialog = false
}) {
Text(
text = stringResource(android.R.string.cancel),
style = MaterialTheme.typography.labelLarge
)
}
}
)
}
}
@@ -32,6 +32,7 @@ import de.mm20.launcher2.ui.settings.musicwidget.MusicWidgetSettingsScreen
import de.mm20.launcher2.ui.settings.search.SearchSettingsScreen
import de.mm20.launcher2.ui.settings.weatherwidget.WeatherWidgetSettingsScreen
import de.mm20.launcher2.ui.settings.widgets.WidgetsSettingsScreen
import de.mm20.launcher2.ui.settings.wikipedia.WikipediaSettingsScreen
class SettingsActivity : BaseActivity() {
@@ -90,6 +91,9 @@ class SettingsActivity : BaseActivity() {
composable("settings/search") {
SearchSettingsScreen()
}
composable("settings/search/wikipedia") {
WikipediaSettingsScreen()
}
composable("settings/widgets") {
WidgetsSettingsScreen()
}
@@ -17,6 +17,7 @@ import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.MissingPermissionBanner
import de.mm20.launcher2.ui.component.preferences.*
import de.mm20.launcher2.ui.icons.Wikipedia
import de.mm20.launcher2.ui.locals.LocalNavController
@Composable
fun SearchSettingsScreen() {
@@ -24,6 +25,8 @@ fun SearchSettingsScreen() {
val viewModel: SearchSettingsScreenVM = viewModel()
val context = LocalContext.current
val navController = LocalNavController.current
PreferenceScreen(title = stringResource(R.string.preference_screen_search)) {
item {
PreferenceCategory {
@@ -116,6 +119,9 @@ fun SearchSettingsScreen() {
switchValue = wikipedia == true,
onSwitchChanged = {
viewModel.setWikipedia(it)
},
onClick = {
navController?.navigate("settings/search/wikipedia")
}
)
@@ -0,0 +1,49 @@
package de.mm20.launcher2.ui.settings.wikipedia
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
import de.mm20.launcher2.ui.component.preferences.TextPreference
@Composable
fun WikipediaSettingsScreen() {
val viewModel: WikipediaSettingsScreenVM = viewModel()
PreferenceScreen(title = stringResource(R.string.preference_search_wikipedia)) {
item {
val wikipedia by viewModel.wikipedia.observeAsState()
SwitchPreference(
title = stringResource(R.string.preference_search_wikipedia),
summary = stringResource(R.string.preference_search_wikipedia_summary),
value = wikipedia == true,
onValueChanged = {
viewModel.setWikipedia(it)
}
)
val images by viewModel.images.observeAsState()
SwitchPreference(
title = stringResource(R.string.preference_search_wikipedia_pictures),
summary = stringResource(R.string.preference_search_wikipedia_pictures_summary),
enabled = wikipedia == true,
value = images == true,
onValueChanged = {
viewModel.setImages(it)
}
)
val customUrl by viewModel.customUrl.observeAsState("")
TextPreference(
title = stringResource(R.string.preference_wikipedia_customurl),
value = customUrl,
placeholder = stringResource(id = R.string.wikipedia_url),
summary = customUrl.takeIf { !it.isNullOrBlank() }
?: stringResource(id = R.string.wikipedia_url),
onValueChanged = {
viewModel.setCustomUrl(it)
})
}
}
}
@@ -0,0 +1,56 @@
package de.mm20.launcher2.ui.settings.wikipedia
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import de.mm20.launcher2.preferences.LauncherDataStore
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class WikipediaSettingsScreenVM: ViewModel(), KoinComponent {
private val dataStore: LauncherDataStore by inject()
val wikipedia = dataStore.data.map { it.wikipediaSearch.enabled }.asLiveData()
fun setWikipedia(wikipedia: Boolean) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setWikipediaSearch(
it.wikipediaSearch.toBuilder()
.setEnabled(wikipedia)
)
.build()
}
}
}
val images = dataStore.data.map { it.wikipediaSearch.images }.asLiveData()
fun setImages(images: Boolean) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setWikipediaSearch(
it.wikipediaSearch.toBuilder()
.setImages(images)
)
.build()
}
}
}
val customUrl = dataStore.data.map { it.wikipediaSearch.customUrl }.asLiveData()
fun setCustomUrl(customUrl: String) {
viewModelScope.launch {
dataStore.updateData {
it.toBuilder()
.setWikipediaSearch(
it.wikipediaSearch.toBuilder()
.setCustomUrl(customUrl)
)
.build()
}
}
}
}