From 40335fb7ffee731c2db6a2a469d9b80af7ba6191 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 3 Dec 2024 23:49:25 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=88=20=EC=9E=AC=EC=83=9D=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EB=A7=8C=EB=93=A4=EA=B8=B0=20-=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AudioContentPlaylistCreateActivity.kt | 10 ++ .../add_content/PlaylistAddContentAdapter.kt | 62 +++++++ .../PlaylistAddContentDialogFragment.kt | 167 ++++++++++++++++++ .../res/drawable-xxhdpi/ic_check_blue.png | Bin 0 -> 631 bytes .../res/drawable-xxhdpi/ic_playlist_add.png | Bin 0 -> 962 bytes .../layout/fragment_playlist_add_content.xml | 69 ++++++++ .../res/layout/item_playlist_add_content.xml | 74 ++++++++ 7 files changed, 382 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/add_content/PlaylistAddContentAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/add_content/PlaylistAddContentDialogFragment.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_check_blue.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_playlist_add.png create mode 100644 app/src/main/res/layout/fragment_playlist_add_content.xml create mode 100644 app/src/main/res/layout/item_playlist_add_content.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/AudioContentPlaylistCreateActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/AudioContentPlaylistCreateActivity.kt index 76c0aa8..186de3d 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/AudioContentPlaylistCreateActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/AudioContentPlaylistCreateActivity.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.audio_content.playlist.create import android.app.Service import android.os.Bundle import android.view.inputmethod.InputMethodManager +import kr.co.vividnext.sodalive.audio_content.playlist.create.add_content.PlaylistAddContentDialogFragment import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.databinding.ActivityAudioContentPlaylistCreateBinding @@ -14,6 +15,10 @@ class AudioContentPlaylistCreateActivity : BaseActivity() { + + var items = mutableListOf() + + inner class ViewHolder( + private val context: Context, + private val binding: ItemPlaylistAddContentBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetAudioContentOrderListItem) { + Glide + .with(context) + .load(item.coverImageUrl) + .apply( + RequestOptions().transform( + CenterCrop(), + RoundedCorners(5.3f.dpToPx().toInt()) + ) + ) + .into(binding.ivCover) + + binding.tvTitle.text = item.title + binding.tvTheme.text = item.themeStr + binding.tvDuration.text = item.duration + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + parent.context, + ItemPlaylistAddContentBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount() = items.count() + + @SuppressLint("NotifyDataSetChanged") + fun clear() { + items.clear() + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/add_content/PlaylistAddContentDialogFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/add_content/PlaylistAddContentDialogFragment.kt new file mode 100644 index 0000000..57181b8 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/playlist/create/add_content/PlaylistAddContentDialogFragment.kt @@ -0,0 +1,167 @@ +package kr.co.vividnext.sodalive.audio_content.playlist.create.add_content + +import android.annotation.SuppressLint +import android.app.Dialog +import android.graphics.Rect +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListViewModel +import kr.co.vividnext.sodalive.audio_content.playlist.create.AudioContentPlaylistCreateActivity +import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.databinding.FragmentPlaylistAddContentBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import org.koin.android.ext.android.inject + +class PlaylistAddContentDialogFragment : BottomSheetDialogFragment() { + + private lateinit var binding: FragmentPlaylistAddContentBinding + private lateinit var adapter: PlaylistAddContentAdapter + private lateinit var loadingDialog: LoadingDialog + + private val viewModel: AudioContentOrderListViewModel by inject() + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + + dialog.setOnShowListener { dialogInterface -> + val d = dialogInterface as BottomSheetDialog + val bottomSheet = d.findViewById( + com.google.android.material.R.id.design_bottom_sheet + ) + if (bottomSheet != null) { + BottomSheetBehavior.from(bottomSheet).state = BottomSheetBehavior.STATE_EXPANDED + } + bottomSheet?.let { + val behavior = BottomSheetBehavior.from(bottomSheet) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + behavior.skipCollapsed = true + + it.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT + it.requestLayout() + } + } + + return dialog + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = FragmentPlaylistAddContentBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupView() + bindData() + viewModel.getAudioContentOrderList { dismiss() } + } + + private fun setupView() { + binding.tvClose.setOnClickListener { dismiss() } + + loadingDialog = LoadingDialog(requireActivity(), layoutInflater) + adapter = PlaylistAddContentAdapter() + + val recyclerView = binding.rvContent + recyclerView.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.VERTICAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + outRect.left = 13.3f.dpToPx().toInt() + outRect.right = 13.3f.dpToPx().toInt() + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.top = 13.3f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + + adapter.itemCount - 1 -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + } + } + }) + + recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!! + .findLastCompletelyVisibleItemPosition() + val itemTotalCount = recyclerView.adapter!!.itemCount - 1 + + // 스크롤이 끝에 도달했는지 확인 + if (!recyclerView.canScrollVertically(1) && + lastVisibleItemPosition == itemTotalCount + ) { + viewModel.getAudioContentOrderList {} + } + } + }) + + recyclerView.adapter = adapter + } + + @SuppressLint("SetTextI18n", "NotifyDataSetChanged") + private fun bindData() { + viewModel.toastLiveData.observe(viewLifecycleOwner) { + Toast.makeText(requireActivity(), it, Toast.LENGTH_LONG).show() + } + + viewModel.isLoading.observe(viewLifecycleOwner) { + if (it) { + loadingDialog.show( + (requireActivity() as AudioContentPlaylistCreateActivity).screenWidth, + "" + ) + } else { + loadingDialog.dismiss() + } + } + + viewModel.orderList.observe(viewLifecycleOwner) { + if (viewModel.page == 2) { + adapter.items.clear() + } + + adapter.items.addAll(it) + adapter.notifyDataSetChanged() + } + + viewModel.totalCount.observe(viewLifecycleOwner) { + binding.tvContentCount.text = "${it}개" + } + } +} diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_blue.png b/app/src/main/res/drawable-xxhdpi/ic_check_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ac310783b3fe3abce08d0c94334b68c8994e91a2 GIT binary patch literal 631 zcmV--0*L*IP)JsB7=~dOhADx7Jz?;sx=Ml6KN@f&PsG49ZZCx8yXr$Ko1&mC z&&1RE*ak$7QFh6dX?)beIkF%GOib6K70#2z>x2HOcr@LL@*OUc#dlX`&5cgjMwW<5 z*jAQ^M%aZc5rwcTSt590m$F3A!meeBV1<3i5}CsCS+(F0x_=g!K}GnIC5*!IRW%j89o2E4A$W$}Sg5@EFSvjJijB%MwOmtSje+1-(jFAxjvA#TVS; zX=+$Ffd!0KkGwOgk|nY?t%*wDNS9bm!|mCsz@C96Rmu{X<)OS3bCLp*+oXwq)z~)D zRm&2E-(f95)aqXb;%N?Gc8xrxv~qmmFJ=d9@#3jw3RN1>=5U6z%yI* zw6skAMmEyByJ>C!vcyis!$#`)pDBD|q-mE=#|I)y?9{c?k^aU=n=&$h7Jk3SX{1Av zC9KLrT~Qt2JDnA20S_U`64v!_fwY;LWC`m=yu8pQ<8|o?HOdmsIv%)@QAv51JE&$^ z!fA^qS2_S$!g){2C>@9_;iZY!e^EWrz<$`WX)yGiE;0$|MoH7f zL#2IjBN;0pJy0eOEE)vg_ z?wNS|1tVcJwG@fZs}iT*=~xmUB$pP6f5N52e|M00igWBwp-F8V?kn~w*Yj~1vv+ds z6$W6?)e=jbwvc19(tS)@$=e%Qlo(}{zOMQ{s_Xy2$3HB%t6HACy5H~r!T{D7Ou02rRKEP=1SNw3tT32YPc(i{sU@|wtDjA1)usDF zs-avnQ{!%aYtCNBXa;lGA!EOxT$;^g4Q-53B+cWsT6E_WlT%I81;0T(EE3+3Vb4nU zpv%L-43^h4T+sKG?k(58hAiU_BIz0l&*On>)6!dvYFi-bA0swH1MiD3e!EIh2XaGgyxH*R)E( ke5d&li^Jh?I2`Yte}%ces!oKN6#xJL07*qoM6N<$f?DIp0RR91 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_playlist_add_content.xml b/app/src/main/res/layout/fragment_playlist_add_content.xml new file mode 100644 index 0000000..3273404 --- /dev/null +++ b/app/src/main/res/layout/fragment_playlist_add_content.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_playlist_add_content.xml b/app/src/main/res/layout/item_playlist_add_content.xml new file mode 100644 index 0000000..7bd0e4e --- /dev/null +++ b/app/src/main/res/layout/item_playlist_add_content.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + +