diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d4bd7c02..fbd7e0ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -80,7 +80,7 @@ android:exported="false" android:screenOrientation="portrait" /> diff --git a/app/src/main/java/sopt/uni/presentation/MissionDetailCreateActivity.kt b/app/src/main/java/sopt/uni/presentation/MissionDetailCreateActivity.kt deleted file mode 100644 index 3868ffab..00000000 --- a/app/src/main/java/sopt/uni/presentation/MissionDetailCreateActivity.kt +++ /dev/null @@ -1,12 +0,0 @@ -package sopt.uni.presentation - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import sopt.uni.R - -class MissionDetailCreateActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_mission_detail_create) - } -} diff --git a/app/src/main/java/sopt/uni/presentation/entity/MissionIdPosition.kt b/app/src/main/java/sopt/uni/presentation/entity/MissionIdPosition.kt index e5603f8a..0ce8428a 100644 --- a/app/src/main/java/sopt/uni/presentation/entity/MissionIdPosition.kt +++ b/app/src/main/java/sopt/uni/presentation/entity/MissionIdPosition.kt @@ -1,6 +1,10 @@ package sopt.uni.presentation.entity +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize data class MissionIdPosition( val id: Int, - val position: Int -) + val position: Int, +) : Parcelable diff --git a/app/src/main/java/sopt/uni/presentation/home/HomeActivity.kt b/app/src/main/java/sopt/uni/presentation/home/HomeActivity.kt index e67ca092..d7395f67 100644 --- a/app/src/main/java/sopt/uni/presentation/home/HomeActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/home/HomeActivity.kt @@ -5,7 +5,7 @@ import dagger.hilt.android.AndroidEntryPoint import sopt.uni.R import sopt.uni.databinding.ActivityHomeBinding import sopt.uni.presentation.history.HistoryActivity -import sopt.uni.presentation.shortgame.CreateShortGameActivity +import sopt.uni.presentation.shortgame.createshortgame.CreateShortGameActivity import sopt.uni.presentation.wish.WishActivity import sopt.uni.util.binding.BindingActivity import sopt.uni.util.extension.setOnSingleClickListener diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/CreateShortGameActivity.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt similarity index 52% rename from app/src/main/java/sopt/uni/presentation/shortgame/CreateShortGameActivity.kt rename to app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt index df002565..460ff7db 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/CreateShortGameActivity.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameActivity.kt @@ -1,19 +1,26 @@ -package sopt.uni.presentation.shortgame +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.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.util.binding.BindingActivity +import sopt.uni.util.extension.parcelable import sopt.uni.util.extension.setOnSingleClickListener @AndroidEntryPoint @@ -22,10 +29,19 @@ class CreateShortGameActivity : 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 missionAdapter by lazy { MissionCategoryAdapter( goToMissionDetailClickListener = { missionIdPosition -> - // TODO : 미션상세뷰 이동 + val intent = Intent(this, MissionDetailCreateActivity::class.java) + intent.putExtra(MissionDetailCreateActivity.MISSION_ID_POSITION, missionIdPosition) + activityLauncher.launch(intent) }, selectMissionClickListener = { missionIdPosition -> selectItem(missionIdPosition.id, missionIdPosition.position) @@ -37,6 +53,7 @@ class CreateShortGameActivity : super.onCreate(savedInstanceState) setContentView(binding.root) binding.viewModel = viewModel + setViewModelObserve() setAdapter() setClickListener() } @@ -62,22 +79,67 @@ class CreateShortGameActivity : private fun setAdapter() { binding.rvMission.adapter = missionAdapter binding.rvMission.addItemDecoration(ItemDecorations(0, 9, 0, 9)) + } + + 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() + } + } } private fun setClickListener() { binding.apply { ivClose.setOnSingleClickListener { - // TODO : 종료 다이얼로그 + exitDialog() } btnCreate.setOnSingleClickListener { - // TODO : 생성 다이얼로그 + 미션 기록 액티비티 이동 + 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) @@ -89,7 +151,7 @@ class CreateShortGameActivity : @JvmStatic @BindingAdapter("setContentLength") fun setContentLength(view: TextView, length: Int) { - if (length >= MAX_LENGTH) { + if (length > MAX_LENGTH) { view.setTextColor(view.context.getColor(R.color.Red_500)) } else { view.setTextColor(view.context.getColor(R.color.Gray_200)) @@ -100,7 +162,7 @@ class CreateShortGameActivity : @JvmStatic @BindingAdapter("setContentLength") fun setWishContent(view: EditText, length: Int) { - if (length >= MAX_LENGTH && view.isFocused) { + 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/java/sopt/uni/presentation/shortgame/CreateShortGameViewModel.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt similarity index 74% rename from app/src/main/java/sopt/uni/presentation/shortgame/CreateShortGameViewModel.kt rename to app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt index 285ee9ed..de52a0dc 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/CreateShortGameViewModel.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/CreateShortGameViewModel.kt @@ -1,4 +1,4 @@ -package sopt.uni.presentation.shortgame +package sopt.uni.presentation.shortgame.createshortgame import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -9,6 +9,9 @@ class CreateShortGameViewModel : ViewModel() { private val _selectedMissionId = MutableLiveData() val selectedMissionId = _selectedMissionId + private val _roundGameId = MutableLiveData() + val roundGameId = _roundGameId + private val _missionList = MutableLiveData>() val missionList = _missionList @@ -18,6 +21,9 @@ class CreateShortGameViewModel : ViewModel() { it.length } + private val _isCreateSuccess = MutableLiveData(false) + val isCreateSuccess = _isCreateSuccess + init { setDummyList() } @@ -31,12 +37,17 @@ class CreateShortGameViewModel : ViewModel() { image = "https://github.com/U-is-Ni-in-Korea/Android-United/assets/50603273/8c345eb3-d688-42bd-8585-a02f1016e213", title = "뀨$i", id = i, - ) + ), ) } _missionList.value = missionList } + fun createShortGame() { + _isCreateSuccess.postValue(true) + _roundGameId.value = 1 + } + fun setSelectedMissionId(missionId: Int) { _selectedMissionId.value = missionId } diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/MissionCategoryAdapter.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt similarity index 96% rename from app/src/main/java/sopt/uni/presentation/shortgame/MissionCategoryAdapter.kt rename to app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt index e525d71a..66f80783 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/MissionCategoryAdapter.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionCategoryAdapter.kt @@ -1,4 +1,4 @@ -package sopt.uni.presentation.shortgame +package sopt.uni.presentation.shortgame.createshortgame import android.view.LayoutInflater import android.view.ViewGroup diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/MissionViewHolder.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt similarity index 95% rename from app/src/main/java/sopt/uni/presentation/shortgame/MissionViewHolder.kt rename to app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt index a220906c..72742de2 100644 --- a/app/src/main/java/sopt/uni/presentation/shortgame/MissionViewHolder.kt +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/MissionViewHolder.kt @@ -1,4 +1,4 @@ -package sopt.uni.presentation.shortgame +package sopt.uni.presentation.shortgame.createshortgame import androidx.recyclerview.widget.RecyclerView import coil.load diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/dialog/CreateShortGameDialogFragment.kt b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/dialog/CreateShortGameDialogFragment.kt new file mode 100644 index 00000000..1384986b --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/shortgame/createshortgame/dialog/CreateShortGameDialogFragment.kt @@ -0,0 +1,61 @@ +package sopt.uni.presentation.shortgame.createshortgame.dialog + +import android.os.Bundle +import android.view.View +import sopt.uni.R +import sopt.uni.databinding.TitleAction2DialogBinding +import sopt.uni.presentation.BindingDialogFragment + +class CreateShortGameDialogFragment : + BindingDialogFragment(R.layout.title_action2_dialog) { + + var titleText: String? = null + var bodyText: String? = null + var confirmButtonText: String? = null + var dismissButtonText: String? = null + var confirmClickListener: (() -> Unit)? = null + var dismissClickListener: (() -> Unit)? = null + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initView() + } + + private fun initView() { + titleText?.let { + binding.dialogTitle.visibility = View.VISIBLE + binding.dialogTitle.text = it + } ?: kotlin.run { + binding.dialogTitle.visibility = View.GONE + } + bodyText?.let { + binding.dialogBody.visibility = View.VISIBLE + binding.dialogBody.text = it + } ?: kotlin.run { + binding.dialogBody.visibility = View.GONE + } + confirmButtonText?.let { + binding.btnRight.text = it + } + dismissButtonText?.let { + binding.btnLeft.text = it + } + + confirmClickListener?.let { + binding.btnRight.visibility = View.VISIBLE + binding.btnRight.setOnClickListener { + confirmClickListener?.invoke() + } + } ?: kotlin.run { + binding.btnRight.visibility = View.GONE + } + + dismissClickListener?.let { + binding.btnLeft.visibility = View.VISIBLE + binding.btnLeft.setOnClickListener { + dismissClickListener?.invoke() + } + } ?: run { + binding.btnLeft.visibility = View.GONE + } + } +} diff --git a/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateActivity.kt b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateActivity.kt new file mode 100644 index 00000000..339d62db --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateActivity.kt @@ -0,0 +1,43 @@ +package sopt.uni.presentation.shortgame.missiondetailcreate + +import android.content.Intent +import android.os.Bundle +import androidx.activity.viewModels +import sopt.uni.R +import sopt.uni.databinding.ActivityMissionDetailCreateBinding +import sopt.uni.presentation.entity.MissionIdPosition +import sopt.uni.presentation.shortgame.createshortgame.CreateShortGameActivity +import sopt.uni.util.binding.BindingActivity +import sopt.uni.util.extension.parcelable +import sopt.uni.util.extension.setOnSingleClickListener + +class MissionDetailCreateActivity : BindingActivity(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/MissionDetailCreateViewModel.kt b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateViewModel.kt new file mode 100644 index 00000000..03b0ee3b --- /dev/null +++ b/app/src/main/java/sopt/uni/presentation/shortgame/missiondetailcreate/MissionDetailCreateViewModel.kt @@ -0,0 +1,31 @@ +package sopt.uni.presentation.shortgame.missiondetailcreate + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import sopt.uni.data.entity.shortgame.MissionDetail +import sopt.uni.data.entity.shortgame.MissionExample +import sopt.uni.presentation.entity.MissionIdPosition + +class MissionDetailCreateViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { + val missionId = savedStateHandle.get(MissionDetailCreateActivity.MISSION_ID_POSITION) + + private val _missionDetail = MutableLiveData() + val missionDetail = _missionDetail + + init { + setMissionDetail() + } + + fun setMissionDetail() { + _missionDetail.value = MissionDetail( + 1, + "금지어 말하지 않기", + "금지이름 말하지 않는 게임입니다", + "본인에게 할당된 주제의 답변을 상대방이 맞춰야 하는 게임입니다.\n" + "단순 주제가 나와있는 미션이라면, 상대의 입장에서 해당 주제에 대한 답을 해주세요.\n" + "2지선다로 이루어진 미션이라면, 상대가 어떤 선지를 더 좋아할지에 대해 예상하여 답을 해주세요.", + "요리조리 피해보세요", + "https://github.com/U-is-Ni-in-Korea/Android-United/assets/50603273/8c345eb3-d688-42bd-8585-a02f1016e213", + listOf(MissionExample(1, "헐"), MissionExample(2, "대박")), + ) + } +} 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 e74a6ba2..6e794f4a 100644 --- a/app/src/main/res/layout/activity_create_short_game.xml +++ b/app/src/main/res/layout/activity_create_short_game.xml @@ -7,7 +7,7 @@ + type="sopt.uni.presentation.shortgame.createshortgame.CreateShortGameViewModel" /> + tools:context=".presentation.shortgame.createshortgame.CreateShortGameActivity"> + + tools:context=".presentation.shortgame.missiondetailcreate.MissionDetailCreateActivity"> + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/imagecard_android" /> + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/mission_detatil_create_game_title" /> - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2fa040c8..d4d9c9b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -165,4 +165,12 @@ 미션 실패 님이 이겼어요 + + 승부 만들기가 완료되지 않았어요 + 여기서 나가실래요 + 나가기 + 설정된 내용으로 승부를 만들까요? + 한번 설정한 내용은 변경할 수 없어요 + 만들기 +