Added first data validator to AddBatteryFragment.kt

This commit is contained in:
Sockenklaus
2022-07-19 11:48:38 +02:00
parent 7bc969c6c0
commit cc18e7bf50
3 changed files with 62 additions and 9 deletions

View File

@@ -14,17 +14,16 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout import androidx.lifecycle.asLiveData
import androidx.constraintlayout.compose.Dimension
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.sockenklaus.batterytracker.R import com.sockenklaus.batterytracker.R
import com.sockenklaus.batterytracker.databinding.FragmentAddBatteryBinding import com.sockenklaus.batterytracker.databinding.FragmentAddBatteryBinding
import com.sockenklaus.batterytracker.room.BatteryTrackerDB import com.sockenklaus.batterytracker.room.BatteryTrackerDB
import com.sockenklaus.batterytracker.room.entities.Battery import com.sockenklaus.batterytracker.room.entities.Battery
import com.sockenklaus.batterytracker.ui.theme.BatteryTrackerTheme import com.sockenklaus.batterytracker.ui.theme.BatteryTrackerTheme
import com.sockenklaus.batterytracker.ui.theme.Gray500
import com.sockenklaus.batterytracker.util.validateDecimal import com.sockenklaus.batterytracker.util.validateDecimal
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -45,13 +44,26 @@ class AddBatteryFragment : Fragment() {
): View { ): View {
_binding = FragmentAddBatteryBinding.inflate(inflater, container, false) _binding = FragmentAddBatteryBinding.inflate(inflater, container, false)
val db = BatteryTrackerDB.getInstance(requireContext())
val view = binding.root val view = binding.root
val batteries = db.batteryDao().getBatteries().asLiveData()
var listBatteries = emptyList<Battery>()
batteries.observe(viewLifecycleOwner) {
listBatteries = it
}
binding.root.setContent { binding.root.setContent {
BatteryTrackerTheme { BatteryTrackerTheme {
var batteryId by remember { mutableStateOf("") } var batteryId by remember { mutableStateOf("") }
var declaredCapacity by remember { mutableStateOf("")} var declaredCapacity by remember { mutableStateOf("")}
var batteryIsError by remember { mutableStateOf(false) }
var batteryHelper: Int? by remember { mutableStateOf(null) }
var chargeIsError by remember { mutableStateOf(false) }
var chargeHelper: Int? by remember { mutableStateOf(null) }
val outerPadding = 24.dp val outerPadding = 24.dp
val innerPadding = 16.dp val innerPadding = 16.dp
@@ -60,9 +72,19 @@ class AddBatteryFragment : Fragment() {
) { ) {
MyOutlinedTextField( MyOutlinedTextField(
value = batteryId, value = batteryId,
onValueChange = { batteryId = it }, onValueChange = { value ->
batteryId = value
onChangeBatteryId(
value = value,
batteries = listBatteries,
changeHelper = { ch -> batteryHelper = ch },
changeIsError = { ce -> batteryIsError = ce }
)
},
labelId = R.string.hint_enter_battery_id, labelId = R.string.hint_enter_battery_id,
leadingIcon = { Icon(Icons.Default.Tag, "Icon Tag") } leadingIcon = { Icon(Icons.Default.Tag, "Icon Tag") },
isError = batteryIsError,
helperTextId = batteryHelper
) )
Spacer(Modifier.size(innerPadding)) Spacer(Modifier.size(innerPadding))
@@ -72,7 +94,9 @@ class AddBatteryFragment : Fragment() {
onValueChange = { declaredCapacity = validateDecimal(it, declaredCapacity) }, onValueChange = { declaredCapacity = validateDecimal(it, declaredCapacity) },
labelId = R.string.hint_enter_declared_capacity, labelId = R.string.hint_enter_declared_capacity,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal),
leadingIcon = { Icon(Icons.Default.BatteryFull, "Icon Battery Full") } leadingIcon = { Icon(Icons.Default.BatteryFull, "Icon Battery Full") },
isError = chargeIsError,
helperTextId = chargeHelper
) )
Spacer(Modifier.size(outerPadding)) Spacer(Modifier.size(outerPadding))
@@ -101,23 +125,49 @@ class AddBatteryFragment : Fragment() {
labelId: Int, labelId: Int,
leadingIcon: (@Composable () -> Unit)? = null, leadingIcon: (@Composable () -> Unit)? = null,
isError: Boolean = false, isError: Boolean = false,
helperText: String = "" helperTextId: Int? = null
) { ) {
val helperTextColor = if(isError){
MaterialTheme.colors.error
} else {
Gray500
}
OutlinedTextField( OutlinedTextField(
value = value, value = value,
onValueChange = onValueChange, onValueChange = onValueChange,
keyboardOptions = keyboardOptions, keyboardOptions = keyboardOptions,
label = { Text(stringResource(labelId)) }, label = { Text(stringResource(labelId)) },
leadingIcon = leadingIcon, leadingIcon = leadingIcon,
isError = isError,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) )
Text( Text(
text = helperText, text = stringResource(helperTextId ?: R.string.helper_required),
style = MaterialTheme.typography.caption, style = MaterialTheme.typography.caption,
color = helperTextColor,
modifier = Modifier.padding(start = 16.dp) modifier = Modifier.padding(start = 16.dp)
) )
} }
private fun onChangeBatteryId(
value: String,
batteries: List<Battery>,
changeIsError: (Boolean) -> Unit,
changeHelper: (Int?) -> Unit
) {
changeIsError(false)
changeHelper(null)
if(batteries.any{ it.id.lowercase() == value.lowercase() }){
changeIsError(true)
changeHelper(R.string.helper_battery_not_unique)
}
if(value.isEmpty()){
changeIsError(true)
changeHelper(null)
}
}
/* /*
TODO: Implement the action TODO: Implement the action
*/ */

View File

@@ -6,3 +6,4 @@ val Purple200 = Color(0xFFBB86FC)
val Purple500 = Color(0xFF6200EE) val Purple500 = Color(0xFF6200EE)
val Purple700 = Color(0xFF3700B3) val Purple700 = Color(0xFF3700B3)
val Teal200 = Color(0xFF03DAC5) val Teal200 = Color(0xFF03DAC5)
val Gray500 = Color(0xFF9E9E9E)

View File

@@ -27,4 +27,6 @@
<string name="declared_capacity">Declared Capacity</string> <string name="declared_capacity">Declared Capacity</string>
<string name="button_save_battery">Save Battery</string> <string name="button_save_battery">Save Battery</string>
<string name="title_activity_add_battery">AddBattery</string> <string name="title_activity_add_battery">AddBattery</string>
<string name="helper_required">* Required</string>
<string name="helper_battery_not_unique">Battery-ID not unique!</string>
</resources> </resources>