From 66ec9a147d0a27d27441cbbbc45fe06ae7213e5c Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:36:25 +0900 Subject: [PATCH 01/21] [feat/#135] GroupService reviewFriendList --- .../main/java/com/teumteum/data/service/GroupService.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/data/src/main/java/com/teumteum/data/service/GroupService.kt b/core/data/src/main/java/com/teumteum/data/service/GroupService.kt index 06fb3680..a987335c 100644 --- a/core/data/src/main/java/com/teumteum/data/service/GroupService.kt +++ b/core/data/src/main/java/com/teumteum/data/service/GroupService.kt @@ -2,6 +2,7 @@ package com.teumteum.data.service import com.teumteum.data.model.response.ResponseGroup import com.teumteum.data.model.response.ResponseMeeting +import com.teumteum.data.model.response.ResponseReviewFriends import com.teumteum.domain.entity.Meeting import okhttp3.MultipartBody import okhttp3.RequestBody @@ -17,8 +18,6 @@ import retrofit2.http.Path import retrofit2.http.Query interface GroupService { - - @Multipart @POST("meetings") suspend fun postMoim( @@ -71,4 +70,9 @@ interface GroupService { suspend fun reportMeeting( @Path("meetingId") meetingId:Long ): Response + + @GET("meetings/{meetingId}/participants") + suspend fun getReviewFriendList( + @Path("meetingId") meetingId: Long + ): ResponseReviewFriends } \ No newline at end of file From be0e4d0e6e5ab5ec7d119cc76c71b7f417a9a01a Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:36:49 +0900 Subject: [PATCH 02/21] [feat/#135] ResponseReviewFriend & ReviewFriend --- .../model/response/ResponseReviewFriend.kt | 21 +++++++++++++++++++ .../teumteum/domain/entity/ReviewFriend.kt | 12 +++++++++++ 2 files changed, 33 insertions(+) create mode 100644 core/data/src/main/java/com/teumteum/data/model/response/ResponseReviewFriend.kt create mode 100644 core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt diff --git a/core/data/src/main/java/com/teumteum/data/model/response/ResponseReviewFriend.kt b/core/data/src/main/java/com/teumteum/data/model/response/ResponseReviewFriend.kt new file mode 100644 index 00000000..f466aa1c --- /dev/null +++ b/core/data/src/main/java/com/teumteum/data/model/response/ResponseReviewFriend.kt @@ -0,0 +1,21 @@ +package com.teumteum.data.model.response + +import com.teumteum.domain.entity.ReviewFriend +import kotlinx.serialization.Serializable + +@Serializable +data class ResponseReviewFriends( + val participants: List +) + +@Serializable +data class ResponseReviewFriend( + val id: Long, + val characterId: Long, + val name: String, + val job: String +) { + fun toReviewFriend(): ReviewFriend { + return ReviewFriend(id, characterId, name, job) + } +} \ No newline at end of file diff --git a/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt b/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt new file mode 100644 index 00000000..0bf5003a --- /dev/null +++ b/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt @@ -0,0 +1,12 @@ +package com.teumteum.domain.entity + +import kotlinx.serialization.Serializable + +@Serializable +data class ReviewFriend( + val id: Long, + val characterId: Long, + val name: String, + val job: String, + var isSelected: Boolean = false +) \ No newline at end of file From b999d784ffd319609405194066b06564f660986b Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:37:16 +0900 Subject: [PATCH 03/21] [feat/#135] ReviewFriendList dataSource & Repository --- .../data/datasource/remote/RemoteGroupDataSource.kt | 7 +++++++ .../com/teumteum/data/repository/GroupRepositoryImpl.kt | 6 ++++++ .../java/com/teumteum/domain/repository/GroupRepository.kt | 2 ++ 3 files changed, 15 insertions(+) diff --git a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt index 5a849da9..01d00d06 100644 --- a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt +++ b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt @@ -3,6 +3,7 @@ package com.teumteum.data.datasource.remote import com.teumteum.data.model.response.ResponseGroup import com.teumteum.data.model.response.ResponseMeeting import com.teumteum.data.model.response.ResponseMyMeeting +import com.teumteum.data.model.response.ResponseReviewFriends import com.teumteum.data.service.GroupService import okhttp3.MultipartBody import okhttp3.RequestBody @@ -68,4 +69,10 @@ class RemoteGroupDataSource @Inject constructor( ): Boolean { return service.reportMeeting(meetingId).isSuccessful } + + suspend fun getReviewFriendList( + meetingId: Long + ): ResponseReviewFriends { + return service.getReviewFriendList(meetingId) + } } \ No newline at end of file diff --git a/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt index 0535193c..f66a5572 100644 --- a/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt +++ b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt @@ -7,6 +7,7 @@ import com.teumteum.data.model.request.toBody import com.teumteum.domain.TeumTeumDataStore import com.teumteum.domain.entity.Meeting import com.teumteum.domain.entity.MoimEntity +import com.teumteum.domain.entity.ReviewFriend import com.teumteum.domain.repository.GroupRepository import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -94,4 +95,9 @@ class GroupRepositoryImpl @Inject constructor( } } + override suspend fun getReviewFriendList(meetingId: Long): Result> { + return runCatching { + dataSource.getReviewFriendList(meetingId).participants.map { it.toReviewFriend() } + } + } } \ No newline at end of file diff --git a/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt b/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt index 28b51d05..a1c8a282 100644 --- a/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt +++ b/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt @@ -2,6 +2,7 @@ package com.teumteum.domain.repository import com.teumteum.domain.entity.Meeting import com.teumteum.domain.entity.MoimEntity +import com.teumteum.domain.entity.ReviewFriend import java.io.File interface GroupRepository { @@ -13,4 +14,5 @@ interface GroupRepository { suspend fun deleteMeeting(meetingId: Long): Result suspend fun modifyMeeting(meetingId: Long, moimEntity: MoimEntity, imageFiles: List): Result suspend fun reportMeeting(meetingId: Long): Result + suspend fun getReviewFriendList(meetingId: Long): Result> } \ No newline at end of file From 1e0f9383ece8f2487c7d2608eded70fa5d08c130 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:38:27 +0900 Subject: [PATCH 04/21] =?UTF-8?q?[feat/#135]=20ReviewOnboardingActivity=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/review/ReviewOnboardingActivity.kt | 43 +++++++++++++++++++ .../res/layout/activity_review_onboading.xml | 7 ++- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewOnboardingActivity.kt diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewOnboardingActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewOnboardingActivity.kt new file mode 100644 index 00000000..7c62cbfb --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewOnboardingActivity.kt @@ -0,0 +1,43 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.lifecycle.lifecycleScope +import com.teumteum.base.BindingActivity +import com.teumteum.base.util.extension.longExtra +import com.teumteum.base.util.extension.stringExtra +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.ActivityReviewOnboadingBinding +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch + +class ReviewOnboardingActivity: BindingActivity(R.layout.activity_review_onboading) { + private val meetingId by longExtra() + private val title by stringExtra() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initView() + } + + private fun initView() { + title?.let { + binding.tvTitle.text = getString(R.string.review_onboarding_title, it) + } + + lifecycleScope.launch { + delay(3000) + startActivity(ReviewActivity.getIntent(this@ReviewOnboardingActivity, meetingId)) + openActivitySlideAnimation() + finish() + } + } + + companion object { + fun getIntent(context: Context, meetingId: Long, title: String) = Intent(context, ReviewOnboardingActivity::class.java).apply { + putExtra("meetingId", meetingId) + putExtra("title", title) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_review_onboading.xml b/app/src/main/res/layout/activity_review_onboading.xml index c70ea6c8..45a9b637 100644 --- a/app/src/main/res/layout/activity_review_onboading.xml +++ b/app/src/main/res/layout/activity_review_onboading.xml @@ -32,10 +32,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="112dp" - app:layout_constraintStart_toStartOf="parent" + android:src="@drawable/ic_review" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/tv_title" - tools:src="@drawable/ic_review" /> - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_title" /> \ 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 da7142de..4772e8da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -323,7 +323,7 @@ 더 가까워지기 소개서를 살펴보며 서로를\n소개해 보세요 - %1$s\n모임이 종료 되었어요. + %1$s\n모임이 종료되었어요 특별히 인상적인\n틈틈 유저가 있었나요? 선택항목은 상대방에게 전달되지 않아요 리뷰 남기기 From ed40f56856bd685ae69e00290a8396d56d434e2b Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:38:55 +0900 Subject: [PATCH 05/21] [feat/#135] ReviewActivity --- .../group/review/ReviewActivity.kt | 63 +++++++++++++++++++ app/src/main/res/layout/activity_review.xml | 31 +++++---- 2 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt new file mode 100644 index 00000000..0272ca18 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt @@ -0,0 +1,63 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.activity.viewModels +import androidx.fragment.app.commit +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import com.teumteum.base.BindingActivity +import com.teumteum.base.component.appbar.AppBarLayout +import com.teumteum.base.component.appbar.AppBarMenu +import com.teumteum.base.databinding.LayoutCommonAppbarBinding +import com.teumteum.base.util.extension.longExtra +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.ActivityReviewBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach + +@AndroidEntryPoint +class ReviewActivity: BindingActivity(R.layout.activity_review), AppBarLayout { + private val viewModel by viewModels() + private val meetingId by longExtra() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + viewModel.meetingId = meetingId + initAppBarLayout() + initView() + } + + override val appBarBinding: LayoutCommonAppbarBinding + get() = binding.appBar + + override fun initAppBarLayout() { + setAppBarHeight(48) + + addMenuToLeft( + AppBarMenu.IconStyle( + resourceId = R.drawable.ic_close, + useRippleEffect = false, + clickEvent = { + finish() + } + ) + ) + } + + private fun initView() { + supportFragmentManager.commit { + add(R.id.fragment_container,ReviewFriendSelectFragment()) + } + } + + companion object { + fun getIntent(context: Context, meetingId: Long) = Intent(context, ReviewActivity::class.java).apply { + putExtra("meetingId", meetingId) + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_review.xml b/app/src/main/res/layout/activity_review.xml index 623ddaf8..dcf23000 100644 --- a/app/src/main/res/layout/activity_review.xml +++ b/app/src/main/res/layout/activity_review.xml @@ -1,18 +1,25 @@ - - + - + + - \ No newline at end of file + android:layout_height="match_parent"> + + + + + + \ No newline at end of file From df6c01ba0b3618f915741ba490d75ef2021a1b66 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:39:16 +0900 Subject: [PATCH 06/21] [feat/#135] ReviewFriendSelectFragment --- .../review/ReviewFriendSelectFragment.kt | 76 +++++++++++ .../main/res/drawable/selector_check_box.xml | 2 + .../layout/fragment_review_friend_select.xml | 120 ++++++++++-------- app/src/main/res/layout/item_review_user.xml | 10 +- 4 files changed, 146 insertions(+), 62 deletions(-) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt new file mode 100644 index 00000000..872713e9 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt @@ -0,0 +1,76 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.os.Bundle +import android.util.Log +import android.view.View +import androidx.fragment.app.activityViewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.teumteum.base.BindingFragment +import com.teumteum.base.util.extension.deepCopyList +import com.teumteum.base.util.extension.setOnSingleClickListener +import com.teumteum.domain.entity.Friend +import com.teumteum.domain.entity.ReviewFriend +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.FragmentReviewFriendSelectBinding +import kotlin.reflect.typeOf +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + + +class ReviewFriendSelectFragment: BindingFragment(R.layout.fragment_review_friend_select) { + private val viewModel by activityViewModels() + private var adapter: ReviewFriendListAdapter? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initView() + initEvent() + observe() + } + + private fun initView() { + adapter = ReviewFriendListAdapter { friend -> + val currentList = Gson().toJson(adapter?.currentList) + val newCurrentList = Gson().fromJson>(currentList, object : TypeToken>() {}.type) + + newCurrentList?.forEach { + if(it.id == friend.id) { + it.isSelected = !it.isSelected + } + } + adapter?.submitList(newCurrentList) + binding.btnReview.isEnabled = newCurrentList.any { it.isSelected } + } + binding.rvUser.run { + itemAnimator = null + adapter = this@ReviewFriendSelectFragment.adapter + } + viewModel.getReviewFriendList() + } + + private fun initEvent() { + binding.btnReview.setOnSingleClickListener { + + } + } + + private fun observe() { + viewModel.moimFriendList.flowWithLifecycle(lifecycle) + .onEach { + if (it.isNotEmpty()) { + adapter?.submitList(it) + } + }.launchIn(lifecycleScope) + } + + override fun onDestroyView() { + adapter = null + super.onDestroyView() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_check_box.xml b/app/src/main/res/drawable/selector_check_box.xml index dbb13ead..7d1fa1ce 100644 --- a/app/src/main/res/drawable/selector_check_box.xml +++ b/app/src/main/res/drawable/selector_check_box.xml @@ -1,5 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_review_friend_select.xml b/app/src/main/res/layout/fragment_review_friend_select.xml index 3258b59b..6e5c39ec 100644 --- a/app/src/main/res/layout/fragment_review_friend_select.xml +++ b/app/src/main/res/layout/fragment_review_friend_select.xml @@ -1,60 +1,68 @@ - - - - - - - - - - - + + + + + + + android:layout_height="match_parent"> + + + + + + + + + + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_review_user.xml b/app/src/main/res/layout/item_review_user.xml index 44fa9a5a..1bc2e362 100644 --- a/app/src/main/res/layout/item_review_user.xml +++ b/app/src/main/res/layout/item_review_user.xml @@ -40,15 +40,13 @@ app:layout_constraintStart_toStartOf="@id/tv_name" app:layout_constraintTop_toBottomOf="@id/tv_name" /> - + android:layout_marginEnd="20dp" /> \ No newline at end of file From 6924499feb1bc736ec23d84f2fbf7097c32446dd Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:39:38 +0900 Subject: [PATCH 07/21] [feat/#135] ReviewFriendListAdapter & ReviewViewModel --- .../group/review/ReviewFriendListAdapter.kt | 53 +++++++++++++++++++ .../group/review/ReviewViewModel.kt | 39 ++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendListAdapter.kt create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendListAdapter.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendListAdapter.kt new file mode 100644 index 00000000..fafe09a7 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendListAdapter.kt @@ -0,0 +1,53 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.teumteum.base.util.extension.setOnSingleClickListener +import com.teumteum.domain.entity.ReviewFriend +import com.teumteum.teumteum.databinding.ItemReviewUserBinding +import com.teumteum.teumteum.util.ResMapper +import com.teumteum.teumteum.util.callback.ItemDiffCallback + +class ReviewFriendListAdapter(private val itemClick: (ReviewFriend) -> (Unit)) : + ListAdapter( + DIFF_UTIL + ) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReviewFriendViewHolder { + val binding = ItemReviewUserBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + return ReviewFriendViewHolder(binding, itemClick) + } + + override fun onBindViewHolder(holder: ReviewFriendViewHolder, position: Int) { + holder.onBind(getItem(position)) + } + + class ReviewFriendViewHolder( + private val binding: ItemReviewUserBinding, + private val itemClick: (ReviewFriend) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun onBind(item: ReviewFriend) { + binding.tvName.text = item.name + binding.tvCompany.text = item.job + binding.ivSelected.isSelected = item.isSelected + binding.ivUserIcon.setImageResource(ResMapper.getCharacterDrawableById(item.characterId.toInt())) + + binding.root.setOnSingleClickListener { + itemClick(item) + } + } + } + + companion object { + val DIFF_UTIL = ItemDiffCallback( + onItemsTheSame = { old, new -> old.id == new.id }, + onContentsTheSame = { old, new -> old.isSelected == new.isSelected }, + ) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt new file mode 100644 index 00000000..6ed1da78 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt @@ -0,0 +1,39 @@ +package com.teumteum.teumteum.presentation.group.review + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.teumteum.domain.entity.ReviewFriend +import com.teumteum.domain.repository.GroupRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +@HiltViewModel +class ReviewViewModel @Inject constructor( + private val repository: GroupRepository +): ViewModel() { + private var _selectFriendList = listOf() + val selectFriendList get() = _selectFriendList + + private val _moimFriendList = MutableStateFlow>(listOf()) + val moimFriendList: StateFlow> = _moimFriendList + + var meetingId: Long? = null + + fun setSelectFriendList(selectFriendList: List) { + _selectFriendList = selectFriendList + } + + fun getReviewFriendList() { + meetingId?.let { id -> + viewModelScope.launch { + repository.getReviewFriendList(id) + .onSuccess { + _moimFriendList.value = it + } + } + } + } +} \ No newline at end of file From cdfa22fec06ac795236ce287d4784cf99b11013b Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 00:40:24 +0900 Subject: [PATCH 08/21] [feat/#135] MainActivity push alarm --- app/src/main/AndroidManifest.xml | 7 ++++++- .../teumteum/presentation/MainActivity.kt | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5d22693..08fea02c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -108,7 +108,12 @@ - + + diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt index d05ff5d5..a82afccd 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt @@ -15,8 +15,11 @@ import androidx.navigation.ui.setupWithNavController import com.teumteum.base.BindingActivity import com.teumteum.base.util.extension.boolExtra import com.teumteum.base.util.extension.intExtra +import com.teumteum.base.util.extension.longExtra +import com.teumteum.base.util.extension.stringExtra import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.ActivityMainBinding +import com.teumteum.teumteum.presentation.group.review.ReviewOnboardingActivity import com.teumteum.teumteum.presentation.home.HomeFragmentDirections import com.teumteum.teumteum.presentation.signin.SignInViewModel import dagger.hilt.android.AndroidEntryPoint @@ -26,6 +29,8 @@ class MainActivity : BindingActivity(R.layout.activity_main private val id by intExtra() private var isGroup: Boolean = false private val isFromAlarm by boolExtra() + private val meetingId by longExtra() + private val title by stringExtra() private val viewModel by viewModels() @@ -41,7 +46,9 @@ class MainActivity : BindingActivity(R.layout.activity_main if (id != -1) { moveRecommendDetail() } if(isGroup) { moveWebView() } - + if (meetingId != -1L && title != null) { + moveReviewOnboardingActivity() + } if (isFromAlarm) { val action = HomeFragmentDirections.actionHomeFragmentToFragmentFamiliar() @@ -67,6 +74,10 @@ class MainActivity : BindingActivity(R.layout.activity_main navHostFragment.navController.navigate(action) } + private fun moveReviewOnboardingActivity() { + startActivity(ReviewOnboardingActivity.getIntent(this, meetingId, title!!)) + } + fun returnGroupDetail(fullAddress:String) { val returnIntent = Intent().apply { putExtra("address", fullAddress) @@ -140,5 +151,9 @@ class MainActivity : BindingActivity(R.layout.activity_main putExtra("id", id) putExtra("isFromAlarm", isFromAlarm) } + fun getIntent(context: Context, meetingId: Long, title: String) = Intent(context, MainActivity::class.java).apply { + putExtra("meetingId", meetingId) + putExtra("title", title) + } } } From 84acea90ff179551ba44952df2a47ff3155b7d4e Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 18:31:29 +0900 Subject: [PATCH 09/21] =?UTF-8?q?[ui/#135]=20selector=5Freview=5Ftext=5Fco?= =?UTF-8?q?lor=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/color/selector_review_text_color.xml | 5 + .../layout/fragment_review_friend_detail.xml | 370 +++++++++--------- 2 files changed, 194 insertions(+), 181 deletions(-) create mode 100644 app/src/main/res/color/selector_review_text_color.xml diff --git a/app/src/main/res/color/selector_review_text_color.xml b/app/src/main/res/color/selector_review_text_color.xml new file mode 100644 index 00000000..b63b321e --- /dev/null +++ b/app/src/main/res/color/selector_review_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_review_friend_detail.xml b/app/src/main/res/layout/fragment_review_friend_detail.xml index 78fdb909..b5c2d50b 100644 --- a/app/src/main/res/layout/fragment_review_friend_detail.xml +++ b/app/src/main/res/layout/fragment_review_friend_detail.xml @@ -1,207 +1,215 @@ - - - - - - - - - - - + xmlns:tools="http://schemas.android.com/tools"> - + - - - + - + android:layout_height="match_parent"> - - - - + app:layout_constraintStart_toStartOf="@id/tv_title" + app:layout_constraintTop_toBottomOf="@id/tv_title" /> - - - + + + + + + + + + + + + + - - + app:layout_constraintTop_toBottomOf="@id/view_division_card"> - - - + - + + + + + + + + + + - + app:layout_constraintStart_toEndOf="@id/cl_good" + app:layout_constraintTop_toTopOf="@id/cl_bad"> - - - - \ No newline at end of file + + + + + + + + + + \ No newline at end of file From 03fac15eebd5c27e3c570118c08083a3fb47c8be Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 18:31:47 +0900 Subject: [PATCH 10/21] =?UTF-8?q?[feat/#135]=20ArgsExtension=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/util/extension/ArgsExtension.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 core/base/src/main/java/com/teumteum/base/util/extension/ArgsExtension.kt diff --git a/core/base/src/main/java/com/teumteum/base/util/extension/ArgsExtension.kt b/core/base/src/main/java/com/teumteum/base/util/extension/ArgsExtension.kt new file mode 100644 index 00000000..d5b2a200 --- /dev/null +++ b/core/base/src/main/java/com/teumteum/base/util/extension/ArgsExtension.kt @@ -0,0 +1,20 @@ +package com.teumteum.base.util.extension + +import androidx.fragment.app.Fragment +import kotlin.properties.ReadOnlyProperty + +fun intArgs() = ReadOnlyProperty { thisRef, property -> + thisRef.requireArguments().getInt(property.name) +} + +fun longArgs() = ReadOnlyProperty { thisRef, property -> + thisRef.requireArguments().getLong(property.name) +} + +fun boolArgs() = ReadOnlyProperty { thisRef, property -> + thisRef.requireArguments().getBoolean(property.name) +} + +fun stringArgs() = ReadOnlyProperty { thisRef, property -> + thisRef.requireArguments().getString(property.name, "") +} \ No newline at end of file From 6dc7fe6844bbbedc7ae21b9dfb069f0263a7feaa Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 18:32:10 +0900 Subject: [PATCH 11/21] =?UTF-8?q?[feat/#135]=20ReviewFriend=20review=20tex?= =?UTF-8?q?t=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/teumteum/domain/entity/ReviewFriend.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt b/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt index 0bf5003a..5a8d4aa3 100644 --- a/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt +++ b/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt @@ -8,5 +8,6 @@ data class ReviewFriend( val characterId: Long, val name: String, val job: String, - var isSelected: Boolean = false + var isSelected: Boolean = false, + var review: String = "" ) \ No newline at end of file From 753f41601ee9b69cc36ea4933eec9cc9ee47f51c Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 18:32:42 +0900 Subject: [PATCH 12/21] =?UTF-8?q?[feat/#135]=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/group/review/ReviewActivity.kt | 17 ++++++++++++----- .../group/review/ReviewFriendSelectFragment.kt | 13 +++++++------ .../layout/fragment_review_friend_select.xml | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt index 0272ca18..136cfd71 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt @@ -5,8 +5,6 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.fragment.app.commit -import androidx.lifecycle.flowWithLifecycle -import androidx.lifecycle.lifecycleScope import com.teumteum.base.BindingActivity import com.teumteum.base.component.appbar.AppBarLayout import com.teumteum.base.component.appbar.AppBarMenu @@ -15,8 +13,6 @@ import com.teumteum.base.util.extension.longExtra import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.ActivityReviewBinding import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach @AndroidEntryPoint class ReviewActivity: BindingActivity(R.layout.activity_review), AppBarLayout { @@ -50,7 +46,18 @@ class ReviewActivity: BindingActivity(R.layout.activity_r private fun initView() { supportFragmentManager.commit { - add(R.id.fragment_container,ReviewFriendSelectFragment()) + replace(R.id.fragment_container, ReviewFriendSelectFragment()) + } + } + + fun nextFriendDetailFragment() { + if (viewModel.currentFriendIndex >= viewModel.selectFriendList.size) return + with(viewModel.selectFriendList[viewModel.currentFriendIndex++]) { + val fragment = ReviewFriendDetailFragment.newInstance(id, characterId, name, job) + + supportFragmentManager.commit { + replace(R.id.fragment_container, fragment) + } } } diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt index 872713e9..1a87e999 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt @@ -1,7 +1,6 @@ package com.teumteum.teumteum.presentation.group.review import android.os.Bundle -import android.util.Log import android.view.View import androidx.fragment.app.activityViewModels import androidx.lifecycle.flowWithLifecycle @@ -9,17 +8,12 @@ import androidx.lifecycle.lifecycleScope import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.teumteum.base.BindingFragment -import com.teumteum.base.util.extension.deepCopyList import com.teumteum.base.util.extension.setOnSingleClickListener -import com.teumteum.domain.entity.Friend import com.teumteum.domain.entity.ReviewFriend import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.FragmentReviewFriendSelectBinding -import kotlin.reflect.typeOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json class ReviewFriendSelectFragment: BindingFragment(R.layout.fragment_review_friend_select) { @@ -56,7 +50,14 @@ class ReviewFriendSelectFragment: BindingFragment Date: Tue, 13 Feb 2024 18:32:59 +0900 Subject: [PATCH 13/21] =?UTF-8?q?[feat/#135]=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/ReviewFriendDetailFragment.kt | 89 +++++++++++++++++++ .../group/review/ReviewViewModel.kt | 9 ++ 2 files changed, 98 insertions(+) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt new file mode 100644 index 00000000..e0519959 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt @@ -0,0 +1,89 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.activityViewModels +import com.teumteum.base.BindingFragment +import com.teumteum.base.util.extension.longArgs +import com.teumteum.base.util.extension.longExtra +import com.teumteum.base.util.extension.setOnSingleClickListener +import com.teumteum.base.util.extension.stringArgs +import com.teumteum.domain.entity.ReviewFriend +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.FragmentReviewFriendDetailBinding +import com.teumteum.teumteum.util.ResMapper + +class ReviewFriendDetailFragment: BindingFragment(R.layout.fragment_review_friend_detail) { + private val viewModel by activityViewModels() + private val id by longArgs() + private val characterId by longArgs() + private val name by stringArgs() + private val job by stringArgs() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initView() + initClick() + } + + private fun initView() { + with(binding) { + tvTitle.text = getString(R.string.review_select_friend_title, name) + tvName.text = name + tvCompany.text = job + ivUserIcon.setImageResource(ResMapper.getCharacterDrawableById(characterId.toInt())) + } + } + + private fun initClick() { + val friendDetail = ReviewFriend(id, characterId, name, job) + binding.btnReview.setOnSingleClickListener { + if (viewModel.currentFriendIndex < viewModel.selectFriendList.size) { + viewModel.addSelectDetailFriendList(friendDetail) + (requireActivity() as? ReviewActivity)?.nextFriendDetailFragment() + } else { + + } + } + + binding.clBad.setOnSingleClickListener { + setSelectReview(it.id) + friendDetail.review = "별로에요" + } + + binding.clBest.setOnSingleClickListener { + setSelectReview(it.id) + friendDetail.review = "최고에요" + } + + binding.clGood.setOnSingleClickListener { + setSelectReview(it.id) + friendDetail.review = "좋아요" + } + } + + private fun setSelectReview(viewId: Int) { + with(binding) { + tvBad.isSelected = viewId == clBad.id + ivBad.isSelected = viewId == clBad.id + tvBest.isSelected = viewId == clBest.id + ivBest.isSelected = viewId == clBest.id + tvGood.isSelected = viewId == clGood.id + ivGood.isSelected = viewId == clGood.id + + btnReview.isEnabled = true + } + } + + companion object { + fun newInstance(id: Long, characterId: Long, name: String, job: String) = + ReviewFriendDetailFragment().apply { + arguments = Bundle().apply { + putLong("id", id) + putLong("characterId", characterId) + putString("name", name) + putString("job", job) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt index 6ed1da78..ff866647 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt @@ -17,15 +17,24 @@ class ReviewViewModel @Inject constructor( private var _selectFriendList = listOf() val selectFriendList get() = _selectFriendList + private var _selectDetailFriendList = mutableListOf() + val selectDetailFriendList get() = _selectFriendList + private val _moimFriendList = MutableStateFlow>(listOf()) val moimFriendList: StateFlow> = _moimFriendList var meetingId: Long? = null + var currentFriendIndex = 0 + fun setSelectFriendList(selectFriendList: List) { _selectFriendList = selectFriendList } + fun addSelectDetailFriendList(selectFriendDetail: ReviewFriend) { + _selectDetailFriendList.add(selectFriendDetail) + } + fun getReviewFriendList() { meetingId?.let { id -> viewModelScope.launch { From 42fd82720e1137d5e853afb33e280d6f6e46291c Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:02:44 +0900 Subject: [PATCH 14/21] =?UTF-8?q?[feat/#135]=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=A2=85=EB=A3=8C=20=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EC=96=BC=EB=A1=9C=EA=B7=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/review/ReviewInfoDialog.kt | 48 +++++++++++++++++ app/src/main/res/drawable/shape_bg_dialog.xml | 5 ++ .../main/res/layout/dialog_review_info.xml | 52 +++++++++++++++++++ app/src/main/res/values/strings.xml | 4 ++ 4 files changed, 109 insertions(+) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewInfoDialog.kt create mode 100644 app/src/main/res/drawable/shape_bg_dialog.xml create mode 100644 app/src/main/res/layout/dialog_review_info.xml diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewInfoDialog.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewInfoDialog.kt new file mode 100644 index 00000000..6311286a --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewInfoDialog.kt @@ -0,0 +1,48 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.content.res.Resources +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import com.teumteum.base.BindingDialogFragment +import com.teumteum.base.util.extension.setOnSingleClickListener +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.DialogReviewInfoBinding + +class ReviewInfoDialog : + BindingDialogFragment(R.layout.dialog_review_info) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initClick() + } + + private fun initClick() { + binding.btnBack.setOnSingleClickListener { + dismiss() + } + + binding.btnOk.setOnSingleClickListener { + requireActivity().finish() + } + } + + private fun setDialogBackground() { + val deviceWidth = Resources.getSystem().displayMetrics.widthPixels + val dialogHorizontalMargin = (Resources.getSystem().displayMetrics.density * 26) + + dialog?.window?.apply { + setLayout( + (deviceWidth - dialogHorizontalMargin * 2).toInt(), + WindowManager.LayoutParams.WRAP_CONTENT, + ) + setBackgroundDrawableResource(R.drawable.shape_bg_dialog) + } + dialog?.setCancelable(true) + } + + override fun onStart() { + super.onStart() + setDialogBackground() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_dialog.xml b/app/src/main/res/drawable/shape_bg_dialog.xml new file mode 100644 index 00000000..8b405d39 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_dialog.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_review_info.xml b/app/src/main/res/layout/dialog_review_info.xml new file mode 100644 index 00000000..a5c90a70 --- /dev/null +++ b/app/src/main/res/layout/dialog_review_info.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + \ 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 4772e8da..b699dc70 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -331,6 +331,10 @@ 리뷰 남기기가\n완료되었습니다. 홈으로 돌아가기 + 리뷰 남기기를 종료하시겠어요? + 종료할래요 + 돌아가기 + 정말 틈틈을 종료하시겠어요? 틈틈을 종료하시면 지금까지 진행한\n틈틈의 내용이 사라져요. 종료하기 From 46280ff7dbf473b9eea5e903ba38944964411494 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:03:25 +0900 Subject: [PATCH 15/21] [feat/#135] GroupService postRegisterReview --- .../main/java/com/teumteum/data/service/GroupService.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/data/src/main/java/com/teumteum/data/service/GroupService.kt b/core/data/src/main/java/com/teumteum/data/service/GroupService.kt index a987335c..f570d233 100644 --- a/core/data/src/main/java/com/teumteum/data/service/GroupService.kt +++ b/core/data/src/main/java/com/teumteum/data/service/GroupService.kt @@ -1,5 +1,6 @@ package com.teumteum.data.service +import com.teumteum.data.model.request.RequestReviewFriend import com.teumteum.data.model.response.ResponseGroup import com.teumteum.data.model.response.ResponseMeeting import com.teumteum.data.model.response.ResponseReviewFriends @@ -75,4 +76,10 @@ interface GroupService { suspend fun getReviewFriendList( @Path("meetingId") meetingId: Long ): ResponseReviewFriends + + @POST("users/reviews") + suspend fun postRegisterReview( + @Query("meetingId") meetingsId: Long, + @Body request: List + ):Response } \ No newline at end of file From 4154b893ca8755ce5c4030044d97324942fafa49 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:03:48 +0900 Subject: [PATCH 16/21] [feat/#135] RemoteGroupDataSource postRegisterReview --- .../data/datasource/remote/RemoteGroupDataSource.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt index 01d00d06..5efcc470 100644 --- a/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt +++ b/core/data/src/main/java/com/teumteum/data/datasource/remote/RemoteGroupDataSource.kt @@ -1,8 +1,8 @@ package com.teumteum.data.datasource.remote +import com.teumteum.data.model.request.RequestReviewFriend import com.teumteum.data.model.response.ResponseGroup import com.teumteum.data.model.response.ResponseMeeting -import com.teumteum.data.model.response.ResponseMyMeeting import com.teumteum.data.model.response.ResponseReviewFriends import com.teumteum.data.service.GroupService import okhttp3.MultipartBody @@ -75,4 +75,11 @@ class RemoteGroupDataSource @Inject constructor( ): ResponseReviewFriends { return service.getReviewFriendList(meetingId) } + + suspend fun postRegisterReview( + meetingId: Long, + requestReviewFriends: List + ): Boolean { + return service.postRegisterReview(meetingId, requestReviewFriends).isSuccessful + } } \ No newline at end of file From 7819c93f997e1873b61a380375cfdd7bc4267bc1 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:04:09 +0900 Subject: [PATCH 17/21] [feat/#135] GroupRepository postRegisterReview --- .../teumteum/data/repository/GroupRepositoryImpl.kt | 10 ++++++++++ .../com/teumteum/domain/repository/GroupRepository.kt | 1 + 2 files changed, 11 insertions(+) diff --git a/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt index f66a5572..4088ceda 100644 --- a/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt +++ b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt @@ -4,6 +4,7 @@ import android.util.Log import com.google.gson.Gson import com.teumteum.data.datasource.remote.RemoteGroupDataSource import com.teumteum.data.model.request.toBody +import com.teumteum.data.model.request.toRequestReviewFriend import com.teumteum.domain.TeumTeumDataStore import com.teumteum.domain.entity.Meeting import com.teumteum.domain.entity.MoimEntity @@ -100,4 +101,13 @@ class GroupRepositoryImpl @Inject constructor( dataSource.getReviewFriendList(meetingId).participants.map { it.toReviewFriend() } } } + + override suspend fun postRegisterReview( + meetingId: Long, + request: List + ): Result { + return runCatching { + dataSource.postRegisterReview(meetingId, request.map { it.toRequestReviewFriend() }) + } + } } \ No newline at end of file diff --git a/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt b/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt index a1c8a282..b32e1418 100644 --- a/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt +++ b/core/domain/src/main/java/com/teumteum/domain/repository/GroupRepository.kt @@ -15,4 +15,5 @@ interface GroupRepository { suspend fun modifyMeeting(meetingId: Long, moimEntity: MoimEntity, imageFiles: List): Result suspend fun reportMeeting(meetingId: Long): Result suspend fun getReviewFriendList(meetingId: Long): Result> + suspend fun postRegisterReview(meetingId: Long, request: List): Result } \ No newline at end of file From a075600dc5d841be72b4fb6463cd5442da051b48 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:04:25 +0900 Subject: [PATCH 18/21] [feat/#135] RequestReviewFriend --- .../data/model/request/RequestReviewFriend.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt diff --git a/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt b/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt new file mode 100644 index 00000000..3461be89 --- /dev/null +++ b/core/data/src/main/java/com/teumteum/data/model/request/RequestReviewFriend.kt @@ -0,0 +1,14 @@ +package com.teumteum.data.model.request + +import com.teumteum.domain.entity.ReviewFriend +import kotlinx.serialization.Serializable + +@Serializable +data class RequestReviewFriend( + val id: Long, + val review: String +) + +fun ReviewFriend.toRequestReviewFriend(): RequestReviewFriend { + return RequestReviewFriend(id, review) +} \ No newline at end of file From 93c75a8b38592c45b5b1a4cd271ef17f3faeedd6 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:04:42 +0900 Subject: [PATCH 19/21] =?UTF-8?q?[feat/#135]=20ReviewActivity=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../group/review/ReviewActivity.kt | 12 +- .../res/layout/activity_review_finish.xml | 103 ++++++++++-------- 2 files changed, 62 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt index 136cfd71..490acf5b 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt @@ -15,7 +15,8 @@ import com.teumteum.teumteum.databinding.ActivityReviewBinding import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class ReviewActivity: BindingActivity(R.layout.activity_review), AppBarLayout { +class ReviewActivity : BindingActivity(R.layout.activity_review), + AppBarLayout { private val viewModel by viewModels() private val meetingId by longExtra() @@ -38,7 +39,7 @@ class ReviewActivity: BindingActivity(R.layout.activity_r resourceId = R.drawable.ic_close, useRippleEffect = false, clickEvent = { - finish() + ReviewInfoDialog().show(supportFragmentManager, "dialog") } ) ) @@ -62,9 +63,10 @@ class ReviewActivity: BindingActivity(R.layout.activity_r } companion object { - fun getIntent(context: Context, meetingId: Long) = Intent(context, ReviewActivity::class.java).apply { - putExtra("meetingId", meetingId) - } + fun getIntent(context: Context, meetingId: Long) = + Intent(context, ReviewActivity::class.java).apply { + putExtra("meetingId", meetingId) + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_review_finish.xml b/app/src/main/res/layout/activity_review_finish.xml index 65911d47..0c24925e 100644 --- a/app/src/main/res/layout/activity_review_finish.xml +++ b/app/src/main/res/layout/activity_review_finish.xml @@ -1,50 +1,57 @@ - - - - - - - - - - - + + + + + + - \ No newline at end of file + android:layout_height="match_parent"> + + + + + + + + + + + + \ No newline at end of file From 6972e8f444706fd99c9e6f0dcc08dc443da1a9e4 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:05:05 +0900 Subject: [PATCH 20/21] =?UTF-8?q?[feat/#135]=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/ReviewFriendDetailFragment.kt | 34 +++++++++++++++++-- .../group/review/ReviewViewModel.kt | 31 ++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt index e0519959..5168e37a 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt @@ -1,19 +1,25 @@ package com.teumteum.teumteum.presentation.group.review +import android.content.Intent import android.os.Bundle import android.view.View import androidx.fragment.app.activityViewModels +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope import com.teumteum.base.BindingFragment +import com.teumteum.base.util.extension.defaultToast import com.teumteum.base.util.extension.longArgs -import com.teumteum.base.util.extension.longExtra import com.teumteum.base.util.extension.setOnSingleClickListener import com.teumteum.base.util.extension.stringArgs import com.teumteum.domain.entity.ReviewFriend import com.teumteum.teumteum.R import com.teumteum.teumteum.databinding.FragmentReviewFriendDetailBinding import com.teumteum.teumteum.util.ResMapper +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach -class ReviewFriendDetailFragment: BindingFragment(R.layout.fragment_review_friend_detail) { +class ReviewFriendDetailFragment : + BindingFragment(R.layout.fragment_review_friend_detail) { private val viewModel by activityViewModels() private val id by longArgs() private val characterId by longArgs() @@ -24,6 +30,7 @@ class ReviewFriendDetailFragment: BindingFragment { + startActivity(Intent(requireActivity(), ReviewFinishActivity::class.java)) + } + + is ReviewUiState.Failure -> { + requireActivity().defaultToast(it.msg) + } + + else -> {} + } + + }.launchIn(viewLifecycleOwner.lifecycleScope) + } + private fun setSelectReview(viewId: Int) { with(binding) { tvBad.isSelected = viewId == clBad.id diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt index ff866647..edd1ca6d 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt @@ -13,20 +13,22 @@ import kotlinx.coroutines.launch @HiltViewModel class ReviewViewModel @Inject constructor( private val repository: GroupRepository -): ViewModel() { +) : ViewModel() { private var _selectFriendList = listOf() val selectFriendList get() = _selectFriendList private var _selectDetailFriendList = mutableListOf() val selectDetailFriendList get() = _selectFriendList - private val _moimFriendList = MutableStateFlow>(listOf()) - val moimFriendList: StateFlow> = _moimFriendList - var meetingId: Long? = null var currentFriendIndex = 0 + private val _moimFriendList = MutableStateFlow>(listOf()) + val moimFriendList: StateFlow> = _moimFriendList + + private val _reviewState = MutableStateFlow(ReviewUiState.Init) + val reviewState: StateFlow = _reviewState fun setSelectFriendList(selectFriendList: List) { _selectFriendList = selectFriendList } @@ -45,4 +47,25 @@ class ReviewViewModel @Inject constructor( } } } + + fun postRegisterReview() { + meetingId?.let { id -> + _reviewState.value = ReviewUiState.Init + viewModelScope.launch { + repository.postRegisterReview(id, selectDetailFriendList) + .onSuccess { + _reviewState.value = + if (it) ReviewUiState.Success else ReviewUiState.Failure("리뷰 등록 서버 통신에 실패했습니다.") + }.onFailure { + _reviewState.value = ReviewUiState.Failure("리뷰 등록 서버 통신에 실패했습니다.") + } + } + } + } +} + +sealed interface ReviewUiState { + object Init : ReviewUiState + object Success : ReviewUiState + data class Failure(val msg: String) : ReviewUiState } \ No newline at end of file From 88cc921ed49b775b644b588b392c9c910e562b26 Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Tue, 13 Feb 2024 23:05:39 +0900 Subject: [PATCH 21/21] =?UTF-8?q?[feat/#135]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=ED=99=94=EB=A9=B4=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 ++ .../group/review/ReviewFinishActivity.kt | 53 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFinishActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 08fea02c..8ac144f4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -114,6 +114,9 @@ + diff --git a/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFinishActivity.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFinishActivity.kt new file mode 100644 index 00000000..c4ccfd12 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFinishActivity.kt @@ -0,0 +1,53 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.content.Intent +import android.os.Bundle +import com.teumteum.base.BindingActivity +import com.teumteum.base.component.appbar.AppBarLayout +import com.teumteum.base.component.appbar.AppBarMenu +import com.teumteum.base.databinding.LayoutCommonAppbarBinding +import com.teumteum.base.util.extension.setOnSingleClickListener +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.ActivityReviewFinishBinding +import com.teumteum.teumteum.presentation.MainActivity + +class ReviewFinishActivity : + BindingActivity(R.layout.activity_review_finish), AppBarLayout { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initAppBarLayout() + initEvent() + } + + override val appBarBinding: LayoutCommonAppbarBinding + get() = binding.appBar + + override fun initAppBarLayout() { + setAppBarHeight(48) + + addMenuToLeft( + AppBarMenu.IconStyle( + resourceId = R.drawable.ic_arrow_left_l, + useRippleEffect = false, + clickEvent = { + goToMainActivity() + } + ) + ) + } + + private fun initEvent() { + binding.btnHome.setOnSingleClickListener { + goToMainActivity() + } + } + + private fun goToMainActivity() { + Intent(this, MainActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_CLEAR_TOP + startActivity(this) + } + openActivitySlideAnimation() + } +} \ No newline at end of file