From 0c4a7593197a50a6e84ac49f49ee776b2ed6ed4c Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:47:50 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compileKotlin/cacheable/last-build.bin | Bin 18 -> 18 bytes .../local-state/build-history.bin | Bin 65 -> 82 bytes buildSrc/build/libs/buildSrc.jar | Bin 13958 -> 13959 bytes .../com/dpm/presentation/home/HomeActivity.kt | 5 +++++ 4 files changed, 5 insertions(+) diff --git a/buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin b/buildSrc/build/kotlin/compileKotlin/cacheable/last-build.bin index 1035ce155bf634bd75c270c776710e31f7789093..7f3e2a3504ef559981f7e0af82e71c7d81f9178e 100644 GIT binary patch literal 18 YcmZ4UmVvdLhk=1{;vCIMl?*@t05m%Uga7~l literal 18 YcmZ4UmVvdLhk=1{;`D^iZVW&G05;nM2UfwkO+0RmVi@)-*qdBRP5h}<40F}E2O#lD@ delta 20 XcmWG?@6aWAS2mlIW9kC7K3JD2g9a-jW7Y4bL_zE0^5+6g^M2 zWkpsT*-6^O359+@?S|S;%2!F6kcPI1F@~u#9+<3TS>q^{rHr2JVVPBb2rCvWfGoN*BGm8Gvs@A*tP@i_}+ovwIh~6 zpwVQE85-u1pM!)2qVO3?x@=V14A~t@Jlxxz5^b6TLM)XljjLu`Vc>W@Dt@=&2ff;f z9d-iK@p#SjJU=u;qVZbO51T{R-M;E2mMUHs(r^RtW zVNiA~H+mbDdZh)swR<|K z@>4%l@F9arkyFQiwOieOidKXw$OFeqymeZa&@IkB;!_WOX+g-dvomtI~?3O8Ui_Dk;KHk~2@Iro4G2tz4XKNpNNIazdK$a61+ECZk(K| ztG4`MVA;=q9U-%taN5@z#3rpznqDo7Rk2NU(|z(}I&aXqiVds~;wjk@9?s;d$deuC zYUI}^{7v$=rt+%zFCbeLKf9SaG9faNcR*fEEEJuY2d|<07SX>++6bU7`k0~Pw-L-Rn=(B}m@{JgfkcG7v-SWAx89736 z3CoG%L^q{hX9Tlv>1J{$1*~BmsYqv!n4)lQqxjArxVv$V(sX}vA{Y0U8~2x^mc+DQ zh=MFpo@iFVz46@Z5f@nc3(^m-@%}l=3Js$8AgRWpYT{o=B~G3yO86@3;tLpb_6YHa zCi2lj5mE*|Ht>moPw^RQvY#)Jf?BK}}mN-<7T@IO}8X0wtjmX&InCHlGXdDHO zBF9ZG@XH))9P1o={{c`-0|b+CGa9q#4k8f)31c0z4ItwY0}5juv-2@W0SO6X9a-jW z7Y4bLLo-qV%afKfK>`C4lO7WslYKN0lLa&y0pF7#G(!R=7?VL57?XW8DgwnCli(T} zlYKN0lcgOH3jhEB000000HlGKlkPMx0|{dtlOQ!40RfXdHB16!Ad`R~9Fu)C5RT9XwvNdf>XlVCO=2IVmT0000ApB?Q0 delta 1178 zcmV;L1ZDe&ZH8?PP)h>@6aWAS2msk|9I*}J3JKY899b=G0O`1s_zE0c#U;hAjgl`z;4t$S?rWf)o7=wOdj?AiSdcEp* zofF#%vq&+>JC5gsy9}v+Qn{@m16f5HS%!3Y>~Mx$W2~~xknh=H+YY$ndk22kj#vhP zMw2mSXqZQS4iXlK!e=Pyl2L9mWOpd>U~hLyv}q0qu~aHIu9|Iyf#db4_??Cy^r|Oz z*a=L><5ko1{Ll=E#;Z*~Yz|#_`>K~%s(4*U!%eJ+=2oYgi}A~UrR#)pTfrj3t-c?+ zj#oVy4XTb8+JR@fRl^e)?pQSATST{xZL6O&^Sv36CIK1lP0Gg8-+o&m4e#N774PCU zgR*0}(c7rhD?Nx}G+T%J&4VWzK7=YRaE~FgRjF0#3d(fxQ`733Jv+XLX8D6k_jFL< zr+%p5BLTWT-zBt=Zr4>n)^oui9QiP!-XP!!~%Vmj2=L<)MhE7iSd8To1_<%1(!rS=5?7mxS_v6v|U*Ev=|}?si(y^m$6> z6OoDZg054#pcgNHkr%~P>P%cv=?opW+X^h2==g_F>4yyKFNR*|3~a+2Io#>E_Wsp6 zGR*%EZkz5*vsaXA8&V8!;du3u`gDAio&_g;yZuh&gMDRru&lD`Q^f5;P3E6NQSuJe<>9~_bGg1M{ zlb16=0s<409}^stel!r11~eK0-jg9TLkJ}p002v2aCDM29+S{C1e1<58Un-`li?Z~ zlYTT1lcpUI3jhEB000000HlGJlkYSy1KDsKlOZ)50RWRdHB16zAd`V09Fu-D5R( } private fun initView() { + setLayoutBorder() initReviewDialog() initViewStatusBar() homeViewModel.getStadiums() @@ -117,6 +118,10 @@ class HomeActivity : BaseActivity( } } + private fun setLayoutBorder(){ + binding.clHomeArchiving.clipToOutline = true + binding.clHomeScrap.clipToOutline = true + } private fun initEvent() = with(binding) { clHomeArchiving.setOnClickListener { From 8c3e8da04ffc004207f263af67cbda46af37f554 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:49:27 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=ED=85=8C=EB=91=90=EB=A6=AC=20=EC=A0=81=EC=9A=A9=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=ED=98=84=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt index 24593de5..6cb7cd40 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt @@ -46,6 +46,7 @@ class ScrapRecordViewHolder( ) : RecyclerView.ViewHolder(binding.root) { fun bind(item: ResponseScrap.ResponseReviewWrapper, position: Int) = with(binding) { itemView.layoutParams.height = 193.dpToPx(itemView.context) + root.clipToOutline = true ivScrap.setOnSingleClickListener { scrapClick(item) @@ -64,7 +65,6 @@ class ScrapRecordViewHolder( ivScrapImage.loadAndClip(item.baseReview.images[0].url) tvScrapStadium.text = item.stadiumName tvScrapSeat.text = item.baseReview.formattedBaseToBlock() -// root.clipToOutline = true } } From 0924c5d484413d81f00665e02e5f53e4b02a8423 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:05:20 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9,?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=20=ED=85=8C=EB=91=90=EB=A6=AC=20=ED=85=8C?= =?UTF-8?q?=EB=91=90=EB=A6=AC=20=EB=B0=8F=20=EC=83=89=EC=83=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dpm/presentation/scrap/ScrapActivity.kt | 6 +-- .../scrap/adapter/ScrapFilterAdapter.kt | 2 + .../scrap/adapter/ScrapRecordAdapter.kt | 7 +-- .../rect_white_fill_gray200_stroke_999.xml | 10 +++++ .../src/main/res/layout/activity_scrap.xml | 43 +++++++++---------- .../src/main/res/layout/item_scrap_filter.xml | 2 +- 6 files changed, 41 insertions(+), 29 deletions(-) create mode 100644 presentation/src/main/res/drawable/rect_white_fill_gray200_stroke_999.xml diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapActivity.kt b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapActivity.kt index 30e1b7d1..ae73a4cd 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapActivity.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapActivity.kt @@ -14,7 +14,6 @@ import com.dpm.core.base.BaseActivity import com.dpm.core.state.UiState import com.dpm.designsystem.extension.dpToPx import com.dpm.presentation.extension.setOnSingleClickListener -import com.dpm.presentation.global.GlobalVariable import com.dpm.presentation.scrap.adapter.ScrapFilterAdapter import com.dpm.presentation.scrap.adapter.ScrapGridSpacingItemDecoration import com.dpm.presentation.scrap.adapter.ScrapRecordAdapter @@ -77,7 +76,7 @@ class ScrapActivity : BaseActivity( viewModel.scrap.asLiveData().observe(this) { state -> when (state) { is UiState.Success -> { - binding.tvScrapCount.text = state.data.totalScrapCount .toString() + binding.tvScrapCount.text = state.data.totalScrapCount.toString() scrapAdapter.submitList(state.data.reviews) isLoading = false setScrapScreenVisibility(ScrapScreenState.SUCCESS) @@ -120,7 +119,8 @@ class ScrapActivity : BaseActivity( binding.rvScrapRecord.itemAnimator = null binding.rvScrapRecord.addItemDecoration( ScrapGridSpacingItemDecoration( - spanCount = 2, spacing = 12.dpToPx(this), bottomSpacing = 40.dpToPx(this) + spanCount = 2, spacing = 12.dpToPx(this), bottomSpacing = 40.dpToPx(this), + borderMargin = 16.dpToPx(this) ) ) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt index 22d4f6d4..71a4596c 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt @@ -88,6 +88,7 @@ class ScrapFilterViewHolder( private val filterClick: () -> Unit, ) : RecyclerView.ViewHolder(binding.root) { fun bind() { + binding.root.clipToOutline = true binding.root.setOnClickListener { filterClick() } @@ -99,6 +100,7 @@ class ScrapFilterSelectedViewHolder( private val selectedClick: (FilterNameData) -> Unit, ) : RecyclerView.ViewHolder(binding.root) { fun bind(item: FilterNameData) = with(binding) { + root.clipToOutline = true ivClose.setOnClickListener { selectedClick(item) } tvScrapFilter.text = item.name } diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt index 6cb7cd40..bc2e2784 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapRecordAdapter.kt @@ -72,6 +72,7 @@ class ScrapGridSpacingItemDecoration( private val spanCount: Int, private val spacing: Int = 0, private val bottomSpacing: Int = 0, + private val borderMargin : Int = 0 ) : RecyclerView.ItemDecoration() { override fun getItemOffsets( outRect: Rect, @@ -89,9 +90,9 @@ class ScrapGridSpacingItemDecoration( val row = position / spanCount with(outRect) { - left = if (column == 0) 3 else spacing / 2 - right = if (column == spanCount - 1) 3 else spacing / 2 - top = if (row == 0) 3 else spacing + left = if (column == 0) borderMargin else spacing / 2 + right = if (column == spanCount - 1) borderMargin else spacing / 2 + top = if (row == 0) 6 else spacing bottom = if (row == totalRows - 1) bottomSpacing else 0 } diff --git a/presentation/src/main/res/drawable/rect_white_fill_gray200_stroke_999.xml b/presentation/src/main/res/drawable/rect_white_fill_gray200_stroke_999.xml new file mode 100644 index 00000000..bd80f776 --- /dev/null +++ b/presentation/src/main/res/drawable/rect_white_fill_gray200_stroke_999.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/layout/activity_scrap.xml b/presentation/src/main/res/layout/activity_scrap.xml index de92f3af..355cee36 100644 --- a/presentation/src/main/res/layout/activity_scrap.xml +++ b/presentation/src/main/res/layout/activity_scrap.xml @@ -76,20 +76,19 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvScrapTitle" tools:itemCount="5" - tools:listitem="@layout/item_scrap_filter_selected"/> + tools:listitem="@layout/item_scrap_filter_selected" /> - - - - - - - - - - - - - + + + + + + + + + + + + + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/presentation/src/main/res/layout/item_scrap_filter.xml b/presentation/src/main/res/layout/item_scrap_filter.xml index 183433c6..5033d14a 100644 --- a/presentation/src/main/res/layout/item_scrap_filter.xml +++ b/presentation/src/main/res/layout/item_scrap_filter.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/rect_gray200_stroke_999" + android:background="@drawable/rect_white_fill_gray200_stroke_999" android:paddingVertical="10dp" android:layout_marginEnd="8dp" android:paddingStart="12dp" From 2f5cf2ac6902265c3272b36390ea1ece54dda122 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:12:40 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[fix/#160]=20=EC=95=BC=EA=B5=AC=EC=9E=A5?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=20close=20visibility=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt index 71a4596c..d8e6cffa 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapFilterAdapter.kt @@ -2,12 +2,14 @@ package com.dpm.presentation.scrap.adapter import android.annotation.SuppressLint import android.view.LayoutInflater +import android.view.View.GONE import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.depromeet.presentation.databinding.ItemScrapFilterBinding import com.depromeet.presentation.databinding.ItemScrapFilterSelectedBinding import com.dpm.presentation.scrap.viewmodel.FilterNameData +import com.dpm.presentation.scrap.viewmodel.ScrapViewModel import com.dpm.presentation.util.ItemDiffCallback import timber.log.Timber @@ -100,6 +102,10 @@ class ScrapFilterSelectedViewHolder( private val selectedClick: (FilterNameData) -> Unit, ) : RecyclerView.ViewHolder(binding.root) { fun bind(item: FilterNameData) = with(binding) { + /** 현재 잠실야구장만 있어 임시 처리**/ + if(item.filterType == ScrapViewModel.ScrapFilterType.STADIUM){ + ivClose.visibility = GONE + } root.clipToOutline = true ivClose.setOnClickListener { selectedClick(item) } tvScrapFilter.text = item.name From c0182b6eaaadfc2aeacb513b5c39176a6d9e2a8a Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:52:25 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EC=8B=9C=20=EC=8A=A4=EB=82=B5=EB=B0=94=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/ScrapDetailPictureFragment.kt | 38 ++++++++++++---- .../scrap/adapter/ScrapDetailAdapter.kt | 45 +++++++++---------- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt index 5a8a4198..b5d35c00 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt @@ -18,6 +18,7 @@ import com.depromeet.presentation.R import com.depromeet.presentation.databinding.FragmentScrapDetailPictureBinding import com.dpm.core.base.BindingFragment import com.dpm.core.state.UiState +import com.dpm.designsystem.SpotSnackBar import com.dpm.domain.entity.response.home.ResponseScrap import com.dpm.presentation.scheme.SchemeKey import com.dpm.presentation.scrap.adapter.ScrapDetailAdapter @@ -84,8 +85,25 @@ class ScrapDetailPictureFragment : BindingFragment + viewModel.updateScrap(id) + if (isScrap) { + SpotSnackBar.make( + view = binding.root, + message = "스크랩이 해제되었어요!", + marginBottom = 20, + onClick = {}, + ).show() + } else { + SpotSnackBar.make( + view = binding.root, + message = "스크랩이 완료되었어요!", + endMessage = "스크랩으로 이동", + marginBottom = 20, + ) { + finishFragment() + }.show() + } }, likeClick = { viewModel.updateLike(it) @@ -141,12 +159,7 @@ class ScrapDetailPictureFragment : BindingFragment Unit, + private val scrapClick: (Int, Boolean) -> Unit, private val likeClick: (Int) -> Unit, private val shareClick: (ResponseScrap.ResponseBaseReview, Int) -> Unit, ) : ListAdapter( @@ -53,7 +53,7 @@ class ScrapDetailAdapter( class ScrapDetailViewHolder( private val binding: ItemScrapDetailBinding, - private val scrapClick: (Int) -> Unit, + private val scrapClick: (Int, Boolean) -> Unit, private val likeClick: (Int) -> Unit, private val shareClick: (ResponseScrap.ResponseBaseReview, Int) -> Unit, ) : RecyclerView.ViewHolder(binding.root) { @@ -167,7 +167,7 @@ class ScrapDetailViewHolder( } ivScrap.setOnSingleClickListener { - scrapClick(item.id) + scrapClick(item.id, item.isScrapped) } ivShare.setOnSingleClickListener { shareClick(item, binding.vpImage.currentItem) @@ -199,31 +199,26 @@ class ScrapDetailViewHolder( binding.llIndicator.removeAllViews() val context = binding.root.context - if (count < 2) { - binding.llIndicator.visibility = GONE - } else { - binding.llIndicator.visibility = VISIBLE - for (i in 0 until count) { - val indicator = ImageView(context).apply { - layoutParams = LinearLayout.LayoutParams( - 6.dpToPx(context), 6.dpToPx(context) - ).apply { - setMargins(2.dpToPx(context), 0, 2.dpToPx(context), 0) - } - scaleType = ImageView.ScaleType.FIT_XY - setImageDrawable( - ContextCompat.getDrawable( - context, - R.drawable.indicator_unselected - ) - ) + for (i in 0 until count) { + val indicator = ImageView(context).apply { + layoutParams = LinearLayout.LayoutParams( + 6.dpToPx(context), 6.dpToPx(context) + ).apply { + setMargins(2.dpToPx(context), 0, 2.dpToPx(context), 0) } - indicators.add(indicator) - binding.llIndicator.addView(indicator) + scaleType = ImageView.ScaleType.FIT_XY + setImageDrawable( + ContextCompat.getDrawable( + context, + R.drawable.indicator_unselected + ) + ) } - - updateIndicators(0) + indicators.add(indicator) + binding.llIndicator.addView(indicator) } + + updateIndicators(0) } private fun updateIndicators(selectedPosition: Int) { From 9b2cff512582c4023eaeaeed3c2be5eca67591c4 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:07:22 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[fix/#160]=20=EC=A2=8C=EC=84=9D=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EA=B7=9C=EC=B9=99=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/response/home/ResponseScrap.kt | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt b/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt index c7534582..bf8a329b 100644 --- a/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt +++ b/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt @@ -8,7 +8,7 @@ data class ResponseScrap( val nextCursor: String? = null, val hasNext: Boolean = false, val totalScrapCount: Int = 0, - val filter: ResponseFilter, + val filter: ResponseFilter = ResponseFilter(), ) { data class ResponseReviewWrapper( val baseReview: ResponseBaseReview, @@ -35,8 +35,13 @@ data class ResponseScrap( val isLiked: Boolean = false, val isScrapped: Boolean = false, ) { + /** + * @param + * formatted는 띄워쓰기 x parameter들은 띄워쓰기 o 일괄 적용 + * 띄워쓰기가 모두 적용되어있기 때문에 마지막에 trim 일괄 적용 + */ fun formattedStadiumToSection() : String = - "${stadium.name} ${formattedBaseName()} ${formattedSectionName()}".trim() + "${stadium.name} ${formattedBaseName()}${formattedSectionName()}".trim() fun formattedBlockToSeat(): String = if (seat != null) { @@ -51,11 +56,9 @@ data class ResponseScrap( BASE.Base3 -> "3루 " else -> "" } - val section = section.name - val block = "${row.number}열 " val seat = if(seat == null) "" else "${seat.seatNumber}번 " - return "${stadium.name}$base$section$block$seat".trim() + return "${stadium.name} ${formattedBaseName()}${formattedSectionName()}${formattedBlockName()}$seat".trim() } fun formattedBaseToBlock() : String = @@ -79,7 +82,11 @@ data class ResponseScrap( section.name.trim() } return when(block.code){ - in listOf("101w", "102w", "122w", "121w", "109w", "114w","exciting1","exciting3","premium") -> "" + in listOf("101w", "102w", "122w", "121w") -> "휠체어석-레드" + in listOf("109w", "114w") -> "휠체어석-블루" + in listOf("exciting1") -> "1루 익사이팅석 " + in listOf("exciting3") -> "3루 익사이팅석 " + in listOf("premium") -> "프리미엄석 " else -> "$section " } } @@ -87,10 +94,8 @@ data class ResponseScrap( private fun formattedBlockName() = when(stadium.id) { 1 -> { when(block.code) { - in listOf("101w", "102w", "122w", "121w", "109w", "114w") -> "휠체어석 ${block.code.replace("w", "")}블록 " - in listOf("exciting1") -> "1루 익사이팅석 " - in listOf("exciting3") -> "3루 익사이팅석 " - in listOf("premium") -> "프리미엄석 " + in listOf("101w", "102w", "122w", "121w", "109w", "114w") -> "${block.code.replace("w", "")}블록 " + in listOf("exciting1","exciting3","premium") -> "" else -> "${block.code}블록 " } } From ab6657af27c263b04ea115fd653c6c1cc5b7cad5 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:35:19 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9,?= =?UTF-8?q?=EC=8B=9C=EC=95=BC=20=EC=95=84=EC=B9=B4=EC=9D=B4=EB=B9=99=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EA=B7=9C=EC=B9=99=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/response/home/ResponseMySeatRecord.kt | 14 +++----------- .../domain/entity/response/home/ResponseScrap.kt | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseMySeatRecord.kt b/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseMySeatRecord.kt index 782fb601..2de09fb4 100644 --- a/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseMySeatRecord.kt +++ b/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseMySeatRecord.kt @@ -40,16 +40,7 @@ data class ResponseMySeatRecord( } fun kakaoShareSeatFeedTitle() : String { - val base = when(stadiumName.base(blockCode)) { - BASE.Base1 -> "1루 " - BASE.Base3 -> "3루 " - else -> "" - } - val section = sectionName - val block = "${rowNumber} 열 " - val seat = if(seatNumber == null) "" else "${seatNumber}번 " - - return "$stadiumName $base $section $block $seat".trim() + return "$stadiumName ${formattedBaseName()}${formattedSectionName()}${formattedBlockName()}${formattedRowNumber()}${formattedSeatNumber()}".trim() } private fun formattedBaseName(): String { @@ -77,7 +68,8 @@ data class ResponseMySeatRecord( private fun formattedBlockName() = when(stadiumId) { 1 -> { when(blockCode) { - in listOf("101w", "102w", "122w", "121w", "109w", "114w") -> "휠체어석 ${blockCode.replace("w", "")}블록 " + in listOf("101w", "102w", "122w", "121w") -> "휠체어석-레드 ${blockCode.replace("w", "")}블록" + in listOf("109w", "114w") -> "휠체어석-블루 ${blockCode.replace("w", "")}블록" in listOf("exciting1") -> "1루 익사이팅석 " in listOf("exciting3") -> "3루 익사이팅석 " in listOf("premium") -> "프리미엄석 " diff --git a/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt b/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt index bf8a329b..a65f1fb3 100644 --- a/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt +++ b/domain/src/main/java/com/dpm/domain/entity/response/home/ResponseScrap.kt @@ -58,7 +58,7 @@ data class ResponseScrap( } val seat = if(seat == null) "" else "${seat.seatNumber}번 " - return "${stadium.name} ${formattedBaseName()}${formattedSectionName()}${formattedBlockName()}$seat".trim() + return "${stadium.name} ${formattedBaseName()}${formattedSectionName()}${formattedBlockToSeat()}".trim() } fun formattedBaseToBlock() : String = From 4fd3331ed465ca2b18d46e50dd3cb4682996022c Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:38:27 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[fix/#160]=20=EC=82=AC=EC=A7=84=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=20=EC=98=A4=EB=A5=98=20=ED=98=84=EC=83=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(=EB=B7=B0=ED=8E=98=EC=9D=B4=EC=A0=80,?= =?UTF-8?q?=EB=B0=B0=EA=B2=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/adapter/ScrapDetailAdapter.kt | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt index 5a66d67b..f9b902a7 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt @@ -1,7 +1,5 @@ package com.dpm.presentation.scrap.adapter -import android.animation.Animator -import android.animation.AnimatorListenerAdapter import android.view.LayoutInflater import android.view.View.GONE import android.view.View.INVISIBLE @@ -75,7 +73,6 @@ class ScrapDetailViewHolder( } initScrapImageAdapter(item) - cvScrapKeyword.apply { setContent { MaterialTheme { @@ -118,7 +115,7 @@ class ScrapDetailViewHolder( } tvScrapContent.post { if (tvScrapContent.layout != null) { - if (!(tvScrapContent.layout.getEllipsisCount(0) > 0)) { + if (tvScrapContent.layout.getEllipsisCount(0) <= 0) { tvMore.visibility = INVISIBLE } } @@ -154,17 +151,20 @@ class ScrapDetailViewHolder( ivLike.setOnSingleClickListener { if (!item.isLiked) { lottieLike.playAnimation() - ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_active) - lottieLike.addAnimatorListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { - super.onAnimationEnd(animation, isReverse) - likeClick(item.id) - } - }) - } else { - likeClick(item.id) } - + likeClick(item.id) +// if (!item.isLiked) { +// lottieLike.playAnimation() +// ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_active) +// lottieLike.addAnimatorListener(object : AnimatorListenerAdapter() { +// override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { +// super.onAnimationEnd(animation, isReverse) +// likeClick(item.id) +// } +// }) +// } else { +// likeClick(item.id) +// } } ivScrap.setOnSingleClickListener { scrapClick(item.id, item.isScrapped) @@ -178,20 +178,21 @@ class ScrapDetailViewHolder( if (!::scrapImageAdapter.isInitialized) { scrapImageAdapter = ScrapImageAdapter() binding.vpImage.adapter = scrapImageAdapter - scrapImageAdapter.submitList(item.images.map { it.url }) - setupIndicators(scrapImageAdapter.itemCount) - binding.vpImage.registerOnPageChangeCallback(object : - ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - updateIndicators(position) - if (position >= 0 && position < item.images.size) { - binding.ivBackground.loadAndClip(item.images[position].url) - } else { - binding.ivBackground.loadAndClip(item.images[0].url) - } - } - }) } + + scrapImageAdapter.submitList(item.images.map { it.url }) + setupIndicators(scrapImageAdapter.itemCount) + binding.vpImage.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + updateIndicators(position) + if (position >= 0 && position < item.images.size) { + binding.ivBackground.loadAndClip(item.images[position].url) + } else { + binding.ivBackground.loadAndClip(item.images[0].url) + } + } + }) } private fun setupIndicators(count: Int) { From a3c7ecda95485a6ea36e929bc2a8ec7e2490801e Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:04:23 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9,?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=9E=A9=20=EC=83=81=EC=84=B8=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EB=8F=99?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/ScrapDetailPictureFragment.kt | 32 ++++-------- .../scrap/adapter/ScrapDetailAdapter.kt | 23 +++++---- .../scrap/adapter/ScrapRecordAdapter.kt | 1 + .../scrap/viewmodel/ScrapViewModel.kt | 49 ++++++++++++++++--- 4 files changed, 66 insertions(+), 39 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt index b5d35c00..d96312d3 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt @@ -52,6 +52,7 @@ class ScrapDetailPictureFragment : BindingFragment - when (state) { - is UiState.Success -> { - adapter.submitList(state.data.reviews.map { it.baseReview }.toList()) - binding.vpScrap.post { - binding.vpScrap.setCurrentItem(viewModel.currentPage.value, false) - } - isLoading = false - } - - else -> {} - } + viewModel.detailScrap.asLiveData().observe(viewLifecycleOwner) { data -> + adapter.submitList(data.map { it.baseReview }.toList()) + binding.vpScrap.setCurrentItem(viewModel.currentPage.value, false) + isLoading = false } } @@ -101,7 +94,7 @@ class ScrapDetailPictureFragment : BindingFragment= adapter.itemCount - 2 && (viewModel.scrap.value as UiState.Success).data.hasNext) { isLoading = true viewModel.getNextScrapRecord() @@ -147,6 +140,7 @@ class ScrapDetailPictureFragment : BindingFragment>(UiState.Loading) val scrap = _scrap.asStateFlow() + private val _detailScrap = MutableStateFlow>(emptyList()) + val detailScrap = _detailScrap.asStateFlow() + private val _filter = MutableStateFlow>(emptyList()) val filter = _filter.asStateFlow() @@ -82,6 +85,7 @@ class ScrapViewModel @Inject constructor( ).onSuccess { data -> if (data.reviews.isNotEmpty()) { _scrap.value = UiState.Success(data) + _detailScrap.value = data.reviews } else { _scrap.value = UiState.Empty } @@ -91,12 +95,28 @@ class ScrapViewModel @Inject constructor( } } + fun getDetailScrap() { + _detailScrap.value = (_scrap.value as UiState.Success).data.reviews + } + fun reloadScrap() { if(GlobalVariable.isScrap && _scrap.value is UiState.Empty) { getScrapRecord() } } + fun updateScrapRecord() { + val currentState = (_scrap.value as UiState.Success).data + if(_detailScrap.value.count { it.baseReview.isScrapped } == 0){ + _scrap.value = UiState.Empty + }else{ + _scrap.value = UiState.Success(currentState.copy( + reviews = _detailScrap.value.filter { it.baseReview.isScrapped } + )) + } + } + + fun getNextScrapRecord() { viewModelScope.launch { homeRepository.getScrap( @@ -122,6 +142,8 @@ class ScrapViewModel @Inject constructor( filter = it.filter ) _scrap.value = UiState.Success(updatedScrap) + val currentDetailScrap = _detailScrap.value + _detailScrap.value = currentDetailScrap + it.reviews }.onFailure {} } } @@ -211,7 +233,23 @@ class ScrapViewModel @Inject constructor( review } } - + val updatedDetailList = detailScrap.value.map { review -> + if(review.baseReview.id == id){ + review.copy( + baseReview = review.baseReview.copy( + isLiked = !review.baseReview.isLiked, + likesCount = if (review.baseReview.isLiked) { + review.baseReview.likesCount - 1 + } else { + review.baseReview.likesCount + 1 + } + ) + ) + } else { + review + } + } + _detailScrap.value = updatedDetailList _scrap.value = UiState.Success( data = currentState.copy(reviews = updatedList) ) @@ -226,8 +264,9 @@ class ScrapViewModel @Inject constructor( viewModelScope.launch { viewfinderRepository.updateScrap(id).onSuccess { val currentState = (_scrap.value as UiState.Success).data - val updatedList = currentState.reviews.map { review -> - if (review.baseReview.id == id) { + _scrap.value = UiState.Success(currentState.copy(reviews = currentState.reviews.filter { it.baseReview.id != id })) + val detailScrapUpdatedList = detailScrap.value.map { review -> + if(review.baseReview.id == id){ review.copy( baseReview = review.baseReview.copy( isScrapped = !review.baseReview.isScrapped @@ -237,9 +276,7 @@ class ScrapViewModel @Inject constructor( review } } - _scrap.value = UiState.Success( - data = currentState.copy(reviews = updatedList) - ) + _detailScrap.value = detailScrapUpdatedList }.onFailure { Timber.d("test 스크랩 업데이트 실패 $it") } From a9b50290b44b4a596c6146e04b175e6634882945 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:05:39 +0900 Subject: [PATCH 10/14] =?UTF-8?q?[fix/#160]=20onDestroyView=20=EC=8A=A4?= =?UTF-8?q?=EB=82=B5=EB=B0=94=20=EC=82=AD=EC=A0=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/scrap/ScrapDetailPictureFragment.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt index d96312d3..a5ddcae5 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt @@ -41,6 +41,7 @@ class ScrapDetailPictureFragment : BindingFragment viewModel.updateScrap(id) if (isScrap) { - SpotSnackBar.make( + snackbar = SpotSnackBar.make( view = binding.root, message = "스크랩이 해제되었어요!", marginBottom = 20, onClick = {}, - ).show() + ) } else { - SpotSnackBar.make( + snackbar = SpotSnackBar.make( view = binding.root, message = "스크랩이 완료되었어요!", endMessage = "스크랩으로 이동", marginBottom = 20, ) { removeFragment() - }.show() + } } + snackbar?.show() }, likeClick = { viewModel.updateLike(it) @@ -112,6 +114,8 @@ class ScrapDetailPictureFragment : BindingFragment Date: Thu, 29 Aug 2024 20:27:23 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[fix/#160]=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=20=ED=81=B4=EB=A6=AD=EC=8B=9C=20=EC=A6=89=EA=B0=81=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0(=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EB=81=8A=EA=B8=B0=EB=8A=94=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/adapter/ScrapDetailAdapter.kt | 8 +-- .../seatrecord/adapter/MonthRecordAdapter.kt | 54 +++++++------------ .../seatrecord/adapter/RecentRecordAdapter.kt | 16 +++--- 3 files changed, 30 insertions(+), 48 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt index bc1e72db..3a92eafc 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt @@ -102,14 +102,10 @@ class ScrapDetailViewHolder( if (item.isLiked) { - ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_active){ - crossfade(true) - } + ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_active) tvLikeCount.setTextColor(binding.root.context.getColor(com.depromeet.designsystem.R.color.color_action_enabled)) } else { - ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_inactive){ - crossfade(true) - } + ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_inactive) tvLikeCount.setTextColor(binding.root.context.getColor(com.depromeet.designsystem.R.color.color_foreground_white)) } diff --git a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt index b522d833..fd59801e 100644 --- a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt @@ -2,14 +2,12 @@ package com.dpm.presentation.seatrecord.adapter import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView -import com.dpm.domain.entity.response.home.ResponseMySeatRecord import com.depromeet.presentation.databinding.ItemRecentMonthBinding +import com.dpm.domain.entity.response.home.ResponseMySeatRecord import com.dpm.presentation.seatrecord.uiMapper.MonthReviewData import com.dpm.presentation.util.ItemDiffCallback -import timber.log.Timber class MonthRecordAdapter() : @@ -49,49 +47,37 @@ class MonthRecordViewHolder( private val itemRecordClickListener: MonthRecordAdapter.OnItemRecordClickListener?, ) : RecyclerView.ViewHolder(binding.root) { - private lateinit var adapter: RecentRecordAdapter + private lateinit var adapter : RecentRecordAdapter fun bind(item: MonthReviewData) { with(binding) { - initReviewAdapter() + initReviewAdapter(item) "${item.month}월".also { tvRecentMonth.text = it } - adapter.submitList(item.reviews) } } - private fun initReviewAdapter() { - adapter = RecentRecordAdapter() - binding.rvRecentPost.adapter = adapter - adapter.itemRecordClickListener = - object : RecentRecordAdapter.OnItemRecordClickListener { - override fun onItemRecordClick(item: ResponseMySeatRecord.ReviewResponse) { - itemRecordClickListener?.onItemRecordClick(item) - } - - override fun onItemMoreClick(item: ResponseMySeatRecord.ReviewResponse) { - itemRecordClickListener?.onMoreRecordClick(item.id) - } - - override fun onLikeClick(reviewId: Int) { - itemRecordClickListener?.onLikeClick(reviewId) - } + private fun initReviewAdapter(item : MonthReviewData) { + adapter = RecentRecordAdapter() + binding.rvRecentPost.adapter = adapter + adapter.submitList(item.reviews.toList()) + adapter.itemRecordClickListener = + object : RecentRecordAdapter.OnItemRecordClickListener { + override fun onItemRecordClick(item: ResponseMySeatRecord.ReviewResponse) { + itemRecordClickListener?.onItemRecordClick(item) + } - override fun onScrapClick(reviewId: Int) { - itemRecordClickListener?.onScrapClick(reviewId) - } + override fun onItemMoreClick(item: ResponseMySeatRecord.ReviewResponse) { + itemRecordClickListener?.onMoreRecordClick(item.id) } - binding.rvRecentPost.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - val scrollBottom = !binding.rvRecentPost.canScrollVertically(1) - val layoutManager = binding.rvRecentPost.layoutManager as LinearLayoutManager - val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() - val itemCount = layoutManager.itemCount - 1 + override fun onLikeClick(reviewId: Int) { + itemRecordClickListener?.onLikeClick(reviewId) + } - Timber.d("test scroll $scrollBottom / $lastVisibleItemPosition / $itemCount") + override fun onScrapClick(reviewId: Int) { + itemRecordClickListener?.onScrapClick(reviewId) } - }) + } } } \ No newline at end of file diff --git a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt index 0f3e5376..51681a32 100644 --- a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt @@ -21,6 +21,7 @@ import com.dpm.presentation.seatrecord.uiMapper.toUiKeyword import com.dpm.presentation.util.CalendarUtil import com.dpm.presentation.util.ItemDiffCallback import com.dpm.presentation.viewfinder.compose.KeywordFlowRow +import timber.log.Timber class RecentRecordAdapter( ) : ListAdapter( @@ -63,15 +64,8 @@ class RecentRecordAdapter( binding.ivRecordLike.setOnSingleClickListener { if (!getItem(position).isLiked) { binding.lottieLike.playAnimation() - binding.lottieLike.addAnimatorListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - super.onAnimationEnd(animation) - itemRecordClickListener?.onLikeClick(getItem(position).id) - } - }) - } else { - itemRecordClickListener?.onLikeClick(getItem(position).id) } + itemRecordClickListener?.onLikeClick(getItem(position).id) } } @@ -113,6 +107,12 @@ class RecentRecordViewHolder( tvRecordScrapCount.text = item.scrapsCount.toString() if (item.isScrapped) { ivRecordScrap.load(com.depromeet.designsystem.R.drawable.ic_scrap_active) + ivRecordScrap.setColorFilter( + ContextCompat.getColor( + binding.root.context, + com.depromeet.designsystem.R.color.color_action_enabled + ) + ) } else { ivRecordScrap.load(com.depromeet.designsystem.R.drawable.ic_scrap_inactive) ivRecordScrap.setColorFilter( From 8070d531431ad73dcd6e1b0e046bf00ef5c595e3 Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 21:07:02 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[fix/#160]=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=20=EA=B0=B1=EC=8B=A0=EC=8B=9C=20=EC=95=A0=EB=8B=88=EB=A9=94?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=81=8A=EA=B8=B0=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/ScrapDetailPictureFragment.kt | 5 +++++ .../scrap/adapter/ScrapDetailAdapter.kt | 20 ++++++------------- .../seatrecord/SeatRecordActivity.kt | 3 +++ .../seatrecord/adapter/MonthRecordAdapter.kt | 9 +++++++-- .../seatrecord/adapter/RecentRecordAdapter.kt | 3 --- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt index a5ddcae5..660f828c 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt @@ -13,6 +13,8 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit import androidx.lifecycle.asLiveData +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SimpleItemAnimator import androidx.viewpager2.widget.ViewPager2 import com.depromeet.presentation.R import com.depromeet.presentation.databinding.FragmentScrapDetailPictureBinding @@ -108,6 +110,9 @@ class ScrapDetailPictureFragment : BindingFragment Unit, ) : ListAdapter( ItemDiffCallback( - onItemsTheSame = { oldItem, newItem -> oldItem.id == newItem.id }, - onContentsTheSame = { oldItem, newItem -> oldItem == newItem } + onItemsTheSame = { oldItem, newItem -> + oldItem.id == newItem.id + }, + onContentsTheSame = { oldItem, newItem -> + oldItem == newItem + } ) ) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScrapDetailViewHolder { @@ -152,18 +156,6 @@ class ScrapDetailViewHolder( lottieLike.playAnimation() } likeClick(item.id) -// if (!item.isLiked) { -// lottieLike.playAnimation() -// ivLike.load(com.depromeet.designsystem.R.drawable.ic_like_active) -// lottieLike.addAnimatorListener(object : AnimatorListenerAdapter() { -// override fun onAnimationEnd(animation: Animator, isReverse: Boolean) { -// super.onAnimationEnd(animation, isReverse) -// likeClick(item.id) -// } -// }) -// } else { -// likeClick(item.id) -// } } ivScrap.setOnSingleClickListener { scrapClick(item.id, item.isScrapped) diff --git a/presentation/src/main/java/com/dpm/presentation/seatrecord/SeatRecordActivity.kt b/presentation/src/main/java/com/dpm/presentation/seatrecord/SeatRecordActivity.kt index 8856e5b1..6cb466b5 100644 --- a/presentation/src/main/java/com/dpm/presentation/seatrecord/SeatRecordActivity.kt +++ b/presentation/src/main/java/com/dpm/presentation/seatrecord/SeatRecordActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.viewModels import androidx.core.widget.NestedScrollView import androidx.fragment.app.commit import androidx.lifecycle.asLiveData +import androidx.recyclerview.widget.SimpleItemAnimator import com.depromeet.presentation.R import com.depromeet.presentation.databinding.ActivitySeatRecordBinding import com.dpm.core.base.BaseActivity @@ -545,8 +546,10 @@ class SeatRecordActivity : BaseActivity( private fun initReviewList() { monthSeatReviewAdapter = MonthRecordAdapter() binding.rvSeatReview.adapter = monthSeatReviewAdapter +// (binding.rvSeatReview.itemAnimator as? SimpleItemAnimator)?.supportsChangeAnimations = false binding.rvSeatReview.itemAnimator = null + monthSeatReviewAdapter.itemRecordClickListener = object : MonthRecordAdapter.OnItemRecordClickListener { diff --git a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt index fd59801e..3a1e3785 100644 --- a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/MonthRecordAdapter.kt @@ -4,6 +4,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.SimpleItemAnimator import com.depromeet.presentation.databinding.ItemRecentMonthBinding import com.dpm.domain.entity.response.home.ResponseMySeatRecord import com.dpm.presentation.seatrecord.uiMapper.MonthReviewData @@ -58,8 +59,12 @@ class MonthRecordViewHolder( private fun initReviewAdapter(item : MonthReviewData) { - adapter = RecentRecordAdapter() - binding.rvRecentPost.adapter = adapter + if(!::adapter.isInitialized){ + adapter = RecentRecordAdapter() + binding.rvRecentPost.adapter = adapter + (binding.rvRecentPost.itemAnimator as? SimpleItemAnimator)?.supportsChangeAnimations = false + binding.rvRecentPost.itemAnimator = null + } adapter.submitList(item.reviews.toList()) adapter.itemRecordClickListener = object : RecentRecordAdapter.OnItemRecordClickListener { diff --git a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt index 51681a32..6ce74fcb 100644 --- a/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/seatrecord/adapter/RecentRecordAdapter.kt @@ -1,7 +1,5 @@ package com.dpm.presentation.seatrecord.adapter -import android.animation.Animator -import android.animation.AnimatorListenerAdapter import android.view.LayoutInflater import android.view.View.GONE import android.view.ViewGroup @@ -21,7 +19,6 @@ import com.dpm.presentation.seatrecord.uiMapper.toUiKeyword import com.dpm.presentation.util.CalendarUtil import com.dpm.presentation.util.ItemDiffCallback import com.dpm.presentation.viewfinder.compose.KeywordFlowRow -import timber.log.Timber class RecentRecordAdapter( ) : ListAdapter( From be41c0e87a331bec50b1c9aaed26aba97deda3fc Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Thu, 29 Aug 2024 23:35:48 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[fix/#160]=20=EC=8A=A4=ED=81=AC=EB=9E=A9?= =?UTF-8?q?=20=EB=AA=A8=EB=91=90=20=EC=82=AD=EC=A0=9C=EC=8B=9C=20empty=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=95=88=EB=B3=B4=EC=9D=B4=EB=8A=94=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/viewmodel/ScrapViewModel.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt b/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt index 4716687c..8a27b91c 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import com.dpm.core.state.UiState import com.dpm.domain.entity.request.home.RequestScrap import com.dpm.domain.entity.response.home.ResponseScrap +import com.dpm.domain.preference.SharedPreference import com.dpm.domain.repository.HomeRepository import com.dpm.domain.repository.ViewfinderRepository import com.dpm.presentation.global.GlobalVariable @@ -41,6 +42,7 @@ data class BadReviewData( class ScrapViewModel @Inject constructor( private val homeRepository: HomeRepository, private val viewfinderRepository: ViewfinderRepository, + private val sharedPreference: SharedPreference ) : ViewModel() { private var monthsSelected: List = emptyList() @@ -95,6 +97,10 @@ class ScrapViewModel @Inject constructor( } } + fun updateIsFirstShare(isFirstShare : Boolean) { + sharedPreference.isFirstShare = isFirstShare + } + fun getDetailScrap() { _detailScrap.value = (_scrap.value as UiState.Success).data.reviews } @@ -106,10 +112,10 @@ class ScrapViewModel @Inject constructor( } fun updateScrapRecord() { - val currentState = (_scrap.value as UiState.Success).data if(_detailScrap.value.count { it.baseReview.isScrapped } == 0){ _scrap.value = UiState.Empty }else{ + val currentState = (_scrap.value as UiState.Success).data _scrap.value = UiState.Success(currentState.copy( reviews = _detailScrap.value.filter { it.baseReview.isScrapped } )) @@ -264,7 +270,12 @@ class ScrapViewModel @Inject constructor( viewModelScope.launch { viewfinderRepository.updateScrap(id).onSuccess { val currentState = (_scrap.value as UiState.Success).data - _scrap.value = UiState.Success(currentState.copy(reviews = currentState.reviews.filter { it.baseReview.id != id })) + val updatedList = currentState.reviews.filter { it.baseReview.id != id } + _scrap.value = if(updatedList.isEmpty()){ + UiState.Empty + }else { + UiState.Success(currentState.copy(reviews = currentState.reviews.filter { it.baseReview.id != id })) + } val detailScrapUpdatedList = detailScrap.value.map { review -> if(review.baseReview.id == id){ review.copy( From 83d0bf01c7ee98c22bc3d41adad5331e78d483da Mon Sep 17 00:00:00 2001 From: BENDENG1 <76191161+BENDENG1@users.noreply.github.com> Date: Fri, 30 Aug 2024 00:14:55 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[fix/#160]=20=ED=88=B4=ED=8C=81=20?= =?UTF-8?q?=EC=95=A0=EB=8B=88=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=8A=A4=EB=82=B5=EB=B0=94=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scrap/ScrapDetailPictureFragment.kt | 68 +++++++++++++++++++ .../scrap/adapter/ScrapDetailAdapter.kt | 3 +- .../scrap/viewmodel/ScrapViewModel.kt | 9 +++ .../res/drawable/rect_gray800_fill_60.xml | 6 ++ .../layout/fragment_scrap_detail_picture.xml | 22 +++++- .../src/main/res/layout/item_scrap_detail.xml | 21 +++++- 6 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 presentation/src/main/res/drawable/rect_gray800_fill_60.xml diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt index 660f828c..7ac908f7 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/ScrapDetailPictureFragment.kt @@ -2,7 +2,11 @@ package com.dpm.presentation.scrap import android.os.Bundle import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.ScaleAnimation import androidx.activity.OnBackPressedCallback import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat @@ -24,6 +28,7 @@ import com.dpm.designsystem.SpotSnackBar import com.dpm.domain.entity.response.home.ResponseScrap import com.dpm.presentation.scheme.SchemeKey import com.dpm.presentation.scrap.adapter.ScrapDetailAdapter +import com.dpm.presentation.scrap.adapter.ScrapDetailViewHolder import com.dpm.presentation.scrap.viewmodel.ScrapViewModel import com.dpm.presentation.util.KakaoUtils import com.dpm.presentation.util.Utils @@ -45,6 +50,7 @@ class ScrapDetailPictureFragment : BindingFragment + if (!isFirstLike) { + hideLikeDescriptionView() + } + } } private fun initViewPager() { @@ -87,6 +99,7 @@ class ScrapDetailPictureFragment : BindingFragment requireContext().startActivity(sharingIntent) + viewModel.updateIsFirstShare(true) }, onFailure = { Timber.d("링크 공유 실패 : ${it.message}") diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt index adaff7af..d43ba542 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/adapter/ScrapDetailAdapter.kt @@ -54,7 +54,7 @@ class ScrapDetailAdapter( } class ScrapDetailViewHolder( - private val binding: ItemScrapDetailBinding, + internal val binding: ItemScrapDetailBinding, private val scrapClick: (Int, Boolean) -> Unit, private val likeClick: (Int) -> Unit, private val shareClick: (ResponseScrap.ResponseBaseReview, Int) -> Unit, @@ -70,6 +70,7 @@ class ScrapDetailViewHolder( tvScrapLevel.text = item.member.formattedLevel() tvSectionName.text = item.formattedBlockToSeat() tvLikeCount.text = item.likesCount.toString() + binding.csbvLikeDescription.setTextPart("유용했다면,","도움돼요","를 눌러주세요!") if (item.content.isNotEmpty()) { tvScrapContent.text = item.content } else { diff --git a/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt b/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt index 8a27b91c..d1cd0b0d 100644 --- a/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt +++ b/presentation/src/main/java/com/dpm/presentation/scrap/viewmodel/ScrapViewModel.kt @@ -71,6 +71,9 @@ class ScrapViewModel @Inject constructor( private val _currentPage = MutableStateFlow(0) val currentPage = _currentPage.asStateFlow() + private val _isFirstLike = MutableStateFlow(sharedPreference.isFirstLike) + val isFirstLike = _isFirstLike.asStateFlow() + fun getScrapRecord() { viewModelScope.launch { @@ -97,6 +100,11 @@ class ScrapViewModel @Inject constructor( } } + fun updateIsFirstLike(isFirstLike : Boolean) { + sharedPreference.isFirstLike = isFirstLike + _isFirstLike.value = isFirstLike + } + fun updateIsFirstShare(isFirstShare : Boolean) { sharedPreference.isFirstShare = isFirstShare } @@ -219,6 +227,7 @@ class ScrapViewModel @Inject constructor( } fun updateLike(id: Int) { + updateIsFirstLike(false) viewModelScope.launch { viewfinderRepository.updateLike(id).onSuccess { val currentState = (_scrap.value as? UiState.Success)?.data diff --git a/presentation/src/main/res/drawable/rect_gray800_fill_60.xml b/presentation/src/main/res/drawable/rect_gray800_fill_60.xml new file mode 100644 index 00000000..e5305fb8 --- /dev/null +++ b/presentation/src/main/res/drawable/rect_gray800_fill_60.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/layout/fragment_scrap_detail_picture.xml b/presentation/src/main/res/layout/fragment_scrap_detail_picture.xml index 2dc835f7..6127b26c 100644 --- a/presentation/src/main/res/layout/fragment_scrap_detail_picture.xml +++ b/presentation/src/main/res/layout/fragment_scrap_detail_picture.xml @@ -11,6 +11,7 @@ android:layout_height="wrap_content" android:background="@android:color/transparent" android:elevation="4dp" + android:text="" android:textColor="@color/color_foreground_white" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -21,8 +22,7 @@ app:navigationIcon="@drawable/ic_chevron_left_big" app:navigationIconColor="@color/color_foreground_white" app:navigationIconSize="24" - app:titleTextAppearance="@style/TextAppearance.Spot.Label03" - android:text=""/> + app:titleTextAppearance="@style/TextAppearance.Spot.Label03" /> + + \ No newline at end of file diff --git a/presentation/src/main/res/layout/item_scrap_detail.xml b/presentation/src/main/res/layout/item_scrap_detail.xml index 8000318a..b6ddfec4 100644 --- a/presentation/src/main/res/layout/item_scrap_detail.xml +++ b/presentation/src/main/res/layout/item_scrap_detail.xml @@ -48,8 +48,10 @@ android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.499" /> + +