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