From f8c2c6d1492b9439cfaec669cc02c7f70e2a45d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luka=CC=81s=CC=8C=20Krystek?= Date: Fri, 16 May 2025 11:32:15 +0200 Subject: [PATCH] feat: Implement user data saving and updating functionality This commit introduces the ability to save and update user data (first and last name) in the database. Key changes: - Added `Repository` class to handle data operations, including saving and updating user names. - Implemented `saveName` function in `Repository` to insert a new user or update an existing one based on the last name. - Added `MainViewModel` to manage UI logic for user input and interaction. - Implemented `onClick` function in `MainViewModel` to trigger the save/update operation in the repository. - Updated `UserDao` with `suspend` functions for `insertAll` and added a new `update` function. - Modified `MainActivity` to include input fields for first and last names and a "Ulozit" (Save) button. - The UI now allows users to enter their first and last names and save them to the database. --- .../cz/eman/android/interview/MainActivity.kt | 63 +++++++++++++++++-- .../cz/eman/android/interview/MainState.kt | 27 ++++++++ .../interview/database/User/UserDao.kt | 6 +- .../interview/repository/Repository.kt | 22 +++++++ 4 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/cz/eman/android/interview/MainState.kt create mode 100644 app/src/main/java/cz/eman/android/interview/repository/Repository.kt diff --git a/app/src/main/java/cz/eman/android/interview/MainActivity.kt b/app/src/main/java/cz/eman/android/interview/MainActivity.kt index 544675d..683950f 100644 --- a/app/src/main/java/cz/eman/android/interview/MainActivity.kt +++ b/app/src/main/java/cz/eman/android/interview/MainActivity.kt @@ -3,21 +3,31 @@ package cz.eman.android.interview import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Button +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextAlign import androidx.core.view.WindowCompat import androidx.room.Room import cz.eman.android.interview.database.AppDatabase +import cz.eman.android.interview.repository.Repository class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -44,12 +54,7 @@ class MainActivity : ComponentActivity() { .fillMaxSize() .padding(paddingValues) ) { - Text( - modifier = Modifier.fillMaxSize(), - textAlign = TextAlign.Center, - color = Color.Blue, - text = "Hello eMan candidate", - ) + content(MainViewModel(Repository(db))) // DI will be done in next MR } } ) @@ -57,3 +62,49 @@ class MainActivity : ComponentActivity() { } } } + +@Composable +private fun content( + viewModel: MainViewModel, +) { + Column { + Text( + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center, + color = Color.Blue, + text = "Hello eMan candidate", + ) + + var jmeno: String = "" + var prijmeni: String = "" + + Row { + Column { + Text("Jmeno") + TextField(jmeno, onValueChange = { + jmeno = it + }) + } + Column { + Text("Prijmeni") + TextField("", onValueChange = { + prijmeni = it + }) + } + } + + + Button( + onClick = { + viewModel.onClick( + jmeno = jmeno, + prijmeni = prijmeni, + ) + } + ) { + Text(text = "Ulozit") + } + + + } +} diff --git a/app/src/main/java/cz/eman/android/interview/MainState.kt b/app/src/main/java/cz/eman/android/interview/MainState.kt new file mode 100644 index 0000000..af88247 --- /dev/null +++ b/app/src/main/java/cz/eman/android/interview/MainState.kt @@ -0,0 +1,27 @@ +package cz.eman.android.interview + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import cz.eman.android.interview.repository.Repository +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking + +class MainViewModel( + private val repository: Repository +): ViewModel() { + + fun onClick( + jmeno: String, + prijmeni: String + ): Boolean { + viewModelScope.launch { + runBlocking(Dispatchers.IO) { + repository.saveName(jmeno, prijmeni) + } + return@launch + } + return false + } +} \ No newline at end of file diff --git a/app/src/main/java/cz/eman/android/interview/database/User/UserDao.kt b/app/src/main/java/cz/eman/android/interview/database/User/UserDao.kt index ae9945b..53e3ce7 100644 --- a/app/src/main/java/cz/eman/android/interview/database/User/UserDao.kt +++ b/app/src/main/java/cz/eman/android/interview/database/User/UserDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Delete import androidx.room.Insert import androidx.room.Query +import androidx.room.Update @Dao interface UserDao { @@ -18,7 +19,10 @@ interface UserDao { fun findByName(first: String, last: String): User @Insert - fun insertAll(vararg users: User) + suspend fun insertAll(vararg users: User) + + @Update + suspend fun update(users: User) @Delete fun delete(user: User) diff --git a/app/src/main/java/cz/eman/android/interview/repository/Repository.kt b/app/src/main/java/cz/eman/android/interview/repository/Repository.kt new file mode 100644 index 0000000..4bae153 --- /dev/null +++ b/app/src/main/java/cz/eman/android/interview/repository/Repository.kt @@ -0,0 +1,22 @@ +package cz.eman.android.interview.repository + +import cz.eman.android.interview.database.AppDatabase +import cz.eman.android.interview.database.User.User +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking + +class Repository( + private val database: AppDatabase +) { + + val names = runBlocking(Dispatchers.IO) { database.userDao().getAll() } + + suspend fun saveName(jmeno: String, prijmeni: String) { + if (names.any { it.lastName == prijmeni }) { + database.userDao().update( + User(database.userDao().findByName(jmeno, prijmeni).uid, jmeno, prijmeni)) + } else { + database.userDao().insertAll(User(0, jmeno, prijmeni)) + } + } +} \ No newline at end of file