From 7bc969c6c0416e4d5268befd3ccb0c7b651ece0f Mon Sep 17 00:00:00 2001 From: Sockenklaus Date: Mon, 18 Jul 2022 17:21:56 +0200 Subject: [PATCH] worked on AddBatteryFragment.kt --- .../batterytracker/room/BatteryTrackerDB.kt | 3 +- .../batterytracker/room/Converters.kt | 19 +++++ .../add_battery/AddBatteryFragment.kt | 81 ++++++++++--------- .../fragments/add_charge/AddChargeFragment.kt | 1 + 4 files changed, 66 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/sockenklaus/batterytracker/room/Converters.kt diff --git a/app/src/main/java/com/sockenklaus/batterytracker/room/BatteryTrackerDB.kt b/app/src/main/java/com/sockenklaus/batterytracker/room/BatteryTrackerDB.kt index 8e3c4ca..d936f0d 100644 --- a/app/src/main/java/com/sockenklaus/batterytracker/room/BatteryTrackerDB.kt +++ b/app/src/main/java/com/sockenklaus/batterytracker/room/BatteryTrackerDB.kt @@ -4,6 +4,7 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.TypeConverters import com.sockenklaus.batterytracker.room.dao.BatteryDao import com.sockenklaus.batterytracker.room.dao.ChargeDao import com.sockenklaus.batterytracker.room.entities.Battery @@ -13,9 +14,9 @@ import com.sockenklaus.batterytracker.room.entities.Charge entities = [Charge::class, Battery::class], version = 2 ) +@TypeConverters(Converters::class) abstract class BatteryTrackerDB : RoomDatabase() { abstract fun batteryDao(): BatteryDao - abstract fun chargeDao(): ChargeDao companion object { diff --git a/app/src/main/java/com/sockenklaus/batterytracker/room/Converters.kt b/app/src/main/java/com/sockenklaus/batterytracker/room/Converters.kt new file mode 100644 index 0000000..aa70b76 --- /dev/null +++ b/app/src/main/java/com/sockenklaus/batterytracker/room/Converters.kt @@ -0,0 +1,19 @@ +package com.sockenklaus.batterytracker.room + +import androidx.room.TypeConverter +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId + +class Converters { + + @TypeConverter + fun toLocalDateTime(value: Long): LocalDateTime { + return LocalDateTime.ofInstant(Instant.ofEpochMilli(value), ZoneId.systemDefault()) + } + + @TypeConverter + fun toEpochMilli(value: LocalDateTime): Long { + return value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_battery/AddBatteryFragment.kt b/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_battery/AddBatteryFragment.kt index b1db7b5..a76b51c 100644 --- a/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_battery/AddBatteryFragment.kt +++ b/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_battery/AddBatteryFragment.kt @@ -10,12 +10,11 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.* -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.getValue -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout @@ -53,56 +52,39 @@ class AddBatteryFragment : Fragment() { var batteryId by remember { mutableStateOf("") } var declaredCapacity by remember { mutableStateOf("")} - ConstraintLayout { - val (textBatteryId, textDeclaredCapacity, fab ) = createRefs() - val outerMargin = 24.dp - val innerMargin = 16.dp + val outerPadding = 24.dp + val innerPadding = 16.dp - OutlinedTextField( + Column( + Modifier.padding(outerPadding) + ) { + MyOutlinedTextField( value = batteryId, onValueChange = { batteryId = it }, - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text), - label = { Text(stringResource(R.string.hint_enter_battery_id)) }, - leadingIcon = { Icon(Icons.Default.Tag, null) }, - modifier = Modifier - .constrainAs(textBatteryId) { - top.linkTo(parent.top, margin = outerMargin) - start.linkTo(parent.start, margin = outerMargin) - end.linkTo(parent.end, margin = outerMargin) - width = Dimension.fillToConstraints - } - .wrapContentHeight() + labelId = R.string.hint_enter_battery_id, + leadingIcon = { Icon(Icons.Default.Tag, "Icon Tag") } ) - OutlinedTextField( + Spacer(Modifier.size(innerPadding)) + + MyOutlinedTextField( value = declaredCapacity, onValueChange = { declaredCapacity = validateDecimal(it, declaredCapacity) }, + labelId = R.string.hint_enter_declared_capacity, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), - label = { Text(stringResource(R.string.hint_enter_declared_capacity)) }, - leadingIcon = { Icon(Icons.Default.BatteryFull, null) }, - modifier = Modifier - .constrainAs(textDeclaredCapacity) { - top.linkTo(textBatteryId.bottom, margin = innerMargin) - start.linkTo(parent.start, margin = outerMargin) - end.linkTo(parent.end, margin = outerMargin) - width = Dimension.fillToConstraints - } + leadingIcon = { Icon(Icons.Default.BatteryFull, "Icon Battery Full") } ) + Spacer(Modifier.size(outerPadding)) + ExtendedFloatingActionButton( onClick = { saveBattery( batteryId, declaredCapacity ) }, icon = { Icon(Icons.Default.Save, null) }, text = { Text(stringResource(R.string.button_save_battery)) }, - modifier = Modifier - .constrainAs(fab) { - top.linkTo(textDeclaredCapacity.bottom, margin = 24.dp) - end.linkTo(parent.end, margin = outerMargin) - } + modifier = Modifier.align(Alignment.End) ) - - } } } @@ -111,6 +93,31 @@ class AddBatteryFragment : Fragment() { return view } + @Composable + fun MyOutlinedTextField( + value: String, + onValueChange: (String) -> Unit, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + labelId: Int, + leadingIcon: (@Composable () -> Unit)? = null, + isError: Boolean = false, + helperText: String = "" + ) { + OutlinedTextField( + value = value, + onValueChange = onValueChange, + keyboardOptions = keyboardOptions, + label = { Text(stringResource(labelId)) }, + leadingIcon = leadingIcon, + modifier = Modifier.fillMaxWidth() + ) + Text( + text = helperText, + style = MaterialTheme.typography.caption, + modifier = Modifier.padding(start = 16.dp) + ) + } + /* TODO: Implement the action */ diff --git a/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_charge/AddChargeFragment.kt b/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_charge/AddChargeFragment.kt index a1cc6f6..c7e9849 100644 --- a/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_charge/AddChargeFragment.kt +++ b/app/src/main/java/com/sockenklaus/batterytracker/ui/fragments/add_charge/AddChargeFragment.kt @@ -148,6 +148,7 @@ class AddChargeFragment : Fragment() { onSelect: (LocalDateTime) -> Unit, ) { val dateFormat: DateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(Locale.GERMANY) + val datePicker = MaterialDatePicker.Builder.datePicker() .setTitleText("Select date") .setSelection( date.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() )