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 0000000..ac31078 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_check_blue.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_playlist_add.png b/app/src/main/res/drawable-xxhdpi/ic_playlist_add.png new file mode 100644 index 0000000..c3bbee8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_playlist_add.png differ 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 @@ + + + + + + + + + + + + +