From 7305c439ecf47564a1cd7320483049919b3aa2be Mon Sep 17 00:00:00 2001 From: rkdmf1026 <50603273+rkdmf1026@users.noreply.github.com> Date: Wed, 4 Oct 2023 19:40:54 +0900 Subject: [PATCH 1/5] =?UTF-8?q?#102=20/=20=EB=AF=B8=EC=85=98=EC=83=81?= =?UTF-8?q?=EC=84=B8=20Activity=20to=20Fragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 - .../MissionDetailCreateActivity.kt | 44 ------- .../MissionDetailCreateFragment.kt | 107 ++++++++++++++++++ .../MissionDetailCreateViewModel.kt | 38 ------- ...xml => fragment_mission_detail_create.xml} | 57 ++++------ 5 files changed, 129 insertions(+), 122 deletions(-) delete mode 100644 app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateActivity.kt create mode 100644 app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateFragment.kt delete mode 100644 app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateViewModel.kt rename app/src/main/res/layout/{activity_mission_detail_create.xml => fragment_mission_detail_create.xml} (84%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b2594d62..aa244df5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -86,11 +86,6 @@ android:exported="false" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize" /> - (R.layout.activity_mission_detail_create) { - - private val viewModel: MissionDetailCreateViewModel by viewModels() - - private lateinit var idPosition: MissionIdPosition - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(binding.root) - idPosition = intent.parcelable(MISSION_ID_POSITION)!! - binding.missionDetailCreateViewModel = viewModel - setClickListener() - } - - private fun setClickListener() { - binding.missionDetailCreateMissionBtnPick.setOnSingleClickListener { - val intent = Intent(this, CreateShortGameActivity::class.java) - intent.putExtra(MISSION_ID_POSITION, idPosition) - setResult(RESULT_OK, intent) - finish() - } - binding.missionDetailCreateBack.setOnSingleClickListener { - finish() - } - } - - companion object { - const val MISSION_ID_POSITION = "MISSION_ID_POSITION" - } -} diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateFragment.kt b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateFragment.kt new file mode 100644 index 00000000..248aa96c --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateFragment.kt @@ -0,0 +1,107 @@ +package sopt.uni.presentation.shortgame.missiondetailcreate + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.activityViewModels +import sopt.uni.R +import sopt.uni.databinding.FragmentMissionDetailCreateBinding +import sopt.uni.presentation.shortgame.createshortgame.CreateShortGameActivity +import sopt.uni.presentation.shortgame.createshortgame.CreateShortGameViewModel +import sopt.uni.presentation.shortgame.createshortgame.dialog.CreateShortGameDialogFragment +import sopt.uni.presentation.shortgame.missionrecord.MissionRecordActivity +import sopt.uni.util.binding.BindingFragment +import sopt.uni.util.extension.setOnSingleClickListener + +class MissionDetailCreateFragment : + BindingFragment(R.layout.fragment_mission_detail_create) { + private val viewModel by activityViewModels() + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + super.onCreateView(inflater, container, savedInstanceState) + binding.apply { + viewModel = this@MissionDetailCreateFragment.viewModel + } + setViewModelObserve() + setClickListener() + setBackPressed() + return binding.root + } + + private fun setViewModelObserve() { + viewModel.isCreateSuccess.observe(viewLifecycleOwner) { + if (it) { + MissionRecordActivity.start( + this.requireContext(), + viewModel.roundGameId.value + ?: return@observe, + ) + requireActivity().finish() + } + } + } + + private fun setBackPressed() { + this.activity?.onBackPressedDispatcher?.addCallback( + viewLifecycleOwner, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goToShortGame() + } + }, + ) + } + + private fun setClickListener() { + binding.apply { + missionDetailCreateBack.setOnSingleClickListener { + goToShortGame() + } + btnCreateShortGame.setOnSingleClickListener { + createDialog() + } + } + } + + private fun goToShortGame() { + val activity = activity as CreateShortGameActivity + activity.changeFragment(getString(R.string.label_short_game)) + } + + private fun createDialog() { + requireActivity().let { + CreateShortGameDialogFragment().apply { + titleText = + it.resources.getString(R.string.create_short_game_create_dialog_title) + bodyText = + it.resources.getString(R.string.create_short_game_create_dialog_body) + confirmButtonText = + it.resources.getString(R.string.create_short_game_create_dialog_create) + dismissButtonText = + it.resources.getString(R.string.dialog_cancel_text) + confirmClickListener = { + viewModel.createShortGame() + this.dismiss() + } + dismissClickListener = { + this.dismiss() + } + }.show(it.supportFragmentManager, "") + } + } + + companion object { + @JvmStatic + fun newInstance(): MissionDetailCreateFragment { + val args = Bundle() + val fragment = MissionDetailCreateFragment() + fragment.arguments = args + return fragment + } + } +} diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateViewModel.kt b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateViewModel.kt deleted file mode 100644 index ec82b616..00000000 --- a/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateViewModel.kt +++ /dev/null @@ -1,38 +0,0 @@ -package sopt.uni.presentation.shortgame.missiondetailcreate - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.SavedStateHandle -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch -import sopt.uni.data.entity.shortgame.MissionDetail -import sopt.uni.data.repository.shortgame.ShortGameRepository -import sopt.uni.presentation.entity.MissionIdPosition -import javax.inject.Inject - -@HiltViewModel -class MissionDetailCreateViewModel @Inject constructor( - private val shortGameRepository: ShortGameRepository, - savedStateHandle: SavedStateHandle, -) : ViewModel() { - val missionId = - savedStateHandle.get(MissionDetailCreateActivity.MISSION_ID_POSITION)?.id - - private val _missionDetail = MutableLiveData() - val missionDetail = _missionDetail - - init { - setMissionDetail() - } - - private fun setMissionDetail() { - viewModelScope.launch { - shortGameRepository.getMissionDetail(missionId ?: return@launch).onSuccess { - _missionDetail.postValue(it) - }.onFailure { - // TODO: 실패로직 구현 - } - } - } -} diff --git a/app/src/main/res/layout/activity_mission_detail_create.xml b/app/src/main/res/layout/fragment_mission_detail_create.xml similarity index 84% rename from app/src/main/res/layout/activity_mission_detail_create.xml rename to app/src/main/res/layout/fragment_mission_detail_create.xml index af69cc52..079e67b6 100644 --- a/app/src/main/res/layout/activity_mission_detail_create.xml +++ b/app/src/main/res/layout/fragment_mission_detail_create.xml @@ -1,4 +1,3 @@ - @@ -6,8 +5,8 @@ + name="viewModel" + type="sopt.uni.presentation.shortgame.createshortgame.CreateShortGameViewModel" /> - - + app:layout_constraintTop_toBottomOf="@+id/mission_detail_create_subtitle" + tools:text="@string/mission_detatil_create_game_description" /> + app:layout_constraintTop_toBottomOf="@+id/mission_detail_create_rule_title" + tools:text="@string/mission_detatil_create_rule_description" /> + app:layout_constraintTop_toBottomOf="@+id/mission_detail_create_tiptitle" + tools:text="@string/mission_detatil_create_tip_description" /> + android:text="@{viewModel.missionDetail.missionContentList[0].content}" + android:textColor="@color/Gray_600" + tools:text="@string/mission_detatil_create_example1" /> + android:text="@{viewModel.missionDetail.missionContentList[1].content}" + android:textColor="@color/Gray_600" + tools:text="@string/mission_detatil_create_example2" /> - + \ No newline at end of file From 56d2ee8e6fa9996e5546006c5c5354c6056a299f Mon Sep 17 00:00:00 2001 From: rkdmf1026 <50603273+rkdmf1026@users.noreply.github.com> Date: Wed, 4 Oct 2023 19:42:17 +0900 Subject: [PATCH 2/5] =?UTF-8?q?#102=20/=20=ED=95=9C=ED=8C=90=EC=8A=B9?= =?UTF-8?q?=EB=B6=80=EC=83=9D=EC=84=B1=20Activity=20to=20Fragment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateShortGameActivity.kt | 163 +++-------------- .../CreateShortGameViewModel.kt | 14 +- .../createshortgame/ShortGameFragment.kt | 138 ++++++++++++++ .../res/layout/activity_create_short_game.xml | 171 +----------------- .../main/res/layout/fragment_short_game.xml | 145 +++++++++++++++ 5 files changed, 318 insertions(+), 313 deletions(-) create mode 100644 app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/ShortGameFragment.kt create mode 100644 app/src/main/res/layout/fragment_short_game.xml diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt index 22ace1f0..4c4378d7 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt @@ -1,64 +1,31 @@ package sopt.uni.presentation.shortgame.createshortgame import android.content.Context -import android.content.Intent import android.graphics.Rect import android.os.Bundle import android.view.MotionEvent import android.view.inputmethod.InputMethodManager -import android.widget.Button import android.widget.EditText -import android.widget.TextView -import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels -import androidx.databinding.BindingAdapter import dagger.hilt.android.AndroidEntryPoint import sopt.uni.R import sopt.uni.databinding.ActivityCreateShortGameBinding -import sopt.uni.presentation.entity.MissionIdPosition -import sopt.uni.presentation.shortgame.createshortgame.dialog.CreateShortGameDialogFragment -import sopt.uni.presentation.shortgame.missiondetailcreate.MissionDetailCreateActivity -import sopt.uni.presentation.shortgame.missionrecord.MissionRecordActivity -import sopt.uni.util.ItemDecorations +import sopt.uni.presentation.shortgame.missiondetailcreate.MissionDetailCreateFragment import sopt.uni.util.binding.BindingActivity -import sopt.uni.util.extension.parcelable -import sopt.uni.util.extension.setOnSingleClickListener @AndroidEntryPoint class CreateShortGameActivity : BindingActivity(R.layout.activity_create_short_game) { - private val viewModel: CreateShortGameViewModel by viewModels() - - private val activityLauncher = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK) { - val data = - it.data?.parcelable(MissionDetailCreateActivity.MISSION_ID_POSITION) as MissionIdPosition - selectItem(data.id, data.position) - } - } + private val shortGameFragment by lazy { ShortGameFragment.newInstance() } + private val missionDetailCreateFragment by lazy { MissionDetailCreateFragment.newInstance() } - private val missionAdapter by lazy { - MissionCategoryAdapter( - goToMissionDetailClickListener = { missionIdPosition -> - val intent = Intent(this, MissionDetailCreateActivity::class.java) - intent.putExtra(MissionDetailCreateActivity.MISSION_ID_POSITION, missionIdPosition) - activityLauncher.launch(intent) - }, - selectMissionClickListener = { missionIdPosition -> - selectItem(missionIdPosition.id, missionIdPosition.position) - }, - ) - } + private val viewModel: CreateShortGameViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(binding.root) binding.viewModel = viewModel - setViewModelObserve() - setAdapter() - setClickListener() + changeFragment(getString(R.string.label_short_game)) } // 화면 클릭하여 키보드 숨기기 및 포커스 제거 @@ -79,115 +46,29 @@ class CreateShortGameActivity : return super.dispatchTouchEvent(event) } - override fun onBackPressed() { - exitDialog() - } + fun changeFragment(tag: String) { + val fragmentManager = supportFragmentManager + val fragment = fragmentManager.findFragmentByTag(tag) ?: when (tag) { + getString(R.string.label_mission_detail) -> missionDetailCreateFragment + getString(R.string.label_short_game) -> shortGameFragment + else -> null + } ?: return - private fun setAdapter() { - binding.rvMission.adapter = missionAdapter - binding.rvMission.addItemDecoration(ItemDecorations(0, 9, 0, 9)) - } + if (fragment.isVisible) return - private fun setViewModelObserve() { - viewModel.missionList.observe(this) { - missionAdapter.submitList(it) - } - viewModel.isCreateSuccess.observe(this) { - if (it) { - MissionRecordActivity.start( - this, - viewModel.roundGameId.value - ?: return@observe, - ) - finish() - } - } - } + val transaction = fragmentManager.beginTransaction() - private fun setClickListener() { - binding.apply { - ivClose.setOnSingleClickListener { - exitDialog() + fragmentManager.fragments.filter { it.isVisible } + .forEach { + transaction.hide(it) } - btnCreate.setOnSingleClickListener { - createDialog() - } - } - } - private fun exitDialog() { - CreateShortGameDialogFragment().apply { - titleText = - this@CreateShortGameActivity.resources.getString(R.string.create_short_game_exit_dialog_title) - bodyText = - this@CreateShortGameActivity.resources.getString(R.string.create_short_game_exit_dialog_body) - confirmButtonText = - this@CreateShortGameActivity.resources.getString(R.string.create_short_game_exit_dialog_exit) - dismissButtonText = - this@CreateShortGameActivity.resources.getString(R.string.dialog_cancel_text) - confirmClickListener = { - finish() - this.dismiss() - } - dismissClickListener = { - this.dismiss() - } - }.show(supportFragmentManager, "") - } - - private fun createDialog() { - CreateShortGameDialogFragment().apply { - titleText = - this@CreateShortGameActivity.resources.getString(R.string.create_short_game_create_dialog_title) - bodyText = - this@CreateShortGameActivity.resources.getString(R.string.create_short_game_create_dialog_body) - confirmButtonText = - this@CreateShortGameActivity.resources.getString(R.string.create_short_game_create_dialog_create) - dismissButtonText = - this@CreateShortGameActivity.resources.getString(R.string.dialog_cancel_text) - confirmClickListener = { - viewModel.createShortGame() - this.dismiss() - } - dismissClickListener = { - this.dismiss() - } - }.show(supportFragmentManager, "") - } - - private fun selectItem(id: Int, position: Int) { - missionAdapter.setSelectedItem(position) - viewModel.setSelectedMissionId(id) - } - - companion object { - private const val MAX_LENGTH = 54 - - @JvmStatic - @BindingAdapter("setContentLength") - fun setContentLength(view: TextView, length: Int) { - if (length > MAX_LENGTH) { - view.setTextColor(view.context.getColor(R.color.Red_500)) - } else { - view.setTextColor(view.context.getColor(R.color.Gray_200)) - } - view.text = "$length/$MAX_LENGTH" + if (fragment.isAdded) { + transaction.show(fragment) + } else { + transaction.add(R.id.fcv_create_short_game, fragment, tag) } - @JvmStatic - @BindingAdapter("setContentLength") - fun setWishContent(view: EditText, length: Int) { - if (length > MAX_LENGTH && view.isFocused) { - view.background = view.context.getDrawable(R.drawable.bg_wish_edit_text_error) - } else { - view.background = view.context.getDrawable(R.drawable.bg_wish_edit_text) - } - } - - @JvmStatic - @BindingAdapter("setContentLength") - fun setButtonEnable(view: Button, length: Int) { - view.isEnabled = length <= MAX_LENGTH - } + transaction.commit() } } diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt index 567b3f7e..b546c838 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt @@ -1,5 +1,6 @@ package sopt.uni.presentation.shortgame.createshortgame +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.map @@ -13,8 +14,8 @@ import javax.inject.Inject @HiltViewModel class CreateShortGameViewModel @Inject constructor(private val shortGameRepository: ShortGameRepository) : ViewModel() { - private val _selectedMissionId = MutableLiveData() - val selectedMissionId = _selectedMissionId + private val _missionId = MutableLiveData() + val missionId = _missionId private val _roundGameId = MutableLiveData() val roundGameId = _roundGameId @@ -22,6 +23,10 @@ class CreateShortGameViewModel @Inject constructor(private val shortGameReposito private val _missionList = MutableLiveData>() val missionList = _missionList + val missionDetail: LiveData = missionId.map { id -> + missionList.value?.find { it.id == id } + } + val wishContent = MutableLiveData("") val contentLength = wishContent.map { @@ -39,7 +44,6 @@ class CreateShortGameViewModel @Inject constructor(private val shortGameReposito viewModelScope.launch { shortGameRepository.getMissionCategory().onSuccess { _missionList.postValue(it) - selectedMissionId.postValue(it[0].id) }.onFailure { // TODO: 실패시 예외처리 } @@ -49,7 +53,7 @@ class CreateShortGameViewModel @Inject constructor(private val shortGameReposito fun createShortGame() { viewModelScope.launch { shortGameRepository.createShortGame( - selectedMissionId.value ?: return@launch, + missionId.value ?: return@launch, wishContent.value ?: "", ).onSuccess { _roundGameId.value = it.roundGameId @@ -61,6 +65,6 @@ class CreateShortGameViewModel @Inject constructor(private val shortGameReposito } fun setSelectedMissionId(missionId: Int) { - _selectedMissionId.value = missionId + _missionId.value = missionId } } diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/ShortGameFragment.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/ShortGameFragment.kt new file mode 100644 index 00000000..0ca13c83 --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/ShortGameFragment.kt @@ -0,0 +1,138 @@ +package sopt.uni.presentation.shortgame.createshortgame + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.databinding.BindingAdapter +import androidx.fragment.app.activityViewModels +import sopt.uni.R +import sopt.uni.databinding.FragmentShortGameBinding +import sopt.uni.presentation.shortgame.createshortgame.dialog.CreateShortGameDialogFragment +import sopt.uni.util.ItemDecorations +import sopt.uni.util.binding.BindingFragment +import sopt.uni.util.extension.setOnSingleClickListener + +class ShortGameFragment : BindingFragment(R.layout.fragment_short_game) { + private val viewModel by activityViewModels() + + private val missionAdapter by lazy { + MissionCategoryAdapter( + selectMissionClickListener = { missionId -> + goToMissionDetail(missionId) + }, + ) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + super.onCreateView(inflater, container, savedInstanceState) + binding.apply { + viewModel = this@ShortGameFragment.viewModel + } + setBackPressed() + setAdapter() + setClickListener() + setViewModelObserve() + + return binding.root + } + + private fun setBackPressed() { + this.activity?.onBackPressedDispatcher?.addCallback( + viewLifecycleOwner, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + exitDialog() + } + }, + ) + } + + private fun setAdapter() { + binding.rvMission.adapter = missionAdapter + binding.rvMission.addItemDecoration(ItemDecorations(0, 9, 0, 9)) + } + + private fun setViewModelObserve() { + viewModel.missionList.observe(viewLifecycleOwner) { + missionAdapter.submitList(it) + } + } + + private fun setClickListener() { + binding.apply { + ivClose.setOnSingleClickListener { + exitDialog() + } + } + } + + private fun goToMissionDetail(missionId: Int) { + if ((viewModel.contentLength.value ?: 0) > MAX_LENGTH) return + viewModel.setSelectedMissionId(missionId) + val activity = activity as CreateShortGameActivity + activity.changeFragment(getString(R.string.label_mission_detail)) + } + + private fun exitDialog() { + requireActivity().let { + CreateShortGameDialogFragment().apply { + titleText = + it.resources.getString(R.string.create_short_game_exit_dialog_title) + bodyText = + it.resources.getString(R.string.create_short_game_exit_dialog_body) + confirmButtonText = + it.resources.getString(R.string.create_short_game_exit_dialog_exit) + dismissButtonText = + it.resources.getString(R.string.dialog_cancel_text) + confirmClickListener = { + it.finish() + this.dismiss() + } + dismissClickListener = { + this.dismiss() + } + }.show(it.supportFragmentManager, "") + } + } + + companion object { + @JvmStatic + fun newInstance(): ShortGameFragment { + val args = Bundle() + val fragment = ShortGameFragment() + fragment.arguments = args + return fragment + } + + private const val MAX_LENGTH = 54 + + @JvmStatic + @BindingAdapter("setContentLength") + fun setContentLength(view: TextView, length: Int) { + if (length > MAX_LENGTH) { + view.setTextColor(view.context.getColor(R.color.Red_500)) + } else { + view.setTextColor(view.context.getColor(R.color.Gray_200)) + } + view.text = "$length/$MAX_LENGTH" + } + + @JvmStatic + @BindingAdapter("setContentLength") + fun setWishContent(view: EditText, length: Int) { + if (length > MAX_LENGTH && view.isFocused) { + view.background = view.context.getDrawable(R.drawable.bg_wish_edit_text_error) + } else { + view.background = view.context.getDrawable(R.drawable.bg_wish_edit_text) + } + } + } +} diff --git a/app/src/main/res/layout/activity_create_short_game.xml b/app/src/main/res/layout/activity_create_short_game.xml index 190485fa..d3253594 100644 --- a/app/src/main/res/layout/activity_create_short_game.xml +++ b/app/src/main/res/layout/activity_create_short_game.xml @@ -1,8 +1,5 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_short_game.xml b/app/src/main/res/layout/fragment_short_game.xml new file mode 100644 index 00000000..0e3a24ad --- /dev/null +++ b/app/src/main/res/layout/fragment_short_game.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 11121ab62f8447d93e109385d65aa88eb57e6996 Mon Sep 17 00:00:00 2001 From: rkdmf1026 <50603273+rkdmf1026@users.noreply.github.com> Date: Wed, 4 Oct 2023 19:43:02 +0900 Subject: [PATCH 3/5] =?UTF-8?q?#102=20/=20=EB=AF=B8=EC=85=98=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=96=B4=EB=8C=91=ED=84=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../createshortgame/MissionCategoryAdapter.kt | 15 +------------ .../createshortgame/MissionViewHolder.kt | 22 +++---------------- app/src/main/res/layout/item_mission.xml | 14 +++++++++--- 3 files changed, 15 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt index d24edc81..a8c7fc67 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt @@ -5,19 +5,16 @@ import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import sopt.uni.data.entity.shortgame.MissionDetail import sopt.uni.databinding.ItemMissionBinding -import sopt.uni.presentation.entity.MissionIdPosition import sopt.uni.util.extension.ItemDiffCallback class MissionCategoryAdapter( - private val goToMissionDetailClickListener: (MissionIdPosition) -> Unit, - private val selectMissionClickListener: (MissionIdPosition) -> Unit, + private val selectMissionClickListener: (Int) -> Unit, ) : ListAdapter( ItemDiffCallback( onContentsTheSame = { old, new -> old == new }, onItemsTheSame = { old, new -> old == new }, ), ) { - private var selectedPosition = 0 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MissionViewHolder { val binding = ItemMissionBinding.inflate(LayoutInflater.from(parent.context), parent, false) @@ -27,17 +24,7 @@ class MissionCategoryAdapter( override fun onBindViewHolder(holder: MissionViewHolder, position: Int) { holder.onBind( getItem(position), - position == selectedPosition, - position, - goToMissionDetailClickListener, selectMissionClickListener, ) } - - fun setSelectedItem(position: Int) { - val prevPosition = selectedPosition - selectedPosition = position - notifyItemChanged(prevPosition) - notifyItemChanged(selectedPosition) - } } diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt index b6325d86..bafb52a1 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt @@ -1,37 +1,21 @@ package sopt.uni.presentation.shortgame.createshortgame import androidx.recyclerview.widget.RecyclerView -import coil.load -import sopt.uni.R import sopt.uni.data.entity.shortgame.MissionDetail import sopt.uni.databinding.ItemMissionBinding -import sopt.uni.presentation.entity.MissionIdPosition class MissionViewHolder(val binding: ItemMissionBinding) : RecyclerView.ViewHolder(binding.root) { fun onBind( data: MissionDetail, - isSelected: Boolean, - position: Int, - goToMissionDetailClickListener: (MissionIdPosition) -> Unit, - selectMissionClickListener: (MissionIdPosition) -> Unit, + selectMissionClickListener: (Int) -> Unit, ) { binding.apply { - ivMission.load(data.image) - tvMissionTitle.text = data.title - ivMissionDetail.setOnClickListener { - goToMissionDetailClickListener(MissionIdPosition(data.id, position)) - } root.setOnClickListener { - selectMissionClickListener(MissionIdPosition(data.id, position)) + selectMissionClickListener(data.id) } - } - - if (isSelected) { - binding.clBackground.setBackgroundResource(R.drawable.bg_mission_hover) - } else { - binding.clBackground.setBackgroundResource(R.drawable.bg_white_round_10) + missionDetail = data } } } diff --git a/app/src/main/res/layout/item_mission.xml b/app/src/main/res/layout/item_mission.xml index 4b8bd7b7..53092836 100644 --- a/app/src/main/res/layout/item_mission.xml +++ b/app/src/main/res/layout/item_mission.xml @@ -1,7 +1,13 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + - \ No newline at end of file + From 40fba79b6da0760af20252e217579bce4c42931a Mon Sep 17 00:00:00 2001 From: rkdmf1026 <50603273+rkdmf1026@users.noreply.github.com> Date: Wed, 4 Oct 2023 19:43:26 +0900 Subject: [PATCH 4/5] =?UTF-8?q?#102=20/=20String=20resource=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/values/strings.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f54892d3..f9a48e77 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -118,9 +118,11 @@ 한판승부 미션 카테고리 선택하기 더보기 버튼을 눌러 설명을 볼 수 있어요 - 소원 정하기 + 소원 작성하기 이번 승부에 걸 소원을 입력해주세요! \n소원은 지금 정하지 않고 승부가 끝난 뒤에도 작성할 수 있어요 한판 승부 만들기 + SHORT_GAME + MISSION_DETAIL 한판 승부 기록 @@ -212,6 +214,8 @@ 하트 추가 기능은 준비중이에요! 공유하기 Share WishCoupon + + Hello blank fragment 타이머 From 4e2ce03ae197117536d005b151f221ba0eef38bb Mon Sep 17 00:00:00 2001 From: rkdmf1026 <50603273+rkdmf1026@users.noreply.github.com> Date: Wed, 4 Oct 2023 19:44:05 +0900 Subject: [PATCH 5/5] =?UTF-8?q?#102=20/=20API=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=95=9C=ED=8C=90=EC=8A=B9?= =?UTF-8?q?=EB=B6=80=20=EA=B4=80=EB=A0=A8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/entity/shortgame/MissionCategory.kt | 18 ++++++++++++------ .../data/entity/shortgame/MissionContent.kt | 4 ++-- .../data/entity/shortgame/MissionExample.kt | 2 ++ .../response/ResponseShortGameResultDto.kt | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/sopt/uni/data/entity/shortgame/MissionCategory.kt b/app/src/main/java/sopt/uni/data/entity/shortgame/MissionCategory.kt index a5bb7ca6..0e1930a8 100644 --- a/app/src/main/java/sopt/uni/data/entity/shortgame/MissionCategory.kt +++ b/app/src/main/java/sopt/uni/data/entity/shortgame/MissionCategory.kt @@ -5,20 +5,26 @@ import kotlinx.serialization.Serializable @Serializable data class MissionCategory( - @SerialName("description") - val description: String, @SerialName("expectedTime") val expectedTime: Int, @SerialName("id") val id: Int, + @SerialName("title") + val title: String, + @SerialName("description") + val description: String, + @SerialName("rule") + val rule: String, + @SerialName("tip") + val tip: String, + @SerialName("example") + val example: String, @SerialName("image") val image: String, @SerialName("level") val level: Int, @SerialName("missionType") val missionType: String, - @SerialName("tip") - val tip: String, - @SerialName("title") - val title: String, + @SerialName("missionTool") + val missionTool: String, ) diff --git a/app/src/main/java/sopt/uni/data/entity/shortgame/MissionContent.kt b/app/src/main/java/sopt/uni/data/entity/shortgame/MissionContent.kt index d8c79ee5..f1275f36 100644 --- a/app/src/main/java/sopt/uni/data/entity/shortgame/MissionContent.kt +++ b/app/src/main/java/sopt/uni/data/entity/shortgame/MissionContent.kt @@ -9,8 +9,8 @@ data class MissionContent( val content: String, @SerialName("id") val id: Int, - @SerialName("image") - val image: String, + @SerialName("recommendTime") + val recommendTime: String?, @SerialName("missionCategory") val missionCategory: MissionCategory, ) diff --git a/app/src/main/java/sopt/uni/data/entity/shortgame/MissionExample.kt b/app/src/main/java/sopt/uni/data/entity/shortgame/MissionExample.kt index d00d4477..8cb9f37d 100644 --- a/app/src/main/java/sopt/uni/data/entity/shortgame/MissionExample.kt +++ b/app/src/main/java/sopt/uni/data/entity/shortgame/MissionExample.kt @@ -9,4 +9,6 @@ data class MissionExample( val id: Int, @SerialName("content") val content: String, + @SerialName("recommend_time") + val recommendTime: String? ) diff --git a/app/src/main/java/sopt/uni/data/source/remote/response/ResponseShortGameResultDto.kt b/app/src/main/java/sopt/uni/data/source/remote/response/ResponseShortGameResultDto.kt index 653419a1..b73215d7 100644 --- a/app/src/main/java/sopt/uni/data/source/remote/response/ResponseShortGameResultDto.kt +++ b/app/src/main/java/sopt/uni/data/source/remote/response/ResponseShortGameResultDto.kt @@ -9,5 +9,5 @@ data class ResponseShortGameResultDto( @SerialName("myRoundMission") val myRoundMission: RoundMission, @SerialName("partnerRoundMission") - val partnerRoundMission: RoundMission?, + val partnerRoundMission: RoundMission? = null, )