diff --git a/Nabi/presentation/src/main/java/com/nabi/nabi/utils/Constants.kt b/Nabi/presentation/src/main/java/com/nabi/nabi/utils/Constants.kt index 3c618d0..7f9f80b 100644 --- a/Nabi/presentation/src/main/java/com/nabi/nabi/utils/Constants.kt +++ b/Nabi/presentation/src/main/java/com/nabi/nabi/utils/Constants.kt @@ -17,5 +17,5 @@ object Constants { val dateKoreanFormat = SimpleDateFormat("yyyy년 M월 d일", Locale.KOREAN) val dateEnglishOnlyYearFormat = SimpleDateFormat("yyyy", Locale.ENGLISH) val dateEnglishOnlyMonthFormat = SimpleDateFormat("MMMM", Locale.ENGLISH) - val dateNumberOnlyMonthFormat = SimpleDateFormat("M", Locale.getDefault()) + val dateNumberOnlyMonthFormat = SimpleDateFormat("M", Locale.ENGLISH) } \ No newline at end of file diff --git a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/emotion/EmotionSearchFragment.kt b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/emotion/EmotionSearchFragment.kt index 5fdc918..67f134e 100644 --- a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/emotion/EmotionSearchFragment.kt +++ b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/emotion/EmotionSearchFragment.kt @@ -17,7 +17,7 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class EmotionSearchFragment( private val emotion: String -): BaseFragment(R.layout.fragment_emotion_search) { +) : BaseFragment(R.layout.fragment_emotion_search) { private val viewModel: EmotionSearchViewModel by viewModels() private lateinit var emotionSearchAdapter: EmotionSearchAdapter private var isLoading = false @@ -34,16 +34,24 @@ class EmotionSearchFragment( emotionSearchAdapter.submitList(viewModel.diaryItems.value) } - private fun setSearchDiaryAdapter(){ + private fun setSearchDiaryAdapter() { emotionSearchAdapter = EmotionSearchAdapter().apply { setRvItemClickListener(object : OnRvItemClickListener { override fun onClick(item: Int) { - (requireActivity() as MainActivity).replaceFragment(DetailDiaryFragment(item), true) + (requireActivity() as MainActivity).replaceFragment( + DetailDiaryFragment(item), + true + ) } }) } binding.rvEmotionDiaryResult.layoutManager = LinearLayoutManager(requireContext()) - binding.rvEmotionDiaryResult.addItemDecoration(CustomDecoration(0.5f, ContextCompat.getColor(requireContext(), R.color.gray2))) + binding.rvEmotionDiaryResult.addItemDecoration( + CustomDecoration( + 0.5f, + ContextCompat.getColor(requireContext(), R.color.gray2) + ) + ) binding.rvEmotionDiaryResult.adapter = emotionSearchAdapter } @@ -63,7 +71,7 @@ class EmotionSearchFragment( val itemTotalCount = recyclerView.adapter?.itemCount ?: 0 if (lastVisibleItemPos >= itemTotalCount - 6) { - if(!isLoading){ + if (!isLoading) { isLoading = true viewModel.fetchData(viewModel.searchEmotion.value ?: emotion) } @@ -94,16 +102,78 @@ class EmotionSearchFragment( } } - private fun setCurrentEmotion(){ + private fun setCurrentEmotion() { val resourceIds = mutableListOf() - val condition = if(viewModel.searchEmotion.value.isNullOrEmpty()) emotion else viewModel.searchEmotion.value - - when(condition){ - "화남" -> resourceIds.addAll(listOf(R.drawable.img_anger, R.drawable.img_happiness_gray, R.drawable.img_boredom_gray, R.drawable.img_sadness_gray, R.drawable.img_anxiety_gray)) - "행복" -> resourceIds.addAll(listOf(R.drawable.img_anger_gray, R.drawable.img_happiness, R.drawable.img_boredom_gray, R.drawable.img_sadness_gray, R.drawable.img_anxiety_gray)) - "지루함" -> resourceIds.addAll(listOf(R.drawable.img_anger_gray, R.drawable.img_happiness_gray, R.drawable.img_boredom, R.drawable.img_sadness_gray, R.drawable.img_anxiety_gray)) - "우울" -> resourceIds.addAll(listOf(R.drawable.img_anger_gray, R.drawable.img_happiness_gray, R.drawable.img_boredom_gray, R.drawable.img_sadness, R.drawable.img_anxiety_gray)) - "불안" -> resourceIds.addAll(listOf(R.drawable.img_anger_gray, R.drawable.img_happiness_gray, R.drawable.img_boredom_gray, R.drawable.img_sadness_gray, R.drawable.img_anxiety)) + val condition = + if (viewModel.searchEmotion.value.isNullOrEmpty()) emotion else viewModel.searchEmotion.value + + var titleText = "" + + when (condition) { + "화남" -> { + titleText = "화난 감정의 일기들" + resourceIds.addAll( + listOf( + R.drawable.img_anger, + R.drawable.img_happiness_gray, + R.drawable.img_boredom_gray, + R.drawable.img_sadness_gray, + R.drawable.img_anxiety_gray + ) + ) + } + + "행복" -> { + titleText = "행복한 감정의 일기들" + resourceIds.addAll( + listOf( + R.drawable.img_anger_gray, + R.drawable.img_happiness, + R.drawable.img_boredom_gray, + R.drawable.img_sadness_gray, + R.drawable.img_anxiety_gray + ) + ) + } + + "지루함" -> { + titleText = "지루한 감정의 일기들" + resourceIds.addAll( + listOf( + R.drawable.img_anger_gray, + R.drawable.img_happiness_gray, + R.drawable.img_boredom, + R.drawable.img_sadness_gray, + R.drawable.img_anxiety_gray + ) + ) + } + + "우울" -> { + titleText = "우울한 감정의 일기들" + resourceIds.addAll( + listOf( + R.drawable.img_anger_gray, + R.drawable.img_happiness_gray, + R.drawable.img_boredom_gray, + R.drawable.img_sadness, + R.drawable.img_anxiety_gray + ) + ) + } + + "불안" -> { + titleText = "불안한 감정의 일기들" + resourceIds.addAll( + listOf( + R.drawable.img_anger_gray, + R.drawable.img_happiness_gray, + R.drawable.img_boredom_gray, + R.drawable.img_sadness_gray, + R.drawable.img_anxiety + ) + ) + } } resourceIds.run { @@ -113,27 +183,30 @@ class EmotionSearchFragment( binding.ivEmotionSadness.setImageResource(this[3]) binding.ivEmotionAnxiety.setImageResource(this[4]) } + + binding.tvTitle.text = titleText } override fun setObserver() { super.setObserver() - viewModel.searchEmotion.observe(viewLifecycleOwner){ - if(it.isNotEmpty()){ + viewModel.searchEmotion.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { emotionSearchAdapter.submitList(emptyList()) } } - viewModel.uiState.observe(viewLifecycleOwner){ - when(it){ + viewModel.uiState.observe(viewLifecycleOwner) { + when (it) { is UiState.Loading -> {} is UiState.Failure -> { showToast("검색 실패: ${it.message}") } + is UiState.Success -> { isLoading = false - if(it.data.isEmpty()) emotionSearchAdapter.submitList(emptyList()) + if (it.data.isEmpty()) emotionSearchAdapter.submitList(emptyList()) else { val temp = emotionSearchAdapter.currentList.toMutableList() temp.addAll(it.data) diff --git a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryDayCalendarAdapter.kt b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryDayCalendarAdapter.kt index b977dc8..52bc616 100644 --- a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryDayCalendarAdapter.kt +++ b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryDayCalendarAdapter.kt @@ -3,6 +3,7 @@ package com.nabi.nabi.views.diary.view import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView @@ -40,19 +41,21 @@ class SelectDiaryDayCalendarAdapter() : ListAdapter, Se fun bind(diaryInfo: Pair) { binding.tvDay.text = diaryInfo.first + binding.tvDay.setTextColor(ContextCompat.getColor(itemView.context, R.color.black)) binding.root.isClickable = true binding.root.visibility = View.VISIBLE diaryInfo.second?.let { val resourceId = when(it.emotion){ - "행복" -> R.drawable.img_happiness - "우울" -> R.drawable.img_sadness - "화남" -> R.drawable.img_anger - "불안" -> R.drawable.img_anxiety - "지루함" -> R.drawable.img_boredom - else -> R.color.transparent + "행복" -> R.drawable.img_happiness_empty + "우울" -> R.drawable.img_sadness_empty + "화남" -> R.drawable.img_anger_empty + "불안" -> R.drawable.img_anxiety_empty + "지루함" -> R.drawable.img_boredom_empty + else -> R.drawable.img_boredom_empty_gray } binding.ivDiaryCheck.setImageResource(resourceId) + binding.tvDay.setTextColor(ContextCompat.getColor(itemView.context, R.color.white)) } itemView.setOnClickListener { diff --git a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryFragment.kt b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryFragment.kt index b79a3c3..f1bd2b2 100644 --- a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryFragment.kt +++ b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryFragment.kt @@ -31,6 +31,8 @@ class SelectDiaryFragment : BaseFragment(R.layout.fr private val minYear = 1950 private val maxYear = Calendar.getInstance().get(Calendar.YEAR) + private var lastVisibleDate: Calendar? = null + override fun initView() { calendarAdapter = SelectDiaryMonthCalendarStateAdapter(requireActivity()) binding.vpCalendarMonth.adapter = calendarAdapter @@ -44,7 +46,32 @@ class SelectDiaryFragment : BaseFragment(R.layout.fr override fun onResume() { super.onResume() - updateCurrentMonthText(binding.vpCalendarMonth.currentItem) + lastVisibleDate = getCurrentVisibleDate() + + lastVisibleDate?.let { date -> + val position = calculatePositionFromDate(date) + calendarAdapter = SelectDiaryMonthCalendarStateAdapter(requireActivity()) // Reinitialize adapter + binding.vpCalendarMonth.adapter = calendarAdapter + binding.vpCalendarMonth.setCurrentItem(position, false) + updateCurrentMonthText(position) + } ?: run { + updateCurrentMonthText(binding.vpCalendarMonth.currentItem) + } + } + + private fun getCurrentVisibleDate(): Calendar { + val calendar = Calendar.getInstance().apply { + add(Calendar.MONTH, binding.vpCalendarMonth.currentItem - (Int.MAX_VALUE / 2)) + } + return calendar + } + + private fun calculatePositionFromDate(date: Calendar): Int { + val today = Calendar.getInstance() + val currentMonthPosition = Int.MAX_VALUE / 2 + val differenceInMonths = (date.get(Calendar.YEAR) - today.get(Calendar.YEAR)) * 12 + + (date.get(Calendar.MONTH) - today.get(Calendar.MONTH)) + return currentMonthPosition + differenceInMonths } override fun initListener() { @@ -102,24 +129,18 @@ class SelectDiaryFragment : BaseFragment(R.layout.fr return createBalloon(context = requireContext()) { setHeight(42) setWidth(BalloonSizeSpec.WRAP) - setText(text) setTextSize(12f) setTextColorResource(R.color.white) setTextTypeface(ResourcesCompat.getFont(requireContext(), R.font.pretendard_semi_bold)!!) - setArrowPositionRules(ArrowPositionRules.ALIGN_BALLOON) setArrowSize(10) setArrowPosition(0.5f) - setPaddingHorizontal(8) - setCornerRadius(5f) setBackgroundColorResource(R.color.black) setBalloonAnimation(BalloonAnimation.FADE) - setBalloonHighlightAnimation(BalloonHighlightAnimation.SHAKE) - setLifecycleOwner(viewLifecycleOwner) build() } diff --git a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryMonthFragment.kt b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryMonthFragment.kt index c37a577..ab35d30 100644 --- a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryMonthFragment.kt +++ b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryMonthFragment.kt @@ -7,23 +7,21 @@ import com.nabi.domain.model.diary.DiaryInfo import com.nabi.nabi.R import com.nabi.nabi.base.BaseFragment import com.nabi.nabi.databinding.FragmentSelectDiaryMonthBinding +import com.nabi.nabi.utils.Constants.dateEnglishOnlyYearFormat +import com.nabi.nabi.utils.Constants.dateNumberOnlyMonthFormat import com.nabi.nabi.utils.LoggerUtils import com.nabi.nabi.utils.UiState import com.nabi.nabi.views.MainActivity import com.nabi.nabi.views.OnRvItemClickListener import com.nabi.nabi.views.diary.detail.DetailDiaryFragment import dagger.hilt.android.AndroidEntryPoint -import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date -import java.util.Locale @AndroidEntryPoint class SelectDiaryMonthFragment: BaseFragment(R.layout.fragment_select_diary_month) { private val viewModel: SelectDiaryViewModel by viewModels() private lateinit var dayAdapter: SelectDiaryDayCalendarAdapter - private val dateMonthFormat = SimpleDateFormat("M", Locale.ENGLISH) - private val dateYearFormat = SimpleDateFormat("yyyy", Locale.ENGLISH) private lateinit var date: Date companion object { @@ -45,6 +43,8 @@ class SelectDiaryMonthFragment: BaseFragment(R. dayAdapter = SelectDiaryDayCalendarAdapter().apply { setRvItemClickListener(object : OnRvItemClickListener { override fun onClick(item: Int) { + LoggerUtils.i("click: $item") + viewModel.isUpdateFlag = true (requireActivity() as MainActivity).replaceFragment(DetailDiaryFragment(item), true) } }) @@ -55,7 +55,14 @@ class SelectDiaryMonthFragment: BaseFragment(R. binding.rvCalendarDays.adapter = dayAdapter binding.rvCalendarDays.itemAnimator = null - viewModel.fetchData(month = dateMonthFormat.format(date.time).toInt(), year = dateYearFormat.format(date.time).toInt()) + fetchDataForMonth() + } + + private fun fetchDataForMonth() { + viewModel.fetchData( + month = dateNumberOnlyMonthFormat.format(date.time).toInt(), + year = dateEnglishOnlyYearFormat.format(date.time).toInt() + ) } private fun getDaysInMonth(date: Date): List { @@ -85,7 +92,7 @@ class SelectDiaryMonthFragment: BaseFragment(R. if (day == "previous" || day == "next") { result.add(day to null) } else { - val dayWithLeadingZero = day.padStart(2, '0') // day 앞에 0을 붙여 두 자리로 맞춤 + val dayWithLeadingZero = day.padStart(2, '0') val matchedDiaryInfo = diaryInfos.find { diaryInfo -> val entryDate = diaryInfo?.diaryEntryDate entryDate?.let { datePattern.find(it)?.groupValues?.get(1) == dayWithLeadingZero } ?: false @@ -97,12 +104,10 @@ class SelectDiaryMonthFragment: BaseFragment(R. return result } - - override fun setObserver() { super.setObserver() - viewModel.diaryState.observe(viewLifecycleOwner){ state -> + viewModel.diaryState.observe(viewLifecycleOwner) { state -> when (state) { is UiState.Loading -> {} is UiState.Failure -> { diff --git a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryViewModel.kt b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryViewModel.kt index 8b6ca56..85ed1c7 100644 --- a/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryViewModel.kt +++ b/Nabi/presentation/src/main/java/com/nabi/nabi/views/diary/view/SelectDiaryViewModel.kt @@ -18,6 +18,8 @@ class SelectDiaryViewModel @Inject constructor( private val getMonthlyDiaryUseCase: GetMonthlyDiaryUseCase, private val getAccessTokenUseCase: GetAccessTokenUseCase ) : ViewModel() { + var isUpdateFlag = false + private val _diaryState = MutableLiveData>>(UiState.Loading) val diaryState: LiveData>> get() = _diaryState diff --git a/Nabi/presentation/src/main/res/drawable/img_anger_empty.png b/Nabi/presentation/src/main/res/drawable/img_anger_empty.png new file mode 100644 index 0000000..050c856 Binary files /dev/null and b/Nabi/presentation/src/main/res/drawable/img_anger_empty.png differ diff --git a/Nabi/presentation/src/main/res/drawable/img_anxiety_empty.png b/Nabi/presentation/src/main/res/drawable/img_anxiety_empty.png new file mode 100644 index 0000000..ab35545 Binary files /dev/null and b/Nabi/presentation/src/main/res/drawable/img_anxiety_empty.png differ diff --git a/Nabi/presentation/src/main/res/drawable/img_boredom_empty.png b/Nabi/presentation/src/main/res/drawable/img_boredom_empty.png new file mode 100644 index 0000000..db0141d Binary files /dev/null and b/Nabi/presentation/src/main/res/drawable/img_boredom_empty.png differ diff --git a/Nabi/presentation/src/main/res/drawable/img_boredom_empty_gray.png b/Nabi/presentation/src/main/res/drawable/img_boredom_empty_gray.png new file mode 100644 index 0000000..8fba89f Binary files /dev/null and b/Nabi/presentation/src/main/res/drawable/img_boredom_empty_gray.png differ diff --git a/Nabi/presentation/src/main/res/drawable/img_happiness_empty.png b/Nabi/presentation/src/main/res/drawable/img_happiness_empty.png new file mode 100644 index 0000000..60599cc Binary files /dev/null and b/Nabi/presentation/src/main/res/drawable/img_happiness_empty.png differ diff --git a/Nabi/presentation/src/main/res/drawable/img_sadness_empty.png b/Nabi/presentation/src/main/res/drawable/img_sadness_empty.png new file mode 100644 index 0000000..53a1b51 Binary files /dev/null and b/Nabi/presentation/src/main/res/drawable/img_sadness_empty.png differ diff --git a/Nabi/presentation/src/main/res/layout/fragment_select_diary.xml b/Nabi/presentation/src/main/res/layout/fragment_select_diary.xml index a1c57e2..969ba4e 100644 --- a/Nabi/presentation/src/main/res/layout/fragment_select_diary.xml +++ b/Nabi/presentation/src/main/res/layout/fragment_select_diary.xml @@ -107,6 +107,7 @@ android:layout_height="match_parent" android:layout_weight="1" style="@style/weekdays_bold_10px" + android:textColor="@color/gray2" android:text="@string/text_week_sunday" android:gravity="center"/> diff --git a/Nabi/presentation/src/main/res/layout/fragment_statistics_diary.xml b/Nabi/presentation/src/main/res/layout/fragment_statistics_diary.xml index 7083314..2156434 100644 --- a/Nabi/presentation/src/main/res/layout/fragment_statistics_diary.xml +++ b/Nabi/presentation/src/main/res/layout/fragment_statistics_diary.xml @@ -239,5 +239,21 @@ android:textColor="#000000"/> + +