diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b0ca2d8f..b1005b81 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,9 +39,6 @@ - @@ -105,10 +102,18 @@ + + + - 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 99a433cb..7b316ca4 100644 --- a/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt +++ b/app/src/main/java/com/teumteum/teumteum/presentation/MainActivity.kt @@ -15,9 +15,12 @@ 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.domain.entity.Message 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 @@ -27,6 +30,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() @@ -42,7 +47,9 @@ class MainActivity : BindingActivity(R.layout.activity_main if (id != -1) { moveRecommendDetail() } if(isGroup) { moveWebView() } - + if (meetingId != -1L && title != null) { + moveReviewOnboardingActivity() + } if (isFromAlarm) { val message = intent.getSerializableExtra(MESSAGE) as Message @@ -81,6 +88,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) @@ -154,7 +165,10 @@ class MainActivity : BindingActivity(R.layout.activity_main putExtra("id", id) putExtra(IS_FROM_ALARM, isFromAlarm) } - + fun getIntent(context: Context, meetingId: Long, title: String) = Intent(context, MainActivity::class.java).apply { + putExtra("meetingId", meetingId) + putExtra("title", title) + } private const val IS_FROM_ALARM = "isFromAlarm" private const val MESSAGE = "message" 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..490acf5b --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewActivity.kt @@ -0,0 +1,72 @@ +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 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 + +@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 = { + ReviewInfoDialog().show(supportFragmentManager, "dialog") + } + ) + ) + } + + private fun initView() { + supportFragmentManager.commit { + 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) + } + } + } + + 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/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 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..5168e37a --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendDetailFragment.kt @@ -0,0 +1,117 @@ +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.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) { + 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() + observe() + } + + 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())) + } + + binding.btnReview.text = + "리뷰 남기기 (${viewModel.currentFriendIndex}/${viewModel.selectFriendList.size}}" + } + + 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 { + viewModel.postRegisterReview() + } + } + + 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 observe() { + viewModel.reviewState.flowWithLifecycle(viewLifecycleOwner.lifecycle) + .onEach { + when (it) { + is ReviewUiState.Success -> { + 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 + 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/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/ReviewFriendSelectFragment.kt b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt new file mode 100644 index 00000000..1a87e999 --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewFriendSelectFragment.kt @@ -0,0 +1,77 @@ +package com.teumteum.teumteum.presentation.group.review + +import android.os.Bundle +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.setOnSingleClickListener +import com.teumteum.domain.entity.ReviewFriend +import com.teumteum.teumteum.R +import com.teumteum.teumteum.databinding.FragmentReviewFriendSelectBinding +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach + + +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 { + val selectFriendList = adapter?.currentList?.filter { + it.isSelected + } + selectFriendList?.let { + viewModel.setSelectFriendList(it) + } + + (requireActivity() as? ReviewActivity)?.nextFriendDetailFragment() + } + } + + 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/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/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/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..edd1ca6d --- /dev/null +++ b/app/src/main/java/com/teumteum/teumteum/presentation/group/review/ReviewViewModel.kt @@ -0,0 +1,71 @@ +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 var _selectDetailFriendList = mutableListOf() + val selectDetailFriendList get() = _selectFriendList + + 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 + } + + fun addSelectDetailFriendList(selectFriendDetail: ReviewFriend) { + _selectDetailFriendList.add(selectFriendDetail) + } + + fun getReviewFriendList() { + meetingId?.let { id -> + viewModelScope.launch { + repository.getReviewFriendList(id) + .onSuccess { + _moimFriendList.value = it + } + } + } + } + + 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 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/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/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/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 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 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/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/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 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..fb040f60 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 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d4c1658..3947a0ae 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틈틈 유저가 있었나요? 선택항목은 상대방에게 전달되지 않아요 리뷰 남기기 @@ -331,10 +331,17 @@ 리뷰 남기기가\n완료되었습니다. 홈으로 돌아가기 + 리뷰 남기기를 종료하시겠어요? + 종료할래요 + 돌아가기 + + 정말 틈틈을 종료하시겠어요? + 틈틈을 종료하시면 지금까지 진행한\n틈틈의 내용이 사라져요. 정말 틈틈을 종료하시겠어요? 틈틈을 종료하시면 지금까지 진행한\n틈틈의 내용이 사라져요. 서로의 관심사 틈을 채우기 3초만 모바일 기기를 흔들어 보세요!\n관심사 기반 대화 주제를 받을 수 있어요. + 종료하기 시작하기 diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab index 02b6657b..afd6cf11 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream index 70489336..54f1f1a1 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at index 348253f4..bdf79879 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i index 5270a93c..9c0d937a 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at index 2c937385..5dcb6578 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at index a89d1e63..ed4de6aa 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream index ef92c2ee..d3edf145 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream index ef92c2ee..d3edf145 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i index 81dc48db..9b6c2c52 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at index aa651847..ef6942d3 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/cacheable/last-build.bin b/build-logic/convention/build/kotlin/compileKotlin/cacheable/last-build.bin index 8f408988..f6b4ee29 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/cacheable/last-build.bin and b/build-logic/convention/build/kotlin/compileKotlin/cacheable/last-build.bin differ diff --git a/build-logic/convention/build/kotlin/compileKotlin/local-state/build-history.bin b/build-logic/convention/build/kotlin/compileKotlin/local-state/build-history.bin index e70d8f0e..6079a953 100644 Binary files a/build-logic/convention/build/kotlin/compileKotlin/local-state/build-history.bin and b/build-logic/convention/build/kotlin/compileKotlin/local-state/build-history.bin differ diff --git a/build-logic/convention/build/kotlin/conventionjar-classes.txt b/build-logic/convention/build/kotlin/conventionjar-classes.txt index be72955d..47543b58 100644 --- a/build-logic/convention/build/kotlin/conventionjar-classes.txt +++ b/build-logic/convention/build/kotlin/conventionjar-classes.txt @@ -1 +1 @@ -D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\Constants.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\com\teumteum\convention\src\main\kotlin\ext\DependencyHandlerScopeExtensionKt.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\com\teumteum\convention\src\main\kotlin\ext\ExtensionContainerExtensionKt$getVersionCatalog$$inlined$getByType$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\com\teumteum\convention\src\main\kotlin\ext\ExtensionContainerExtensionKt.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\com\teumteum\convention\src\main\kotlin\ext\VersionCatalogExtensionKt.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\ext\application\DefaultConfigKt$configureDefault$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\ext\application\DefaultConfigKt$configureDefault$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\ext\application\DefaultConfigKt$sam$org_gradle_api_Action$0.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\ext\application\DefaultConfigKt.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$3$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$3$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$3.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$4.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2$5.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$1$3.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$apply$lambda$1$$inlined$configure$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin$inlined$sam$i$org_gradle_api_Action$0.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidApplicationPlugin.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidHiltPlugin.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidKotlinPlugin$apply$1$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidKotlinPlugin.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$apply$1$2$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$apply$1$2$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$apply$1$2$3.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$apply$1$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$apply$1$3.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$apply$lambda$1$$inlined$configure$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin$inlined$sam$i$org_gradle_api_Action$0.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\AndroidLibraryPlugin.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\CommonConfigsKt$configureAndroidCommonPlugin$$inlined$apply$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\CommonConfigsKt$configureAndroidCommonPlugin$$inlined$apply$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\CommonConfigsKt$configureAndroidCommonPlugin$$inlined$getByType$1.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\CommonConfigsKt$configureAndroidCommonPlugin$2.class;D:\Android\TeumTeum-Android\build-logic\convention\build\classes\kotlin\main\plugins\CommonConfigsKt.class \ No newline at end of file +/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/Constants.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/com/teumteum/convention/src/main/kotlin/ext/DependencyHandlerScopeExtensionKt.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/com/teumteum/convention/src/main/kotlin/ext/ExtensionContainerExtensionKt$getVersionCatalog$$inlined$getByType$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/com/teumteum/convention/src/main/kotlin/ext/ExtensionContainerExtensionKt.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/com/teumteum/convention/src/main/kotlin/ext/VersionCatalogExtensionKt.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/ext/application/DefaultConfigKt$configureDefault$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/ext/application/DefaultConfigKt$configureDefault$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/ext/application/DefaultConfigKt$sam$org_gradle_api_Action$0.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/ext/application/DefaultConfigKt.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$3$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$3$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$3.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$4.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2$5.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$1$3.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$apply$lambda$1$$inlined$configure$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin$inlined$sam$i$org_gradle_api_Action$0.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidApplicationPlugin.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidHiltPlugin.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidKotlinPlugin$apply$1$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidKotlinPlugin.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$apply$1$2$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$apply$1$2$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$apply$1$2$3.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$apply$1$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$apply$1$3.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$apply$lambda$1$$inlined$configure$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin$inlined$sam$i$org_gradle_api_Action$0.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/AndroidLibraryPlugin.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/CommonConfigsKt$configureAndroidCommonPlugin$$inlined$apply$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/CommonConfigsKt$configureAndroidCommonPlugin$$inlined$apply$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/CommonConfigsKt$configureAndroidCommonPlugin$$inlined$getByType$1.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/CommonConfigsKt$configureAndroidCommonPlugin$2.class:/Users/leekangmin/AndroidStudioProjects/TeumTeum-Android/build-logic/convention/build/classes/kotlin/main/plugins/CommonConfigsKt.class \ No newline at end of file diff --git a/build-logic/convention/build/libs/convention.jar b/build-logic/convention/build/libs/convention.jar index 03feaeb0..608c55e5 100644 Binary files a/build-logic/convention/build/libs/convention.jar and b/build-logic/convention/build/libs/convention.jar differ 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 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 e0c3c0ac..62055bb5 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,9 @@ 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 import okhttp3.RequestBody @@ -81,4 +82,17 @@ class RemoteGroupDataSource @Inject constructor( ): Boolean { return service.reportMeeting(meetingId).isSuccessful } + + suspend fun getReviewFriendList( + meetingId: Long + ): 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 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 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/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt b/core/data/src/main/java/com/teumteum/data/repository/GroupRepositoryImpl.kt index e57638d6..bdf6d783 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,9 +4,11 @@ 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 +import com.teumteum.domain.entity.ReviewFriend import com.teumteum.domain.repository.GroupRepository import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -94,6 +96,20 @@ class GroupRepositoryImpl @Inject constructor( } } + override suspend fun getReviewFriendList(meetingId: Long): Result> { + return runCatching { + 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() }) + } + } override suspend fun saveBookmark(meetingId: Long): Result { return runCatching { dataSource.saveBookmark(meetingId) @@ -105,5 +121,4 @@ class GroupRepositoryImpl @Inject constructor( dataSource.deleteBookmark(meetingId) } } - } \ No newline at end of file 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 d7f9e709..a5f91bc5 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,7 +1,9 @@ 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 import com.teumteum.domain.entity.Meeting import okhttp3.MultipartBody import okhttp3.RequestBody @@ -17,8 +19,6 @@ import retrofit2.http.Path import retrofit2.http.Query interface GroupService { - - @Multipart @POST("meetings") suspend fun postMoim( @@ -81,4 +81,15 @@ interface GroupService { suspend fun reportMeeting( @Path("meetingId") meetingId:Long ): Response + + @GET("meetings/{meetingId}/participants") + 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 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..5a8d4aa3 --- /dev/null +++ b/core/domain/src/main/java/com/teumteum/domain/entity/ReviewFriend.kt @@ -0,0 +1,13 @@ +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, + var review: String = "" +) \ 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 a66d6c77..92486ec7 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 { @@ -15,4 +16,6 @@ interface GroupRepository { suspend fun deleteBookmark(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> + suspend fun postRegisterReview(meetingId: Long, request: List): Result } \ No newline at end of file