New fast scroller for library
Updated Drag handle icon
Removed outline fron update button in extensions
Moved "view options" to filter sheet as "display options"
Removed freeform cover option from library 😔
Added swipe refresh to recents page
Removed a few overflows
This commit is contained in:
parent
836291a59a
commit
d0def563c8
@ -177,6 +177,8 @@ class PreferencesHelper(val context: Context) {
|
|||||||
|
|
||||||
fun gridSize() = rxPrefs.getInteger(Keys.gridSize, 1)
|
fun gridSize() = rxPrefs.getInteger(Keys.gridSize, 1)
|
||||||
|
|
||||||
|
fun autoHideSeeker() = rxPrefs.getBoolean("auto_hide_seeker", true)
|
||||||
|
|
||||||
fun uniformGrid() = rxPrefs.getBoolean(Keys.uniformGrid, true)
|
fun uniformGrid() = rxPrefs.getBoolean(Keys.uniformGrid, true)
|
||||||
|
|
||||||
fun libraryAsSingleList() = rxPrefs.getBoolean(Keys.libraryAsSingleList, false)
|
fun libraryAsSingleList() = rxPrefs.getBoolean(Keys.libraryAsSingleList, false)
|
||||||
|
@ -91,7 +91,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
|
|||||||
override fun getTitle(): String? {
|
override fun getTitle(): String? {
|
||||||
return if (showingExtenions)
|
return if (showingExtenions)
|
||||||
applicationContext?.getString(R.string.label_extensions)
|
applicationContext?.getString(R.string.label_extensions)
|
||||||
else applicationContext?.getString(R.string.label_catalogues)
|
else applicationContext?.getString(R.string.pref_category_sources)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,7 +60,7 @@ class CategoryHolder(view: View, val adapter: CategoryAdapter) : BaseFlexibleVie
|
|||||||
} else {
|
} else {
|
||||||
title.setTextColor(ContextCompat.getColor(itemView.context, R.color.textColorPrimary))
|
title.setTextColor(ContextCompat.getColor(itemView.context, R.color.textColorPrimary))
|
||||||
regularDrawable = ContextCompat.getDrawable(itemView.context, R.drawable
|
regularDrawable = ContextCompat.getDrawable(itemView.context, R.drawable
|
||||||
.ic_reorder_grey_24dp)
|
.ic_drag_handle_black_24dp)
|
||||||
image.visible()
|
image.visible()
|
||||||
edit_text.setText(title.text)
|
edit_text.setText(title.text)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.ui.extension
|
package eu.kanade.tachiyomi.ui.extension
|
||||||
|
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
|
import android.graphics.Color
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
@ -11,6 +12,7 @@ import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
|||||||
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
|
import eu.kanade.tachiyomi.ui.base.holder.SlicedHolder
|
||||||
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
import eu.kanade.tachiyomi.util.system.LocaleHelper
|
||||||
import eu.kanade.tachiyomi.util.system.getResourceColor
|
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||||
|
import eu.kanade.tachiyomi.util.view.resetStrokeColor
|
||||||
import io.github.mthli.slice.Slice
|
import io.github.mthli.slice.Slice
|
||||||
import kotlinx.android.synthetic.main.extension_card_item.*
|
import kotlinx.android.synthetic.main.extension_card_item.*
|
||||||
|
|
||||||
@ -64,8 +66,8 @@ class ExtensionHolder(view: View, override val adapter: ExtensionAdapter) :
|
|||||||
setTextColor(ContextCompat.getColorStateList(context, R.drawable.button_text_state))
|
setTextColor(ContextCompat.getColorStateList(context, R.drawable.button_text_state))
|
||||||
backgroundTintList = ContextCompat.getColorStateList(context, android.R.color.transparent)
|
backgroundTintList = ContextCompat.getColorStateList(context, android.R.color.transparent)
|
||||||
|
|
||||||
|
resetStrokeColor()
|
||||||
val extension = item.extension
|
val extension = item.extension
|
||||||
|
|
||||||
val installStep = item.installStep
|
val installStep = item.installStep
|
||||||
if (installStep != null) {
|
if (installStep != null) {
|
||||||
setText(when (installStep) {
|
setText(when (installStep) {
|
||||||
@ -85,6 +87,7 @@ class ExtensionHolder(view: View, override val adapter: ExtensionAdapter) :
|
|||||||
isActivated = true
|
isActivated = true
|
||||||
backgroundTintList = ColorStateList.valueOf(
|
backgroundTintList = ColorStateList.valueOf(
|
||||||
context.getResourceColor(R.attr.colorAccent))
|
context.getResourceColor(R.attr.colorAccent))
|
||||||
|
strokeColor = ColorStateList.valueOf(Color.TRANSPARENT)
|
||||||
setText(R.string.ext_update)
|
setText(R.string.ext_update)
|
||||||
}
|
}
|
||||||
extension.isObsolete -> {
|
extension.isObsolete -> {
|
||||||
|
@ -64,7 +64,7 @@ class DisplayBottomSheet(private val controller: LibraryController) : BottomShee
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
initGeneralPreferences()
|
initGeneralPreferences()
|
||||||
setBottomEdge(unread_badge_group, activity)
|
setBottomEdge(hide_filters, activity)
|
||||||
close_button.setOnClickListener {
|
close_button.setOnClickListener {
|
||||||
dismiss()
|
dismiss()
|
||||||
true
|
true
|
||||||
@ -86,6 +86,9 @@ class DisplayBottomSheet(private val controller: LibraryController) : BottomShee
|
|||||||
uniform_grid.bindToPreference(preferences.uniformGrid()) {
|
uniform_grid.bindToPreference(preferences.uniformGrid()) {
|
||||||
controller.reattachAdapter()
|
controller.reattachAdapter()
|
||||||
}
|
}
|
||||||
|
autohide_seeker.bindToPreference(preferences.autoHideSeeker()) {
|
||||||
|
controller.updateAutoHideScrollbar(autohide_seeker.isChecked)
|
||||||
|
}
|
||||||
grid_size_toggle_group.bindToPreference(preferences.gridSize()) {
|
grid_size_toggle_group.bindToPreference(preferences.gridSize()) {
|
||||||
controller.reattachAdapter()
|
controller.reattachAdapter()
|
||||||
}
|
}
|
||||||
@ -95,28 +98,29 @@ class DisplayBottomSheet(private val controller: LibraryController) : BottomShee
|
|||||||
unread_badge_group.bindToPreference(preferences.unreadBadgeType()) {
|
unread_badge_group.bindToPreference(preferences.unreadBadgeType()) {
|
||||||
controller.presenter.requestUnreadBadgesUpdate()
|
controller.presenter.requestUnreadBadgesUpdate()
|
||||||
}
|
}
|
||||||
|
hide_filters.bindToPreference(preferences.hideFiltersAtStart())
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds a checkbox or switch view with a boolean preference.
|
* Binds a checkbox or switch view with a boolean preference.
|
||||||
*/
|
*/
|
||||||
private fun CompoundButton.bindToPreference(pref: Preference<Boolean>, block: () -> Unit) {
|
private fun CompoundButton.bindToPreference(pref: Preference<Boolean>, block: (() -> Unit)? = null) {
|
||||||
isChecked = pref.getOrDefault()
|
isChecked = pref.getOrDefault()
|
||||||
setOnCheckedChangeListener { _, isChecked ->
|
setOnCheckedChangeListener { _, isChecked ->
|
||||||
pref.set(isChecked)
|
pref.set(isChecked)
|
||||||
block()
|
block?.invoke()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds a radio group with a int preference.
|
* Binds a radio group with a int preference.
|
||||||
*/
|
*/
|
||||||
private fun RadioGroup.bindToPreference(pref: Preference<Int>, block: () -> Unit) {
|
private fun RadioGroup.bindToPreference(pref: Preference<Int>, block: (() -> Unit)? = null) {
|
||||||
(getChildAt(pref.getOrDefault()) as RadioButton).isChecked = true
|
(getChildAt(pref.getOrDefault()) as RadioButton).isChecked = true
|
||||||
setOnCheckedChangeListener { _, checkedId ->
|
setOnCheckedChangeListener { _, checkedId ->
|
||||||
val index = indexOfChild(findViewById(checkedId))
|
val index = indexOfChild(findViewById(checkedId))
|
||||||
pref.set(index)
|
pref.set(index)
|
||||||
block()
|
block?.invoke()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.library
|
|||||||
|
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible
|
import eu.davidea.flexibleadapter.items.IFlexible
|
||||||
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
@ -13,6 +14,7 @@ import java.text.SimpleDateFormat
|
|||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
import kotlin.math.max
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapter storing a list of manga in a certain category.
|
* Adapter storing a list of manga in a certain category.
|
||||||
@ -91,65 +93,152 @@ class LibraryCategoryAdapter(val libraryListener: LibraryListener) :
|
|||||||
isLongPressDragEnabled = libraryListener.canDrag() && s.isNullOrBlank()
|
isLongPressDragEnabled = libraryListener.canDrag() && s.isNullOrBlank()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateBubbleText(position: Int): String {
|
fun getSectionText(position: Int): String? {
|
||||||
return if (position < scrollableHeaders.size) {
|
val preferences: PreferencesHelper by injectLazy()
|
||||||
"Top"
|
val db: DatabaseHelper by injectLazy()
|
||||||
} else if (position >= itemCount - scrollableFooters.size) {
|
return when (val item: IFlexible<*>? = getItem(position)) {
|
||||||
"Bottom"
|
is LibraryHeaderItem ->
|
||||||
} else { // Get and show the first character
|
if (preferences.hideCategories().getOrDefault()) null
|
||||||
val iFlexible: IFlexible<*>? = getItem(position)
|
else getFirstLetter(item.category.name) +
|
||||||
if (iFlexible is LibraryHeaderItem) {
|
"\u200B".repeat(max(0, item.category.order))
|
||||||
return iFlexible.category.name
|
is LibraryItem -> {
|
||||||
}
|
when (preferences.librarySortingMode().getOrDefault()) {
|
||||||
val preferences: PreferencesHelper by injectLazy()
|
LibrarySort.DRAG_AND_DROP -> {
|
||||||
when (preferences.librarySortingMode().getOrDefault()) {
|
val category = db.getCategoriesForManga(item.manga).executeAsBlocking()
|
||||||
LibrarySort.DRAG_AND_DROP -> {
|
.firstOrNull()
|
||||||
if (!preferences.hideCategories().getOrDefault()) {
|
if (category == null) null
|
||||||
val title = (iFlexible as LibraryItem).manga.title
|
else getFirstLetter(category.name) + "\u200B".repeat(max(0, category.order))
|
||||||
if (preferences.removeArticles().getOrDefault())
|
}
|
||||||
title.removeArticles().substring(0, 1).toUpperCase(Locale.US)
|
LibrarySort.LAST_READ -> {
|
||||||
else title.substring(0, 1).toUpperCase(Locale.US)
|
val id = item.manga.id ?: return ""
|
||||||
} else {
|
val history = db.getHistoryByMangaId(id).executeAsBlocking()
|
||||||
val db: DatabaseHelper by injectLazy()
|
val last = history.maxBy { it.last_read }
|
||||||
val category = db.getCategoriesForManga((iFlexible as LibraryItem).manga)
|
if (last != null && last.last_read > 100) getShorterDate(Date(last.last_read))
|
||||||
.executeAsBlocking().firstOrNull()?.name
|
else "*"
|
||||||
category?.chop(10) ?: "Default"
|
}
|
||||||
|
LibrarySort.TOTAL -> {
|
||||||
|
val unread = item.chapterCount
|
||||||
|
(unread / 100).toString()
|
||||||
|
}
|
||||||
|
LibrarySort.UNREAD -> {
|
||||||
|
val unread = item.manga.unread
|
||||||
|
if (unread > 0) (unread / 100).toString()
|
||||||
|
else "R"
|
||||||
|
}
|
||||||
|
LibrarySort.LATEST_CHAPTER -> {
|
||||||
|
val lastUpdate = item.manga.last_update
|
||||||
|
if (lastUpdate > 0) getShorterDate(Date(lastUpdate))
|
||||||
|
else "*"
|
||||||
|
}
|
||||||
|
LibrarySort.DATE_ADDED -> {
|
||||||
|
val lastUpdate = item.manga.date_added
|
||||||
|
if (lastUpdate > 0) getShorterDate(Date(lastUpdate))
|
||||||
|
else "*"
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
val title = if (preferences.removeArticles()
|
||||||
|
.getOrDefault()
|
||||||
|
) item.manga.title.removeArticles()
|
||||||
|
else item.manga.title
|
||||||
|
getFirstLetter(title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LibrarySort.LAST_READ -> {
|
}
|
||||||
val db: DatabaseHelper by injectLazy()
|
else -> ""
|
||||||
val id = (iFlexible as LibraryItem).manga.id ?: return ""
|
}
|
||||||
val history = db.getHistoryByMangaId(id).executeAsBlocking()
|
}
|
||||||
val last = history.maxBy { it.last_read }
|
|
||||||
if (last != null)
|
private fun getFirstLetter(name: String): String {
|
||||||
getShortDate(Date(last.last_read))
|
val letter = name.first()
|
||||||
else
|
return if (letter.isLetter()) letter.toString()
|
||||||
"N/A"
|
.toUpperCase(Locale.ROOT) else "#"
|
||||||
}
|
}
|
||||||
LibrarySort.UNREAD -> {
|
|
||||||
val unread = (iFlexible as LibraryItem).manga.unread
|
override fun onCreateBubbleText(position: Int): String {
|
||||||
if (unread > 0)
|
val preferences: PreferencesHelper by injectLazy()
|
||||||
unread.toString()
|
val db: DatabaseHelper by injectLazy()
|
||||||
else
|
return when (val iFlexible: IFlexible<*>? = getItem(position)) {
|
||||||
"Read"
|
is LibraryHeaderItem -> iFlexible.category.name
|
||||||
}
|
is LibraryItem -> {
|
||||||
LibrarySort.LATEST_CHAPTER -> {
|
when (preferences.librarySortingMode().getOrDefault()) {
|
||||||
val lastUpdate = (iFlexible as LibraryItem).manga.last_update
|
LibrarySort.DRAG_AND_DROP -> {
|
||||||
if (lastUpdate > 0)
|
if (!preferences.hideCategories().getOrDefault()) {
|
||||||
getShortDate(Date(lastUpdate))
|
val title = iFlexible.manga.title
|
||||||
else
|
if (preferences.removeArticles().getOrDefault()) title.removeArticles()
|
||||||
"N/A"
|
.substring(0, 1).toUpperCase(Locale.US)
|
||||||
}
|
else title.substring(0, 1).toUpperCase(Locale.US)
|
||||||
else -> {
|
} else {
|
||||||
val title = (iFlexible as LibraryItem).manga.title
|
val category = db.getCategoriesForManga(iFlexible.manga)
|
||||||
if (preferences.removeArticles().getOrDefault())
|
.executeAsBlocking().firstOrNull()?.name
|
||||||
title.removeArticles().substring(0, 1).toUpperCase(Locale.US)
|
category?.chop(10)
|
||||||
else title.substring(0, 1).toUpperCase(Locale.US)
|
?: recyclerView.context.getString(R.string.default_category)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LibrarySort.LAST_READ -> {
|
||||||
|
val id = iFlexible.manga.id ?: return ""
|
||||||
|
val history = db.getHistoryByMangaId(id).executeAsBlocking()
|
||||||
|
val last = history.maxBy { it.last_read }
|
||||||
|
if (last != null && last.last_read > 100) getShortDate(Date(last.last_read))
|
||||||
|
else "N/A"
|
||||||
|
}
|
||||||
|
LibrarySort.UNREAD -> {
|
||||||
|
val unread = iFlexible.manga.unread
|
||||||
|
if (unread > 0) getRange(unread)
|
||||||
|
else recyclerView.context.getString(R.string.action_filter_read)
|
||||||
|
}
|
||||||
|
LibrarySort.TOTAL -> {
|
||||||
|
val total = iFlexible.chapterCount
|
||||||
|
if (total > 0) getRange(total)
|
||||||
|
else "N/A"
|
||||||
|
}
|
||||||
|
LibrarySort.LATEST_CHAPTER -> {
|
||||||
|
val lastUpdate = iFlexible.manga.last_update
|
||||||
|
if (lastUpdate > 0) getShortDate(Date(lastUpdate))
|
||||||
|
else "N/A"
|
||||||
|
}
|
||||||
|
LibrarySort.DATE_ADDED -> {
|
||||||
|
val lastUpdate = iFlexible.manga.date_added
|
||||||
|
if (lastUpdate > 0) getShortDate(Date(lastUpdate))
|
||||||
|
else "N/A"
|
||||||
|
}
|
||||||
|
else -> getSectionText(position) ?: ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else -> ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getRange(value: Int): String {
|
||||||
|
return when (value) {
|
||||||
|
in 1..99 -> "< 100"
|
||||||
|
in 100..199 -> "100-199"
|
||||||
|
in 200..299 -> "200-299"
|
||||||
|
in 300..399 -> "300-399"
|
||||||
|
in 400..499 -> "400-499"
|
||||||
|
in 500..599 -> "500-599"
|
||||||
|
in 600..699 -> "600-699"
|
||||||
|
in 700..799 -> "700-799"
|
||||||
|
in 800..899 -> "800-899"
|
||||||
|
in 900..Int.MAX_VALUE -> "900+"
|
||||||
|
else -> "None"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getShorterDate(date: Date): String {
|
||||||
|
val cal = Calendar.getInstance()
|
||||||
|
cal.time = Date()
|
||||||
|
|
||||||
|
val yearNow = cal.get(Calendar.YEAR)
|
||||||
|
val cal2 = Calendar.getInstance()
|
||||||
|
cal2.time = date
|
||||||
|
val yearThen = cal2.get(Calendar.YEAR)
|
||||||
|
|
||||||
|
return if (yearNow == yearThen)
|
||||||
|
SimpleDateFormat("M", Locale.getDefault()).format(date)
|
||||||
|
else
|
||||||
|
SimpleDateFormat("''yy", Locale.getDefault()).format(date)
|
||||||
|
}
|
||||||
|
|
||||||
private fun getShortDate(date: Date): String {
|
private fun getShortDate(date: Date): String {
|
||||||
val cal = Calendar.getInstance()
|
val cal = Calendar.getInstance()
|
||||||
cal.time = Date()
|
cal.time = Date()
|
||||||
@ -160,7 +249,7 @@ class LibraryCategoryAdapter(val libraryListener: LibraryListener) :
|
|||||||
val yearThen = cal2.get(Calendar.YEAR)
|
val yearThen = cal2.get(Calendar.YEAR)
|
||||||
|
|
||||||
return if (yearNow == yearThen)
|
return if (yearNow == yearThen)
|
||||||
SimpleDateFormat("MMM", Locale.getDefault()).format(date)
|
SimpleDateFormat("MMMM", Locale.getDefault()).format(date)
|
||||||
else
|
else
|
||||||
SimpleDateFormat("yyyy", Locale.getDefault()).format(date)
|
SimpleDateFormat("yyyy", Locale.getDefault()).format(date)
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import android.animation.AnimatorSet
|
|||||||
import android.animation.ValueAnimator
|
import android.animation.ValueAnimator
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.res.ColorStateList
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
@ -15,11 +16,13 @@ import android.view.MenuItem
|
|||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.view.ViewPropertyAnimator
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.appcompat.view.ActionMode
|
import androidx.appcompat.view.ActionMode
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
@ -33,6 +36,8 @@ import com.bluelinelabs.conductor.ControllerChangeType
|
|||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.snackbar.BaseTransientBottomBar
|
import com.google.android.material.snackbar.BaseTransientBottomBar
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
|
||||||
|
import com.reddit.indicatorfastscroll.FastScrollerView
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
import eu.davidea.flexibleadapter.SelectableAdapter
|
import eu.davidea.flexibleadapter.SelectableAdapter
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible
|
import eu.davidea.flexibleadapter.items.IFlexible
|
||||||
@ -51,7 +56,6 @@ import eu.kanade.tachiyomi.ui.library.filter.FilterBottomSheet
|
|||||||
import eu.kanade.tachiyomi.ui.main.MainActivity
|
import eu.kanade.tachiyomi.ui.main.MainActivity
|
||||||
import eu.kanade.tachiyomi.ui.main.OnTouchEventInterface
|
import eu.kanade.tachiyomi.ui.main.OnTouchEventInterface
|
||||||
import eu.kanade.tachiyomi.ui.main.RootSearchInterface
|
import eu.kanade.tachiyomi.ui.main.RootSearchInterface
|
||||||
import eu.kanade.tachiyomi.ui.main.SpinnerTitleInterface
|
|
||||||
import eu.kanade.tachiyomi.ui.main.SwipeGestureInterface
|
import eu.kanade.tachiyomi.ui.main.SwipeGestureInterface
|
||||||
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
|
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
|
||||||
import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController
|
import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController
|
||||||
@ -59,6 +63,7 @@ import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController
|
|||||||
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcedureConfig
|
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcedureConfig
|
||||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||||
import eu.kanade.tachiyomi.util.system.dpToPx
|
import eu.kanade.tachiyomi.util.system.dpToPx
|
||||||
|
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||||
import eu.kanade.tachiyomi.util.system.launchUI
|
import eu.kanade.tachiyomi.util.system.launchUI
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController
|
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController
|
||||||
@ -90,7 +95,7 @@ class LibraryController(
|
|||||||
ChangeMangaCategoriesDialog.Listener,
|
ChangeMangaCategoriesDialog.Listener,
|
||||||
FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener,
|
FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener,
|
||||||
FlexibleAdapter.OnItemMoveListener, LibraryCategoryAdapter.LibraryListener,
|
FlexibleAdapter.OnItemMoveListener, LibraryCategoryAdapter.LibraryListener,
|
||||||
SpinnerTitleInterface, OnTouchEventInterface, SwipeGestureInterface,
|
OnTouchEventInterface, SwipeGestureInterface,
|
||||||
RootSearchInterface, LibraryServiceListener {
|
RootSearchInterface, LibraryServiceListener {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@ -112,6 +117,8 @@ class LibraryController(
|
|||||||
|
|
||||||
private var libraryLayout: Int = preferences.libraryLayout().getOrDefault()
|
private var libraryLayout: Int = preferences.libraryLayout().getOrDefault()
|
||||||
|
|
||||||
|
private var singleCategory: Boolean = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Library search query.
|
* Library search query.
|
||||||
*/
|
*/
|
||||||
@ -155,11 +162,15 @@ class LibraryController(
|
|||||||
private var isDragging = false
|
private var isDragging = false
|
||||||
private val scrollDistanceTilHidden = 1000.dpToPx
|
private val scrollDistanceTilHidden = 1000.dpToPx
|
||||||
|
|
||||||
|
private var textAnim: ViewPropertyAnimator? = null
|
||||||
|
private var scrollAnim: ViewPropertyAnimator? = null
|
||||||
|
private var autoHideScroller: Boolean = preferences.autoHideSeeker().getOrDefault()
|
||||||
|
|
||||||
override fun getTitle(): String? {
|
override fun getTitle(): String? {
|
||||||
return if (view != null && presenter.categories.size > 1) presenter.categories.find {
|
return if (view != null && presenter.categories.size > 1) presenter.categories.find {
|
||||||
it.order == activeCategory
|
it.order == activeCategory
|
||||||
}?.name ?: super.getTitle()
|
}?.name ?: view?.context?.getString(R.string.label_library)
|
||||||
else super.getTitle()
|
else view?.context?.getString(R.string.label_library)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var scrollListener = object : RecyclerView.OnScrollListener() {
|
private var scrollListener = object : RecyclerView.OnScrollListener() {
|
||||||
@ -179,14 +190,145 @@ class LibraryController(
|
|||||||
setTitle()
|
setTitle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
||||||
|
super.onScrollStateChanged(recyclerView, newState)
|
||||||
|
if (!autoHideScroller) return
|
||||||
|
when (newState) {
|
||||||
|
RecyclerView.SCROLL_STATE_DRAGGING -> {
|
||||||
|
scrollAnim?.cancel()
|
||||||
|
if (fast_scroller.translationX != 0f) {
|
||||||
|
fast_scroller.animate().setStartDelay(0).setDuration(100).translationX(0f)
|
||||||
|
.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RecyclerView.SCROLL_STATE_IDLE -> {
|
||||||
|
scrollAnim = fast_scroller.animate().setStartDelay(1000).setDuration(250)
|
||||||
|
.translationX(22f.dpToPx)
|
||||||
|
scrollAnim?.start()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun hideScroller() {
|
||||||
|
if (!autoHideScroller) return
|
||||||
|
scrollAnim = fast_scroller.animate()
|
||||||
|
.setStartDelay(1000)
|
||||||
|
.setDuration(250)
|
||||||
|
.translationX(22f.dpToPx)
|
||||||
|
scrollAnim?.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setFastScrollBackground() {
|
||||||
|
val context = activity ?: return
|
||||||
|
fast_scroller.background = if (autoHideScroller) ContextCompat.getDrawable(
|
||||||
|
context, R.drawable.fast_scroll_background
|
||||||
|
) else null
|
||||||
|
fast_scroller.textColor = ColorStateList.valueOf(
|
||||||
|
context.getResourceColor(
|
||||||
|
if (autoHideScroller) android.R.attr.textColorPrimaryInverse else android.R.attr.textColorPrimary
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View) {
|
override fun onViewCreated(view: View) {
|
||||||
super.onViewCreated(view)
|
super.onViewCreated(view)
|
||||||
view.applyWindowInsetsForRootController(activity!!.bottom_nav)
|
view.applyWindowInsetsForRootController(activity!!.bottom_nav)
|
||||||
if (!::presenter.isInitialized) presenter = LibraryPresenter(this)
|
if (!::presenter.isInitialized) presenter = LibraryPresenter(this)
|
||||||
|
fast_scroller.translationX = 22f.dpToPx
|
||||||
|
setFastScrollBackground()
|
||||||
|
|
||||||
layoutView(view)
|
adapter = LibraryCategoryAdapter(this)
|
||||||
|
setRecyclerLayout()
|
||||||
|
recycler.manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() {
|
||||||
|
override fun getSpanSize(position: Int): Int {
|
||||||
|
if (libraryLayout == 0) return 1
|
||||||
|
val item = this@LibraryController.adapter.getItem(position)
|
||||||
|
return if (item is LibraryHeaderItem) recycler.manager.spanCount
|
||||||
|
else if (item is LibraryItem && item.manga.isBlank()) recycler.manager.spanCount
|
||||||
|
else 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
recycler.setHasFixedSize(true)
|
||||||
|
recycler.adapter = adapter
|
||||||
|
fast_scroller.setupWithRecyclerView(
|
||||||
|
recycler, { position ->
|
||||||
|
val letter = adapter.getSectionText(position)
|
||||||
|
if (!singleCategory && !adapter.isHeader(adapter.getItem(position))) null
|
||||||
|
else if (letter != null) FastScrollItemIndicator.Text(letter)
|
||||||
|
else FastScrollItemIndicator.Icon(R.drawable.star)
|
||||||
|
})
|
||||||
|
fast_scroller.useDefaultScroller = false
|
||||||
|
fast_scroller.itemIndicatorSelectedCallbacks += object : FastScrollerView.ItemIndicatorSelectedCallback {
|
||||||
|
override fun onItemIndicatorSelected(
|
||||||
|
indicator: FastScrollItemIndicator,
|
||||||
|
indicatorCenterY: Int,
|
||||||
|
itemPosition: Int
|
||||||
|
) {
|
||||||
|
fast_scroller.translationX = 0f
|
||||||
|
hideScroller()
|
||||||
|
|
||||||
|
textAnim?.cancel()
|
||||||
|
textAnim = text_view_m.animate().alpha(0f).setDuration(250L).setStartDelay(1000)
|
||||||
|
textAnim?.start()
|
||||||
|
|
||||||
|
text_view_m.translationY = indicatorCenterY.toFloat() - text_view_m.height / 2
|
||||||
|
text_view_m.alpha = 1f
|
||||||
|
text_view_m.text = adapter.onCreateBubbleText(itemPosition)
|
||||||
|
val appbar = activity?.appbar
|
||||||
|
appbar?.y = 0f
|
||||||
|
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
|
||||||
|
itemPosition,
|
||||||
|
if (singleCategory) 0 else (if (itemPosition == 0) 0 else (-40).dpToPx)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
recycler.addOnScrollListener(scrollListener)
|
||||||
|
|
||||||
|
val tv = TypedValue()
|
||||||
|
activity!!.theme.resolveAttribute(R.attr.actionBarTintColor, tv, true)
|
||||||
|
|
||||||
|
scrollViewWith(recycler, swipeRefreshLayout = swipe_refresh) { insets ->
|
||||||
|
fast_scroller.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||||
|
topMargin = insets.systemWindowInsetTop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
swipe_refresh.setDistanceToTriggerSync(150.dpToPx)
|
||||||
|
swipe_refresh.setOnRefreshListener {
|
||||||
|
swipe_refresh.isRefreshing = false
|
||||||
|
if (!LibraryUpdateService.isRunning()) {
|
||||||
|
when {
|
||||||
|
presenter.allCategories.size <= 1 -> updateLibrary()
|
||||||
|
preferences.updateOnRefresh().getOrDefault() == -1 -> {
|
||||||
|
MaterialDialog(activity!!).title(R.string.what_should_update)
|
||||||
|
.negativeButton(android.R.string.cancel)
|
||||||
|
.listItemsSingleChoice(items = listOf(
|
||||||
|
view.context.getString(
|
||||||
|
R.string.top_category, presenter.allCategories.first().name
|
||||||
|
), view.context.getString(
|
||||||
|
R.string.categories_in_global_update
|
||||||
|
)
|
||||||
|
), selection = { _, index, _ ->
|
||||||
|
preferences.updateOnRefresh().set(index)
|
||||||
|
when (index) {
|
||||||
|
0 -> updateLibrary(presenter.allCategories.first())
|
||||||
|
else -> updateLibrary()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.positiveButton(R.string.action_update)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
when (preferences.updateOnRefresh().getOrDefault()) {
|
||||||
|
0 -> updateLibrary(presenter.allCategories.first())
|
||||||
|
else -> updateLibrary()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (selectedMangas.isNotEmpty()) {
|
if (selectedMangas.isNotEmpty()) {
|
||||||
createActionModeIfNeeded()
|
createActionModeIfNeeded()
|
||||||
@ -201,6 +343,7 @@ class LibraryController(
|
|||||||
FilterBottomSheet.ACTION_HIDE_FILTER_TIP -> activity?.toast(
|
FilterBottomSheet.ACTION_HIDE_FILTER_TIP -> activity?.toast(
|
||||||
R.string.hide_filters_tip, Toast.LENGTH_LONG
|
R.string.hide_filters_tip, Toast.LENGTH_LONG
|
||||||
)
|
)
|
||||||
|
FilterBottomSheet.ACTION_DISPLAY -> DisplayBottomSheet(this).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,7 +485,7 @@ class LibraryController(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun resetScrollingValues() {
|
private fun resetScrollingValues() {
|
||||||
swipe_refresh.isEnabled = true
|
swipe_refresh.isEnabled = !isDragging
|
||||||
startPosX = null
|
startPosX = null
|
||||||
startPosY = null
|
startPosY = null
|
||||||
nextCategory = null
|
nextCategory = null
|
||||||
@ -351,8 +494,17 @@ class LibraryController(
|
|||||||
lockedY = false
|
lockedY = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun updateAutoHideScrollbar(autoHide: Boolean) {
|
||||||
|
autoHideScroller = autoHide
|
||||||
|
setFastScrollBackground()
|
||||||
|
scrollAnim?.cancel()
|
||||||
|
if (autoHide) hideScroller()
|
||||||
|
else fast_scroller.translationX = 0f
|
||||||
|
setRecyclerLayout()
|
||||||
|
}
|
||||||
|
|
||||||
private fun resetRecyclerY(animated: Boolean = false, time: Long = 100) {
|
private fun resetRecyclerY(animated: Boolean = false, time: Long = 100) {
|
||||||
swipe_refresh.isEnabled = true
|
swipe_refresh.isEnabled = !isDragging
|
||||||
moved = false
|
moved = false
|
||||||
lockedRecycler = false
|
lockedRecycler = false
|
||||||
if (animated) {
|
if (animated) {
|
||||||
@ -387,67 +539,6 @@ class LibraryController(
|
|||||||
return inflater.inflate(R.layout.library_list_controller, container, false)
|
return inflater.inflate(R.layout.library_list_controller, container, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun layoutView(view: View) {
|
|
||||||
adapter = LibraryCategoryAdapter(this)
|
|
||||||
setRecyclerLayout()
|
|
||||||
recycler.manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() {
|
|
||||||
override fun getSpanSize(position: Int): Int {
|
|
||||||
if (libraryLayout == 0) return 1
|
|
||||||
val item = this@LibraryController.adapter.getItem(position)
|
|
||||||
return if (item is LibraryHeaderItem) recycler.manager.spanCount
|
|
||||||
else if (item is LibraryItem && item.manga.isBlank()) recycler.manager.spanCount
|
|
||||||
else 1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
recycler.setHasFixedSize(true)
|
|
||||||
recycler.adapter = adapter
|
|
||||||
adapter.fastScroller = fast_scroller
|
|
||||||
recycler.addOnScrollListener(scrollListener)
|
|
||||||
|
|
||||||
val tv = TypedValue()
|
|
||||||
activity!!.theme.resolveAttribute(R.attr.actionBarTintColor, tv, true)
|
|
||||||
|
|
||||||
scrollViewWith(recycler, swipeRefreshLayout = swipe_refresh) { insets ->
|
|
||||||
fast_scroller.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
|
||||||
topMargin = insets.systemWindowInsetTop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
swipe_refresh.setOnRefreshListener {
|
|
||||||
swipe_refresh.isRefreshing = false
|
|
||||||
if (!LibraryUpdateService.isRunning()) {
|
|
||||||
when {
|
|
||||||
presenter.allCategories.size <= 1 -> updateLibrary()
|
|
||||||
preferences.updateOnRefresh().getOrDefault() == -1 -> {
|
|
||||||
MaterialDialog(activity!!).title(R.string.what_should_update)
|
|
||||||
.negativeButton(android.R.string.cancel)
|
|
||||||
.listItemsSingleChoice(items = listOf(
|
|
||||||
view.context.getString(
|
|
||||||
R.string.top_category, presenter.allCategories.first().name
|
|
||||||
), view.context.getString(
|
|
||||||
R.string.categories_in_global_update
|
|
||||||
)
|
|
||||||
), selection = { _, index, _ ->
|
|
||||||
preferences.updateOnRefresh().set(index)
|
|
||||||
when (index) {
|
|
||||||
0 -> updateLibrary(presenter.allCategories.first())
|
|
||||||
else -> updateLibrary()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.positiveButton(R.string.action_update)
|
|
||||||
.show()
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
when (preferences.updateOnRefresh().getOrDefault()) {
|
|
||||||
0 -> updateLibrary(presenter.allCategories.first())
|
|
||||||
else -> updateLibrary()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateLibrary(category: Category? = null) {
|
private fun updateLibrary(category: Category? = null) {
|
||||||
val view = view ?: return
|
val view = view ?: return
|
||||||
LibraryUpdateService.start(view.context, category)
|
LibraryUpdateService.start(view.context, category)
|
||||||
@ -459,21 +550,24 @@ class LibraryController(
|
|||||||
private fun setRecyclerLayout() {
|
private fun setRecyclerLayout() {
|
||||||
if (libraryLayout == 0) {
|
if (libraryLayout == 0) {
|
||||||
recycler.spanCount = 1
|
recycler.spanCount = 1
|
||||||
recycler.updatePaddingRelative(start = 0, end = 0)
|
recycler.updatePaddingRelative(start = 0, end = if (!autoHideScroller) 10.dpToPx else 0)
|
||||||
} else {
|
} else {
|
||||||
recycler.columnWidth = (90 + (preferences.gridSize().getOrDefault() * 30)).dpToPx
|
recycler.columnWidth = (90 + (preferences.gridSize().getOrDefault() * 30)).dpToPx
|
||||||
recycler.updatePaddingRelative(start = 5.dpToPx, end = 5.dpToPx)
|
recycler.updatePaddingRelative(
|
||||||
|
start = (if (!autoHideScroller) 2 else 5).dpToPx,
|
||||||
|
end = (if (!autoHideScroller) 12 else 5).dpToPx
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
|
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
|
||||||
super.onChangeStarted(handler, type)
|
super.onChangeStarted(handler, type)
|
||||||
if (type.isEnter) {
|
if (type.isEnter) {
|
||||||
if (presenter.categories.size > 1) {
|
/*if (presenter.categories.size > 1) {
|
||||||
activity?.toolbar?.showSpinner()
|
activity?.toolbar?.showSpinner()
|
||||||
} else {
|
} else {
|
||||||
activity?.toolbar?.removeSpinner()
|
activity?.toolbar?.removeSpinner()
|
||||||
}
|
}*/
|
||||||
presenter.getLibrary()
|
presenter.getLibrary()
|
||||||
DownloadService.callListeners()
|
DownloadService.callListeners()
|
||||||
LibraryUpdateService.setListener(this)
|
LibraryUpdateService.setListener(this)
|
||||||
@ -521,8 +615,10 @@ class LibraryController(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
adapter.setItems(mangaMap)
|
adapter.setItems(mangaMap)
|
||||||
|
singleCategory = presenter.categories.size <= 1
|
||||||
|
|
||||||
val isCurrentController = router?.backstack?.lastOrNull()?.controller() == this
|
fast_scroller.translationX = 0f
|
||||||
|
hideScroller()
|
||||||
|
|
||||||
setTitle()
|
setTitle()
|
||||||
updateScroll = false
|
updateScroll = false
|
||||||
@ -537,21 +633,21 @@ class LibraryController(
|
|||||||
}
|
}
|
||||||
adapter.isLongPressDragEnabled = canDrag()
|
adapter.isLongPressDragEnabled = canDrag()
|
||||||
|
|
||||||
val popupMenu = if (presenter.categories.size > 1 && isCurrentController) {
|
/*val popupMenu = if (presenter.categories.size > 1 && isCurrentController) {
|
||||||
activity?.toolbar?.showSpinner()
|
activity?.toolbar?.showSpinner()
|
||||||
} else {
|
} else {
|
||||||
activity?.toolbar?.removeSpinner()
|
activity?.toolbar?.removeSpinner()
|
||||||
null
|
null
|
||||||
}
|
}*/
|
||||||
|
|
||||||
presenter.categories.forEach { category ->
|
/*presenter.categories.forEach { category ->
|
||||||
popupMenu?.menu?.add(0, category.order, max(0, category.order), category.name)
|
popupMenu?.menu?.add(0, category.order, max(0, category.order), category.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
popupMenu?.setOnMenuItemClickListener { item ->
|
popupMenu?.setOnMenuItemClickListener { item ->
|
||||||
scrollToHeader(item.itemId)
|
scrollToHeader(item.itemId)
|
||||||
true
|
true
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun scrollToHeader(pos: Int) {
|
private fun scrollToHeader(pos: Int) {
|
||||||
@ -736,6 +832,7 @@ class LibraryController(
|
|||||||
|
|
||||||
override fun onActionStateChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
|
override fun onActionStateChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
|
||||||
val position = viewHolder?.adapterPosition ?: return
|
val position = viewHolder?.adapterPosition ?: return
|
||||||
|
swipe_refresh.isEnabled = actionState != ItemTouchHelper.ACTION_STATE_DRAG
|
||||||
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
|
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
|
||||||
isDragging = true
|
isDragging = true
|
||||||
activity?.appbar?.y = 0f
|
activity?.appbar?.y = 0f
|
||||||
@ -995,9 +1092,6 @@ class LibraryController(
|
|||||||
searchView.clearFocus()
|
searchView.clearFocus()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mutate the filter icon because it needs to be tinted and the resource is shared.
|
|
||||||
menu.findItem(R.id.action_library_filter).icon.mutate()
|
|
||||||
|
|
||||||
setOnQueryTextChangeListener(searchView) { search(it) }
|
setOnQueryTextChangeListener(searchView) { search(it) }
|
||||||
searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
|
searchItem.fixExpand(onExpand = { invalidateMenuOnExpand() })
|
||||||
}
|
}
|
||||||
@ -1043,8 +1137,6 @@ class LibraryController(
|
|||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.library_selection, menu)
|
mode.menuInflater.inflate(R.menu.library_selection, menu)
|
||||||
val selectItem = menu.findItem(R.id.action_select_all)
|
|
||||||
selectItem.isVisible = false
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ class LibraryItem(
|
|||||||
val parent = adapter.recyclerView
|
val parent = adapter.recyclerView
|
||||||
return if (parent is AutofitRecyclerView) {
|
return if (parent is AutofitRecyclerView) {
|
||||||
val libraryLayout = libraryLayout.getOrDefault()
|
val libraryLayout = libraryLayout.getOrDefault()
|
||||||
val isFixedSize = fixedSize.getOrDefault()
|
val isFixedSize = true // fixedSize.getOrDefault()
|
||||||
if (libraryLayout == 0 || manga.isBlank()) {
|
if (libraryLayout == 0 || manga.isBlank()) {
|
||||||
LibraryListHolder(view, adapter as LibraryCategoryAdapter)
|
LibraryListHolder(view, adapter as LibraryCategoryAdapter)
|
||||||
} else {
|
} else {
|
||||||
|
@ -346,7 +346,7 @@ class LibraryPresenter(
|
|||||||
manga1TotalChapter.compareTo(mange2TotalChapter)
|
manga1TotalChapter.compareTo(mange2TotalChapter)
|
||||||
}
|
}
|
||||||
sortingMode == LibrarySort.DATE_ADDED -> {
|
sortingMode == LibrarySort.DATE_ADDED -> {
|
||||||
i1.manga.date_added.compareTo(i2.manga.date_added)
|
i2.manga.date_added.compareTo(i1.manga.date_added)
|
||||||
}
|
}
|
||||||
else -> 0
|
else -> 0
|
||||||
}
|
}
|
||||||
@ -421,13 +421,13 @@ class LibraryPresenter(
|
|||||||
i2.chapterCount = totalChapters!![i2.manga.id!!] ?: 0
|
i2.chapterCount = totalChapters!![i2.manga.id!!] ?: 0
|
||||||
manga1TotalChapter.compareTo(mange2TotalChapter)
|
manga1TotalChapter.compareTo(mange2TotalChapter)
|
||||||
}
|
}
|
||||||
LibrarySort.DATE_ADDED -> i1.manga.date_added.compareTo(i2.manga.date_added)
|
LibrarySort.DATE_ADDED -> i2.manga.date_added.compareTo(i1.manga.date_added)
|
||||||
else -> sortAlphabetical(i1, i2)
|
else -> sortAlphabetical(i1, i2)
|
||||||
}
|
}
|
||||||
if (!category.isAscending()) sort *= -1
|
if (!category.isAscending()) sort *= -1
|
||||||
sort
|
sort
|
||||||
}
|
}
|
||||||
category?.mangaOrder?.isEmpty() == false -> {
|
category.mangaOrder.isNotEmpty() -> {
|
||||||
val order = category.mangaOrder
|
val order = category.mangaOrder
|
||||||
val index1 = order.indexOf(i1.manga.id!!)
|
val index1 = order.indexOf(i1.manga.id!!)
|
||||||
val index2 = order.indexOf(i2.manga.id!!)
|
val index2 = order.indexOf(i2.manga.id!!)
|
||||||
@ -441,7 +441,7 @@ class LibraryPresenter(
|
|||||||
else -> 0
|
else -> 0
|
||||||
}
|
}
|
||||||
if (compare == 0) {
|
if (compare == 0) {
|
||||||
if (category?.isAscending() != false) sortAlphabetical(i1, i2)
|
if (category.isAscending()) sortAlphabetical(i1, i2)
|
||||||
else sortAlphabetical(i2, i1)
|
else sortAlphabetical(i2, i1)
|
||||||
} else compare
|
} else compare
|
||||||
} else {
|
} else {
|
||||||
@ -560,7 +560,7 @@ class LibraryPresenter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun updateView(
|
private suspend fun updateView(
|
||||||
categories: List<Category>,
|
categories: List<Category>,
|
||||||
mangaMap: LibraryMap,
|
mangaMap: LibraryMap,
|
||||||
freshStart: Boolean =
|
freshStart: Boolean =
|
||||||
|
@ -98,6 +98,9 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
|
|||||||
if (isChecked)
|
if (isChecked)
|
||||||
onGroupClicked(ACTION_HIDE_FILTER_TIP)
|
onGroupClicked(ACTION_HIDE_FILTER_TIP)
|
||||||
}
|
}
|
||||||
|
view_options.setOnClickListener {
|
||||||
|
onGroupClicked(ACTION_DISPLAY)
|
||||||
|
}
|
||||||
|
|
||||||
val activeFilters = hasActiveFiltersFromPref()
|
val activeFilters = hasActiveFiltersFromPref()
|
||||||
sheetBehavior?.isHideable = !activeFilters
|
sheetBehavior?.isHideable = !activeFilters
|
||||||
@ -334,6 +337,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri
|
|||||||
const val ACTION_REFRESH = 0
|
const val ACTION_REFRESH = 0
|
||||||
const val ACTION_FILTER = 1
|
const val ACTION_FILTER = 1
|
||||||
const val ACTION_HIDE_FILTER_TIP = 2
|
const val ACTION_HIDE_FILTER_TIP = 2
|
||||||
|
const val ACTION_DISPLAY = 3
|
||||||
var FILTER_TRACKER = ""
|
var FILTER_TRACKER = ""
|
||||||
private set
|
private set
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
|
|||||||
import eu.kanade.tachiyomi.util.system.getResourceColor
|
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||||
import eu.kanade.tachiyomi.util.view.gone
|
import eu.kanade.tachiyomi.util.view.gone
|
||||||
import eu.kanade.tachiyomi.util.view.invisible
|
import eu.kanade.tachiyomi.util.view.invisible
|
||||||
|
import eu.kanade.tachiyomi.util.view.resetStrokeColor
|
||||||
import eu.kanade.tachiyomi.util.view.updateLayoutParams
|
import eu.kanade.tachiyomi.util.view.updateLayoutParams
|
||||||
import eu.kanade.tachiyomi.util.view.visible
|
import eu.kanade.tachiyomi.util.view.visible
|
||||||
import eu.kanade.tachiyomi.util.view.visibleIf
|
import eu.kanade.tachiyomi.util.view.visibleIf
|
||||||
@ -233,13 +234,7 @@ class MangaHeaderHolder(
|
|||||||
)
|
)
|
||||||
strokeColor = ColorStateList.valueOf(Color.TRANSPARENT)
|
strokeColor = ColorStateList.valueOf(Color.TRANSPARENT)
|
||||||
} else {
|
} else {
|
||||||
strokeColor = ColorStateList.valueOf(
|
resetStrokeColor()
|
||||||
ColorUtils.setAlphaComponent(
|
|
||||||
itemView.context.getResourceColor(
|
|
||||||
R.attr.colorOnSurface
|
|
||||||
), 31
|
|
||||||
)
|
|
||||||
)
|
|
||||||
backgroundTintList =
|
backgroundTintList =
|
||||||
ContextCompat.getColorStateList(context, android.R.color.transparent)
|
ContextCompat.getColorStateList(context, android.R.color.transparent)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import android.view.ViewGroup
|
|||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
import androidx.recyclerview.widget.ItemTouchHelper
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.bluelinelabs.conductor.Controller
|
import com.bluelinelabs.conductor.Controller
|
||||||
import com.bluelinelabs.conductor.ControllerChangeHandler
|
import com.bluelinelabs.conductor.ControllerChangeHandler
|
||||||
import com.bluelinelabs.conductor.ControllerChangeType
|
import com.bluelinelabs.conductor.ControllerChangeType
|
||||||
@ -51,6 +52,7 @@ import kotlin.math.max
|
|||||||
class RecentsController(bundle: Bundle? = null) : BaseController(bundle),
|
class RecentsController(bundle: Bundle? = null) : BaseController(bundle),
|
||||||
RecentMangaAdapter.RecentsInterface,
|
RecentMangaAdapter.RecentsInterface,
|
||||||
FlexibleAdapter.OnItemClickListener,
|
FlexibleAdapter.OnItemClickListener,
|
||||||
|
FlexibleAdapter.OnItemMoveListener,
|
||||||
RootSearchInterface {
|
RootSearchInterface {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@ -101,7 +103,7 @@ class RecentsController(bundle: Bundle? = null) : BaseController(bundle),
|
|||||||
val array = view.context.obtainStyledAttributes(attrsArray)
|
val array = view.context.obtainStyledAttributes(attrsArray)
|
||||||
val appBarHeight = array.getDimensionPixelSize(0, 0)
|
val appBarHeight = array.getDimensionPixelSize(0, 0)
|
||||||
array.recycle()
|
array.recycle()
|
||||||
scrollViewWith(recycler, skipFirstSnap = true) {
|
scrollViewWith(recycler, skipFirstSnap = true, swipeRefreshLayout = swipe_refresh) {
|
||||||
headerHeight = it.systemWindowInsetTop + appBarHeight
|
headerHeight = it.systemWindowInsetTop + appBarHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,12 +156,32 @@ class RecentsController(bundle: Bundle? = null) : BaseController(bundle),
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
swipe_refresh.setOnRefreshListener {
|
||||||
|
if (!LibraryUpdateService.isRunning()) {
|
||||||
|
LibraryUpdateService.start(view.context)
|
||||||
|
snack = view.snack(R.string.updating_library) {
|
||||||
|
anchorView = (activity as? MainActivity)?.bottom_nav
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (showingDownloads) {
|
if (showingDownloads) {
|
||||||
dl_bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
|
dl_bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
|
||||||
}
|
}
|
||||||
setPadding(dl_bottom_sheet.sheetBehavior?.isHideable == true)
|
setPadding(dl_bottom_sheet.sheetBehavior?.isHideable == true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onItemMove(fromPosition: Int, toPosition: Int) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun shouldMoveItem(fromPosition: Int, toPosition: Int): Boolean {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActionStateChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
|
||||||
|
swipe_refresh.isEnabled = actionState != ItemTouchHelper.ACTION_STATE_SWIPE
|
||||||
|
}
|
||||||
|
|
||||||
override fun handleRootBack(): Boolean {
|
override fun handleRootBack(): Boolean {
|
||||||
if (dl_bottom_sheet.sheetBehavior?.state == BottomSheetBehavior.STATE_EXPANDED) {
|
if (dl_bottom_sheet.sheetBehavior?.state == BottomSheetBehavior.STATE_EXPANDED) {
|
||||||
dl_bottom_sheet.dismiss()
|
dl_bottom_sheet.dismiss()
|
||||||
|
@ -39,7 +39,7 @@ class SettingsSourcesController : SettingsController(),
|
|||||||
private var sorting = SourcesSort.Alpha
|
private var sorting = SourcesSort.Alpha
|
||||||
|
|
||||||
override fun setupPreferenceScreen(screen: PreferenceScreen) = with(screen) {
|
override fun setupPreferenceScreen(screen: PreferenceScreen) = with(screen) {
|
||||||
titleRes = R.string.pref_category_sources
|
titleRes = R.string.action_filter
|
||||||
sorting = SourcesSort.from(preferences.sourceSorting().getOrDefault()) ?: SourcesSort.Alpha
|
sorting = SourcesSort.from(preferences.sourceSorting().getOrDefault()) ?: SourcesSort.Alpha
|
||||||
activity?.invalidateOptionsMenu()
|
activity?.invalidateOptionsMenu()
|
||||||
// Get the list of active language codes.
|
// Get the list of active language codes.
|
||||||
|
@ -4,6 +4,7 @@ package eu.kanade.tachiyomi.util.view
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.res.ColorStateList
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.Point
|
import android.graphics.Point
|
||||||
@ -20,6 +21,7 @@ import android.widget.ImageView
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.Px
|
import androidx.annotation.Px
|
||||||
import androidx.appcompat.widget.SearchView
|
import androidx.appcompat.widget.SearchView
|
||||||
|
import androidx.core.graphics.ColorUtils
|
||||||
import androidx.core.math.MathUtils.clamp
|
import androidx.core.math.MathUtils.clamp
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
@ -29,6 +31,7 @@ import com.amulyakhare.textdrawable.TextDrawable
|
|||||||
import com.amulyakhare.textdrawable.util.ColorGenerator
|
import com.amulyakhare.textdrawable.util.ColorGenerator
|
||||||
import com.bluelinelabs.conductor.Controller
|
import com.bluelinelabs.conductor.Controller
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
@ -436,3 +439,13 @@ fun setBottomEdge(view: View, activity: Activity) {
|
|||||||
bottomMargin = marginB + activity.window.decorView.rootWindowInsets.systemWindowInsetBottom
|
bottomMargin = marginB + activity.window.decorView.rootWindowInsets.systemWindowInsetBottom
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun MaterialButton.resetStrokeColor() {
|
||||||
|
strokeColor = ColorStateList.valueOf(
|
||||||
|
ColorUtils.setAlphaComponent(
|
||||||
|
context.getResourceColor(
|
||||||
|
R.attr.colorOnSurface
|
||||||
|
), 31
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
27
app/src/main/res/drawable/fast_scroll_background.xml
Normal file
27
app/src/main/res/drawable/fast_scroll_background.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item
|
||||||
|
android:left="4dp"
|
||||||
|
android:right="4dp"
|
||||||
|
android:bottom="4dp"
|
||||||
|
android:top="4dp">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<corners android:radius="40dp" />
|
||||||
|
<size
|
||||||
|
android:width="25dp"
|
||||||
|
android:height="25dp" />
|
||||||
|
<solid android:color="@color/gray_button" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:left="10dp"
|
||||||
|
android:bottom="4dp"
|
||||||
|
android:top="4dp">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<size
|
||||||
|
android:width="0dp"
|
||||||
|
android:height="25dp" />
|
||||||
|
<solid android:color="@color/gray_button" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
6
app/src/main/res/drawable/ic_drag_handle_black_24dp.xml
Normal file
6
app/src/main/res/drawable/ic_drag_handle_black_24dp.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<vector android:height="24dp"
|
||||||
|
android:viewportHeight="24.0" android:viewportWidth="24.0"
|
||||||
|
android:alpha=".38"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="#FF000000" android:pathData="M20,9H4v2h16V9zM4,15h16v-2H4v2z"/>
|
||||||
|
</vector>
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:shape="rectangle">
|
android:shape="rectangle">
|
||||||
<corners android:radius="13dp"/>
|
<corners android:radius="25dp"/>
|
||||||
<size
|
<size
|
||||||
android:height="25dp"
|
android:height="25dp"
|
||||||
android:width="25dp" />
|
android:width="25dp" />
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:srcCompat="@drawable/ic_reorder_grey_24dp" />
|
app:srcCompat="@drawable/ic_drag_handle_black_24dp" />
|
||||||
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/diplay_bottom_sheet"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/diplay_bottom_sheet"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
@ -32,23 +32,25 @@
|
|||||||
android:id="@+id/display_group"
|
android:id="@+id/display_group"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="horizontal"
|
||||||
android:paddingStart="12dp"
|
android:paddingStart="12dp"
|
||||||
android:paddingEnd="12dp">
|
android:paddingEnd="12dp">
|
||||||
|
|
||||||
<com.google.android.material.radiobutton.MaterialRadioButton
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/action_display_list" />
|
android:text="@string/action_display_list" />
|
||||||
|
|
||||||
<com.google.android.material.radiobutton.MaterialRadioButton
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
android:text="@string/action_display_grid" />
|
android:text="@string/action_display_grid" />
|
||||||
|
|
||||||
<com.google.android.material.radiobutton.MaterialRadioButton
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
android:text="@string/action_display_comfy_grid" />
|
android:text="@string/action_display_comfy_grid" />
|
||||||
</RadioGroup>
|
</RadioGroup>
|
||||||
|
|
||||||
@ -90,6 +92,7 @@
|
|||||||
<com.google.android.material.checkbox.MaterialCheckBox
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
android:id="@+id/uniform_grid"
|
android:id="@+id/uniform_grid"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
android:visibility="gone"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="12dp"
|
android:layout_marginStart="12dp"
|
||||||
android:layout_marginEnd="12dp"
|
android:layout_marginEnd="12dp"
|
||||||
@ -102,7 +105,45 @@
|
|||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="12dp"
|
||||||
android:paddingStart="16dp"
|
android:paddingStart="16dp"
|
||||||
android:paddingEnd="12dp"
|
android:paddingEnd="12dp"
|
||||||
android:text="@string/badges" />
|
android:text="@string/action_display_unread_badge" />
|
||||||
|
|
||||||
|
<RadioGroup
|
||||||
|
android:id="@+id/unread_badge_group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingStart="12dp"
|
||||||
|
android:paddingEnd="12dp">
|
||||||
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:text="@string/hide_badges" />
|
||||||
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:text="@string/show_badges" />
|
||||||
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:maxLines="2"
|
||||||
|
android:text="@string/show_count" />
|
||||||
|
</RadioGroup>
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.MaterialComponents.Headline6"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:paddingEnd="12dp"
|
||||||
|
android:text="@string/more" />
|
||||||
|
|
||||||
<com.google.android.material.checkbox.MaterialCheckBox
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
android:id="@+id/download_badge"
|
android:id="@+id/download_badge"
|
||||||
@ -112,31 +153,21 @@
|
|||||||
android:layout_marginEnd="12dp"
|
android:layout_marginEnd="12dp"
|
||||||
android:text="@string/action_display_download_badge" />
|
android:text="@string/action_display_download_badge" />
|
||||||
|
|
||||||
<RadioGroup
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
android:id="@+id/unread_badge_group"
|
android:id="@+id/autohide_seeker"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:layout_marginStart="12dp"
|
||||||
android:paddingStart="12dp"
|
android:layout_marginEnd="12dp"
|
||||||
android:paddingEnd="12dp">
|
android:text="@string/auto_hide_category_seeker" />
|
||||||
|
|
||||||
<com.google.android.material.radiobutton.MaterialRadioButton
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:maxLines="2"
|
|
||||||
android:text="@string/hide_unread" />
|
|
||||||
|
|
||||||
<com.google.android.material.radiobutton.MaterialRadioButton
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/show_unread" />
|
|
||||||
|
|
||||||
<com.google.android.material.radiobutton.MaterialRadioButton
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/show_unread_count" />
|
|
||||||
</RadioGroup>
|
|
||||||
|
|
||||||
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
|
android:id="@+id/hide_filters"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="12dp"
|
||||||
|
android:layout_marginEnd="12dp"
|
||||||
|
android:text="@string/action_start_filters_hidden" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
||||||
|
|
||||||
@ -144,10 +175,10 @@
|
|||||||
android:id="@+id/close_button"
|
android:id="@+id/close_button"
|
||||||
android:layout_width="32dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="32dp"
|
android:layout_height="32dp"
|
||||||
android:background="@drawable/round_ripple"
|
|
||||||
android:layout_gravity="end"
|
android:layout_gravity="end"
|
||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="12dp"
|
||||||
android:layout_marginEnd="12dp"
|
android:layout_marginEnd="12dp"
|
||||||
|
android:background="@drawable/round_ripple"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:contentDescription="@string/action_close"
|
android:contentDescription="@string/action_close"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:srcCompat="@drawable/ic_reorder_grey_24dp" />
|
app:srcCompat="@drawable/ic_drag_handle_black_24dp" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/manga_full_title"
|
android:id="@+id/manga_full_title"
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
app:layout_constraintStart_toEndOf="@id/lang"
|
app:layout_constraintStart_toEndOf="@id/lang"
|
||||||
tools:text="Version" />
|
tools:text="Version" />
|
||||||
|
|
||||||
<Button
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/ext_button"
|
android:id="@+id/ext_button"
|
||||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -29,10 +29,10 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="2dp"
|
android:layout_marginTop="2dp"
|
||||||
|
android:requiresFadingEdge="horizontal"
|
||||||
|
android:fadingEdgeLength="20dp"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:paddingStart="10dp"
|
|
||||||
android:paddingTop="8dp"
|
android:paddingTop="8dp"
|
||||||
android:paddingEnd="20dp"
|
|
||||||
android:paddingBottom="6dp"
|
android:paddingBottom="6dp"
|
||||||
android:scrollbars="none">
|
android:scrollbars="none">
|
||||||
|
|
||||||
@ -41,6 +41,8 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
|
android:paddingStart="10dp"
|
||||||
|
android:paddingEnd="20dp"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
@ -73,11 +75,22 @@
|
|||||||
android:layout_marginEnd="20dp"
|
android:layout_marginEnd="20dp"
|
||||||
android:text="@string/action_hide_categories" />
|
android:text="@string/action_hide_categories" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/view_options"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
style="@style/Theme.Widget.Button.TextButton"
|
||||||
|
android:text="@string/action_view_options"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
|
app:icon="@drawable/ic_tune_white_24dp"
|
||||||
|
app:iconTint="?android:attr/textColorPrimary"
|
||||||
|
/>
|
||||||
|
|
||||||
<com.google.android.material.checkbox.MaterialCheckBox
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
android:id="@+id/hide_filters"
|
android:id="@+id/hide_filters"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
android:layout_marginEnd="20dp"
|
android:layout_marginEnd="20dp"
|
||||||
android:text="@string/action_start_filters_hidden" />
|
android:text="@string/action_start_filters_hidden" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -1,31 +1,61 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/library_layout"
|
android:id="@+id/library_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
android:id="@+id/swipe_refresh"
|
android:id="@+id/swipe_refresh"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
<FrameLayout
|
|
||||||
android:id="@+id/recycler_layout"
|
<FrameLayout
|
||||||
|
android:id="@+id/recycler_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<include layout="@layout/library_grid_recycler" />
|
||||||
|
</FrameLayout>
|
||||||
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<include layout="@layout/library_grid_recycler"/>
|
<com.reddit.indicatorfastscroll.FastScrollerView
|
||||||
</FrameLayout>
|
android:id="@+id/fast_scroller"
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
android:textColor="?android:attr/textColorPrimaryInverse"
|
||||||
|
android:layout_width="22dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:elevation="10dp"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:background="@drawable/fast_scroll_background"
|
||||||
|
android:paddingTop="8dp"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:paddingStart="3dp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
android:id="@+id/text_view_m"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:alpha="0"
|
||||||
|
tools:alpha="1"
|
||||||
|
android:layout_marginEnd="50dp"
|
||||||
|
android:background="@drawable/round_textview_background"
|
||||||
|
android:backgroundTint="@color/md_grey_800_50"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/fast_scroller"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/fast_scroller"
|
||||||
|
tools:text="sdfsdf" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<eu.davidea.fastscroller.FastScroller
|
|
||||||
android:id="@+id/fast_scroller"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
app:fastScrollerIgnoreTouchesOutsideHandle="true"
|
|
||||||
app:fastScrollerBubbleEnabled="false"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
<eu.kanade.tachiyomi.widget.EmptyView
|
<eu.kanade.tachiyomi.widget.EmptyView
|
||||||
android:id="@+id/empty_view"
|
android:id="@+id/empty_view"
|
||||||
@ -33,6 +63,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:visibility="gone" />
|
android:visibility="gone" />
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/shadow"
|
android:id="@+id/shadow"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -40,11 +71,11 @@
|
|||||||
android:alpha="0.5"
|
android:alpha="0.5"
|
||||||
android:background="@drawable/shape_gradient_top_shadow"
|
android:background="@drawable/shape_gradient_top_shadow"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="10dp"
|
||||||
app:layout_anchorGravity="top"
|
app:layout_anchor="@id/bottom_sheet"
|
||||||
app:layout_anchor="@id/bottom_sheet" />
|
app:layout_anchorGravity="top" />
|
||||||
|
|
||||||
<!-- Adding bottom sheet after main content -->
|
<!-- Adding bottom sheet after main content -->
|
||||||
<include layout="@layout/filter_bottom_sheet"/>
|
<include layout="@layout/filter_bottom_sheet" />
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
android:id="@+id/fab"
|
android:id="@+id/fab"
|
||||||
@ -54,8 +85,8 @@
|
|||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:scaleX="0"
|
android:scaleX="0"
|
||||||
android:scaleY="0"
|
android:scaleY="0"
|
||||||
app:layout_anchor="@id/bottom_sheet"
|
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
|
app:layout_anchor="@id/bottom_sheet"
|
||||||
app:layout_anchorGravity="end|top"
|
app:layout_anchorGravity="end|top"
|
||||||
app:srcCompat="@drawable/ic_file_download_white_24dp" />
|
app:srcCompat="@drawable/ic_file_download_white_24dp" />
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@
|
|||||||
android:id="@+id/dropdown"
|
android:id="@+id/dropdown"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginStart="4dp"
|
android:layout_marginStart="4dp"
|
||||||
android:background="@drawable/round_ripple"
|
android:background="@drawable/round_ripple"
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:gravity="center"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Body2"
|
|
||||||
android:background="@drawable/round_textview_background"
|
|
||||||
android:textColor="#FFFFFF"
|
|
||||||
android:layout_marginTop="12dp"
|
|
||||||
android:layout_marginBottom="12dp"
|
|
||||||
android:textStyle="bold"
|
|
||||||
android:layout_marginStart="12dp"
|
|
||||||
android:paddingStart="4dp"
|
|
||||||
android:paddingEnd="4dp"/>
|
|
@ -37,7 +37,7 @@
|
|||||||
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
|
android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height"
|
||||||
android:scaleType="center"
|
android:scaleType="center"
|
||||||
android:layout_gravity="end"
|
android:layout_gravity="end"
|
||||||
app:srcCompat="@drawable/ic_reorder_grey_24dp"
|
app:srcCompat="@drawable/ic_drag_handle_black_24dp"
|
||||||
android:tint="?android:attr/textColorPrimary"/>
|
android:tint="?android:attr/textColorPrimary"/>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
@ -1,25 +1,31 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/recents_layout"
|
android:id="@+id/recents_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
|
||||||
|
|
||||||
<FrameLayout
|
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||||
android:id="@+id/frame_layout"
|
android:id="@+id/swipe_refresh"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:background="?android:attr/colorBackground">
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<FrameLayout
|
||||||
android:id="@+id/recycler"
|
android:id="@+id/frame_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:clipToPadding="false"
|
android:background="?android:attr/colorBackground">
|
||||||
tools:listitem="@layout/catalogue_main_controller_card" />
|
|
||||||
|
|
||||||
</FrameLayout>
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
tools:listitem="@layout/catalogue_main_controller_card" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/shadow"
|
android:id="@+id/shadow"
|
||||||
@ -28,10 +34,10 @@
|
|||||||
android:alpha="0.5"
|
android:alpha="0.5"
|
||||||
android:background="@drawable/shape_gradient_top_shadow"
|
android:background="@drawable/shape_gradient_top_shadow"
|
||||||
android:paddingBottom="10dp"
|
android:paddingBottom="10dp"
|
||||||
app:layout_anchorGravity="top"
|
app:layout_anchor="@id/dl_bottom_sheet"
|
||||||
app:layout_anchor="@id/dl_bottom_sheet" />
|
app:layout_anchorGravity="top" />
|
||||||
<!-- Adding bottom sheet after main content -->
|
<!-- Adding bottom sheet after main content -->
|
||||||
<include layout="@layout/download_bottom_sheet"/>
|
<include layout="@layout/download_bottom_sheet" />
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:id="@+id/shadow2"
|
android:id="@+id/shadow2"
|
||||||
|
@ -17,7 +17,8 @@
|
|||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_open_in_web_view"
|
android:id="@+id/action_open_in_web_view"
|
||||||
|
android:icon="@drawable/ic_open_in_webview_white_24dp"
|
||||||
android:title="@string/action_open_in_web_view"
|
android:title="@string/action_open_in_web_view"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
|
@ -11,14 +11,14 @@
|
|||||||
app:actionViewClass="androidx.appcompat.widget.SearchView"/>
|
app:actionViewClass="androidx.appcompat.widget.SearchView"/>
|
||||||
|
|
||||||
<item android:id="@+id/action_filter"
|
<item android:id="@+id/action_filter"
|
||||||
android:title="@string/action_change_sources"
|
android:title="@string/action_filter"
|
||||||
android:icon="@drawable/ic_filter_list_white_24dp"
|
android:icon="@drawable/ic_filter_list_white_24dp"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="ifRoom"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_settings"
|
android:id="@+id/action_settings"
|
||||||
android:icon="@drawable/ic_settings_white_24dp"
|
android:icon="@drawable/ic_settings_white_24dp"
|
||||||
android:title="@string/label_settings"
|
android:title="@string/label_settings"
|
||||||
app:showAsAction="never"
|
app:showAsAction="ifRoom"
|
||||||
/>
|
/>
|
||||||
</menu>
|
</menu>
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_filter"
|
||||||
|
android:title="@string/action_filter"
|
||||||
|
android:icon="@drawable/ic_filter_list_white_24dp"
|
||||||
|
app:showAsAction="always"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_search"
|
android:id="@+id/action_search"
|
||||||
@ -8,12 +13,6 @@
|
|||||||
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
||||||
app:showAsAction="collapseActionView|ifRoom" />
|
app:showAsAction="collapseActionView|ifRoom" />
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/action_filter"
|
|
||||||
android:title="@string/action_filter"
|
|
||||||
android:icon="@drawable/ic_filter_list_white_24dp"
|
|
||||||
app:showAsAction="always"/>
|
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_auto_check"
|
android:id="@+id/action_auto_check"
|
||||||
android:title="@string/action_auto_check_extensions"
|
android:title="@string/action_auto_check_extensions"
|
||||||
|
@ -12,25 +12,19 @@
|
|||||||
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
||||||
app:showAsAction="collapseActionView|ifRoom" />
|
app:showAsAction="collapseActionView|ifRoom" />
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/action_library_filter"
|
|
||||||
android:icon="@drawable/ic_filter_list_white_24dp"
|
|
||||||
android:visible="false"
|
|
||||||
android:title="@string/action_filter"
|
|
||||||
app:showAsAction="ifRoom"/>
|
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_library_display"
|
android:id="@+id/action_library_display"
|
||||||
android:icon="@drawable/ic_tune_white_24dp"
|
android:icon="@drawable/ic_tune_white_24dp"
|
||||||
|
android:visible="false"
|
||||||
android:title="@string/action_view_options"
|
android:title="@string/action_view_options"
|
||||||
app:showAsAction="never"
|
app:showAsAction="ifRoom"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_settings"
|
android:id="@+id/action_settings"
|
||||||
android:icon="@drawable/ic_settings_white_24dp"
|
android:icon="@drawable/ic_settings_white_24dp"
|
||||||
android:title="@string/label_settings"
|
android:title="@string/label_settings"
|
||||||
app:showAsAction="never"
|
app:showAsAction="ifRoom"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
|
@ -13,11 +13,6 @@
|
|||||||
android:icon="@drawable/ic_delete_white_24dp"
|
android:icon="@drawable/ic_delete_white_24dp"
|
||||||
app:showAsAction="ifRoom"/>
|
app:showAsAction="ifRoom"/>
|
||||||
|
|
||||||
<item android:id="@+id/action_select_all"
|
|
||||||
android:title="@string/action_select_all"
|
|
||||||
android:icon="@drawable/ic_select_all_white_24dp"
|
|
||||||
app:showAsAction="ifRoom"/>
|
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_migrate"
|
android:id="@+id/action_migrate"
|
||||||
android:icon="@drawable/ic_swap_calls_white_24dp"
|
android:icon="@drawable/ic_swap_calls_white_24dp"
|
||||||
|
@ -26,14 +26,14 @@
|
|||||||
android:title="@string/action_sort_total"
|
android:title="@string/action_sort_total"
|
||||||
android:icon="@drawable/ic_blank_24dp"/>
|
android:icon="@drawable/ic_blank_24dp"/>
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/action_drag_and_drop"
|
|
||||||
android:title="@string/action_sort_drag_and_drop"
|
|
||||||
android:icon="@drawable/ic_blank_24dp"/>
|
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_date_added"
|
android:id="@+id/action_date_added"
|
||||||
android:title="@string/action_date_added"
|
android:title="@string/action_date_added"
|
||||||
android:icon="@drawable/ic_blank_24dp"/>
|
android:icon="@drawable/ic_blank_24dp"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_drag_and_drop"
|
||||||
|
android:title="@string/action_sort_drag_and_drop"
|
||||||
|
android:icon="@drawable/ic_blank_24dp"/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
@ -12,6 +12,7 @@
|
|||||||
<item
|
<item
|
||||||
android:id="@+id/action_refresh"
|
android:id="@+id/action_refresh"
|
||||||
android:icon="@drawable/ic_refresh_white_24dp"
|
android:icon="@drawable/ic_refresh_white_24dp"
|
||||||
|
android:visible="false"
|
||||||
android:title="@string/action_update_library"
|
android:title="@string/action_update_library"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
@ -19,5 +20,5 @@
|
|||||||
android:id="@+id/action_settings"
|
android:id="@+id/action_settings"
|
||||||
android:icon="@drawable/ic_settings_white_24dp"
|
android:icon="@drawable/ic_settings_white_24dp"
|
||||||
android:title="@string/label_settings"
|
android:title="@string/label_settings"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="ifRoom" />
|
||||||
</menu>
|
</menu>
|
@ -71,6 +71,7 @@
|
|||||||
<color name="md_grey_50">#FAFAFA</color>
|
<color name="md_grey_50">#FAFAFA</color>
|
||||||
<color name="md_grey_200">#CCCCCC</color>
|
<color name="md_grey_200">#CCCCCC</color>
|
||||||
<color name="md_grey_800">#424242</color>
|
<color name="md_grey_800">#424242</color>
|
||||||
|
<color name="md_grey_800_50">#CF424242</color>
|
||||||
|
|
||||||
<color name="md_blue_A200_50">#80448AFF</color>
|
<color name="md_blue_A200_50">#80448AFF</color>
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
<!-- Actions -->
|
<!-- Actions -->
|
||||||
<string name="action_filter">Filter</string>
|
<string name="action_filter">Filter</string>
|
||||||
<string name="action_change_sources">Change sources</string>
|
<string name="action_change_sources">Change sources</string>
|
||||||
<string name="action_view_options">View options</string>
|
<string name="action_view_options">Display options</string>
|
||||||
<string name="action_filter_downloaded">Downloaded</string>
|
<string name="action_filter_downloaded">Downloaded</string>
|
||||||
<string name="action_filter_not_downloaded">Not downloaded</string>
|
<string name="action_filter_not_downloaded">Not downloaded</string>
|
||||||
<string name="action_filter_bookmarked">Bookmarked</string>
|
<string name="action_filter_bookmarked">Bookmarked</string>
|
||||||
@ -57,7 +57,7 @@
|
|||||||
<string name="action_filter_tracked">Tracked</string>
|
<string name="action_filter_tracked">Tracked</string>
|
||||||
<string name="action_filter_not_tracked">Not tracked</string>
|
<string name="action_filter_not_tracked">Not tracked</string>
|
||||||
<string name="action_hide_categories">Hide categories</string>
|
<string name="action_hide_categories">Hide categories</string>
|
||||||
<string name="action_start_filters_hidden">Start hidden</string>
|
<string name="action_start_filters_hidden">Start with filters hidden</string>
|
||||||
<string name="hiding_categories">Hiding categories</string>
|
<string name="hiding_categories">Hiding categories</string>
|
||||||
<string name="manga_only">Manga only</string>
|
<string name="manga_only">Manga only</string>
|
||||||
<string name="manhwa_only">Manhwa only</string>
|
<string name="manhwa_only">Manhwa only</string>
|
||||||
@ -121,6 +121,7 @@
|
|||||||
<string name="action_display_grid">Compact Grid</string>
|
<string name="action_display_grid">Compact Grid</string>
|
||||||
<string name="action_display_list">List</string>
|
<string name="action_display_list">List</string>
|
||||||
<string name="action_display_download_badge">Download badges</string>
|
<string name="action_display_download_badge">Download badges</string>
|
||||||
|
<string name="auto_hide_category_seeker">Auto-hide category seeker</string>
|
||||||
<string name="action_display_unread_badge">Unread badges</string>
|
<string name="action_display_unread_badge">Unread badges</string>
|
||||||
<string name="action_set_filter">Set filter</string>
|
<string name="action_set_filter">Set filter</string>
|
||||||
<string name="action_cancel">Cancel</string>
|
<string name="action_cancel">Cancel</string>
|
||||||
@ -483,9 +484,9 @@
|
|||||||
<string name="large">Large</string>
|
<string name="large">Large</string>
|
||||||
<string name="grid_options">Grid options</string>
|
<string name="grid_options">Grid options</string>
|
||||||
<string name="badges">Badges</string>
|
<string name="badges">Badges</string>
|
||||||
<string name="hide_unread">Hide unread badges</string>
|
<string name="hide_badges">Hide badges</string>
|
||||||
<string name="show_unread">Show unread badges</string>
|
<string name="show_badges">Show badges</string>
|
||||||
<string name="show_unread_count">Show unread count</string>
|
<string name="show_count">Show count</string>
|
||||||
<string name="hide_filters_tip">To show filters again, tap the Library icon</string>
|
<string name="hide_filters_tip">To show filters again, tap the Library icon</string>
|
||||||
|
|
||||||
<!-- Catalogue fragment -->
|
<!-- Catalogue fragment -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user