Skip to content

Commit

Permalink
♻️ Refactor: 카테고리 UI 및 화면 이동 방식 변경
Browse files Browse the repository at this point in the history
- 일정-카테고리 선택 다이얼로그에서 편집 화면까지 바로 이동
- 화면 이동 방식 수정

Related to: #346
  • Loading branch information
nahy-512 committed Feb 9, 2025
1 parent 59df710 commit 29cf8dc
Show file tree
Hide file tree
Showing 13 changed files with 291 additions and 258 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,22 @@
package com.mongmong.namo.presentation.ui.home.category

import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.Toast
import androidx.appcompat.widget.SwitchCompat
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.GridLayoutManager
import com.google.gson.Gson
import com.google.gson.JsonParseException
import com.google.gson.reflect.TypeToken
import com.mongmong.namo.R
import com.mongmong.namo.databinding.FragmentCategoryDetailBinding
import com.mongmong.namo.domain.model.CategoryModel
import com.mongmong.namo.presentation.config.BaseFragment
import com.mongmong.namo.presentation.enums.CategoryColor
import com.mongmong.namo.presentation.enums.SuccessType
import com.mongmong.namo.presentation.ui.home.category.CategorySettingFragment.Companion.CATEGORY_DATA
import com.mongmong.namo.presentation.ui.home.category.adapter.CategoryPaletteRVAdapter
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class CategoryDetailFragment(private val isEditMode: Boolean)
class CategoryDetailFragment
: BaseFragment<FragmentCategoryDetailBinding>(R.layout.fragment_category_detail) {

private lateinit var paletteAdapter: CategoryPaletteRVAdapter
Expand All @@ -31,56 +26,54 @@ class CategoryDetailFragment(private val isEditMode: Boolean)
override fun setup() {
binding.viewModel = this@CategoryDetailFragment.viewModel

setInit()
val args = this.arguments?.let { CategoryDetailFragmentArgs.fromBundle(it).category }

binding.isEditMode = (args != null)

if (args != null) { // 카테고리 편집
viewModel.setCategory(args)
} else { // 카테고리 생성
viewModel.setCategory(CategoryModel(isShare = true))
}
switchToggle()
onClickListener()
initClickListeners()

initObservers()
}

if (viewModel.color.value == null) {
initPaletteColorRv(CategoryColor.NAMO_ORANGE)
} else {
initPaletteColorRv(viewModel.color.value!!)
private fun initClickListeners() {
// 뒤로가기
binding.categoryDetailBackIv.setOnClickListener {
findNavController().popBackStack()
}
}

private fun onClickListener() {
with(binding) {
// 뒤로가기
categoryDetailBackIv.setOnClickListener {
// 편집 모드라면 CategoryEditActivity 위에 Fragment 씌어짐
moveToSettingFrag(isEditMode)
// 저장하기
binding.categoryDetailSaveTv.setOnClickListener {
if (!this@CategoryDetailFragment.viewModel.isValidInput()) {
Toast.makeText(requireContext(), "카테고리를 입력해주세요", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}

// 저장하기
categoryDetailSaveTv.setOnClickListener {
if (!this@CategoryDetailFragment.viewModel.isValidInput()) {
Toast.makeText(requireContext(), "카테고리를 입력해주세요", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
// 수정 모드 -> 카테고리 update
if (isEditMode) {
updateData()
}
// 생성 모드 -> 카테고리 insert
else {
insertData()
}
// 수정 모드 -> 카테고리 update
if (viewModel.isEditMode) {
updateData()
}
// 생성 모드 -> 카테고리 insert
else {
insertData()
}
}
}

private fun setInit() {
// 편집 모드
if (isEditMode) {
// 이전 화면에서 저장한 spf 받아오기
loadPref()
return
private fun initObservers() {
viewModel.color.observe(requireActivity()) { color ->
Log.e("CategoryDetailFrag", "initObservers - color: $color")
if (color == null) {
initPaletteColorRv(null)
} else {
initPaletteColorRv(color)
}
}
viewModel.setCategory(CategoryModel(isShare = true))
}

private fun initObservers() {
viewModel.isComplete.observe(requireActivity()) { isComplete ->
// 추가 작업이 완료된 후 뒤로가기
if (isComplete) {
Expand All @@ -91,7 +84,7 @@ class CategoryDetailFragment(private val isEditMode: Boolean)
else -> {}
}
}
moveToSettingFrag(isEditMode)
findNavController().popBackStack() // 뒤로가기
}
}
}
Expand All @@ -107,11 +100,10 @@ class CategoryDetailFragment(private val isEditMode: Boolean)
viewModel.editCategory()
}

private fun initPaletteColorRv(initCategory: CategoryColor) {
if (viewModel.selectedPalettePosition.value == null) viewModel.updateSelectedPalettePosition(0)

private fun initPaletteColorRv(initCategory: CategoryColor?) {
val selectedItemPosition = CategoryColor.getAllColors().indexOf(initCategory)
// 어댑터 연결
paletteAdapter = CategoryPaletteRVAdapter(requireContext(), CategoryColor.getAllColors(), initCategory, viewModel.selectedPalettePosition.value!!)
paletteAdapter = CategoryPaletteRVAdapter(requireContext(), CategoryColor.getAllColors(), selectedItemPosition)
binding.categoryPaletteRv.apply {
adapter = paletteAdapter
layoutManager = GridLayoutManager(context, 5)
Expand All @@ -121,15 +113,13 @@ class CategoryDetailFragment(private val isEditMode: Boolean)
override fun onItemClick(position: Int, selectedColor: CategoryColor) {
// 색상값 세팅
viewModel.updateCategoryColor(selectedColor)
// notifyItemChanged()에서 인자로 넘겨주기 위함
viewModel.updateSelectedPalettePosition(position)
}
})
}

private fun switchToggle() {
val isShare = viewModel.category.value!!.isShare
binding.categoryToggleIv.apply {
binding.categoryShareToggleIv.apply {
// 첫 진입 시 토글 이미지 세팅
isChecked = isShare
// 토글 클릭 시 이미지 세팅
Expand All @@ -139,37 +129,4 @@ class CategoryDetailFragment(private val isEditMode: Boolean)
}
}
}

private fun loadPref() {
val spf = requireActivity().getSharedPreferences(CategorySettingFragment.CATEGORY_KEY_PREFS, Context.MODE_PRIVATE)

if (spf.contains(CATEGORY_DATA)) {
val gson = Gson()
val json = spf.getString(CATEGORY_DATA, "")
try {
// 데이터에 타입을 부여하기 위한 typeToken
val typeToken = object : TypeToken<CategoryModel>() {}.type
// 데이터 받기
val data: CategoryModel = gson.fromJson(json, typeToken)
viewModel.setCategory(data)
} catch (e: JsonParseException) { // 파싱이 안 될 경우
e.printStackTrace()
}
Log.d("debug", "Category Data loaded")
}
}

private fun moveToSettingFrag(isEditMode: Boolean) {
if (isEditMode) { // 편집 모드에서의 화면 이동
Intent(requireActivity(), CategoryActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
}.also {
startActivity(it)
}
activity?.finish()
} else { // 생성 모드에서의 화면 이동
requireActivity().supportFragmentManager
.popBackStack() // 뒤로가기
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class CategoryEditActivity
initObservers()

supportFragmentManager.beginTransaction()
.replace(R.id.category_edit_frm, CategoryDetailFragment(true))
.replace(R.id.category_edit_frm, CategoryDetailFragment())
.commitAllowingStateLoss()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class CategorySettingFragment: BaseFragment<FragmentCategorySettingBinding>(R.la
private fun onClickCategoryAddBtn() {
binding.categoryAddBtn.setOnClickListener { // 새 카테고리
requireActivity().supportFragmentManager.beginTransaction()
.add(R.id.category_frm, CategoryDetailFragment(false))
.add(R.id.category_frm, CategoryDetailFragment())
.addToBackStack(null) // 백 스택에 트랜잭션을 추가
.commitAllowingStateLoss()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class CategoryViewModel @Inject constructor(
private val repository: CategoryRepository,
private val getCategoriesUseCase: GetCategoriesUseCase,
) : ViewModel() {
var isEditMode: Boolean = false

private val _category = MutableLiveData<CategoryModel>()
val category: LiveData<CategoryModel> = _category

Expand All @@ -34,9 +36,6 @@ class CategoryViewModel @Inject constructor(
private val _color = MutableLiveData<CategoryColor?>(null)
val color: LiveData<CategoryColor?> = _color

private val _selectedPalettePosition = MutableLiveData<Int?>() // 팔레트 -> 기본 색상 선택 시 사용될 변수
val selectedPalettePosition: LiveData<Int?> = _selectedPalettePosition

private val _canDeleteCategory = MutableLiveData<Boolean>(true)
val canDeleteCategory: LiveData<Boolean> = _canDeleteCategory

Expand Down Expand Up @@ -107,10 +106,6 @@ class CategoryViewModel @Inject constructor(
_category.value!!.isShare = isShare
}

fun updateSelectedPalettePosition(pos: Int?) {
_selectedPalettePosition.value = pos
}

fun isValidInput(): Boolean {
return (!_category.value?.name.isNullOrEmpty()) && (_color.value != null)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,15 @@ import com.mongmong.namo.presentation.enums.CategoryColor
class CategoryPaletteRVAdapter(
val context: Context,
private val colorList: ArrayList<CategoryColor>,
initColor: CategoryColor,
selectedColorPosition: Int
selectedColorPosition: Int?
): RecyclerView.Adapter<CategoryPaletteRVAdapter.ViewHolder>() {

interface MyItemClickListener {
fun onItemClick(position: Int, selectedColor: CategoryColor)
}

private lateinit var mItemClickListener: MyItemClickListener
private var currentSelectPosition = if (colorList[selectedColorPosition] == initColor) selectedColorPosition else -1
private var currentSelectPosition = selectedColorPosition ?: -1
private var previousSelectPosition = currentSelectPosition

fun setColorClickListener(itemClickListener: MyItemClickListener) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,45 @@ class ScheduleDialogCategoryFragment
override fun setup() {
binding.viewModel = viewModel

onClickCategoryEdit()
initClickListeners()
initObserve()
}

private fun onClickCategoryEdit() {
binding.dialogScheduleCategoryEditCv.setOnClickListener {
Log.d("DialogCategoryFrag", "categoryEditCV 클릭")
startActivity(Intent(activity, CategoryActivity::class.java))
private fun initClickListeners() {
// 뒤로가기 (일정 화면)
binding.dialogScheduleCategoryBackIv.setOnClickListener {
val action = ScheduleDialogCategoryFragmentDirections.actionScheduleDialogCategoryFragmentToScheduleDialogBasicFragment()
findNavController().navigate(action)
}

// 카테고리 추가
binding.dialogScheduleCategoryAddBtn.setOnClickListener {
findNavController().navigate(R.id.action_scheduleDialogCategoryFragment_to_categoryFragment)
// startActivity(Intent(activity, CategoryActivity::class.java))
}
}

private fun setAdapter(categoryList: List<CategoryModel>) {
categoryRVAdapter = DialogCategoryRVAdapter(categoryList)
categoryRVAdapter.setSelectedId(viewModel.schedule.value!!.categoryInfo.categoryId)
categoryRVAdapter.setMyItemClickListener(object: DialogCategoryRVAdapter.MyItemClickListener {
// 아이템 클릭
override fun onSendId(category: CategoryModel) {
// 카테고리 세팅
// 카테고리 선택 진행
override fun onSelectCategory(category: CategoryModel) {
viewModel.updateCategory(category)
val action = ScheduleDialogCategoryFragmentDirections.actionScheduleDialogCategoryFragmentToScheduleDialogBasicFragment()
Log.d("CategoryFragment", "selected category: $category")
findNavController().navigate(action)
}

// 카테고리 편집 화면으로 이동
override fun onEditCategory(category: CategoryModel) {
val action = ScheduleDialogCategoryFragmentDirections.actionScheduleDialogCategoryFragmentToCategoryFragment(category)
Log.d("CategoryFragment", "selected category: $category")
findNavController().navigate(action)
// findNavController().navigate(R.id.action_scheduleDialogCategoryFragment_to_categoryFragment)
}
})

binding.dialogScheduleCategoryRv.apply {
adapter = categoryRVAdapter
layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ class DialogCategoryRVAdapter(
private var selectedId : Long = 0

interface MyItemClickListener {
fun onSendId(category: CategoryModel)
fun onSelectCategory(category: CategoryModel)
fun onEditCategory(category: CategoryModel)
}

private lateinit var mItemClickListener : MyItemClickListener
Expand Down Expand Up @@ -48,9 +49,18 @@ class DialogCategoryRVAdapter(
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(categoryList[position])

holder.itemView.setOnClickListener {
selectedId = categoryList[position].categoryId
mItemClickListener.onSendId(categoryList[position])
// 화면 이동
holder.binding.apply {
// 카테고리 선택
categoryColorView.setOnClickListener {
selectedId = categoryList[position].categoryId
mItemClickListener.onSelectCategory(categoryList[position]) // 카테고리 선택 진행
}

// 카테고리 수정
categoryEditLl.setOnClickListener {
mItemClickListener.onEditCategory(categoryList[position])
}
}
}

Expand Down
Loading

0 comments on commit 29cf8dc

Please sign in to comment.