From c05b21ccf0cf6f6004a247c382bdc405b8a6a41d Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 15 Feb 2025 01:52:18 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=9D=BC=EC=A0=95=20=ED=8E=B8=EC=A7=91=20->=20=EC=B9=9C?= =?UTF-8?q?=EA=B5=AC=20=EC=B4=88=EB=8C=80=20=ED=99=94=EB=A9=B4=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EC=8B=9C=20=EC=9D=B4=EB=AF=B8=20=EC=B4=88=EB=8C=80?= =?UTF-8?q?=EB=90=9C=20=EC=B9=9C=EA=B5=AC=20=ED=91=9C=EC=8B=9C=ED=95=B4=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 화면 이동 시 참석자의 userId 목록 넘기기 Related to: #347 --- .../moim/schedule/FriendInviteActivity.kt | 54 +++++++++++++++---- .../moim/schedule/FriendInviteViewModel.kt | 33 ++++++++++-- .../moim/schedule/MoimScheduleActivity.kt | 7 ++- .../moim/schedule/MoimScheduleViewModel.kt | 15 +++--- .../schedule/adapter/FriendInviteRVAdapter.kt | 5 +- .../res/layout/activity_friend_invite.xml | 37 +++++++++++-- .../main/res/layout/item_friend_invite.xml | 5 ++ app/src/main/res/values/strings.xml | 1 + 8 files changed, 129 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteActivity.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteActivity.kt index 84015e0f..8a156943 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteActivity.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteActivity.kt @@ -2,6 +2,7 @@ package com.mongmong.namo.presentation.ui.community.moim.schedule import android.text.Html import android.util.Log +import android.view.View import androidx.activity.viewModels import androidx.recyclerview.widget.LinearLayoutManager import com.mongmong.namo.R @@ -18,18 +19,29 @@ class FriendInviteActivity : BaseActivity(R.layout. private val viewModel: FriendInviteViewModel by viewModels() - private lateinit var friendToInviteAdapter: FriendInvitePreparatoryRVAdapter - private lateinit var allFriendAdapter: FriendInviteRVAdapter + private var invitedFriendAdapter = FriendInviteRVAdapter(canEdit = false) // 초대한 친구 + private lateinit var friendToInviteAdapter: FriendInvitePreparatoryRVAdapter // 초대할 친구 + private var allFriendAdapter = FriendInviteRVAdapter(canEdit = true) // 모든 친구 override fun setup() { binding.viewModel = viewModel + getDataFromScheduleScreen() + initClickListeners() + initObserve() + } + + private fun getDataFromScheduleScreen() { + // moimScheduleId intent.getLongExtra(MOIM_INVITE_KEY, 0L).let { moimScheduleId -> viewModel.moimScheduleId = moimScheduleId } - initClickListeners() - initObserve() + // 이미 초대된 참석자들의 id + intent.getLongArrayExtra(MOIM_PARTICIPANT_ID_KEY)?.let { memberIds -> + viewModel.invitedUserIdList = memberIds.toList() + binding.friendInviteInvitedFriendLl.visibility = View.VISIBLE + } } private fun initClickListeners() { @@ -52,8 +64,21 @@ class FriendInviteActivity : BaseActivity(R.layout. // 초대한 친구 현황 표시용 private fun setFriendSelectedNum() { + val totalCount = viewModel.remainFriendList.value?.size ?: viewModel.allFriendList.value?.size // {초대할 친구 수} / {전체 친구 수} - binding.friendInviteSelectedNumTv.text = Html.fromHtml(String.format(resources.getString(R.string.moim_schedule_friend_invite_selected_num), viewModel.friendToInviteList.value?.size, viewModel.friendList.value?.size)) + binding.friendInviteSelectedNumTv.text = Html.fromHtml( + String.format(resources.getString(R.string.moim_schedule_friend_invite_selected_num), + viewModel.friendToInviteList.value?.size, + totalCount) + ) + } + + // 초대된 친구 어댑터 설정 + private fun setInvitedFriendAdapter() { + binding.friendInviteInvitedListRv.apply { + adapter = invitedFriendAdapter + layoutManager = LinearLayoutManager(context) + } } // 초대할 친구 어댑터 설정 @@ -77,7 +102,6 @@ class FriendInviteActivity : BaseActivity(R.layout. // 모든 친구 어댑터 설정 private fun setAllFriendAdapter() { - allFriendAdapter = FriendInviteRVAdapter() binding.friendInviteListRv.apply { adapter = allFriendAdapter layoutManager = LinearLayoutManager(context) @@ -86,8 +110,10 @@ class FriendInviteActivity : BaseActivity(R.layout. allFriendAdapter.setItemClickListener(object : FriendInviteRVAdapter.MyItemClickListener { override fun onInviteButtonClick(isSelected: Boolean, position: Int) { // 초대할 친구 목록에 추가 - Log.d("FriendInviteACT", "onInviteButtonClick - isSelected: $isSelected, position: $position") - viewModel.updateSelectedFriend(isSelected, viewModel.friendList.value!![position]) +// Log.d("FriendInviteACT", "onInviteButtonClick - isSelected: $isSelected, position: $position") + val friendToInvite = viewModel.remainFriendList.value?.let { it[position] } + ?: viewModel.allFriendList.value!![position] + viewModel.updateSelectedFriend(isSelected, friendToInvite) } override fun onItemClick(position: Int) { @@ -108,11 +134,16 @@ class FriendInviteActivity : BaseActivity(R.layout. } // 모든 친구 - viewModel.friendList.observe(this) { - if (it.isNotEmpty()) { + viewModel.allFriendList.observe(this) { friendList -> + if (friendList.isNotEmpty()) { setAllFriendAdapter() } - allFriendAdapter.addFriend(it) + // 이미 초대된 친구 + viewModel.setInvitedFriend() + setInvitedFriendAdapter() + invitedFriendAdapter.addFriend(viewModel.invitedFriendList) + // 모든 친구 + allFriendAdapter.addFriend(viewModel.remainFriendList.value ?: friendList) setFriendSelectedNum() } @@ -136,5 +167,6 @@ class FriendInviteActivity : BaseActivity(R.layout. companion object { const val MOIM_INVITE_KEY = "moim_invite_key" + const val MOIM_PARTICIPANT_ID_KEY = "moim_participant_id_key" } } \ No newline at end of file diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteViewModel.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteViewModel.kt index 227e8993..b12156b4 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteViewModel.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/FriendInviteViewModel.kt @@ -8,8 +8,11 @@ import androidx.lifecycle.viewModelScope import com.mongmong.namo.domain.model.Friend import com.mongmong.namo.domain.repositories.ScheduleRepository import com.mongmong.namo.domain.usecases.friend.GetFriendsUseCase +import com.mongmong.namo.presentation.config.ApplicationClass.Companion.dsManager import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import javax.inject.Inject @HiltViewModel @@ -19,9 +22,18 @@ class FriendInviteViewModel @Inject constructor( ): ViewModel() { var moimScheduleId: Long = 0L + var invitedUserIdList: List? = null + // 모든 친구 목록 - private val _friendList = MutableLiveData>() - val friendList: LiveData> = _friendList + private val _allFriendList = MutableLiveData>() + val allFriendList: LiveData> = _allFriendList + + // allFriend - invitedFriend + private val _remainFriendList = MutableLiveData>() + val remainFriendList: LiveData> = _remainFriendList + + // 이미 초대된 친구 + var invitedFriendList: List = emptyList() // 초대할 친구 목록 private val _friendToInviteList = MutableLiveData>(ArrayList()) @@ -38,7 +50,7 @@ class FriendInviteViewModel @Inject constructor( /** 친구 목록 조회 */ private fun getFriends() { viewModelScope.launch { - _friendList.value = getFriendsUseCase.execute() + _allFriendList.value = getFriendsUseCase.execute() } } @@ -51,6 +63,21 @@ class FriendInviteViewModel @Inject constructor( } } + // 초대된 친구 세팅 + fun setInvitedFriend() { + if (invitedUserIdList.isNullOrEmpty()) return + + // 초대된 친구 + invitedFriendList = _allFriendList.value?.filter { + it.userId in invitedUserIdList!! + } ?: emptyList() + + // 초대되고 남은 친구 + _remainFriendList.value = _allFriendList.value?.filter { + it.userId !in invitedUserIdList!! + } + } + // 초대할 친구 선택 초기화 fun resetAllSelectedFriend() { _friendToInviteList.value = ArrayList() diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleActivity.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleActivity.kt index e6f8c6f1..71cd545a 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleActivity.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleActivity.kt @@ -45,6 +45,7 @@ import com.mongmong.namo.presentation.ui.common.ConfirmDialog import com.mongmong.namo.presentation.ui.common.ConfirmDialog.ConfirmDialogInterface import com.mongmong.namo.presentation.ui.community.moim.MoimFragment.Companion.MOIM_CREATE_KEY import com.mongmong.namo.presentation.ui.community.moim.schedule.FriendInviteActivity.Companion.MOIM_INVITE_KEY +import com.mongmong.namo.presentation.ui.community.moim.schedule.FriendInviteActivity.Companion.MOIM_PARTICIPANT_ID_KEY import com.mongmong.namo.presentation.utils.PermissionChecker.hasImagePermission import com.mongmong.namo.presentation.utils.converter.PickerConverter.setSelectedTime import dagger.hilt.android.AndroidEntryPoint @@ -116,8 +117,10 @@ class MoimScheduleActivity : BaseActivity(R.layout. binding.moimScheduleAddParticipantTv.setOnClickListener { // 친구 추가하기 화면으로 이동 startActivity( - Intent(this, FriendInviteActivity::class.java) - .putExtra(MOIM_INVITE_KEY, viewModel.moimSchedule.value!!.moimId) + Intent(this, FriendInviteActivity::class.java).apply { + putExtra(MOIM_INVITE_KEY, viewModel.moimSchedule.value!!.moimId) + if (viewModel.getParticipantUserIdList().isNotEmpty()) putExtra(MOIM_PARTICIPANT_ID_KEY, viewModel.getParticipantUserIdList().toLongArray()) + } ) } diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleViewModel.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleViewModel.kt index 34837556..3c86ce7d 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleViewModel.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/MoimScheduleViewModel.kt @@ -9,7 +9,6 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kakao.vectormap.LatLng import com.mongmong.namo.domain.model.MoimScheduleDetail -import com.mongmong.namo.domain.model.Participant import com.mongmong.namo.domain.model.SchedulePeriod import com.mongmong.namo.domain.repositories.ScheduleRepository import com.mongmong.namo.domain.usecases.image.UploadImageToS3UseCase @@ -41,7 +40,6 @@ class MoimScheduleViewModel @Inject constructor( var isCoverImageEdit: Boolean = false - //TODO: 참석자 수정 var participantIdsToAdd = ArrayList(arrayListOf()) // 스케줄에 추가할 유저 ID(userId) var participantIdsToRemove = ArrayList(arrayListOf()) // 스케줄에서 삭제할 참가자 ID(participantId) @@ -160,12 +158,6 @@ class MoimScheduleViewModel @Inject constructor( ) } - fun updateMembers(selectedMember: List) { - _moimSchedule.value = _moimSchedule.value!!.copy( - participants = selectedMember - ) - } - // 시간 변경 fun updateTime(startDateTime: LocalDateTime?, endDateTime: LocalDateTime?) { _moimSchedule.value = _moimSchedule.value?.copy( @@ -215,6 +207,13 @@ class MoimScheduleViewModel @Inject constructor( dsManager.getUserId().first() ?: 0L } + // 모임 참석자들의 userId + fun getParticipantUserIdList(): List { + return _moimSchedule.value!!.participants.filter { + it.userId != getMyUserId() // 내 id 제외 + }.map { it.userId } + } + companion object { const val PREFIX = "cover" } diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/adapter/FriendInviteRVAdapter.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/adapter/FriendInviteRVAdapter.kt index 55d90b94..27f7a870 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/adapter/FriendInviteRVAdapter.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/community/moim/schedule/adapter/FriendInviteRVAdapter.kt @@ -7,7 +7,9 @@ import androidx.recyclerview.widget.RecyclerView import com.mongmong.namo.databinding.ItemFriendInviteBinding import com.mongmong.namo.domain.model.Friend -class FriendInviteRVAdapter: RecyclerView.Adapter(){ +class FriendInviteRVAdapter( + val canEdit: Boolean? = true +): RecyclerView.Adapter(){ private var friendList = emptyList() private var isFriendSelectedList = mutableListOf() @@ -75,6 +77,7 @@ class FriendInviteRVAdapter: RecyclerView.Adapter + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/friend_invite_invited_friend_ll"> + + @@ -84,6 +88,7 @@ android:layout_height="28dp" android:checked="false" android:button="@null" + android:visibility="@{canEdit ? View.VISIBLE : View.GONE}" android:background="@drawable/selector_invite"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e62a0ec..c6b3cb46 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -233,6 +233,7 @@ 전체 선택 취소 %d / %d]]> 초대하기 + 초대된 친구 모든 친구 아직 추가된 친구가 없어요.\n친구를 추가한 후 모임을 만들어보세요! 게스트 초대하기