From 896912d5147ab3e5a65e316c8d5077d00790e81e Mon Sep 17 00:00:00 2001 From: erik-everardo Date: Sat, 17 Feb 2024 22:06:10 -0600 Subject: [PATCH] WIP eliminar audio --- .../audios_list/presentation/AudiosAdapter.kt | 11 ++++++- .../presentation/AudiosViewModel.kt | 12 ++++++- .../audio/audios_list/ui/AudiosFragment.kt | 31 +++++++++++++++++++ .../isolaatti/audio/common/data/AudiosApi.kt | 4 +++ .../audio/common/data/AudiosRepositoryImpl.kt | 15 +++++++++ .../audio/common/domain/AudiosRepository.kt | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 7 files changed, 75 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosAdapter.kt b/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosAdapter.kt index 7e4d7b4..a412ce9 100644 --- a/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosAdapter.kt +++ b/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosAdapter.kt @@ -139,7 +139,16 @@ class AudiosAdapter( } } - override fun onBindViewHolder(holder: AudiosViewHolder, position: Int) { + override fun onBindViewHolder(holder: AudiosViewHolder, position: Int) {} + fun removeAudio(audio: Audio) { + val index = data.indexOf(audio) + + if(index == -1) return + // TODO data should be modified from outside + data = data.toMutableList().apply { + removeAt(index) + } + notifyItemRemoved(index) } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosViewModel.kt b/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosViewModel.kt index 4b46c12..5adf58e 100644 --- a/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosViewModel.kt +++ b/app/src/main/java/com/isolaatti/audio/audios_list/presentation/AudiosViewModel.kt @@ -17,7 +17,7 @@ import javax.inject.Inject @HiltViewModel class AudiosViewModel @Inject constructor(private val audiosRepository: AudiosRepository) : ViewModel() { val resource: MutableLiveData>> = MutableLiveData() - + val audioRemoved: MutableLiveData = MutableLiveData() fun loadAudios(userId: Int) { viewModelScope.launch { @@ -28,4 +28,14 @@ class AudiosViewModel @Inject constructor(private val audiosRepository: AudiosRe } } + fun removeAudio(audio: Audio) { + viewModelScope.launch { + audiosRepository.deleteAudio(audio.id).onEach { + if(it is Resource.Success) { + audioRemoved.postValue(audio) + } + }.flowOn(Dispatchers.IO).launchIn(this) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/audio/audios_list/ui/AudiosFragment.kt b/app/src/main/java/com/isolaatti/audio/audios_list/ui/AudiosFragment.kt index 162aa8d..3b7ee06 100644 --- a/app/src/main/java/com/isolaatti/audio/audios_list/ui/AudiosFragment.kt +++ b/app/src/main/java/com/isolaatti/audio/audios_list/ui/AudiosFragment.kt @@ -11,6 +11,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.isolaatti.R import com.isolaatti.audio.audios_list.presentation.AudiosAdapter import com.isolaatti.audio.audios_list.presentation.AudiosViewModel @@ -45,6 +46,17 @@ class AudiosFragment : Fragment() { return viewBinding.root } + private fun onDeleteAudio(audio: Audio) { + MaterialAlertDialogBuilder(requireContext()) + .setMessage(R.string.delete_audio_message) + .setTitle(R.string.delete_audio_title) + .setPositiveButton(R.string.yes_continue) { _, _ -> + viewModel.removeAudio(audio) + } + .setNegativeButton(R.string.no, null) + .show() + } + private val onOptionsClick: ((audio: Audio, button: View) -> Boolean) = { audio, button -> val popup = PopupMenu(requireContext(), button) popup.menuInflater.inflate(R.menu.audio_item_menu, popup.menu) @@ -55,6 +67,16 @@ class AudiosFragment : Fragment() { popup.menu.removeItem(R.id.set_as_profile_audio) } + popup.setOnMenuItemClickListener { + when(it.itemId) { + R.id.delete_item -> { + onDeleteAudio(audio) + true + } + else -> false + } + } + popup.show() true @@ -133,6 +155,15 @@ class AudiosFragment : Fragment() { } } } + + viewModel.audioRemoved.observe(viewLifecycleOwner) { + if(it != null){ + adapter.removeAudio(it) + viewModel.audioRemoved.value = null + } + + + } } companion object { diff --git a/app/src/main/java/com/isolaatti/audio/common/data/AudiosApi.kt b/app/src/main/java/com/isolaatti/audio/common/data/AudiosApi.kt index 11ccecb..5eda987 100644 --- a/app/src/main/java/com/isolaatti/audio/common/data/AudiosApi.kt +++ b/app/src/main/java/com/isolaatti/audio/common/data/AudiosApi.kt @@ -1,5 +1,6 @@ package com.isolaatti.audio.common.data +import com.isolaatti.common.ResultDto import okhttp3.MultipartBody import retrofit2.Call import retrofit2.http.GET @@ -21,4 +22,7 @@ interface AudiosApi { @POST("/api/Audios/Create") @Multipart fun uploadFile(@Part file: MultipartBody.Part, @Part name: MultipartBody.Part, @Part duration: MultipartBody.Part): Call + + @POST("/api/Audios/{audioId}/Delete") + fun deleteAudio(@Path("audioId") audioId: String): Call> } \ No newline at end of file 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 b945c84..8b8a4a1 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 @@ -80,4 +80,19 @@ class AudiosRepositoryImpl @Inject constructor(private val audiosApi: AudiosApi, Log.d(LOG_TAG, e.message.toString()) } } + + override fun deleteAudio(audioId: String): Flow> = flow { + emit(Resource.Loading()) + try { + val response = audiosApi.deleteAudio(audioId).awaitResponse() + + if(response.isSuccessful) { + emit(Resource.Success(response.isSuccessful)) + } else { + emit(Resource.Error(Resource.Error.mapErrorCode(response.code()))) + } + } catch(e: Exception) { + Log.e(LOG_TAG, e.message.toString()) + } + } } \ No newline at end of file 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 0b67ac1..c405866 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 @@ -7,4 +7,6 @@ interface AudiosRepository { fun getAudiosOfUser(userId: Int, lastId: String?): Flow>> fun uploadAudio(draftId: Long): Flow> + + fun deleteAudio(audioId: String): Flow> } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 355f5a1..d5d7b73 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -184,4 +184,6 @@ Audio attachment Remove Select audio + Do you really want to remove this audio? Discussions with this audio linked will still be pointing to it. + Remove audio? \ No newline at end of file