From eae536e21ec10a4ca69190c4f01dbf42765a642f Mon Sep 17 00:00:00 2001 From: MunJangHun <105299421+moondev03@users.noreply.github.com> Date: Tue, 13 Aug 2024 05:43:55 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20=EC=9D=BC=EA=B8=B0=20?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20|=20=EC=9D=BC=EA=B8=B0=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EC=BA=98=EB=A6=B0=EB=8D=94=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20=EC=88=98=EC=A0=95=20(#80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [feat] Add Assets | 표정 없는 고양이 * [feat] 감정에 따른 Title 수정 * [fix] 캘린더 Week Text 안보이는 문제 수정 * [feat] 안내 텍스트 추가 * [feat] Update Constants | DateFormat * [feat] Update SelectDiary | 갱신 기능 --- .../java/com/nabi/nabi/utils/Constants.kt | 2 +- .../diary/emotion/EmotionSearchFragment.kt | 111 +++++++++++++++--- .../view/SelectDiaryDayCalendarAdapter.kt | 15 ++- .../views/diary/view/SelectDiaryFragment.kt | 35 ++++-- .../diary/view/SelectDiaryMonthFragment.kt | 23 ++-- .../views/diary/view/SelectDiaryViewModel.kt | 2 + .../src/main/res/drawable/img_anger_empty.png | Bin 0 -> 2579 bytes .../main/res/drawable/img_anxiety_empty.png | Bin 0 -> 3204 bytes .../main/res/drawable/img_boredom_empty.png | Bin 0 -> 2545 bytes .../res/drawable/img_boredom_empty_gray.png | Bin 0 -> 1736 bytes .../main/res/drawable/img_happiness_empty.png | Bin 0 -> 2521 bytes .../main/res/drawable/img_sadness_empty.png | Bin 0 -> 2576 bytes .../main/res/layout/fragment_select_diary.xml | 7 ++ .../res/layout/fragment_statistics_diary.xml | 16 +++ 14 files changed, 169 insertions(+), 42 deletions(-) create mode 100644 Nabi/presentation/src/main/res/drawable/img_anger_empty.png create mode 100644 Nabi/presentation/src/main/res/drawable/img_anxiety_empty.png create mode 100644 Nabi/presentation/src/main/res/drawable/img_boredom_empty.png create mode 100644 Nabi/presentation/src/main/res/drawable/img_boredom_empty_gray.png create mode 100644 Nabi/presentation/src/main/res/drawable/img_happiness_empty.png create mode 100644 Nabi/presentation/src/main/res/drawable/img_sadness_empty.png 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 0000000000000000000000000000000000000000..050c856c0ae1aff0d4512f8f652b54115f5ead7b GIT binary patch literal 2579 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 Ys&&tEZ-_`su=~MWu(UtVICnMie>X?zga7~l literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ab35545cbbbc8c3743f3ac0369726f30a6b9e9be GIT binary patch literal 3204 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..8fba89f28c1b83f47d89b3b1b5b887863dc6b00e GIT binary patch literal 1736 zcma)7Yfw^Y7^X5Q8nu}y%R;iOtQ6N9C54K#Yq?S+f?}!RwZ$+?NyDNk1;*O2T1}KP zSc?L@R4A2c&Ss{C!r2XK1TSM3GZc5#AXCykx<58|_DA2$cb<9PXPz_fd7ty0lTX|o zVh3}AK_C#jT|0M#gV;K~7ubT=%BZR`5NuL#1RMl%r(ltlHXq~*(|1xcAQ1P^={+Zl zl}Ug=Z0Wmp;3BePO~SotEB)a%8B;5_a!+?=I)>^`A0Yc)+U|;cwn@ZxSJ$t76g4#TtR3RYKhGKO{w9P{jiZXWHu;9`_n8 z&GQ^i!^+ElVeh1W@#MmtF>gxRm1-WB?0e*$ zYyZzFXagN;clEa?#Za-&m5xJltnUfiC2`Jq>hxqqr3LtFMf)*VU`1u361;Ulc?aJH zQ(n}DHsJ7)-x&^E;B_JWaVKVE%@Gu5Fv}tdo1On z%`?U%Iu#0&VxDX7I>RZo_oN9}w+i}UQVWY1^_6h|M?O^NJh8k+Mn2(-xo^JYO+!7c{RUkIzB*C!btlE|3m;We#IAs3nIN>mtL>7l_X> zuduh7z084J6eXrhJGHzn>iwrz)p28^F@&ybyfg_*vXq?^)}`TbXHtN2!YkwH(GIYQ zvq&UzEJGI(h5(=bnr`Zfw8xKGF^?00n3>sU89TQ>i{Jr0@AU}(|=X;GT+5d#>FA<_cU+vOCcBQ>G7AW|bJ0up)%oghMvlPWdz zCP)bcP*gxT5HJBkktQJUxtsYjH-G-l?7rQd-PxVlot=%hFw^G-iGlzC0JoumF6s>H z{$h?_&ZIi^7u7R3=VxFQ2mo9){)>Sn>X~I{PGBHP9|@=&5oeqkZ0_2o+5kXJGUv~S z|2j+XG1S$*8vx5)qjN+*{rO6s`|f9J5{Nk^d9*n9GT;^u-qK$_*O)IVtI;zg0L-@;SU z%QbS0%h=NQAQ#2MWXaWR*MET`r$^r+YWA{c^M(`>!^cP`a*9W}2X}m((_*h93k8Nx zwwJP_JQvx!Ty`~((_&+JpKT2V8^&7?pE;_AiWM<8RMR4@yh+P;xuH3@*?Z`smZ#^{AGK;)C%4y>!pt7^mf6 zoh|ICRX@baJA4-*F<&K{hFPLP9hxzo0Ttk$ufs4Oh^&;{Gry{w`-e7>3ool5X1i&v z$`_kE<@=bHGn`J}^EISo7k;Y9wQ2Zam`ITEnphi8Rnx=x<^b)o_IVqh@WW zQ07x66J>3t7lxCzxa)~EMq!4m&5;! zhx*zfrNjN&CI?+*#r@-`d`f`$+s1xhru#wi&MP0YY=09}n3fipEV$*`s$uM03BPe* z`?ydB$kearyLoR<)ouPnb1(fiQTI(4m-OZ58v3={vTh3I9gzwdi)zxOQU8u@S&y)v z9Vg1h(G&p|HJlsPKBd(7y3{CmU8RI{okfkK$33$Dh21?L z>7EhZ$K&U%Y}&90(($fqqU?PQR-i-zCPxB$v+X)*|E6yF)!q$U!{VU36e%W-Ia5iwn`_W}9fuAs?#TvFJv;GYWCbMHVve0hpaF@zvjVl07* zF^fHi-szco+a7uhcOr{}k6LkDrB^((TI#u}zVj#?+d?K&W60C{T!&!MNCI?WnTG9g zyrw0U!Auci5w*HZO8vh;kY|6j7^D*P)J=F96-h7B&v>*0 z;p@mT+aYUH{JhCjQ!%JuZT)6RN=z|3g4LRHo-?ABMvO!8urG%l|7f8i*6=Oujqshv zT7J)0XuepIeO=_cJ|4CsVtaWw#2$thxk7;>GfxL{?|A##4Gkm-YtQ zh3O(re^WRGZG7`GhVy-V(Dm+F&y9(!w+d`hHfKk=ZV+0(kV4o8GMS_==YKh;KO>ftq+>rfmZAcS?%GTQn!r6c6N{ne9m`N`h4<^fc$P ztO7-30?4DaJWr=%O8Zg|?z9`o3=sLpkcDbWj61i-3e}+eEpz^FhQ8Bl9VO3}ek%M_ z#b2YOVv&mh8?Z;8EIv~Hp#**RMDb&6h*`y0UdshODuitSuAweh$n4SE_Qa4+u znQ34~9{hN5O5?Yr!40iVyhxN6qz@e?Ja7oF5L%8{NwD+iO)fY|Tc@%u4&N zeEUqzMok9vk5FER>Cp)he;t_&!z7wr9TRJu^8$v@MQ*eW3FUXUtxX@T_TKi^3ZI#! zw00F92FiZ|+r^Ypk9krj3)#8#=$*|t%8 UsaFkc>|v)!ntEE8X zr$0YOq1MjotV<#{gBB4hX`?jwC1vCS(rt2A0Bgn_t6i_FpOaYe3`FBv;_DTPhTPua zqZmX7RCFNPOkEh|t%hd@gyyv{lWAvYYe+MK(^Z|qAnTgxoqmy5NhsZiRi1l>T09)5 z|2#gIOCT6oZZ_iW$RKv0y$d{QZ@C7}-j6z0oTNFSyBy7a)9Bde{(Bz<0ZmYQ{N-)n z*Qy#vCy}X@5l2-g#XbtK`gC+H&Y4bh>7CmZUJ2*hH{>mE@|_{kFw<=JBMks+GScO? z&hm!q$gNdt##r!Vb$92U?nqr9@-AOhJ4TU=N zKNR7Odq1al6{&8m*0 zU58kcYOEJngNq3L?Y-@iPTh0;0w&I>h2=WVl80-)f1ZJOD@wIw`i?H7P zO0Srtr#JuAHMuw1SYVtjHe{EQaKfx^!?36;Wpvb{?vBXKTbBT8UZJ`4-Hvl+T0`xUZfBK&U#_)N&_ctIVBFxgB1m2necpMDQ zXe&PBdwk}PO1kxufXw>Ll|oEEP+NRG>j@Zxu)>m~Gq);HBQ_pc*$g;1$z?o_o-diP zB~Gm*8Ew%BU&>{-FQMb>*wo*)J#{_DEcvLCk)tpRiG^N|e<}UNfoCYET8-5f74_A) zF#@#`EBu?ZjH_5;hDE=I3U4KF@8vK|+7E*8ZYg|YLQ9NM?KS;ic^U=q0N+94#S|wN zQg7Y^jlv@_V<;OQ7X?=_mxs{Suut-3U|(xA^rk((mq(Mlh53J652falpj6RTV68qs zFk?2h49Mizf<=SS5fo#qf^u) z!LR!lv%7h9>bqwBiQBQ^U8b>@>`SHLfCvP6xas1B(fbb;XCkgWQtL$_8iN#`Xsr;) z+Ig10GN&i3BUz-`^g2yK-iLE3_PC;=KY?^rWOJe^kA zX!6KJde|Lf=8m%mUBx}z=_^t;n|bZJnesku*~!qMQNOvUK98M&v)!|(2K z#9ub}e#Q0QV&PPU6p!ft%>Un3VHmomm!+?GgBmBK&3h0tr#Y!o4q@A;xPxx13m#O| z-@1X;lSsa^3wt)(mtzN(w^2e`k8ef)2#W0Vtp!&94Kvnz4SN)Lcg#J62@$qHL&1RM zUoESg;bIgoG2rDhoct`-VW#HXV?2A zYLzqs>E0lDn0lm)CX6yJT3bUE^YJf`Du&g&NtwxlP7Nu+)l|6ip`^|uUhT@Gu zV94fspR&-@gk-h$y@5R8wz%e=u0X`T$8Co^=6ZX0&P*}L@g4Bz$Eh*i$}cib)=K5t zA3POB`WvmGoigU3ir11#BMj%@F|2p_;Nu(biFlAC%5d}rh9oiZlI6+C0M&P;$C!Ic z?=N}S!gJ_!2N>iQAlRTHDc>o^@O+HZty;npG)M`}J*}r1G1@1K!&5>|TzSlV_|eeq zmA7TVnc#rMfqmx)815lcp3^x2g%ko`C;{RushR%g2z=RsgOGT+QTm5JJdBKs`Nn*U zFr_N@S^{^wPWK(3Xqmdh!fAa9DAVD|t3O8Ey(&Qzm~FJzmWTw=w61o`HVlel9Ceig z+UIoCbF<709Fw=e)feA=$nlGLAeuYybqo9IhpF?YTPk`DEtaSPydwNH0*OuBJgng`Pe zl@In)HtN11y(~`))t85#S@0V!;BI-XCp>s%s!)vebIH&%N-oKK_c;L&88;~cF>iQP zr%nO?(O9%(Fc{Uo>R)U#=PkE-G 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"/> + +