Merge remote-tracking branch 'origin/dev' into development

This commit is contained in:
erik-everardo 2024-11-09 01:22:34 -06:00
commit 7f2e16c580
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.audio.drafts.domain.repository.AudioDraftsRepository
import com.isolaatti.connectivity.RetrofitClient import com.isolaatti.connectivity.RetrofitClient
import com.isolaatti.database.AppDatabase import com.isolaatti.database.AppDatabase
import com.isolaatti.settings.domain.UserIdSetting
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
@ -23,8 +24,8 @@ class Module {
} }
@Provides @Provides
fun provideAudiosRepository(audiosApi: AudiosApi, audiosDraftsDao: AudiosDraftsDao): AudiosRepository { fun provideAudiosRepository(audiosApi: AudiosApi, audiosDraftsDao: AudiosDraftsDao, userIdSetting: UserIdSetting): AudiosRepository {
return AudiosRepositoryImpl(audiosApi, audiosDraftsDao) return AudiosRepositoryImpl(audiosApi, audiosDraftsDao, userIdSetting)
} }
@Provides @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.common.domain.Playable
import com.isolaatti.audio.drafts.domain.AudioDraft import com.isolaatti.audio.drafts.domain.AudioDraft
import com.isolaatti.audio.drafts.domain.repository.AudioDraftsRepository import com.isolaatti.audio.drafts.domain.repository.AudioDraftsRepository
import com.isolaatti.auth.domain.AuthRepository
import com.isolaatti.common.SortingEnum import com.isolaatti.common.SortingEnum
import com.isolaatti.utils.Resource
import dagger.hilt.android.lifecycle.HiltViewModel 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.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@ -22,7 +27,9 @@ class AudioSelectorViewModel @Inject constructor(
val audios: MutableLiveData<List<Audio>> = MutableLiveData() val audios: MutableLiveData<List<Audio>> = MutableLiveData()
val drafts: MutableLiveData<List<AudioDraft>> = MutableLiveData() val drafts: MutableLiveData<List<AudioDraft>> = MutableLiveData()
val sorting: MutableLiveData<SortingEnum> = 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) { fun setSorting(sort: SortingEnum) {
sorting.value = sort sorting.value = sort
} }
@ -36,8 +43,24 @@ class AudioSelectorViewModel @Inject constructor(
} }
fun getAudios() { 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?.getInt(ARG_MODE)?.let { mode = it }
arguments?.getString(ARG_SQUAD_ID)?.let { squadId = it } arguments?.getString(ARG_SQUAD_ID)?.let { squadId = it }
viewModel.squadId = squadId
when(mode) { when(mode) {
ARG_VAL_MODE_AUDIOS -> {} ARG_VAL_MODE_AUDIOS -> {
viewModel.getAudios()
}
ARG_VAL_MODE_DRAFTS -> { ARG_VAL_MODE_DRAFTS -> {
viewModel.getAudioDrafts() viewModel.getAudioDrafts()
} }
@ -61,7 +63,7 @@ class AudiosListSelectorFragment : Fragment() {
when(mode) { when(mode) {
ARG_VAL_MODE_AUDIOS -> { ARG_VAL_MODE_AUDIOS -> {
viewModel.audios.observe(viewLifecycleOwner) { viewModel.audios.observe(viewLifecycleOwner) {
adapter.setData(it)
} }
} }
ARG_VAL_MODE_DRAFTS -> { 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.Audio
import com.isolaatti.audio.common.domain.AudiosRepository import com.isolaatti.audio.common.domain.AudiosRepository
import com.isolaatti.audio.drafts.data.AudiosDraftsDao import com.isolaatti.audio.drafts.data.AudiosDraftsDao
import com.isolaatti.settings.domain.UserIdSetting
import com.isolaatti.utils.Resource import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@ -15,29 +16,46 @@ import retrofit2.awaitResponse
import java.io.File import java.io.File
import javax.inject.Inject 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 { companion object {
const val LOG_TAG = "AudiosRepositoryImpl" 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 { try {
val response = audiosApi.getAudiosOfUser(userId, lastId).awaitResponse() val response = audiosApi.getAudiosOfUser(userId, lastId).awaitResponse()
if(response.isSuccessful) { if(response.isSuccessful) {
val body = response.body() val body = response.body() ?: return Resource.Error(Resource.Error.ErrorType.ServerError)
if(body == null) {
emit(Resource.Error(Resource.Error.ErrorType.ServerError))
return@flow
}
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) { } catch(e: Exception) {
Log.e("AudiosRepositoryImpl", e.message.toString()) 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 { override fun uploadAudio(draftId: Long): Flow<Resource<Audio>> = flow {
val audioDraftEntity = audiosDraftsDao.getAudioDraftById(draftId) val audioDraftEntity = audiosDraftsDao.getAudioDraftById(draftId)

View File

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