diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/NavItem.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/NavItem.kt index 691c4ed59..734060b65 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/NavItem.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/NavItem.kt @@ -4,13 +4,12 @@ import androidx.annotation.DrawableRes import androidx.annotation.IdRes import androidx.annotation.StringRes import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.list.ui.model.ListModel enum class NavItem( @IdRes val id: Int, @StringRes val title: Int, @DrawableRes val icon: Int, -) : ListModel { +) { HISTORY(R.id.nav_history, R.string.history, R.drawable.ic_history_selector), FAVORITES(R.id.nav_favorites, R.string.favourites, R.drawable.ic_favourites_selector), @@ -21,10 +20,6 @@ enum class NavItem( BOOKMARKS(R.id.nav_bookmarks, R.string.bookmarks, R.drawable.ic_bookmark_selector), ; - override fun areItemsTheSame(other: ListModel): Boolean { - return other is NavItem && ordinal == other.ordinal - } - fun isAvailable(settings: AppSettings): Boolean = when (this) { SUGGESTIONS -> settings.isSuggestionsEnabled FEED -> settings.isTrackerEnabled diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt index b04aecc06..aae22e41e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt @@ -7,6 +7,7 @@ import androidx.activity.OnBackPressedCallback import androidx.annotation.IdRes import androidx.core.view.isEmpty import androidx.core.view.iterator +import androidx.core.view.size import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.LifecycleOwner @@ -180,6 +181,9 @@ class MainNavigationDelegate( for (item in items) { menu.add(Menu.NONE, item.id, Menu.NONE, item.title) .setIcon(item.icon) + if (menu.size >= navBar.maxItemCount) { + break + } } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/NavConfigViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/NavConfigViewModel.kt index c9a88a6ab..5b6883a6c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/NavConfigViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/NavConfigViewModel.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.plus +import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.NavItem import org.koitharu.kotatsu.core.ui.BaseViewModel @@ -20,6 +21,7 @@ import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.main.ui.MainActivity import org.koitharu.kotatsu.parsers.util.move import org.koitharu.kotatsu.settings.nav.model.NavItemAddModel +import org.koitharu.kotatsu.settings.nav.model.NavItemConfigModel import javax.inject.Inject @HiltViewModel @@ -31,15 +33,18 @@ class NavConfigViewModel @Inject constructor( private val items = MutableStateFlow(settings.mainNavItems) val content: StateFlow> = items.map { snapshot -> - if (snapshot.size < NavItem.entries.size) { - snapshot + NavItemAddModel(snapshot.size < 5) - } else { - snapshot + buildList(snapshot.size + 1) { + snapshot.mapTo(this) { + NavItemConfigModel(it, getUnavailabilityHint(it)) + } + if (size < NavItem.entries.size) { + add(NavItemAddModel(size < 5)) + } } }.stateIn( viewModelScope + Dispatchers.Default, SharingStarted.WhileSubscribed(5000), - emptyList() + emptyList(), ) private var commitJob: Job? = null @@ -81,4 +86,12 @@ class NavConfigViewModel @Inject constructor( activityRecreationHandle.recreate(MainActivity::class.java) } } + + private fun getUnavailabilityHint(item: NavItem) = if (item.isAvailable(settings)) { + 0 + } else when (item) { + NavItem.FEED -> R.string.check_for_new_chapters_disabled + NavItem.SUGGESTIONS -> R.string.suggestions_unavailable_text + else -> 0 + } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/adapter/NavConfigAD.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/adapter/NavConfigAD.kt index 968522805..c8673634d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/adapter/NavConfigAD.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/adapter/NavConfigAD.kt @@ -7,33 +7,37 @@ import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.NavItem import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener +import org.koitharu.kotatsu.core.util.ext.setTextAndVisible import org.koitharu.kotatsu.databinding.ItemNavAvailableBinding import org.koitharu.kotatsu.databinding.ItemNavConfigBinding import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.settings.nav.model.NavItemAddModel +import org.koitharu.kotatsu.settings.nav.model.NavItemConfigModel @SuppressLint("ClickableViewAccessibility") fun navConfigAD( clickListener: OnListItemClickListener, -) = adapterDelegateViewBinding( +) = adapterDelegateViewBinding( { layoutInflater, parent -> ItemNavConfigBinding.inflate(layoutInflater, parent, false) }, ) { val eventListener = object : View.OnClickListener, View.OnTouchListener { - override fun onClick(v: View) = clickListener.onItemClick(item, v) + override fun onClick(v: View) = clickListener.onItemClick(item.item, v) override fun onTouch(v: View?, event: MotionEvent): Boolean = event.actionMasked == MotionEvent.ACTION_DOWN && - clickListener.onItemLongClick(item, itemView) + clickListener.onItemLongClick(item.item, itemView) } binding.imageViewRemove.setOnClickListener(eventListener) binding.imageViewReorder.setOnTouchListener(eventListener) bind { with(binding.textViewTitle) { - setText(item.title) - setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, 0, 0) + isEnabled = item.disabledHintResId == 0 + setText(item.item.title) + setCompoundDrawablesRelativeWithIntrinsicBounds(item.item.icon, 0, 0, 0) } + binding.textViewHint.setTextAndVisible(item.disabledHintResId) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/model/NavItemConfigModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/model/NavItemConfigModel.kt new file mode 100644 index 000000000..e992cbdd0 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/nav/model/NavItemConfigModel.kt @@ -0,0 +1,15 @@ +package org.koitharu.kotatsu.settings.nav.model + +import androidx.annotation.StringRes +import org.koitharu.kotatsu.core.prefs.NavItem +import org.koitharu.kotatsu.list.ui.model.ListModel + +data class NavItemConfigModel( + val item: NavItem, + @StringRes val disabledHintResId: Int, +) : ListModel { + + override fun areItemsTheSame(other: ListModel): Boolean { + return other is NavItemConfigModel && other.item == item + } +} diff --git a/app/src/main/res/layout/item_nav_config.xml b/app/src/main/res/layout/item_nav_config.xml index 5da6630ee..7cb170542 100644 --- a/app/src/main/res/layout/item_nav_config.xml +++ b/app/src/main/res/layout/item_nav_config.xml @@ -5,43 +5,57 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:windowBackground" - android:baselineAligned="false" - android:gravity="center_vertical" - android:orientation="horizontal" + android:orientation="vertical" android:paddingVertical="@dimen/margin_small" android:paddingStart="?listPreferredItemPaddingStart" android:paddingEnd="?listPreferredItemPaddingEnd"> + + + + + + + + + + - - - - + android:textAppearance="?attr/textAppearanceBodySmall" + tools:text="@string/suggestions_unavailable_text" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 75c73fe43..aae4dae96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -591,4 +591,6 @@ %1$d/%2$d Show estimated reading time The time estimation value may be inaccurate + Suggestions feature is disabled + Checking for new chapters is disabled