Restructure integration settings screen
This commit is contained in:
@@ -44,6 +44,7 @@ import de.mm20.launcher2.ui.settings.favorites.FavoritesSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.filesearch.FileSearchSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.filterbar.FilterBarSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.gestures.GestureSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.google.GoogleSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.hiddenitems.HiddenItemsSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.homescreen.HomescreenSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.icons.IconsSettingsScreen
|
||||
@@ -53,6 +54,8 @@ import de.mm20.launcher2.ui.settings.locations.LocationsSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.log.LogScreen
|
||||
import de.mm20.launcher2.ui.settings.main.MainSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.media.MediaIntegrationSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.nextcloud.NextcloudSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.owncloud.OwncloudSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.plugins.PluginSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.plugins.PluginsSettingsScreen
|
||||
import de.mm20.launcher2.ui.settings.search.SearchSettingsScreen
|
||||
@@ -186,6 +189,15 @@ class SettingsActivity : BaseActivity() {
|
||||
composable("settings/integrations") {
|
||||
IntegrationsSettingsScreen()
|
||||
}
|
||||
composable("settings/integrations/nextcloud") {
|
||||
NextcloudSettingsScreen()
|
||||
}
|
||||
composable("settings/integrations/owncloud") {
|
||||
OwncloudSettingsScreen()
|
||||
}
|
||||
composable("settings/integrations/google") {
|
||||
GoogleSettingsScreen()
|
||||
}
|
||||
composable("settings/plugins") {
|
||||
PluginsSettingsScreen()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
package de.mm20.launcher2.ui.settings.google
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.rounded.Logout
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.compose.LocalLifecycleOwner
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
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.locals.LocalNavController
|
||||
import de.mm20.launcher2.ui.settings.integrations.GoogleSigninButton
|
||||
|
||||
@Composable
|
||||
fun GoogleSettingsScreen() {
|
||||
|
||||
val viewModel: GoogleSettingsScreenVM = viewModel()
|
||||
val lifecycleOwner = LocalLifecycleOwner.current
|
||||
val navController = LocalNavController.current
|
||||
|
||||
val googleUser by viewModel.googleUser
|
||||
val loading by viewModel.loading
|
||||
val searchFiles by viewModel.searchFiles.collectAsState(null)
|
||||
|
||||
LaunchedEffect(null) {
|
||||
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
viewModel.onResume()
|
||||
}
|
||||
}
|
||||
PreferenceScreen(title = stringResource(R.string.preference_google)) {
|
||||
if (loading) return@PreferenceScreen
|
||||
|
||||
if (googleUser != null) {
|
||||
item {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.secondaryContainer)
|
||||
.fillParentMaxWidth()
|
||||
.padding(vertical = 64.dp),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
modifier = Modifier
|
||||
.size(72.dp)
|
||||
.background(MaterialTheme.colorScheme.secondary, CircleShape)
|
||||
.border(
|
||||
2.dp,
|
||||
MaterialTheme.colorScheme.onSecondaryContainer,
|
||||
CircleShape
|
||||
),
|
||||
) {
|
||||
Text(
|
||||
text = googleUser!!.userName.split(" ")
|
||||
.map { it.first() }
|
||||
.joinToString("").let {
|
||||
if (it.length >= 2) it.first().toString() + it.last().toString()
|
||||
else it.first().toString()
|
||||
},
|
||||
color = MaterialTheme.colorScheme.onSecondary,
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
)
|
||||
}
|
||||
Text(
|
||||
modifier = Modifier.padding(top = 24.dp),
|
||||
text = stringResource(
|
||||
R.string.preference_signin_user,
|
||||
googleUser!!.userName
|
||||
),
|
||||
color = MaterialTheme.colorScheme.onSecondaryContainer,
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
)
|
||||
Button(
|
||||
modifier = Modifier.padding(top = 32.dp),
|
||||
onClick = {
|
||||
viewModel.signOut()
|
||||
},
|
||||
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
|
||||
) {
|
||||
Icon(
|
||||
Icons.AutoMirrored.Rounded.Logout,
|
||||
modifier = Modifier
|
||||
.padding(end = ButtonDefaults.IconSpacing)
|
||||
.size(ButtonDefaults.IconSize),
|
||||
contentDescription = null
|
||||
)
|
||||
Text(text = stringResource(R.string.preference_signout))
|
||||
}
|
||||
}
|
||||
}
|
||||
item {
|
||||
HorizontalDivider()
|
||||
}
|
||||
|
||||
item {
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.plugin_type_filesearch),
|
||||
summary = stringResource(
|
||||
R.string.preference_search_cloud_summary,
|
||||
googleUser!!.userName
|
||||
),
|
||||
value = searchFiles == true,
|
||||
onValueChanged = {
|
||||
viewModel.setSearchFiles(it)
|
||||
},
|
||||
iconPadding = false,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
item {
|
||||
val activity = LocalContext.current as AppCompatActivity
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillParentMaxWidth()
|
||||
.padding(vertical = 64.dp, horizontal = 24.dp),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
GoogleSigninButton(
|
||||
onClick = {
|
||||
viewModel.signIn(activity)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
item {
|
||||
HorizontalDivider()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package de.mm20.launcher2.ui.settings.google
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import de.mm20.launcher2.accounts.Account
|
||||
import de.mm20.launcher2.accounts.AccountType
|
||||
import de.mm20.launcher2.accounts.AccountsRepository
|
||||
import de.mm20.launcher2.preferences.search.FileSearchSettings
|
||||
import kotlinx.coroutines.launch
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
class GoogleSettingsScreenVM: ViewModel(), KoinComponent {
|
||||
private val accountsRepository: AccountsRepository by inject()
|
||||
private val fileSearchSettings: FileSearchSettings by inject()
|
||||
|
||||
val googleUser = mutableStateOf<Account?>(null)
|
||||
val loading = mutableStateOf(true)
|
||||
|
||||
fun onResume() {
|
||||
viewModelScope.launch {
|
||||
loading.value = true
|
||||
googleUser.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Google)
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
fun signIn(activity: AppCompatActivity) {
|
||||
accountsRepository.signin(activity, AccountType.Google)
|
||||
}
|
||||
|
||||
fun signOut() {
|
||||
accountsRepository.signout(AccountType.Google)
|
||||
googleUser.value = null
|
||||
}
|
||||
|
||||
val searchFiles = fileSearchSettings.gdriveFiles
|
||||
|
||||
fun setSearchFiles(value: Boolean) {
|
||||
fileSearchSettings.setGdriveFiles(value)
|
||||
}
|
||||
}
|
||||
+24
-67
@@ -34,6 +34,9 @@ import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import de.mm20.launcher2.accounts.AccountType
|
||||
import de.mm20.launcher2.icons.Google
|
||||
import de.mm20.launcher2.icons.Nextcloud
|
||||
import de.mm20.launcher2.icons.Owncloud
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.component.preferences.Preference
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
|
||||
@@ -55,7 +58,6 @@ fun IntegrationsSettingsScreen() {
|
||||
|
||||
val owncloudUser by viewModel.owncloudUser
|
||||
val nextcloudUser by viewModel.nextcloudUser
|
||||
val msUser by viewModel.msUser
|
||||
val googleUser by viewModel.googleUser
|
||||
|
||||
val loading by viewModel.loading
|
||||
@@ -83,73 +85,28 @@ fun IntegrationsSettingsScreen() {
|
||||
navController?.navigate("settings/integrations/media")
|
||||
}
|
||||
)
|
||||
}
|
||||
item {
|
||||
PreferenceCategory(
|
||||
title = stringResource(id = R.string.preference_category_accounts)
|
||||
) {
|
||||
|
||||
Preference(
|
||||
title = if (nextcloudUser != null) {
|
||||
stringResource(R.string.preference_nextcloud)
|
||||
} else {
|
||||
stringResource(R.string.preference_nextcloud_signin)
|
||||
},
|
||||
summary = nextcloudUser?.let {
|
||||
stringResource(R.string.preference_signin_user, it.userName)
|
||||
} ?: stringResource(R.string.preference_nextcloud_signin_summary),
|
||||
onClick = {
|
||||
if (nextcloudUser != null) {
|
||||
viewModel.signOut(AccountType.Nextcloud)
|
||||
} else {
|
||||
viewModel.signIn(context as AppCompatActivity, AccountType.Nextcloud)
|
||||
}
|
||||
},
|
||||
enabled = !loading,
|
||||
)
|
||||
|
||||
Preference(
|
||||
title = if (owncloudUser != null) {
|
||||
stringResource(R.string.preference_owncloud)
|
||||
} else {
|
||||
stringResource(R.string.preference_owncloud_signin)
|
||||
},
|
||||
summary = owncloudUser?.let {
|
||||
stringResource(R.string.preference_signin_user, it.userName)
|
||||
} ?: stringResource(R.string.preference_owncloud_signin_summary),
|
||||
onClick = {
|
||||
if (owncloudUser != null) {
|
||||
viewModel.signOut(AccountType.Owncloud)
|
||||
} else {
|
||||
viewModel.signIn(context as AppCompatActivity, AccountType.Owncloud)
|
||||
}
|
||||
},
|
||||
enabled = !loading,
|
||||
)
|
||||
|
||||
if (viewModel.isGoogleAvailable) {
|
||||
Preference(
|
||||
title = if (googleUser != null) {
|
||||
stringResource(R.string.preference_google)
|
||||
} else {
|
||||
stringResource(R.string.preference_google_signin)
|
||||
},
|
||||
summary = googleUser?.let {
|
||||
stringResource(R.string.preference_signin_user, it.userName)
|
||||
} ?: stringResource(R.string.preference_google_signin_summary),
|
||||
onClick = {
|
||||
if (googleUser != null) {
|
||||
viewModel.signOut(AccountType.Google)
|
||||
} else {
|
||||
viewModel.signIn(
|
||||
context as AppCompatActivity,
|
||||
AccountType.Google
|
||||
)
|
||||
}
|
||||
},
|
||||
enabled = !loading,
|
||||
)
|
||||
Preference(
|
||||
title = stringResource(R.string.preference_nextcloud),
|
||||
icon = Icons.Rounded.Nextcloud,
|
||||
onClick = {
|
||||
navController?.navigate("settings/integrations/nextcloud")
|
||||
}
|
||||
)
|
||||
Preference(
|
||||
title = stringResource(R.string.preference_owncloud),
|
||||
icon = Icons.Rounded.Owncloud,
|
||||
onClick = {
|
||||
navController?.navigate("settings/integrations/owncloud")
|
||||
}
|
||||
)
|
||||
if (viewModel.isGoogleAvailable) {
|
||||
Preference(
|
||||
title = stringResource(R.string.preference_google),
|
||||
icon = Icons.Rounded.Google,
|
||||
onClick = {
|
||||
navController?.navigate("settings/integrations/google")
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -17,7 +17,6 @@ class IntegrationsSettingsScreenVM : ViewModel(), KoinComponent {
|
||||
val isGoogleAvailable = accountsRepository.isSupported(AccountType.Google)
|
||||
|
||||
val googleUser = mutableStateOf<Account?>(null)
|
||||
val msUser= mutableStateOf<Account?>(null)
|
||||
val nextcloudUser = mutableStateOf<Account?>(null)
|
||||
val owncloudUser = mutableStateOf<Account?>(null)
|
||||
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
package de.mm20.launcher2.ui.settings.nextcloud
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import de.mm20.launcher2.accounts.Account
|
||||
import de.mm20.launcher2.accounts.AccountType
|
||||
import de.mm20.launcher2.accounts.AccountsRepository
|
||||
import de.mm20.launcher2.preferences.search.FileSearchSettings
|
||||
import kotlinx.coroutines.launch
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
class NextcloudSettingsScreenVM: ViewModel(), KoinComponent {
|
||||
private val accountsRepository: AccountsRepository by inject()
|
||||
private val fileSearchSettings: FileSearchSettings by inject()
|
||||
|
||||
val nextcloudUser = mutableStateOf<Account?>(null)
|
||||
val loading = mutableStateOf(true)
|
||||
|
||||
fun onResume() {
|
||||
viewModelScope.launch {
|
||||
loading.value = true
|
||||
nextcloudUser.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Nextcloud)
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
fun signIn(activity: AppCompatActivity) {
|
||||
accountsRepository.signin(activity, AccountType.Nextcloud)
|
||||
}
|
||||
|
||||
fun signOut() {
|
||||
accountsRepository.signout(AccountType.Nextcloud)
|
||||
nextcloudUser.value = null
|
||||
}
|
||||
|
||||
val searchFiles = fileSearchSettings.nextcloudFiles
|
||||
|
||||
fun setSearchFiles(value: Boolean) {
|
||||
fileSearchSettings.setNextcloudFiles(value)
|
||||
}
|
||||
}
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
package de.mm20.launcher2.ui.settings.nextcloud
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.aspectRatio
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.rounded.Login
|
||||
import androidx.compose.material.icons.automirrored.rounded.Logout
|
||||
import androidx.compose.material.icons.rounded.Logout
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.compose.LocalLifecycleOwner
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.component.preferences.Preference
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
||||
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
||||
import de.mm20.launcher2.ui.locals.LocalNavController
|
||||
|
||||
@Composable
|
||||
fun NextcloudSettingsScreen() {
|
||||
|
||||
val viewModel: NextcloudSettingsScreenVM = viewModel()
|
||||
val lifecycleOwner = LocalLifecycleOwner.current
|
||||
val navController = LocalNavController.current
|
||||
|
||||
val nextcloudUser by viewModel.nextcloudUser
|
||||
val loading by viewModel.loading
|
||||
val searchFiles by viewModel.searchFiles.collectAsState(null)
|
||||
|
||||
LaunchedEffect(null) {
|
||||
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
viewModel.onResume()
|
||||
}
|
||||
}
|
||||
PreferenceScreen(title = stringResource(R.string.preference_nextcloud)) {
|
||||
if (loading) return@PreferenceScreen
|
||||
|
||||
if (nextcloudUser != null) {
|
||||
item {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.secondaryContainer)
|
||||
.fillParentMaxWidth()
|
||||
.padding(vertical = 64.dp)
|
||||
,
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
modifier = Modifier
|
||||
.size(72.dp)
|
||||
.background(MaterialTheme.colorScheme.secondary, CircleShape)
|
||||
.border(2.dp, MaterialTheme.colorScheme.onSecondaryContainer, CircleShape),
|
||||
) {
|
||||
Text(
|
||||
text = nextcloudUser!!.userName.split(" ")
|
||||
.map { it.first() }
|
||||
.joinToString("").let {
|
||||
if (it.length >= 2) it.first().toString() + it.last().toString()
|
||||
else it.first().toString()
|
||||
}
|
||||
,
|
||||
color = MaterialTheme.colorScheme.onSecondary,
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
)
|
||||
}
|
||||
Text(
|
||||
modifier = Modifier.padding(top = 24.dp),
|
||||
text = stringResource(R.string.preference_signin_user, nextcloudUser!!.userName),
|
||||
color = MaterialTheme.colorScheme.onSecondaryContainer,
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
)
|
||||
Button(
|
||||
modifier = Modifier.padding(top = 32.dp),
|
||||
onClick = {
|
||||
viewModel.signOut()
|
||||
},
|
||||
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
|
||||
) {
|
||||
Icon(
|
||||
Icons.AutoMirrored.Rounded.Logout,
|
||||
modifier = Modifier
|
||||
.padding(end = ButtonDefaults.IconSpacing)
|
||||
.size(ButtonDefaults.IconSize),
|
||||
contentDescription = null)
|
||||
Text(text = stringResource(R.string.preference_signout))
|
||||
}
|
||||
}
|
||||
}
|
||||
item {
|
||||
HorizontalDivider()
|
||||
}
|
||||
|
||||
item {
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.plugin_type_filesearch),
|
||||
summary = stringResource(R.string.preference_search_cloud_summary, nextcloudUser!!.userName),
|
||||
value = searchFiles == true,
|
||||
onValueChanged = {
|
||||
viewModel.setSearchFiles(it)
|
||||
},
|
||||
iconPadding = false,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
item {
|
||||
val activity = LocalContext.current as AppCompatActivity
|
||||
Preference(
|
||||
title = stringResource(R.string.preference_nextcloud_signin),
|
||||
summary = stringResource(R.string.preference_nextcloud_signin_summary),
|
||||
icon = Icons.AutoMirrored.Rounded.Login,
|
||||
onClick = {
|
||||
viewModel.signIn(activity)
|
||||
}
|
||||
)
|
||||
}
|
||||
item {
|
||||
HorizontalDivider()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
package de.mm20.launcher2.ui.settings.owncloud
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.rounded.Login
|
||||
import androidx.compose.material.icons.automirrored.rounded.Logout
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.compose.LocalLifecycleOwner
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import de.mm20.launcher2.ui.R
|
||||
import de.mm20.launcher2.ui.component.preferences.Preference
|
||||
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
||||
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
|
||||
import de.mm20.launcher2.ui.locals.LocalNavController
|
||||
|
||||
@Composable
|
||||
fun OwncloudSettingsScreen() {
|
||||
|
||||
val viewModel: OwncloudSettingsScreenVM = viewModel()
|
||||
val lifecycleOwner = LocalLifecycleOwner.current
|
||||
val navController = LocalNavController.current
|
||||
|
||||
val owncloudUser by viewModel.owncloudUser
|
||||
val loading by viewModel.loading
|
||||
val searchFiles by viewModel.searchFiles.collectAsState(null)
|
||||
|
||||
LaunchedEffect(null) {
|
||||
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||
viewModel.onResume()
|
||||
}
|
||||
}
|
||||
PreferenceScreen(title = stringResource(R.string.preference_owncloud)) {
|
||||
if (loading) return@PreferenceScreen
|
||||
|
||||
if (owncloudUser != null) {
|
||||
item {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.background(MaterialTheme.colorScheme.secondaryContainer)
|
||||
.fillParentMaxWidth()
|
||||
.padding(vertical = 64.dp)
|
||||
,
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Box(
|
||||
contentAlignment = Alignment.Center,
|
||||
modifier = Modifier
|
||||
.size(72.dp)
|
||||
.background(MaterialTheme.colorScheme.secondary, CircleShape)
|
||||
.border(2.dp, MaterialTheme.colorScheme.onSecondaryContainer, CircleShape),
|
||||
) {
|
||||
Text(
|
||||
text = owncloudUser!!.userName.split(" ")
|
||||
.map { it.first() }
|
||||
.joinToString("").let {
|
||||
if (it.length >= 2) it.first().toString() + it.last().toString()
|
||||
else it.first().toString()
|
||||
}
|
||||
,
|
||||
color = MaterialTheme.colorScheme.onSecondary,
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
)
|
||||
}
|
||||
Text(
|
||||
modifier = Modifier.padding(top = 24.dp),
|
||||
text = stringResource(R.string.preference_signin_user, owncloudUser!!.userName),
|
||||
color = MaterialTheme.colorScheme.onSecondaryContainer,
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
)
|
||||
Button(
|
||||
modifier = Modifier.padding(top = 32.dp),
|
||||
onClick = {
|
||||
viewModel.signOut()
|
||||
},
|
||||
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
|
||||
) {
|
||||
Icon(
|
||||
Icons.AutoMirrored.Rounded.Logout,
|
||||
modifier = Modifier
|
||||
.padding(end = ButtonDefaults.IconSpacing)
|
||||
.size(ButtonDefaults.IconSize),
|
||||
contentDescription = null)
|
||||
Text(text = stringResource(R.string.preference_signout))
|
||||
}
|
||||
}
|
||||
}
|
||||
item {
|
||||
HorizontalDivider()
|
||||
}
|
||||
|
||||
item {
|
||||
SwitchPreference(
|
||||
title = stringResource(R.string.plugin_type_filesearch),
|
||||
summary = stringResource(R.string.preference_search_cloud_summary, owncloudUser!!.userName),
|
||||
value = searchFiles == true,
|
||||
onValueChanged = {
|
||||
viewModel.setSearchFiles(it)
|
||||
},
|
||||
iconPadding = false,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
item {
|
||||
val activity = LocalContext.current as AppCompatActivity
|
||||
Preference(
|
||||
title = stringResource(R.string.preference_owncloud_signin),
|
||||
summary = stringResource(R.string.preference_owncloud_signin_summary),
|
||||
icon = Icons.AutoMirrored.Rounded.Login,
|
||||
onClick = {
|
||||
viewModel.signIn(activity)
|
||||
}
|
||||
)
|
||||
}
|
||||
item {
|
||||
HorizontalDivider()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
package de.mm20.launcher2.ui.settings.owncloud
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import de.mm20.launcher2.accounts.Account
|
||||
import de.mm20.launcher2.accounts.AccountType
|
||||
import de.mm20.launcher2.accounts.AccountsRepository
|
||||
import de.mm20.launcher2.preferences.search.FileSearchSettings
|
||||
import kotlinx.coroutines.launch
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
|
||||
class OwncloudSettingsScreenVM: ViewModel(), KoinComponent {
|
||||
private val accountsRepository: AccountsRepository by inject()
|
||||
private val fileSearchSettings: FileSearchSettings by inject()
|
||||
|
||||
val owncloudUser = mutableStateOf<Account?>(null)
|
||||
val loading = mutableStateOf(true)
|
||||
|
||||
fun onResume() {
|
||||
viewModelScope.launch {
|
||||
loading.value = true
|
||||
owncloudUser.value = accountsRepository.getCurrentlySignedInAccount(AccountType.Owncloud)
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
fun signIn(activity: AppCompatActivity) {
|
||||
accountsRepository.signin(activity, AccountType.Owncloud)
|
||||
}
|
||||
|
||||
fun signOut() {
|
||||
accountsRepository.signout(AccountType.Owncloud)
|
||||
owncloudUser.value = null
|
||||
}
|
||||
|
||||
val searchFiles = fileSearchSettings.owncloudFiles
|
||||
|
||||
fun setSearchFiles(value: Boolean) {
|
||||
fileSearchSettings.setOwncloudFiles(value)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user