Project Cleanup/Refactor
This commit is contained in:
@@ -3,8 +3,8 @@ package net.helcel.cowspent.android.project.edit
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
|
import androidx.activity.enableEdgeToEdge
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
@@ -13,12 +13,11 @@ import kotlinx.coroutines.launch
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import net.helcel.cowspent.R
|
import net.helcel.cowspent.R
|
||||||
import net.helcel.cowspent.android.helper.showToast
|
import net.helcel.cowspent.android.helper.showToast
|
||||||
|
import net.helcel.cowspent.android.main.MainConstants
|
||||||
import net.helcel.cowspent.model.DBProject
|
import net.helcel.cowspent.model.DBProject
|
||||||
import net.helcel.cowspent.persistence.CowspentSQLiteOpenHelper
|
import net.helcel.cowspent.persistence.CowspentSQLiteOpenHelper
|
||||||
import net.helcel.cowspent.theme.ThemeUtils
|
import net.helcel.cowspent.theme.ThemeUtils
|
||||||
import net.helcel.cowspent.util.ICallback
|
import net.helcel.cowspent.util.ICallback
|
||||||
import net.helcel.cowspent.util.SupportUtil
|
|
||||||
import net.helcel.cowspent.android.main.MainConstants
|
|
||||||
|
|
||||||
|
|
||||||
class EditProjectActivity : AppCompatActivity() {
|
class EditProjectActivity : AppCompatActivity() {
|
||||||
@@ -56,29 +55,33 @@ class EditProjectActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onSave() {
|
private fun onSave() {
|
||||||
|
when (viewModel.validate()) {
|
||||||
|
EditProjectViewModel.ValidationError.EMPTY_NAME -> {
|
||||||
|
showToast(this, getString(R.string.error_invalid_project_name), Toast.LENGTH_LONG)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
EditProjectViewModel.ValidationError.INVALID_EMAIL -> {
|
||||||
|
showToast(this, getString(R.string.error_invalid_email), Toast.LENGTH_LONG)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
null -> Unit
|
||||||
|
}
|
||||||
|
|
||||||
|
val changes = viewModel.changesFrom(project)
|
||||||
|
if (!changes.any) {
|
||||||
|
showToast(this, getString(R.string.project_edition_no_change), Toast.LENGTH_LONG)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
val currentPwd = viewModel.password
|
val currentPwd = viewModel.password
|
||||||
val newPwd = viewModel.newPassword
|
val newPwd = viewModel.newPassword
|
||||||
val newName = viewModel.name
|
val newName = viewModel.name
|
||||||
val newEmail = viewModel.email
|
val newEmail = viewModel.email
|
||||||
|
|
||||||
if (newName.isEmpty()) {
|
val nameChanged = changes.name
|
||||||
showToast(this, getString(R.string.error_invalid_project_name), Toast.LENGTH_LONG)
|
val emailChanged = changes.email
|
||||||
return
|
val pwdChanged = changes.newPassword
|
||||||
}
|
val currentPwdChanged = changes.currentPassword
|
||||||
if (newEmail.isNotEmpty() && !SupportUtil.isValidEmail(newEmail)) {
|
|
||||||
showToast(this, getString(R.string.error_invalid_email), Toast.LENGTH_LONG)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val nameChanged = newName != project.name
|
|
||||||
val emailChanged = newEmail != project.email
|
|
||||||
val pwdChanged = newPwd != project.password
|
|
||||||
val currentPwdChanged = currentPwd != project.password
|
|
||||||
|
|
||||||
if (!nameChanged && !emailChanged && !pwdChanged && !currentPwdChanged) {
|
|
||||||
showToast(this, getString(R.string.project_edition_no_change), Toast.LENGTH_LONG)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (project.isLocal) {
|
if (project.isLocal) {
|
||||||
val targetPwd = if (pwdChanged) newPwd else currentPwd
|
val targetPwd = if (pwdChanged) newPwd else currentPwd
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
|||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import net.helcel.cowspent.android.helper.DialogState
|
import net.helcel.cowspent.android.helper.DialogState
|
||||||
import net.helcel.cowspent.model.DBProject
|
import net.helcel.cowspent.model.DBProject
|
||||||
|
import net.helcel.cowspent.util.SupportUtil
|
||||||
|
|
||||||
class EditProjectViewModel : ViewModel() {
|
class EditProjectViewModel : ViewModel() {
|
||||||
var name by mutableStateOf("")
|
var name by mutableStateOf("")
|
||||||
@@ -17,6 +18,31 @@ class EditProjectViewModel : ViewModel() {
|
|||||||
|
|
||||||
var dialogState by mutableStateOf<DialogState?>(null)
|
var dialogState by mutableStateOf<DialogState?>(null)
|
||||||
|
|
||||||
|
enum class ValidationError { EMPTY_NAME, INVALID_EMAIL }
|
||||||
|
|
||||||
|
fun validate(): ValidationError? = when {
|
||||||
|
name.isBlank() -> ValidationError.EMPTY_NAME
|
||||||
|
email.isNotEmpty() && !SupportUtil.isValidEmail(email) -> ValidationError.INVALID_EMAIL
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Changes(
|
||||||
|
val name: Boolean,
|
||||||
|
val email: Boolean,
|
||||||
|
val newPassword: Boolean,
|
||||||
|
val currentPassword: Boolean
|
||||||
|
) {
|
||||||
|
val any: Boolean get() = name || email || newPassword || currentPassword
|
||||||
|
}
|
||||||
|
|
||||||
|
fun changesFrom(project: DBProject) = Changes(
|
||||||
|
name = name != project.name,
|
||||||
|
// initFromProject maps a null or "null" email to "", so treat those as unchanged
|
||||||
|
email = email != project.email && !(email.isEmpty() && project.email == null),
|
||||||
|
newPassword = newPassword != project.password,
|
||||||
|
currentPassword = password != project.password
|
||||||
|
)
|
||||||
|
|
||||||
fun showDialog(
|
fun showDialog(
|
||||||
title: String? = null,
|
title: String? = null,
|
||||||
message: String? = null,
|
message: String? = null,
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package net.helcel.cowspent.android.statistics
|
|||||||
import android.app.DatePickerDialog
|
import android.app.DatePickerDialog
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.rememberScrollState
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.*
|
import androidx.compose.material.*
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.*
|
import androidx.compose.material.icons.filled.*
|
||||||
@@ -285,9 +285,18 @@ fun ProjectStatisticsTable(
|
|||||||
|
|
||||||
Spacer(modifier = Modifier.height(4.dp))
|
Spacer(modifier = Modifier.height(4.dp))
|
||||||
|
|
||||||
LazyColumn(modifier = Modifier.weight(1f)) {
|
Column(
|
||||||
items(stats.memberStats) { m ->
|
modifier = Modifier
|
||||||
Row(modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp, horizontal = 8.dp), verticalAlignment = Alignment.CenterVertically) {
|
.weight(1f)
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
) {
|
||||||
|
stats.memberStats.forEach { m ->
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(vertical = 12.dp, horizontal = 8.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
Text(m.name, modifier = Modifier.weight(2f), color = MaterialTheme.colors.onSurface, fontWeight = FontWeight.Medium)
|
Text(m.name, modifier = Modifier.weight(2f), color = MaterialTheme.colors.onSurface, fontWeight = FontWeight.Medium)
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
|
|||||||
Reference in New Issue
Block a user