From 52289ce9e0c8530e581c66c47084e6f1e9c79763 Mon Sep 17 00:00:00 2001 From: rayc Date: Mon, 4 Mar 2024 00:57:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E9=80=89=E6=8B=A9=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/eacenic/weighttrack/MainActivity.kt | 35 +++++++++++++++---- .../com/eacenic/weighttrack/WeightRecord.kt | 25 +++++++++++-- .../com/eacenic/weighttrack/WeightTrackApp.kt | 1 + .../weighttrack/WeightTrackObjectBox.kt | 17 +++++++++ .../weighttrack/WeightTrackViewModel.kt | 26 +++++++++----- 5 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/com/eacenic/weighttrack/WeightTrackObjectBox.kt diff --git a/app/src/main/java/com/eacenic/weighttrack/MainActivity.kt b/app/src/main/java/com/eacenic/weighttrack/MainActivity.kt index 75d3425..1522c99 100644 --- a/app/src/main/java/com/eacenic/weighttrack/MainActivity.kt +++ b/app/src/main/java/com/eacenic/weighttrack/MainActivity.kt @@ -3,6 +3,7 @@ package com.eacenic.weighttrack import android.annotation.SuppressLint import android.os.Build import android.os.Bundle +import android.util.Log import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -25,12 +26,15 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerFormatter import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -50,8 +54,12 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import com.eacenic.weighttrack.ui.theme.WeightTrackTheme import kotlinx.coroutines.launch +import java.time.Instant import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZoneOffset import java.time.format.DateTimeFormatter +import java.util.Date class MainActivity : ComponentActivity() { @RequiresApi(Build.VERSION_CODES.O) @@ -84,6 +92,8 @@ fun WeightTrackLayout( var openBottomSheet by rememberSaveable { mutableStateOf(false) } + weightTrackViewModel.loadWeightRecords() + Surface( modifier = Modifier.fillMaxSize(), color = Color.White @@ -139,7 +149,7 @@ fun WeightRecordItem(weightRecord: WeightRecord) { @Composable fun CurrentWeight( - currentWeight: Float, + currentWeight: Float? = null, modifier: Modifier = Modifier ) { Row ( @@ -157,7 +167,7 @@ fun CurrentWeight( ) { Text( - text = "$currentWeight", + text = "${currentWeight ?: "No Data"}", modifier = Modifier.align(Alignment.Center), fontSize = 80.sp, fontFamily = doodleShadowFontFamily @@ -206,6 +216,8 @@ fun BottomSheetEditor( var text by remember { mutableStateOf("") } var clickable by remember { mutableStateOf(false) } + val datePickerState = rememberDatePickerState() + if (expandBottomSheet) { ModalBottomSheet( @@ -239,6 +251,17 @@ fun BottomSheetEditor( Spacer(modifier = Modifier .height(20.dp) .fillMaxWidth()) + + Row( + modifier = Modifier.fillMaxWidth() + ) { + DatePicker( + state = datePickerState, + modifier = Modifier.padding(16.dp), + title = { Text(text="称重日期") }, + ) + } + Row( horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically, @@ -259,7 +282,8 @@ fun BottomSheetEditor( Button( onClick = { Toast.makeText(context, "save weight", Toast.LENGTH_SHORT).show() - weightTrackViewModel.addWeightRecord(WeightRecord(text.toFloat(), LocalDateTime.now())) + Log.e(TAG, "BottomSheetEditor: ${Date(datePickerState.selectedDateMillis!!)}") + weightTrackViewModel.addWeightRecord(WeightRecord(weight = text.toFloat(), date = LocalDateTime.now())) text = "" onDismiss() }, @@ -269,9 +293,8 @@ fun BottomSheetEditor( } } - Spacer(modifier = Modifier - .height(40.dp) - .fillMaxWidth()) + + Spacer(modifier = Modifier.size(40.dp)) } } } diff --git a/app/src/main/java/com/eacenic/weighttrack/WeightRecord.kt b/app/src/main/java/com/eacenic/weighttrack/WeightRecord.kt index 5550e26..6cd4e34 100644 --- a/app/src/main/java/com/eacenic/weighttrack/WeightRecord.kt +++ b/app/src/main/java/com/eacenic/weighttrack/WeightRecord.kt @@ -1,14 +1,35 @@ package com.eacenic.weighttrack +import android.os.Build +import androidx.annotation.RequiresApi +import io.objectbox.annotation.Convert import io.objectbox.annotation.Entity import io.objectbox.annotation.Id +import io.objectbox.converter.PropertyConverter import java.time.LocalDateTime +import java.time.format.DateTimeFormatter @Entity -data class WeightRecord( +data class WeightRecord @RequiresApi(Build.VERSION_CODES.O) constructor( @Id var id: Long = 0, var weight: Float, - var date: LocalDateTime, + @Convert(converter = WeightRecordConverter::class, dbType = String::class) + var date: LocalDateTime? = null, var isDeleted: Boolean = false ) + +@RequiresApi(Build.VERSION_CODES.O) +val ymdHmsFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") + +class WeightRecordConverter: PropertyConverter { + @RequiresApi(Build.VERSION_CODES.O) + override fun convertToEntityProperty(databaseValue: String?): LocalDateTime { + return LocalDateTime.parse(databaseValue, ymdHmsFormatter) + } + + @RequiresApi(Build.VERSION_CODES.O) + override fun convertToDatabaseValue(entityProperty: LocalDateTime?): String { + return entityProperty?.format(ymdHmsFormatter) ?: "" + } +} diff --git a/app/src/main/java/com/eacenic/weighttrack/WeightTrackApp.kt b/app/src/main/java/com/eacenic/weighttrack/WeightTrackApp.kt index f2d2280..1751f44 100644 --- a/app/src/main/java/com/eacenic/weighttrack/WeightTrackApp.kt +++ b/app/src/main/java/com/eacenic/weighttrack/WeightTrackApp.kt @@ -6,6 +6,7 @@ class WeightTrackApp: Application() { override fun onCreate() { super.onCreate() + WeightTrackObjectBox.init(this) } } \ No newline at end of file diff --git a/app/src/main/java/com/eacenic/weighttrack/WeightTrackObjectBox.kt b/app/src/main/java/com/eacenic/weighttrack/WeightTrackObjectBox.kt new file mode 100644 index 0000000..a869334 --- /dev/null +++ b/app/src/main/java/com/eacenic/weighttrack/WeightTrackObjectBox.kt @@ -0,0 +1,17 @@ +package com.eacenic.weighttrack + +import android.content.Context +import io.objectbox.BoxStore + +object WeightTrackObjectBox { + + lateinit var store: BoxStore + private set + + fun init(context: Context) { + store = MyObjectBox.builder() + .androidContext(context.applicationContext) + .build() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/eacenic/weighttrack/WeightTrackViewModel.kt b/app/src/main/java/com/eacenic/weighttrack/WeightTrackViewModel.kt index f19367a..dfe4484 100644 --- a/app/src/main/java/com/eacenic/weighttrack/WeightTrackViewModel.kt +++ b/app/src/main/java/com/eacenic/weighttrack/WeightTrackViewModel.kt @@ -7,15 +7,16 @@ import androidx.lifecycle.ViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import java.time.LocalDateTime +import java.util.Arrays const val TAG = "WeightTrackViewModel" class WeightTrackViewModel: ViewModel() { @RequiresApi(Build.VERSION_CODES.O) private var _historyData = MutableStateFlow>(mutableListOf( - WeightRecord(62.6f, LocalDateTime.now()), - WeightRecord(63.6f, LocalDateTime.now()), - WeightRecord(65.6f, LocalDateTime.now()) + WeightRecord(weight = 62.6f, date = LocalDateTime.now()), + WeightRecord(weight = 63.6f, date = LocalDateTime.now()), + WeightRecord(weight = 65.6f, date = LocalDateTime.now()) )) @RequiresApi(Build.VERSION_CODES.O) @@ -23,10 +24,19 @@ class WeightTrackViewModel: ViewModel() { @RequiresApi(Build.VERSION_CODES.O) fun addWeightRecord(newRecord: WeightRecord) { - val newRecords = _historyData.value.toMutableList() - newRecords.add(newRecord) - _historyData.value = newRecords - Log.e(TAG, "$newRecord") - Log.e(TAG, "${_historyData.value}") + saveWeightRecord(newRecord) + loadWeightRecords() + } + + private val weightBox = WeightTrackObjectBox.store.boxFor(WeightRecord::class.java) + + private fun saveWeightRecord(weightRecord: WeightRecord) { + weightBox.put(weightRecord) + } + + @RequiresApi(Build.VERSION_CODES.O) + fun loadWeightRecords() { + val storedData = weightBox.all + _historyData.value = storedData } } \ No newline at end of file