From 8a345fc59b5548e27a7f80b420a444f6712d93ef Mon Sep 17 00:00:00 2001 From: erik-everardo Date: Mon, 22 Apr 2024 22:42:54 -0600 Subject: [PATCH] se permite eliminar foto de perfil, y varios fixes --- .../profile/data/remote/ProfileApi.kt | 3 +++ .../data/repository/ProfileRepositoryImpl.kt | 17 +++++++++++++++++ .../profile/domain/ProfileRepository.kt | 2 ++ .../domain/use_case/RemoveProfilePicture.kt | 9 +++++++++ .../profile/presentation/ProfileViewModel.kt | 18 +++++++++++++++++- .../profile/ui/ProfileMainFragment.kt | 15 +++++++++++---- .../main/res/layout/fragment_discussions.xml | 11 +---------- app/src/main/res/menu/notifications_menu.xml | 4 ++-- 8 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/isolaatti/profile/domain/use_case/RemoveProfilePicture.kt diff --git a/app/src/main/java/com/isolaatti/profile/data/remote/ProfileApi.kt b/app/src/main/java/com/isolaatti/profile/data/remote/ProfileApi.kt index 224c892..45a51cc 100644 --- a/app/src/main/java/com/isolaatti/profile/data/remote/ProfileApi.kt +++ b/app/src/main/java/com/isolaatti/profile/data/remote/ProfileApi.kt @@ -18,4 +18,7 @@ interface ProfileApi { @POST("EditProfile/UpdateProfile") fun updateProfile(@Body updateProfileDto: UpdateProfileDto): Call + @POST("EditProfile/RemoveProfileImage") + fun removeCurrentProfilePicture(): Call + } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/profile/data/repository/ProfileRepositoryImpl.kt b/app/src/main/java/com/isolaatti/profile/data/repository/ProfileRepositoryImpl.kt index 84d21c9..9d0d0eb 100644 --- a/app/src/main/java/com/isolaatti/profile/data/repository/ProfileRepositoryImpl.kt +++ b/app/src/main/java/com/isolaatti/profile/data/repository/ProfileRepositoryImpl.kt @@ -67,4 +67,21 @@ class ProfileRepositoryImpl @Inject constructor( emit(Resource.Error(Resource.Error.ErrorType.NetworkError)) } } + + override fun removeProfileImage(): Flow> = flow { + emit(Resource.Loading()) + + try { + val response = profileApi.removeCurrentProfilePicture().awaitResponse() + + if(response.isSuccessful) { + emit(Resource.Success(true)) + } else { + emit(Resource.Error(Resource.Error.mapErrorCode(response.code()))) + } + } catch (e: Exception) { + Log.e("ProfileRepositoryImpl", e.message.toString()) + emit(Resource.Error(Resource.Error.ErrorType.NetworkError)) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/profile/domain/ProfileRepository.kt b/app/src/main/java/com/isolaatti/profile/domain/ProfileRepository.kt index 8fc9d0e..b15ea31 100644 --- a/app/src/main/java/com/isolaatti/profile/domain/ProfileRepository.kt +++ b/app/src/main/java/com/isolaatti/profile/domain/ProfileRepository.kt @@ -12,4 +12,6 @@ interface ProfileRepository { fun setProfileImage(image: Image): Flow> fun updateProfile(newDisplayName: String, newDescription: String): Flow> + + fun removeProfileImage(): Flow> } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/profile/domain/use_case/RemoveProfilePicture.kt b/app/src/main/java/com/isolaatti/profile/domain/use_case/RemoveProfilePicture.kt new file mode 100644 index 0000000..552da88 --- /dev/null +++ b/app/src/main/java/com/isolaatti/profile/domain/use_case/RemoveProfilePicture.kt @@ -0,0 +1,9 @@ +package com.isolaatti.profile.domain.use_case + +import com.isolaatti.profile.domain.ProfileRepository +import javax.inject.Inject + +class RemoveProfilePicture @Inject constructor(private val profileRepository: ProfileRepository) { + + operator fun invoke() = profileRepository.removeProfileImage() +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/profile/presentation/ProfileViewModel.kt b/app/src/main/java/com/isolaatti/profile/presentation/ProfileViewModel.kt index 9adc5f9..7107c9b 100644 --- a/app/src/main/java/com/isolaatti/profile/presentation/ProfileViewModel.kt +++ b/app/src/main/java/com/isolaatti/profile/presentation/ProfileViewModel.kt @@ -11,6 +11,7 @@ import com.isolaatti.profile.domain.entity.UserProfile import com.isolaatti.profile.domain.use_case.FollowUser import com.isolaatti.profile.domain.use_case.GetProfile import com.isolaatti.profile.domain.use_case.GetProfilePosts +import com.isolaatti.profile.domain.use_case.RemoveProfilePicture import com.isolaatti.profile.domain.use_case.SetProfileImage import com.isolaatti.utils.Resource import dagger.hilt.android.lifecycle.HiltViewModel @@ -26,7 +27,8 @@ class ProfileViewModel @Inject constructor( private val getProfileUseCase: GetProfile, private val getProfilePostsUseCase: GetProfilePosts, private val setProfileImageUC: SetProfileImage, - private val followUserUC: FollowUser + private val followUserUC: FollowUser, + private val removeProfilePictureUC: RemoveProfilePicture ) : PostListingViewModelBase() { private val _profile = MutableLiveData() val profile: LiveData get() = _profile @@ -143,4 +145,18 @@ class ProfileViewModel @Inject constructor( fun setProfile(profile: UserProfile) { _profile.value = profile } + + fun removeCurrentProfileImage() { + viewModelScope.launch { + removeProfilePictureUC().onEach { + when(it) { + is Resource.Error -> {} + is Resource.Loading -> {} + is Resource.Success -> { + _profile.postValue(_profile.value?.copy(profileImageId = null)) + } + } + }.flowOn(Dispatchers.IO).launchIn(this) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt index ac4e276..86a1a0d 100644 --- a/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt +++ b/app/src/main/java/com/isolaatti/profile/ui/ProfileMainFragment.kt @@ -292,18 +292,25 @@ class ProfileMainFragment : Fragment() { .setTitle(R.string.remove_photo) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.yes_continue) { _, _ -> - // TODO remove image here + viewModel.removeCurrentProfileImage() } .show() } private lateinit var postListingRecyclerViewAdapterWiring: PostListingRecyclerViewAdapterWiring - + // counter variable to prevent calling appBarLayout.totalScrollRange many times + private var i = 0 private fun setupCollapsingBar() { - viewBinding.topAppBarLayout.addOnOffsetChangedListener { appBarLayout, verticalOffset -> - if (scrollRange == -1) scrollRange = appBarLayout.totalScrollRange + // prevent calling appBarLayout.totalScrollRange many times + if (i == 30) { + scrollRange = appBarLayout.totalScrollRange + i = 0 + } else { + i++ + } + if (scrollRange + verticalOffset == 0) { viewBinding.collapsingToolbarLayout.title = viewModel.profile.value?.name isShow = true diff --git a/app/src/main/res/layout/fragment_discussions.xml b/app/src/main/res/layout/fragment_discussions.xml index f082bc4..f3e947a 100644 --- a/app/src/main/res/layout/fragment_discussions.xml +++ b/app/src/main/res/layout/fragment_discussions.xml @@ -106,20 +106,11 @@ android:maxLines="4" android:textAlignment="center" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/description_options_button" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/play_button_container" app:layout_constraintTop_toTopOf="parent" tools:text="Hi there, I am software developer!" /> - diff --git a/app/src/main/res/menu/notifications_menu.xml b/app/src/main/res/menu/notifications_menu.xml index 01a7394..28c4adb 100644 --- a/app/src/main/res/menu/notifications_menu.xml +++ b/app/src/main/res/menu/notifications_menu.xml @@ -1,6 +1,6 @@ - - + + \ No newline at end of file