WIP audio selector

This commit is contained in:
erik-everardo 2024-07-14 17:29:27 -06:00
parent a2c9091598
commit b0d3e28352
5 changed files with 63 additions and 18 deletions

View File

@ -9,6 +9,7 @@ import com.isolaatti.audio.drafts.data.AudiosDraftsDao
import com.isolaatti.audio.drafts.domain.repository.AudioDraftsRepository
import com.isolaatti.connectivity.RetrofitClient
import com.isolaatti.database.AppDatabase
import com.isolaatti.settings.domain.UserIdSetting
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -23,8 +24,8 @@ class Module {
}
@Provides
fun provideAudiosRepository(audiosApi: AudiosApi, audiosDraftsDao: AudiosDraftsDao): AudiosRepository {
return AudiosRepositoryImpl(audiosApi, audiosDraftsDao)
fun provideAudiosRepository(audiosApi: AudiosApi, audiosDraftsDao: AudiosDraftsDao, userIdSetting: UserIdSetting): AudiosRepository {
return AudiosRepositoryImpl(audiosApi, audiosDraftsDao, userIdSetting)
}
@Provides

View File

@ -8,8 +8,13 @@ import com.isolaatti.audio.common.domain.AudiosRepository
import com.isolaatti.audio.common.domain.Playable
import com.isolaatti.audio.drafts.domain.AudioDraft
import com.isolaatti.audio.drafts.domain.repository.AudioDraftsRepository
import com.isolaatti.auth.domain.AuthRepository
import com.isolaatti.common.SortingEnum
import com.isolaatti.utils.Resource
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -22,7 +27,9 @@ class AudioSelectorViewModel @Inject constructor(
val audios: MutableLiveData<List<Audio>> = MutableLiveData()
val drafts: MutableLiveData<List<AudioDraft>> = MutableLiveData()
val sorting: MutableLiveData<SortingEnum> = MutableLiveData()
var squadId: String? = null
val error: MutableLiveData<Resource.Error.ErrorType?> = MutableLiveData(null)
val loading: MutableLiveData<Boolean> = MutableLiveData()
fun setSorting(sort: SortingEnum) {
sorting.value = sort
}
@ -36,8 +43,24 @@ class AudioSelectorViewModel @Inject constructor(
}
fun getAudios() {
viewModelScope.launch {
if(squadId == null) {
viewModelScope.launch {
audiosRepository.getMyAudios(audios.value?.lastOrNull()?.id).onEach { resource ->
when(resource) {
is Resource.Error -> {
loading.postValue(false)
error.postValue(resource.errorType)
}
is Resource.Loading -> {
loading.postValue(true)
}
is Resource.Success -> {
loading.postValue(false)
audios.postValue(resource.data ?: listOf())
}
}
}.flowOn(Dispatchers.IO).launchIn(this)
}
}
}
}

View File

@ -26,10 +26,12 @@ class AudiosListSelectorFragment : Fragment() {
arguments?.getInt(ARG_MODE)?.let { mode = it }
arguments?.getString(ARG_SQUAD_ID)?.let { squadId = it }
viewModel.squadId = squadId
when(mode) {
ARG_VAL_MODE_AUDIOS -> {}
ARG_VAL_MODE_AUDIOS -> {
viewModel.getAudios()
}
ARG_VAL_MODE_DRAFTS -> {
viewModel.getAudioDrafts()
}
@ -61,7 +63,7 @@ class AudiosListSelectorFragment : Fragment() {
when(mode) {
ARG_VAL_MODE_AUDIOS -> {
viewModel.audios.observe(viewLifecycleOwner) {
adapter.setData(it)
}
}
ARG_VAL_MODE_DRAFTS -> {

View File

@ -5,6 +5,7 @@ import com.isolaatti.MyApplication
import com.isolaatti.audio.common.domain.Audio
import com.isolaatti.audio.common.domain.AudiosRepository
import com.isolaatti.audio.drafts.data.AudiosDraftsDao
import com.isolaatti.settings.domain.UserIdSetting
import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
@ -15,29 +16,46 @@ import retrofit2.awaitResponse
import java.io.File
import javax.inject.Inject
class AudiosRepositoryImpl @Inject constructor(private val audiosApi: AudiosApi, private val audiosDraftsDao: AudiosDraftsDao) : AudiosRepository {
class AudiosRepositoryImpl @Inject constructor(
private val audiosApi: AudiosApi,
private val audiosDraftsDao: AudiosDraftsDao,
private val userIdSetting: UserIdSetting
) : AudiosRepository {
companion object {
const val LOG_TAG = "AudiosRepositoryImpl"
}
override fun getAudiosOfUser(userId: Int, lastId: String?): Flow<Resource<List<Audio>>> = flow {
emit(Resource.Loading())
private suspend fun _getAudiosOfUser(userId: Int, lastId: String?): Resource<List<Audio>> {
try {
val response = audiosApi.getAudiosOfUser(userId, lastId).awaitResponse()
if(response.isSuccessful) {
val body = response.body()
if(body == null) {
emit(Resource.Error(Resource.Error.ErrorType.ServerError))
return@flow
}
val body = response.body() ?: return Resource.Error(Resource.Error.ErrorType.ServerError)
emit(Resource.Success(body.data.map { Audio.fromDto(it) }))
return Resource.Success(body.data.map { Audio.fromDto(it) })
} else {
return Resource.Error(Resource.Error.ErrorType.ServerError)
}
} catch(e: Exception) {
Log.e("AudiosRepositoryImpl", e.message.toString())
emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
return Resource.Error(Resource.Error.ErrorType.NetworkError)
}
}
override fun getAudiosOfUser(userId: Int, lastId: String?): Flow<Resource<List<Audio>>> = flow {
emit(Resource.Loading())
emit(_getAudiosOfUser(userId, lastId))
}
override fun getMyAudios(lastId: String?): Flow<Resource<List<Audio>>> = flow {
emit(Resource.Loading())
val userId = userIdSetting.getUserIdAsync()
if(userId == null) {
emit(Resource.Error(Resource.Error.ErrorType.OtherError))
return@flow
}
emit(_getAudiosOfUser(userId, lastId))
}
override fun uploadAudio(draftId: Long): Flow<Resource<Audio>> = flow {
val audioDraftEntity = audiosDraftsDao.getAudioDraftById(draftId)

View File

@ -5,6 +5,7 @@ import kotlinx.coroutines.flow.Flow
interface AudiosRepository {
fun getAudiosOfUser(userId: Int, lastId: String?): Flow<Resource<List<Audio>>>
fun getMyAudios(lastId: String?): Flow<Resource<List<Audio>>>
fun uploadAudio(draftId: Long): Flow<Resource<Audio>>