diff --git a/app/src/main/java/com/isolaatti/audio/Module.kt b/app/src/main/java/com/isolaatti/audio/Module.kt index db8e525..8b63d36 100644 --- a/app/src/main/java/com/isolaatti/audio/Module.kt +++ b/app/src/main/java/com/isolaatti/audio/Module.kt @@ -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 diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt index 653b393..8b5cf7c 100644 --- a/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt +++ b/app/src/main/java/com/isolaatti/audio/audio_selector/presentation/AudioSelectorViewModel.kt @@ -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> = MutableLiveData() val drafts: MutableLiveData> = MutableLiveData() val sorting: MutableLiveData = MutableLiveData() - + var squadId: String? = null + val error: MutableLiveData = MutableLiveData(null) + val loading: MutableLiveData = 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) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt index 9765ba8..cf97c9b 100644 --- a/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt +++ b/app/src/main/java/com/isolaatti/audio/audio_selector/ui/AudiosListSelectorFragment.kt @@ -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 -> { diff --git a/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt b/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt index 8ff7979..e7de7ac 100644 --- a/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt +++ b/app/src/main/java/com/isolaatti/audio/common/data/AudiosRepositoryImpl.kt @@ -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>> = flow { - emit(Resource.Loading()) + + private suspend fun _getAudiosOfUser(userId: Int, lastId: String?): Resource> { 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>> = flow { + emit(Resource.Loading()) + emit(_getAudiosOfUser(userId, lastId)) + } + + override fun getMyAudios(lastId: String?): Flow>> = 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> = flow { val audioDraftEntity = audiosDraftsDao.getAudioDraftById(draftId) diff --git a/app/src/main/java/com/isolaatti/audio/common/domain/AudiosRepository.kt b/app/src/main/java/com/isolaatti/audio/common/domain/AudiosRepository.kt index c405866..41c4d24 100644 --- a/app/src/main/java/com/isolaatti/audio/common/domain/AudiosRepository.kt +++ b/app/src/main/java/com/isolaatti/audio/common/domain/AudiosRepository.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.flow.Flow interface AudiosRepository { fun getAudiosOfUser(userId: Int, lastId: String?): Flow>> + fun getMyAudios(lastId: String?): Flow>> fun uploadAudio(draftId: Long): Flow>