diff --git a/app/src/main/java/com/github/libretube/adapters/BottomSheetAdapter.kt b/app/src/main/java/com/github/libretube/adapters/BottomSheetAdapter.kt new file mode 100644 index 000000000..c1592d388 --- /dev/null +++ b/app/src/main/java/com/github/libretube/adapters/BottomSheetAdapter.kt @@ -0,0 +1,41 @@ +package com.github.libretube.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.databinding.BottomSheetItemBinding +import com.github.libretube.obj.BottomSheetItem + +class BottomSheetAdapter( + private val items: List, + private val listener: (index: Int) -> Unit +) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BottomSheetViewHolder { + val binding = BottomSheetItemBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + return BottomSheetViewHolder(binding) + } + + override fun onBindViewHolder(holder: BottomSheetViewHolder, position: Int) { + val item = items[position] + holder.binding.apply { + title.text = item.title + drawable.setImageResource(item.drawable) + + root.setOnClickListener { + listener.invoke(position) + } + } + } + + override fun getItemCount(): Int { + return items.size + } +} + +class BottomSheetViewHolder( + val binding: BottomSheetItemBinding +) : RecyclerView.ViewHolder(binding.root) diff --git a/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt b/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt index 2d47e8ad1..9a28fab06 100644 --- a/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/SubscriptionsFragment.kt @@ -16,7 +16,9 @@ import com.github.libretube.constants.PreferenceKeys import com.github.libretube.databinding.FragmentSubscriptionsBinding import com.github.libretube.extensions.BaseFragment import com.github.libretube.models.SubscriptionsViewModel +import com.github.libretube.obj.BottomSheetItem import com.github.libretube.util.PreferenceHelper +import com.github.libretube.views.BottomSheet import com.google.android.material.dialog.MaterialAlertDialogBuilder class SubscriptionsFragment : BaseFragment() { @@ -107,15 +109,22 @@ class SubscriptionsFragment : BaseFragment() { private fun showSortDialog() { val sortOptions = resources.getStringArray(R.array.sortOptions) val sortOptionValues = resources.getStringArray(R.array.sortOptionsValues) - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.sort) - .setItems(sortOptions) { _, index -> + val items = mutableListOf() + sortOptions.forEach { + items += BottomSheetItem( + it, R.drawable.ic_arrow_down + ) + } + + val bottomSheet = BottomSheet().apply { + setItems(items) { index -> binding.sortTV.text = sortOptions[index] sortOrder = sortOptionValues[index] showFeed() } - .setNegativeButton(R.string.cancel, null) - .show() + } + + bottomSheet.show(childFragmentManager, null) } private fun showFeed() { diff --git a/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt b/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt new file mode 100644 index 000000000..11a4b010f --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/BottomSheetItem.kt @@ -0,0 +1,6 @@ +package com.github.libretube.obj + +data class BottomSheetItem( + val title: String, + val drawable: Int +) diff --git a/app/src/main/java/com/github/libretube/views/BottomSheet.kt b/app/src/main/java/com/github/libretube/views/BottomSheet.kt new file mode 100644 index 000000000..3a5cac4dd --- /dev/null +++ b/app/src/main/java/com/github/libretube/views/BottomSheet.kt @@ -0,0 +1,51 @@ +package com.github.libretube.views + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import com.github.libretube.adapters.BottomSheetAdapter +import com.github.libretube.databinding.BottomSheetBinding +import com.github.libretube.obj.BottomSheetItem +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.bottomsheet.BottomSheetDialogFragment + +class BottomSheet : BottomSheetDialogFragment() { + private lateinit var items: List + private lateinit var listener: (index: Int) -> Unit + private lateinit var binding: BottomSheetBinding + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + dialog!!.setOnShowListener { dialog -> + val d = dialog as BottomSheetDialog + val bottomSheetInternal = + d.findViewById(com.google.android.material.R.id.design_bottom_sheet)!! + BottomSheetBehavior.from(bottomSheetInternal).state = + BottomSheetBehavior.STATE_EXPANDED + } + + binding = BottomSheetBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.optionsRecycler.layoutManager = LinearLayoutManager(requireContext()) + binding.optionsRecycler.adapter = BottomSheetAdapter(items, listener) + } + + fun setItems(items: List, listener: (index: Int) -> Unit) { + this.items = items + this.listener = { index -> + listener.invoke(index) + dialog?.dismiss() + } + } +} diff --git a/app/src/main/java/com/github/libretube/views/PlayerOptionsBottomSheet.kt b/app/src/main/java/com/github/libretube/views/PlayerOptionsBottomSheet.kt index 901f46894..ba49311b3 100644 --- a/app/src/main/java/com/github/libretube/views/PlayerOptionsBottomSheet.kt +++ b/app/src/main/java/com/github/libretube/views/PlayerOptionsBottomSheet.kt @@ -5,7 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import com.github.libretube.databinding.BottomSheetBinding +import com.github.libretube.databinding.PlayerOptionsBottomSheetBinding import com.github.libretube.interfaces.OnlinePlayerOptionsInterface import com.github.libretube.interfaces.PlayerOptionsInterface import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -16,7 +16,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment * Bottom Sheet including all the player options */ class PlayerOptionsBottomSheet : BottomSheetDialogFragment() { - lateinit var binding: BottomSheetBinding + lateinit var binding: PlayerOptionsBottomSheetBinding private lateinit var playerOptionsInterface: PlayerOptionsInterface private var onlinePlayerOptionsInterface: OnlinePlayerOptionsInterface? = null @@ -44,7 +44,7 @@ class PlayerOptionsBottomSheet : BottomSheetDialogFragment() { BottomSheetBehavior.STATE_EXPANDED } - binding = BottomSheetBinding.inflate(layoutInflater, container, false) + binding = PlayerOptionsBottomSheetBinding.inflate(layoutInflater, container, false) return binding.root } diff --git a/app/src/main/res/layout/bottom_sheet.xml b/app/src/main/res/layout/bottom_sheet.xml index fddbf9545..42fa494ee 100644 --- a/app/src/main/res/layout/bottom_sheet.xml +++ b/app/src/main/res/layout/bottom_sheet.xml @@ -1,46 +1,34 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto"> - + - + - + + - + - + - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_item.xml b/app/src/main/res/layout/bottom_sheet_item.xml new file mode 100644 index 000000000..b79a67ad8 --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet_item.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/player_options_bottom_sheet.xml b/app/src/main/res/layout/player_options_bottom_sheet.xml new file mode 100644 index 000000000..fddbf9545 --- /dev/null +++ b/app/src/main/res/layout/player_options_bottom_sheet.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + \ No newline at end of file