diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt index f609bb32..86bfe43a 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryDetailFragment.kt @@ -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(R.layout.fragment_category_detail) { private lateinit var paletteAdapter: CategoryPaletteRVAdapter @@ -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) { @@ -91,7 +84,7 @@ class CategoryDetailFragment(private val isEditMode: Boolean) else -> {} } } - moveToSettingFrag(isEditMode) + findNavController().popBackStack() // 뒤로가기 } } } @@ -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) @@ -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 // 토글 클릭 시 이미지 세팅 @@ -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() {}.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() // 뒤로가기 - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryEditActivity.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryEditActivity.kt index 5bbfaec1..c3ea4d87 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryEditActivity.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryEditActivity.kt @@ -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() } diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategorySettingFragment.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategorySettingFragment.kt index 946d6c95..bf2de3e6 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategorySettingFragment.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategorySettingFragment.kt @@ -59,7 +59,7 @@ class CategorySettingFragment: BaseFragment(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() } diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryViewModel.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryViewModel.kt index a1312e65..2adae545 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryViewModel.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/CategoryViewModel.kt @@ -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() val category: LiveData = _category @@ -34,9 +36,6 @@ class CategoryViewModel @Inject constructor( private val _color = MutableLiveData(null) val color: LiveData = _color - private val _selectedPalettePosition = MutableLiveData() // 팔레트 -> 기본 색상 선택 시 사용될 변수 - val selectedPalettePosition: LiveData = _selectedPalettePosition - private val _canDeleteCategory = MutableLiveData(true) val canDeleteCategory: LiveData = _canDeleteCategory @@ -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) } diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/adapter/CategoryPaletteRVAdapter.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/adapter/CategoryPaletteRVAdapter.kt index 6ad8bedc..e5460e73 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/adapter/CategoryPaletteRVAdapter.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/category/adapter/CategoryPaletteRVAdapter.kt @@ -11,8 +11,7 @@ import com.mongmong.namo.presentation.enums.CategoryColor class CategoryPaletteRVAdapter( val context: Context, private val colorList: ArrayList, - initColor: CategoryColor, - selectedColorPosition: Int + selectedColorPosition: Int? ): RecyclerView.Adapter() { interface MyItemClickListener { @@ -20,7 +19,7 @@ class CategoryPaletteRVAdapter( } 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) { diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/ScheduleDialogCategoryFragment.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/ScheduleDialogCategoryFragment.kt index c6d5b349..4a9578fb 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/ScheduleDialogCategoryFragment.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/ScheduleDialogCategoryFragment.kt @@ -24,14 +24,21 @@ 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)) } } @@ -39,15 +46,23 @@ class ScheduleDialogCategoryFragment 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) diff --git a/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/adapter/DialogCategoryRVAdapter.kt b/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/adapter/DialogCategoryRVAdapter.kt index 9362d5d0..d2de3d4c 100644 --- a/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/adapter/DialogCategoryRVAdapter.kt +++ b/app/src/main/java/com/mongmong/namo/presentation/ui/home/schedule/adapter/DialogCategoryRVAdapter.kt @@ -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 @@ -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]) + } } } diff --git a/app/src/main/res/layout/fragment_category_detail.xml b/app/src/main/res/layout/fragment_category_detail.xml index 1813205d..68550c8f 100644 --- a/app/src/main/res/layout/fragment_category_detail.xml +++ b/app/src/main/res/layout/fragment_category_detail.xml @@ -5,146 +5,167 @@ + + - + + + + + + + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_marginTop="20dp" + android:layout_marginHorizontal="10dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/category_detail_back_iv"> + + - + + - + android:layout_marginTop="-15dp" + android:layout_gravity="end" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="5" + tools:itemCount="20" + tools:listitem="@layout/item_palette_color" + app:layout_constraintTop_toTopOf="@id/category_detail_color_tv" + app:layout_constraintEnd_toEndOf="parent"/> + + + + android:background="@null" + app:layout_constraintTop_toTopOf="@id/category_share_tv" + app:layout_constraintBottom_toBottomOf="@id/category_share_tv" + app:layout_constraintEnd_toEndOf="parent" + style="@style/category_toggle"/> - + android:layout_marginTop="8dp" + android:textColor="@color/main_text" + android:text="@string/category_detail_share_guide" + app:layout_constraintStart_toStartOf="@id/category_share_tv" + app:layout_constraintTop_toBottomOf="@id/category_share_tv" + style="@style/subtext_12"/> - - - - - - - - - - - + - - - + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_category_setting.xml b/app/src/main/res/layout/fragment_category_setting.xml index 37f0ef61..57986026 100644 --- a/app/src/main/res/layout/fragment_category_setting.xml +++ b/app/src/main/res/layout/fragment_category_setting.xml @@ -76,7 +76,7 @@ app:layout_constraintVertical_bias="0"> - + + + style="@style/content_bold" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"/> - + - - - - - - - + android:paddingEnd="5dp" + android:text="@string/category_add" + android:drawableStart="@drawable/ic_category_add" + android:drawablePadding="16dp" + style="@style/content_regular"/> diff --git a/app/src/main/res/layout/item_dialog_schedule_category.xml b/app/src/main/res/layout/item_dialog_schedule_category.xml index 83137d21..0e25b775 100644 --- a/app/src/main/res/layout/item_dialog_schedule_category.xml +++ b/app/src/main/res/layout/item_dialog_schedule_category.xml @@ -37,18 +37,37 @@ app:layout_constraintEnd_toEndOf="@id/category_color_view" android:visibility="gone"/> - + app:layout_constraintHorizontal_bias="0"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_schedule.xml b/app/src/main/res/navigation/nav_schedule.xml index de2fd295..0a9df541 100644 --- a/app/src/main/res/navigation/nav_schedule.xml +++ b/app/src/main/res/navigation/nav_schedule.xml @@ -28,5 +28,20 @@ app:destination="@id/scheduleDialogBasicFragment" app:popUpTo="@id/scheduleDialogBasicFragment" app:popUpToInclusive="true" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1336f7d4..b31c12aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -186,9 +186,12 @@ 팔레트 기본 팔레트 새 카테고리 + 새 카테고리 추가 + 카테고리 삭제 카테고리 이름 색상 - 공유 설정 + 공개 설정 + 카테고리 일정이 친구에게 공개되지 않습니다. 카테고리 설정 장소 금액 정산