add option to set default start tab

This commit is contained in:
Bnyro 2022-11-24 17:38:14 +01:00
parent a5b1c77eeb
commit 77be9424fc
8 changed files with 67 additions and 4 deletions

View File

@ -22,6 +22,7 @@ object PreferenceKeys {
const val BREAK_REMINDER = "break_reminder" const val BREAK_REMINDER = "break_reminder"
const val SAVE_FEED = "save_feed" const val SAVE_FEED = "save_feed"
const val NAVBAR_ITEMS = "navbar_items" const val NAVBAR_ITEMS = "navbar_items"
const val START_FRAGMENT = "start_fragment"
/** /**
* Appearance * Appearance

View File

@ -10,7 +10,8 @@ import com.github.libretube.databinding.NavOptionsItemBinding
import com.github.libretube.ui.viewholders.NavBarOptionsViewHolder import com.github.libretube.ui.viewholders.NavBarOptionsViewHolder
class NavBarOptionsAdapter( class NavBarOptionsAdapter(
val items: MutableList<MenuItem> val items: MutableList<MenuItem>,
var selectedHomeTabId: Int
) : RecyclerView.Adapter<NavBarOptionsViewHolder>() { ) : RecyclerView.Adapter<NavBarOptionsViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NavBarOptionsViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NavBarOptionsViewHolder {
@ -31,7 +32,28 @@ class NavBarOptionsAdapter(
holder.binding.apply { holder.binding.apply {
title.text = item.title title.text = item.title
checkbox.isChecked = item.isVisible checkbox.isChecked = item.isVisible
home.setImageResource(
if (item.itemId == selectedHomeTabId) R.drawable.ic_home else R.drawable.ic_home_outlined
)
home.setOnClickListener {
if (selectedHomeTabId == item.itemId) {
return@setOnClickListener
}
if (!item.isVisible) {
Toast.makeText(root.context, R.string.not_enabled, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
val oldSelection = items.indexOfFirst { it.itemId == selectedHomeTabId }
selectedHomeTabId = item.itemId
listOf(position, oldSelection).forEach {
notifyItemChanged(it)
}
}
checkbox.setOnClickListener { checkbox.setOnClickListener {
if (item.itemId == selectedHomeTabId) {
Toast.makeText(root.context, R.string.select_other_start_tab, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (!checkbox.isChecked && getVisibleItemsCount() < 2) { if (!checkbox.isChecked && getVisibleItemsCount() < 2) {
checkbox.isChecked = true checkbox.isChecked = true
Toast.makeText( Toast.makeText(
@ -41,7 +63,7 @@ class NavBarOptionsAdapter(
).show() ).show()
return@setOnClickListener return@setOnClickListener
} }
items[position].isVisible = checkbox.isChecked item.isVisible = checkbox.isChecked
} }
} }
} }

View File

@ -20,7 +20,7 @@ class NavBarOptionsDialog : DialogFragment() {
val options = NavBarHelper.getNavBarItems(requireContext()) val options = NavBarHelper.getNavBarItems(requireContext())
val adapter = NavBarOptionsAdapter(options.toMutableList()) val adapter = NavBarOptionsAdapter(options.toMutableList(), NavBarHelper.getStartFragmentId(requireContext()))
val itemTouchCallback = object : ItemTouchHelper.Callback() { val itemTouchCallback = object : ItemTouchHelper.Callback() {
override fun getMovementFlags( override fun getMovementFlags(
@ -63,6 +63,7 @@ class NavBarOptionsDialog : DialogFragment() {
.setView(binding.root) .setView(binding.root)
.setPositiveButton(R.string.okay) { _, _ -> .setPositiveButton(R.string.okay) { _, _ ->
NavBarHelper.setNavBarItems(adapter.items, requireContext()) NavBarHelper.setNavBarItems(adapter.items, requireContext())
NavBarHelper.setStartFragment(requireContext(), adapter.selectedHomeTabId)
RequireRestartDialog() RequireRestartDialog()
.show(requireParentFragment().childFragmentManager, null) .show(requireParentFragment().childFragmentManager, null)
} }

View File

@ -106,6 +106,21 @@ object NavBarHelper {
).icon = menuItem.icon ).icon = menuItem.icon
} }
} }
return navBarItems.first { it.isVisible }.itemId return getStartFragmentId(bottomNav.context)
}
fun getStartFragmentId(context: Context): Int {
val pref = PreferenceHelper.getInt(PreferenceKeys.START_FRAGMENT, Int.MAX_VALUE)
val defaultNavItems = getDefaultNavBarItems(context)
return if (pref == Int.MAX_VALUE) {
getNavBarItems(context).first { it.isVisible }.itemId
} else {
defaultNavItems.get(pref).itemId
}
}
fun setStartFragment(context: Context, itemId: Int) {
val index = getDefaultNavBarItems(context).indexOfFirst { it.itemId == itemId }
PreferenceHelper.putInt(PreferenceKeys.START_FRAGMENT, index)
} }
} }

View File

@ -37,6 +37,10 @@ object PreferenceHelper {
editor.putBoolean(key, value).commit() editor.putBoolean(key, value).commit()
} }
fun putInt(key: String, value: Int) {
editor.putInt(key, value).commit()
}
fun getString(key: String?, defValue: String): String { fun getString(key: String?, defValue: String): String {
return settings.getString(key, defValue) ?: defValue return settings.getString(key, defValue) ?: defValue
} }

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:fillColor="#FF000000"
android:pathData="M11,39h7.5L18.5,26.5h11L29.5,39L37,39L37,19.5L24,9.75 11,19.5ZM8,42L8,18L24,6l16,12v24L26.5,42L26.5,29.5h-5L21.5,42ZM24,24.35Z" />
</vector>

View File

@ -11,6 +11,14 @@
android:paddingEnd="0dp" android:paddingEnd="0dp"
tools:gravity="start|center_vertical"> tools:gravity="start|center_vertical">
<ImageView
android:id="@+id/home"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackgroundBorderless"
android:paddingHorizontal="10dp"
android:src="@drawable/ic_home_outlined"/>
<com.google.android.material.checkbox.MaterialCheckBox <com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkbox" android:id="@+id/checkbox"
style="@style/Widget.Material3.CompoundButton.CheckBox" style="@style/Widget.Material3.CompoundButton.CheckBox"

View File

@ -387,6 +387,8 @@
<string name="bookmarks_empty">No bookmarks yet!</string> <string name="bookmarks_empty">No bookmarks yet!</string>
<string name="queue_insert_related_videos">Insert related videos</string> <string name="queue_insert_related_videos">Insert related videos</string>
<string name="local_playlists">Local playlists</string> <string name="local_playlists">Local playlists</string>
<string name="not_enabled">Menu item not enabled!</string>
<string name="select_other_start_tab">Please select an other start tab first!</string>
<!-- Notification channel strings --> <!-- Notification channel strings -->
<string name="download_channel_name">Download Service</string> <string name="download_channel_name">Download Service</string>