Skip to content

Instantly share code, notes, and snippets.

View Ahmedgadein's full-sized avatar

Ahmed Gadein Obied Ahmedgadein

View GitHub Profile
name: Workflow
on:
pull_request:
branches:
- master
jobs:
testing:
name: Lint Check and Testing
class LoginFragment : Fragment(){
private val viewModel: LoginViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val binding = LoginFragmentBinding.inflate(inflater, container, false)
sealed class Result<out T>{
object Loading(): Result<Nothing>()
class Success<T>(val value: T): Result<T>()
class Error(val message:String): Result<Nothing>()
}
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,
}
}
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 LoginUiState(
val loading: Boolean = false,
val navigateToHome = false,
val navigateToRegistration = false,
val errorMessages = listOf<String>()
)
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) }
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)
}
@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
@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)