meili-epfl/Meili

View on GitHub
app/src/main/java/com/github/epfl/meili/profile/ProfileViewModel.kt

Summary

Maintainability
A
0 mins
Test Coverage
C
76%
package com.github.epfl.meili.profile

import android.content.ContentResolver
import android.graphics.Bitmap
import android.net.Uri
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.github.epfl.meili.database.FirebaseStorageService
import com.github.epfl.meili.database.FirestoreDocumentService
import com.github.epfl.meili.models.User
import com.github.epfl.meili.util.ImageUtility
import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator

class ProfileViewModel(profileUid: String) : ViewModel() {
    private val mUser: MutableLiveData<User> = MutableLiveData()
    private val mRequestCreator: MutableLiveData<RequestCreator> = MutableLiveData()
    private var bitmap: Bitmap? = null

    private var uid: String = profileUid

    companion object {
        private const val USERS_PATH = "users"
        private const val AVATARS_PATH = "images/avatars"
    }

    init {
        FirestoreDocumentService.getDocument("${USERS_PATH}/${uid}").addOnSuccessListener {
            if (it.exists()) {
                mUser.value = it.toObject(User::class.java)
                FirebaseStorageService.getDownloadUrl(
                    "${AVATARS_PATH}/${uid}",
                    { uri -> loadImageIntoRequestCreator(uri) },
                    { /* do nothing in case of failure */ }
                )
            }
        }
    }

    fun getUser(): LiveData<User> = mUser
    fun getRequestCreator(): LiveData<RequestCreator> = mRequestCreator

    fun updateProfile(user: User) {
        mUser.value = user
        FirestoreDocumentService.setDocument("${USERS_PATH}/${uid}", user)
        if (bitmap != null) {
            ImageUtility.compressAndUploadToFirebase("${AVATARS_PATH}/${uid}", bitmap!!)
        }
    }

    private fun loadImageIntoRequestCreator(uri: Uri) {
        mRequestCreator.value = Picasso.get().load(uri)
    }

    fun loadLocalImage(contentResolver: ContentResolver, uri: Uri) {
        loadImageIntoRequestCreator(uri)
        bitmap = ImageUtility.getBitmapFromFilePath(contentResolver, uri)
    }
}