Skip to content

Commit

Permalink
feature: Implemented Room database with get and add user methods and …
Browse files Browse the repository at this point in the history
…shared viewmodel
  • Loading branch information
GreenVenom77 committed Aug 19, 2024
1 parent 998bc38 commit 938c3c8
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 5 deletions.
12 changes: 7 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
tools:targetApi="31" >
<activity
android:name=".layout.RecipeActivity"
android:exported="false" >



</activity>
<activity
android:name=".auth.AuthActivity"
android:exported="true" >

<intent-filter>
Expand All @@ -23,11 +30,6 @@
</intent-filter>

</activity>
<activity
android:name=".auth.AuthActivity"
android:exported="false" >

</activity>
</application>

</manifest>
14 changes: 14 additions & 0 deletions app/src/main/java/com/example/recipeappiti/auth/AuthActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,26 @@ package com.example.recipeappiti.auth

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.recipeappiti.R
import com.example.recipeappiti.auth.model.UserRepository
import com.example.recipeappiti.auth.viewmodel.UserViewModel
import com.example.recipeappiti.auth.viewmodel.UserViewModelFactory
import com.example.recipeappiti.core.model.UserDatabase

class AuthActivity : AppCompatActivity() {
private val userViewModel: UserViewModel by viewModels {
UserViewModelFactory(
UserRepository(
UserDatabase.getDatabaseInstance(applicationContext
).userDao()
)
)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
Expand Down
13 changes: 13 additions & 0 deletions app/src/main/java/com/example/recipeappiti/auth/model/User.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.recipeappiti.auth.model

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "user")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val email: String,
val username: String,
val password: String
)
16 changes: 16 additions & 0 deletions app/src/main/java/com/example/recipeappiti/auth/model/UserDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.recipeappiti.auth.model

import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query

@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addUser(user: User)

@Query("SELECT * FROM user WHERE email = :email AND password = :password LIMIT 1")
fun getUser(email: String, password: String): LiveData<User?>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.recipeappiti.auth.model

import androidx.lifecycle.LiveData

class UserRepository(private val userDao: UserDao) {
fun getUser(email: String, password: String): LiveData<User?> {
val user = userDao.getUser(email, password)
return user
}

suspend fun addUser(user: User) {
userDao.addUser(user)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.recipeappiti.auth.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.recipeappiti.auth.model.User
import com.example.recipeappiti.auth.model.UserRepository
import kotlinx.coroutines.launch

class UserViewModel(private val userRepository: UserRepository): ViewModel() {
private val _user = MutableLiveData<User?>()
val user: LiveData<User?> get() = _user

fun getUser(email: String, password: String) {
_user.value = userRepository.getUser(email, password).value
}

fun addUser(user: User) {
viewModelScope.launch {
userRepository.addUser(user)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.recipeappiti.auth.viewmodel

import android.content.Context
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.recipeappiti.auth.model.UserRepository

class UserViewModelFactory(private val userRepository: UserRepository): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
return UserViewModel(userRepository) as T
} else {
throw IllegalArgumentException("Unknown ViewModel class")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.recipeappiti.core.model

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.example.recipeappiti.auth.model.User
import com.example.recipeappiti.auth.model.UserDao

@Database(entities = [User::class], version = 1)
abstract class UserDatabase: RoomDatabase() {
abstract fun userDao(): UserDao

companion object {
@Volatile
private var INSTANCE: UserDatabase? = null
fun getDatabaseInstance(context: Context): UserDatabase {
return INSTANCE ?: synchronized(this) {
Room.databaseBuilder(
context = context,
klass = UserDatabase::class.java,
name = "products_database"
).build().also { INSTANCE = it }
}
}
}
}

0 comments on commit 938c3c8

Please sign in to comment.