Skip to content

Instantly share code, notes, and snippets.

View Ahmedgadein's full-sized avatar

Ahmed Gadein Obied Ahmedgadein

View GitHub Profile
apply plugin: "kotlin-kapt"
dependencies {
implementation 'androidx.room:room-runtime:2.2.5'
implementation 'androidx.room:room-coroutines:2.1.0-alpha04'
kapt 'android.arch.persistence.room:compiler:1.1.1'
}
@Ahmedgadein
Ahmedgadein / User.kt
Created July 1, 2020 16:21
User model
@Entity(tableName = "users_table")
data class CountDown(
@PrimaryKey(autoGenerate = true)
var long: Id,
@ColumnInfo(name = "name")
var name:String,
@Dao
interface UserDao{
@Query("SELECT * FROM users_table")
fun getAll():List<User>
@Query("SELECT * FROM users_table WHERE Id = :Id")
fun getUser(Id:Long): User
@Insert(onConflict = OnConflictStrategy.REPLACE)
@Database(entities = arrayOf(User::class), version = 1, exportSchema = false)
abstract class UsersDatabase: RoomDatabase() {
abstract fun getDao(): UserDao
//Singleton to prevent creation ot multiple database instances
companion object{
private var INSTANCE: CountDownDatabase? = null
class Repository(val dao: UserDao) {
//Retrieving methods are thread-safe
val allUsers = dao.getAll()
// invoke on coroutine or other suspend function only
fun insert(user: User) = GlobalScope.launch(Dispatchers.IO) {
dao.insert(user)
}
class LoginViewModel(val repository: AuthRepository): ViewMode() {
private val _state = mutableStateOf(LoginUiState())
val state = _state.asStateFlow()
fun onLoginAttemp(user: User) {
viewModelScope.launch {
repository.isRegistered(user).collect { registered ->
when (registered) {
is Result.Loading -> {
_state.update { it.copy(loading = true) }
data class LoginUiState(
val loading: Boolean = false,
val navigateToHome = false,
val navigateToRegistration = false,
val errorMessages = listOf<String>()
)
interface AuthRepository{
fun isSignedIn(): Flow<Result<Boolean>>
fun isRegistered(token: String): Flow<Result<Boolean>>
fun signIn(user: User): Flow<Result<Boolean>>
fun register(user: User): Flow<Result<Boolean>>
}
class AuthRepoImpl(val remoteService: MyService){
override fun isSignedIn(): Flow<Result<Boolean>> =
callbackFlow {
data class User(val id: String, val name:String, val token: String){
fun toJson(): Map<String, String> = mapOf {
"id" to id,
"name" to name,
"token" to token,
}
}
sealed class Result<out T>{
object Loading(): Result<Nothing>()
class Success<T>(val value: T): Result<T>()
class Error(val message:String): Result<Nothing>()
}