Skip to content
This repository has been archived by the owner on Oct 20, 2024. It is now read-only.

Commit

Permalink
๐Ÿ› ๏ธ ์ผ๊ธฐ ๋ณด๊ธฐ | ์ผ๊ธฐ ์„ ํƒ ์บ˜๋ฆฐ๋” ๋””์ž์ธ ์ˆ˜์ • (#80)
Browse files Browse the repository at this point in the history
* [feat] Add Assets | ํ‘œ์ • ์—†๋Š” ๊ณ ์–‘์ด

* [feat] ๊ฐ์ •์— ๋”ฐ๋ฅธ Title ์ˆ˜์ •

* [fix] ์บ˜๋ฆฐ๋” Week Text ์•ˆ๋ณด์ด๋Š” ๋ฌธ์ œ ์ˆ˜์ •

* [feat] ์•ˆ๋‚ด ํ…์ŠคํŠธ ์ถ”๊ฐ€

* [feat] Update Constants | DateFormat

* [feat] Update SelectDiary | ๊ฐฑ์‹  ๊ธฐ๋Šฅ
  • Loading branch information
moondev03 authored Aug 12, 2024
1 parent 82823d0 commit eae536e
Show file tree
Hide file tree
Showing 14 changed files with 169 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class EmotionSearchFragment(
private val emotion: String
): BaseFragment<FragmentEmotionSearchBinding>(R.layout.fragment_emotion_search) {
) : BaseFragment<FragmentEmotionSearchBinding>(R.layout.fragment_emotion_search) {
private val viewModel: EmotionSearchViewModel by viewModels()
private lateinit var emotionSearchAdapter: EmotionSearchAdapter
private var isLoading = false
Expand All @@ -34,16 +34,24 @@ class EmotionSearchFragment(
emotionSearchAdapter.submitList(viewModel.diaryItems.value)
}

private fun setSearchDiaryAdapter(){
private fun setSearchDiaryAdapter() {
emotionSearchAdapter = EmotionSearchAdapter().apply {
setRvItemClickListener(object : OnRvItemClickListener<Int> {
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
}

Expand All @@ -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)
}
Expand Down Expand Up @@ -94,16 +102,78 @@ class EmotionSearchFragment(
}
}

private fun setCurrentEmotion(){
private fun setCurrentEmotion() {
val resourceIds = mutableListOf<Int>()
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 {
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -40,19 +41,21 @@ class SelectDiaryDayCalendarAdapter() : ListAdapter<Pair<String, DiaryInfo?>, Se

fun bind(diaryInfo: Pair<String, DiaryInfo?>) {
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class SelectDiaryFragment : BaseFragment<FragmentSelectDiaryBinding>(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
Expand All @@ -44,7 +46,32 @@ class SelectDiaryFragment : BaseFragment<FragmentSelectDiaryBinding>(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() {
Expand Down Expand Up @@ -102,24 +129,18 @@ class SelectDiaryFragment : BaseFragment<FragmentSelectDiaryBinding>(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()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<FragmentSelectDiaryMonthBinding>(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 {
Expand All @@ -45,6 +43,8 @@ class SelectDiaryMonthFragment: BaseFragment<FragmentSelectDiaryMonthBinding>(R.
dayAdapter = SelectDiaryDayCalendarAdapter().apply {
setRvItemClickListener(object : OnRvItemClickListener<Int> {
override fun onClick(item: Int) {
LoggerUtils.i("click: $item")
viewModel.isUpdateFlag = true
(requireActivity() as MainActivity).replaceFragment(DetailDiaryFragment(item), true)
}
})
Expand All @@ -55,7 +55,14 @@ class SelectDiaryMonthFragment: BaseFragment<FragmentSelectDiaryMonthBinding>(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<String> {
Expand Down Expand Up @@ -85,7 +92,7 @@ class SelectDiaryMonthFragment: BaseFragment<FragmentSelectDiaryMonthBinding>(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
Expand All @@ -97,12 +104,10 @@ class SelectDiaryMonthFragment: BaseFragment<FragmentSelectDiaryMonthBinding>(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 -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<List<DiaryInfo>>>(UiState.Loading)
val diaryState: LiveData<UiState<List<DiaryInfo>>> get() = _diaryState

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit eae536e

Please sign in to comment.