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,
)