"Mat Spinner" for title in library list mode

and spinners for category headers
Also filter sheet is now hidable
Always showing labels on tabs
This commit is contained in:
Jay 2020-02-25 22:55:25 -08:00
parent 6cccdf4459
commit 5454b74685
31 changed files with 281 additions and 159 deletions

View File

@ -20,6 +20,7 @@ interface Category : Serializable {
var mangaSort:Char? var mangaSort:Char?
var isFirst:Boolean? var isFirst:Boolean?
var isLast:Boolean?
val nameLower: String val nameLower: String
get() = name.toLowerCase() get() = name.toLowerCase()
@ -76,6 +77,7 @@ interface Category : Serializable {
fun createDefault(context: Context): Category = fun createDefault(context: Context): Category =
create(context.getString(R.string.default_columns)).apply { create(context.getString(R.string.default_columns)).apply {
id = 0 id = 0
isFirst = true
} }
fun createAll(context: Context, libSort: Int, ascending: Boolean): Category = fun createAll(context: Context, libSort: Int, ascending: Boolean): Category =
@ -95,6 +97,7 @@ interface Category : Serializable {
} }
order = -1 order = -1
isFirst = true isFirst = true
isLast = true
} }
} }

View File

@ -16,6 +16,8 @@ class CategoryImpl : Category {
override var isFirst: Boolean? = null override var isFirst: Boolean? = null
override var isLast: Boolean? = null
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (other == null || javaClass != other.javaClass) return false if (other == null || javaClass != other.javaClass) return false

View File

@ -96,8 +96,8 @@ interface Manga : SManga {
const val DISPLAY_NUMBER = 0x00100000 const val DISPLAY_NUMBER = 0x00100000
const val DISPLAY_MASK = 0x00100000 const val DISPLAY_MASK = 0x00100000
const val TYPE_MANGA = 1 const val TYPE_MANGA = 0
const val TYPE_MANHWA = 2 const val TYPE_MANHWA = 1
fun create(source: Long): Manga = MangaImpl().apply { fun create(source: Long): Manga = MangaImpl().apply {
this.source = source this.source = source

View File

@ -243,12 +243,5 @@ class PreferencesHelper(val context: Context) {
fun keepCatSort() = rxPrefs.getInteger(Keys.keepCatSort, 0) fun keepCatSort() = rxPrefs.getInteger(Keys.keepCatSort, 0)
fun upgradeFilters() { fun hideFiltersAtStart() = rxPrefs.getBoolean("hide_filters_at_start", false)
val filterDl = rxPrefs.getBoolean(Keys.filterDownloaded, false).getOrDefault()
val filterUn = rxPrefs.getBoolean(Keys.filterUnread, false).getOrDefault()
val filterCm = rxPrefs.getBoolean(Keys.filterCompleted, false).getOrDefault()
filterDownloaded().set(if (filterDl) 1 else 0)
filterUnread().set(if (filterUn) 1 else 0)
filterCompleted().set(if (filterCm) 1 else 0)
}
} }

View File

@ -23,7 +23,7 @@ class LibraryBadge @JvmOverloads constructor(context: Context, attrs: AttributeS
context.getResourceColor(android.R.attr.colorAccent) context.getResourceColor(android.R.attr.colorAccent)
else Color.WHITE) else Color.WHITE)
setBackgroundColor( setBackgroundColor(
if (showTotalChapters) ContextCompat.getColor(context, R.color.md_red_500) if (showTotalChapters) ContextCompat.getColor(context, R.color.total_green)
else context.getResourceColor(android.R.attr.colorAccent)) else context.getResourceColor(android.R.attr.colorAccent))
visibility = when { visibility = when {
unread > 0 || unread == -1 || showTotalChapters -> View.VISIBLE unread > 0 || unread == -1 || showTotalChapters -> View.VISIBLE
@ -47,7 +47,7 @@ class LibraryBadge @JvmOverloads constructor(context: Context, attrs: AttributeS
unread_angle.visibility = if (download_text.visibility == View.VISIBLE && unread_text unread_angle.visibility = if (download_text.visibility == View.VISIBLE && unread_text
.visibility != View.GONE) View.VISIBLE else View.GONE .visibility != View.GONE) View.VISIBLE else View.GONE
unread_angle.setColorFilter( unread_angle.setColorFilter(
if (showTotalChapters) ContextCompat.getColor(context, R.color.md_red_500) if (showTotalChapters) ContextCompat.getColor(context, R.color.total_green)
else context.getResourceColor(android.R.attr.colorAccent)) else context.getResourceColor(android.R.attr.colorAccent))
if (unread_angle.visibility == View.VISIBLE) { if (unread_angle.visibility == View.VISIBLE) {
download_text.updatePaddingRelative(end = 8.dpToPx) download_text.updatePaddingRelative(end = 8.dpToPx)

View File

@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.ui.library package eu.kanade.tachiyomi.ui.library
import android.view.View
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.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
@ -181,5 +182,6 @@ class LibraryCategoryAdapter(val libraryListener: LibraryListener) :
fun sortCategory(catId: Int, sortBy: Int) fun sortCategory(catId: Int, sortBy: Int)
fun selectAll(position: Int) fun selectAll(position: Int)
fun allSelected(position: Int): Boolean fun allSelected(position: Int): Boolean
fun showCategories(position: Int, view: View)
} }
} }

View File

@ -398,4 +398,5 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
override fun sortCategory(catId: Int, sortBy: Int) { } override fun sortCategory(catId: Int, sortBy: Int) { }
override fun selectAll(position: Int) { } override fun selectAll(position: Int) { }
override fun allSelected(position: Int): Boolean = false override fun allSelected(position: Int): Boolean = false
override fun showCategories(position: Int, view: View) { }
} }

View File

@ -122,6 +122,8 @@ open class LibraryController(
val stopRefreshRelay: PublishRelay<Boolean> = PublishRelay.create() val stopRefreshRelay: PublishRelay<Boolean> = PublishRelay.create()
protected var phoneLandscape = false
/** /**
* Number of manga per row in grid mode. * Number of manga per row in grid mode.
*/ */
@ -206,6 +208,11 @@ open class LibraryController(
fab.isFocusable = true fab.isFocusable = true
} }
val config = resources?.configuration
phoneLandscape = (config?.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(config.screenLayout.and(Configuration.SCREENLAYOUT_SIZE_MASK)) <
Configuration.SCREENLAYOUT_SIZE_LARGE)
presenter.onRestore() presenter.onRestore()
val library = presenter.getAllManga() val library = presenter.getAllManga()
if (library != null) presenter.updateViewBlocking() if (library != null) presenter.updateViewBlocking()
@ -457,13 +464,6 @@ open class LibraryController(
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.library, menu) inflater.inflate(R.menu.library, menu)
val config = resources?.configuration
val phoneLandscape = (config?.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(config.screenLayout.and(Configuration.SCREENLAYOUT_SIZE_MASK)) <
Configuration.SCREENLAYOUT_SIZE_LARGE)
menu.findItem(R.id.action_library_filter).isVisible = phoneLandscape
val searchItem = menu.findItem(R.id.action_search) val searchItem = menu.findItem(R.id.action_search)
val searchView = searchItem.actionView as SearchView val searchView = searchItem.actionView as SearchView
searchView.queryHint = resources?.getString(R.string.search_hint) searchView.queryHint = resources?.getString(R.string.search_hint)
@ -492,7 +492,8 @@ open class LibraryController(
override fun handleRootBack(): Boolean { override fun handleRootBack(): Boolean {
val sheetBehavior = BottomSheetBehavior.from(bottom_sheet) val sheetBehavior = BottomSheetBehavior.from(bottom_sheet)
if (sheetBehavior.state != BottomSheetBehavior.STATE_COLLAPSED) { if (sheetBehavior.state != BottomSheetBehavior.STATE_COLLAPSED &&
sheetBehavior.state != BottomSheetBehavior.STATE_HIDDEN) {
sheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED sheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
return true return true
} }
@ -514,7 +515,10 @@ open class LibraryController(
when (item.itemId) { when (item.itemId) {
R.id.action_search -> expandActionViewFromInteraction = true R.id.action_search -> expandActionViewFromInteraction = true
R.id.action_library_filter -> { R.id.action_library_filter -> {
if (bottom_sheet.sheetBehavior?.state != BottomSheetBehavior.STATE_COLLAPSED) if (bottom_sheet.sheetBehavior?.isHideable == true &&
bottom_sheet.sheetBehavior?.state == BottomSheetBehavior.STATE_EXPANDED)
bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_HIDDEN
else if (bottom_sheet.sheetBehavior?.state != BottomSheetBehavior.STATE_COLLAPSED)
bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED
else bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED else bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
} }
@ -524,6 +528,12 @@ open class LibraryController(
return true return true
} }
fun showFiltersBottomSheet() {
if (bottom_sheet.sheetBehavior?.state == BottomSheetBehavior.STATE_HIDDEN)
bottom_sheet.sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED
}
/** /**
* Invalidates the action mode, forcing it to refresh its content. * Invalidates the action mode, forcing it to refresh its content.
*/ */

View File

@ -55,28 +55,6 @@ class LibraryGridHolder(
title.text = item.manga.currentTitle() title.text = item.manga.currentTitle()
subtitle.text = item.manga.originalAuthor()?.trim() subtitle.text = item.manga.originalAuthor()?.trim()
/* if (!fixedSize) {
title.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
title.viewTreeObserver.removeOnPreDrawListener(this)
// Drawing happens after layout so we can assume getLineCount() returns the correct value
val marginParams = title.layoutParams as ConstraintLayout.LayoutParams
if (title.lineCount == 2) {
// Do whatever you want in case text view has more than 2 lines
subtitle.gone()
marginParams.bottomMargin = 10.dpToPx
marginParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
} else {
subtitle.visible()
marginParams.bottomMargin = 0
marginParams.bottomToBottom = -1
}
title.layoutParams = marginParams
return true
}
})
}*/
compact_title.text = title.text compact_title.text = title.text
setUnreadBadge(badge_view, item) setUnreadBadge(badge_view, item)

View File

@ -78,15 +78,20 @@ class LibraryHeaderItem(private val categoryF: (Int) -> Category, val catId: Int
private val sortText: TextView = view.findViewById(R.id.category_sort) private val sortText: TextView = view.findViewById(R.id.category_sort)
private val updateButton: ImageView = view.findViewById(R.id.update_button) private val updateButton: ImageView = view.findViewById(R.id.update_button)
private val checkboxImage: ImageView = view.findViewById(R.id.checkbox) private val checkboxImage: ImageView = view.findViewById(R.id.checkbox)
private val dropDown:Drawable?
init { init {
updateButton.setOnClickListener { addCategoryToUpdate() } updateButton.setOnClickListener { addCategoryToUpdate() }
sortText.setOnClickListener { it.post { showCatSortOptions() } } sortText.setOnClickListener { it.post { showCatSortOptions() } }
checkboxImage.setOnClickListener { selectAll() } checkboxImage.setOnClickListener { selectAll() }
sectionText.setOnClickListener { it.post {
adapter.libraryListener.showCategories(adapterPosition, it)
} }
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
sortText.compoundDrawablesRelative[2]?.mutate()?.setTint( sortText.compoundDrawablesRelative[2]?.mutate()?.setTint(
ContextCompat.getColor(contentView.context, R.color.gray_button)) ContextCompat.getColor(contentView.context, R.color.gray_button))
} }
dropDown = sectionText.compoundDrawablesRelative[2]
updateButton.drawable.mutate() updateButton.drawable.mutate()
} }
@ -94,8 +99,14 @@ class LibraryHeaderItem(private val categoryF: (Int) -> Category, val catId: Int
sectionText.updateLayoutParams<ConstraintLayout.LayoutParams> { sectionText.updateLayoutParams<ConstraintLayout.LayoutParams> {
topMargin = (if (category.isFirst == true) 2 else 32).dpToPx topMargin = (if (category.isFirst == true) 2 else 32).dpToPx
} }
if (category.isFirst == true && category.isLast == true)
sectionText.setCompoundDrawablesRelative(null, null, null, null)
else
sectionText.setCompoundDrawablesRelative(null, null, dropDown, null)
sectionText.text = category.name sectionText.text = category.name
sortText.text = itemView.context.getString( sortText.text = itemView.context.getString(R.string.sort_by_,
itemView.context.getString(
when (category.sortingMode()) { when (category.sortingMode()) {
LibrarySort.LAST_UPDATED -> R.string.action_sort_last_updated LibrarySort.LAST_UPDATED -> R.string.action_sort_last_updated
LibrarySort.DRAG_AND_DROP -> LibrarySort.DRAG_AND_DROP ->
@ -107,7 +118,7 @@ class LibraryHeaderItem(private val categoryF: (Int) -> Category, val catId: Int
LibrarySort.ALPHA -> R.string.title LibrarySort.ALPHA -> R.string.title
else -> R.string.action_sort_drag_and_drop else -> R.string.action_sort_drag_and_drop
} }
) ))
when { when {
adapter.mode == SelectableAdapter.Mode.MULTI -> { adapter.mode == SelectableAdapter.Mode.MULTI -> {

View File

@ -63,6 +63,7 @@ class LibraryItem(val manga: LibraryManga,
) )
} else if (libraryLayout == 2) { } else if (libraryLayout == 2) {
constraint_layout.minHeight = coverHeight constraint_layout.minHeight = coverHeight
cover_thumbnail.minimumHeight = (parent.itemWidth / 3f * 3.6f).toInt()
cover_thumbnail.maxHeight = (parent.itemWidth / 3f * 6f).toInt() cover_thumbnail.maxHeight = (parent.itemWidth / 3f * 6f).toInt()
constraint_layout.background = ContextCompat.getDrawable( constraint_layout.background = ContextCompat.getDrawable(
context, R.drawable.library_item_selector context, R.drawable.library_item_selector

View File

@ -1,19 +1,20 @@
package eu.kanade.tachiyomi.ui.library package eu.kanade.tachiyomi.ui.library
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Spinner import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat
import androidx.core.math.MathUtils import androidx.core.math.MathUtils
import androidx.core.math.MathUtils.clamp
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -38,13 +39,13 @@ import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.updatePaddingRelative
import eu.kanade.tachiyomi.widget.AutofitRecyclerView import eu.kanade.tachiyomi.widget.AutofitRecyclerView
import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener
import kotlinx.android.synthetic.main.filter_bottom_sheet.* import kotlinx.android.synthetic.main.filter_bottom_sheet.*
import kotlinx.android.synthetic.main.library_list_controller.* import kotlinx.android.synthetic.main.library_list_controller.*
import kotlinx.android.synthetic.main.main_activity.* import kotlinx.android.synthetic.main.main_activity.*
import kotlinx.android.synthetic.main.spinner_title.view.*
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import java.util.Locale import java.util.Locale
import kotlin.math.min import kotlin.math.max
class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle), class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemClickListener,
@ -54,7 +55,7 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
private lateinit var adapter: LibraryCategoryAdapter private lateinit var adapter: LibraryCategoryAdapter
private lateinit var spinner: Spinner // private lateinit var spinner: AutoCompleteTextView
private var lastClickPosition = -1 private var lastClickPosition = -1
@ -64,13 +65,16 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
private var lastItemPosition:Int? = null private var lastItemPosition:Int? = null
private var lastItem:IFlexible<*>? = null private var lastItem:IFlexible<*>? = null
private var lastHeaderPos = 0
private lateinit var customTitleSpinner: LinearLayout
private lateinit var titlePopupMenu:PopupMenu
/** /**
* Recycler view of the list of manga. * Recycler view of the list of manga.
*/ */
private lateinit var recycler: RecyclerView private lateinit var recycler: RecyclerView
override fun contentView():View = recycler_layout override fun contentView():View = recycler
override fun getTitle(): String? { override fun getTitle(): String? {
return when { return when {
@ -97,22 +101,18 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
bottom_sheet.lastCategory = category bottom_sheet.lastCategory = category
bottom_sheet.updateTitle() bottom_sheet.updateTitle()
val categortPosition = presenter.categories.indexOf(category) //val categortPosition = presenter.categories.indexOf(category)
if (spinner.selectedItemPosition != categortPosition) { customTitleSpinner.category_title.text = category?.name ?: ""
/*if (spinner.selectedItemPosition != categortPosition) {
updateScroll = true updateScroll = true
spinner.setSelection(categortPosition, true) spinner.setSelection(categortPosition, true)
} }*/
} }
} }
} }
override fun onViewCreated(view: View) { override fun onViewCreated(view: View) {
super.onViewCreated(view) super.onViewCreated(view)
val config = resources?.configuration
val phoneLandscape = (config?.orientation == Configuration.ORIENTATION_LANDSCAPE &&
(config.screenLayout.and(Configuration.SCREENLAYOUT_SIZE_MASK)) <
Configuration.SCREENLAYOUT_SIZE_LARGE)
// pad the recycler if the filter bottom sheet is visible // pad the recycler if the filter bottom sheet is visible
if (!phoneLandscape) { if (!phoneLandscape) {
val height = view.context.resources.getDimensionPixelSize(R.dimen.rounder_radius) + 4.dpToPx val height = view.context.resources.getDimensionPixelSize(R.dimen.rounder_radius) + 4.dpToPx
@ -128,7 +128,7 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
override fun layoutView(view: View) { override fun layoutView(view: View) {
adapter = LibraryCategoryAdapter(this) adapter = LibraryCategoryAdapter(this)
recycler = recycler =
(recycler_layout.inflate(R.layout.library_grid_recycler) as AutofitRecyclerView).apply { (library_layout.inflate(R.layout.library_grid_recycler) as AutofitRecyclerView).apply {
spanCount = if (libraryLayout == 0) 1 else mangaPerRow spanCount = if (libraryLayout == 0) 1 else mangaPerRow
manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() { manager.spanSizeLookup = (object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int { override fun getSpanSize(position: Int): Int {
@ -141,27 +141,42 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
recycler.setHasFixedSize(true) recycler.setHasFixedSize(true)
recycler.adapter = adapter recycler.adapter = adapter
recycler_layout.addView(recycler, 0) library_layout.addView(recycler, 0)
adapter.fastScroller = fast_scroller adapter.fastScroller = fast_scroller
recycler.addOnScrollListener(scrollListener) recycler.addOnScrollListener(scrollListener)
spinner = ReSpinner(view.context) /* val dropdown = library_layout.inflate(R.layout.expanded_dropdown_menu) as
TextInputLayout // ReSpinner(view .context)
spinner = dropdown.filled_exposed_dropdown*/
val tv = TypedValue() val tv = TypedValue()
activity!!.theme.resolveAttribute(R.attr.actionBarTintColor, tv, true) activity!!.theme.resolveAttribute(R.attr.actionBarTintColor, tv, true)
spinner.backgroundTintList = ContextCompat.getColorStateList( /*spinner.backgroundTintList = ContextCompat.getColorStateList(
view.context, tv.resourceId view.context, tv.resourceId
) )
(activity as MainActivity).supportActionBar?.customView = spinner (spinner.parent.parent as ViewGroup).removeView(spinner.parent as View)
(activity as MainActivity).supportActionBar?.customView = spinner.parent as View*/
customTitleSpinner = library_layout.inflate(R.layout.spinner_title) as LinearLayout
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false) (activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false)
spinnerAdapter = SpinnerAdapter( spinnerAdapter = SpinnerAdapter(
view.context, view.context,
R.layout.library_spinner_textview, R.layout.library_spinner_textview,
arrayOf(resources!!.getString(R.string.label_library)) arrayOf(resources!!.getString(R.string.label_library))
) )
spinnerAdapter?.setDropDownViewResource(R.layout.library_spinner_entry_text) customTitleSpinner.category_title.text = view.resources.getString(R.string.label_library)
spinner.adapter = spinnerAdapter
titlePopupMenu = PopupMenu(view.context, customTitleSpinner, Gravity.END or Gravity.CENTER)
customTitleSpinner.setOnTouchListener(titlePopupMenu.dragToOpenListener)
titlePopupMenu.setOnMenuItemClickListener { item ->
scrollToHeader(item.itemId)
true
}
(activity as MainActivity).supportActionBar?.customView = customTitleSpinner
//spinnerAdapter?.setDropDownViewResource(R.layout.library_spinner_entry_text)
//spinner.setAdapter(spinnerAdapter)
// spinner.adapter = spinnerAdapter
} }
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
@ -184,7 +199,7 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
} }
override fun onNextLibraryUpdate(mangaMap: List<LibraryItem>, freshStart: Boolean) { override fun onNextLibraryUpdate(mangaMap: List<LibraryItem>, freshStart: Boolean) {
val recyclerLayout = recycler_layout ?: return val recyclerLayout = view ?: return
destroyActionModeIfNeeded() destroyActionModeIfNeeded()
if (mangaMap.isNotEmpty()) { if (mangaMap.isNotEmpty()) {
empty_view?.hide() empty_view?.hide()
@ -194,27 +209,31 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
adapter.setItems(mangaMap) adapter.setItems(mangaMap)
spinner.onItemSelectedListener = null //spinner.onItemSelectedListener = null
val categoryNames = presenter.categories.map { it.name }.toTypedArray() val categoryNames = presenter.categories.map { it.name }.toTypedArray()
spinnerAdapter = SpinnerAdapter(spinner.context, R.layout.library_spinner_textview, spinnerAdapter = SpinnerAdapter(recyclerLayout.context, R.layout.library_spinner_textview,
if (categoryNames.isNotEmpty()) categoryNames if (categoryNames.isNotEmpty()) categoryNames
else arrayOf(spinner.context.getString(R.string.label_library)) else arrayOf(recyclerLayout.context.getString(R.string.label_library))
) )
spinnerAdapter?.setDropDownViewResource(R.layout.library_spinner_entry_text) //spinnerAdapter?.setDropDownViewResource(R.layout.library_spinner_entry_text)
spinner.adapter = spinnerAdapter //spinner.setAdapter(spinnerAdapter)
val isCurrentController = router?.backstack?.lastOrNull()?.controller() == val isCurrentController = router?.backstack?.lastOrNull()?.controller() ==
this this
(activity as AppCompatActivity).supportActionBar (activity as AppCompatActivity).supportActionBar
?.setDisplayShowCustomEnabled(isCurrentController && categoryNames.size > 1) ?.setDisplayShowCustomEnabled(isCurrentController && presenter.categories.size > 1)
if (isCurrentController) setTitle() if (isCurrentController) setTitle()
spinner.setSelection(min(presenter.categories.size - 1, activeCategory + 1)) //spinner.setSelection(min(presenter.categories.size - 1, activeCategory))
customTitleSpinner.category_title.text =
presenter.categories[clamp(activeCategory,
0,
presenter.categories.size - 1)].name
updateScroll = false updateScroll = false
if (!freshStart) { if (!freshStart) {
justStarted = false justStarted = false
if (recyclerLayout.alpha == 0f) if (contentView().alpha == 0f)
recyclerLayout.animate().alpha(1f).setDuration(500).start() contentView().animate().alpha(1f).setDuration(500).start()
} else if (justStarted) { } else if (justStarted) {
@ -230,21 +249,39 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
activeCategory, 0, presenter.categories.size - 1 activeCategory, 0, presenter.categories.size - 1
)) ))
bottom_sheet.updateTitle() bottom_sheet.updateTitle()
spinner.onItemSelectedListener = IgnoreFirstSpinnerListener { pos -> titlePopupMenu.menu.clear()
presenter.categories.forEach { category ->
titlePopupMenu.menu.add(0, category.order, max(0, category.order), category.name)
}
customTitleSpinner.setOnClickListener {
titlePopupMenu.show()
}
/*spinner.onItemSelectedListener = IgnoreFirstSpinnerListener { pos ->
if (updateScroll) { if (updateScroll) {
updateScroll = false updateScroll = false
return@IgnoreFirstSpinnerListener return@IgnoreFirstSpinnerListener
} }
scrollToHeader(presenter.categories[pos].order) scrollToHeader(presenter.categories[pos].order)
} }*/
} }
private fun scrollToHeader(pos: Int) { private fun scrollToHeader(pos: Int, offset: Float? = null) {
val headerPosition = adapter.indexOf(pos) val headerPosition = adapter.indexOf(pos)
if (headerPosition > -1) { if (headerPosition > -1) {
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset( (recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
headerPosition, if (headerPosition == 0) 0 else (-30).dpToPx headerPosition, offset?.toInt() ?: if (headerPosition == 0) 0 else (-30).dpToPx
) )
lastHeaderPos = pos
if (offset != null && preferences.libraryLayout().getOrDefault() == 2) {
launchUI {
delay(100)
if (pos == lastHeaderPos)
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
headerPosition, offset.toInt()
)
}
}
} }
} }
@ -523,4 +560,21 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
val items = adapter.getSectionItemPositions(header) val items = adapter.getSectionItemPositions(header)
return items.all { adapter.isSelected(it) } return items.all { adapter.isSelected(it) }
} }
override fun showCategories(position: Int, view: View) {
if (presenter.categories.size <= 1) return
val header = adapter.getSectionHeader(position) as? LibraryHeaderItem ?: return
if (presenter.categories.size <= 1) return
val category = header.category
val popupMenu = PopupMenu(view.context, view)
presenter.categories.forEach {
if (it.id != category.id)
popupMenu.menu.add(0, it.order, it.order, it.name)
}
popupMenu.setOnMenuItemClickListener {
scrollToHeader(it.itemId)
true
}
popupMenu.show()
}
} }

View File

@ -169,9 +169,6 @@ class LibraryPresenter(
return@f false return@f false
if (filterUnread == STATE_REALLY_EXCLUDE && item.manga.unread > 0) return@f false if (filterUnread == STATE_REALLY_EXCLUDE && item.manga.unread > 0) return@f false
if (filterMangaType == Manga.TYPE_MANGA &&
item.manga.mangaType() == Manga.TYPE_MANHWA)
return@f false
if ((filterMangaType == Manga.TYPE_MANHWA) && if ((filterMangaType == Manga.TYPE_MANHWA) &&
item.manga.mangaType() == Manga.TYPE_MANGA) return@f false item.manga.mangaType() == Manga.TYPE_MANGA) return@f false
@ -351,6 +348,7 @@ class LibraryPresenter(
category.isFirst = (category.id ?: 0 <= 0 || category.isFirst = (category.id ?: 0 <= 0 ||
(category.order == 0 && categories.none { it.id == 0 })) (category.order == 0 && categories.none { it.id == 0 }))
} }
if (category.isLast == null) category.isLast = categories.lastOrNull()?.id == category.id
return category return category
} }

View File

@ -13,7 +13,6 @@ import android.widget.LinearLayout
import android.widget.Spinner import android.widget.Spinner
import androidx.appcompat.view.menu.MenuBuilder import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.f2prateek.rx.preferences.Preference import com.f2prateek.rx.preferences.Preference
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
@ -44,6 +43,7 @@ import kotlinx.coroutines.withContext
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import kotlin.math.max
import kotlin.math.min import kotlin.math.min
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -80,11 +80,11 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
private val filterItems:MutableList<FilterTagGroup> by lazy { private val filterItems:MutableList<FilterTagGroup> by lazy {
val list = mutableListOf<FilterTagGroup>() val list = mutableListOf<FilterTagGroup>()
if (Injekt.get<DatabaseHelper>().getCategories().executeAsBlocking().isNotEmpty())
list.add(categories)
list.add(downloaded) list.add(downloaded)
list.add(unread) list.add(unread)
list.add(completed) list.add(completed)
if (Injekt.get<DatabaseHelper>().getCategories().executeAsBlocking().isNotEmpty())
list.add(categories)
if (Injekt.get<TrackManager>().hasLoggedServices()) if (Injekt.get<TrackManager>().hasLoggedServices())
list.add(tracked) list.add(tracked)
list list
@ -108,10 +108,11 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
clearButton = clear_button clearButton = clear_button
filter_layout.removeView(clearButton) filter_layout.removeView(clearButton)
sheetBehavior = BottomSheetBehavior.from(this) sheetBehavior = BottomSheetBehavior.from(this)
val phoneLandscape = (isLandscape() && !isTablet())
sheetBehavior?.isHideable = !phoneLandscape
top_bar.setOnClickListener { top_bar.setOnClickListener {
if (sheetBehavior?.state != BottomSheetBehavior.STATE_EXPANDED) { if (sheetBehavior?.state != BottomSheetBehavior.STATE_EXPANDED) {
sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED sheetBehavior?.state = BottomSheetBehavior.STATE_EXPANDED
//topbar.animate().alpha(0f).setDuration(100).start()
} else { } else {
sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED sheetBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED
} }
@ -121,25 +122,34 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
updateTitle() updateTitle()
val shadow2:View = (pagerView.parent as ViewGroup).findViewById(R.id.shadow2) val shadow2:View = (pagerView.parent as ViewGroup).findViewById(R.id.shadow2)
val shadow:View = (pagerView.parent as ViewGroup).findViewById(R.id.shadow) val shadow:View = (pagerView.parent as ViewGroup).findViewById(R.id.shadow)
val fastScroller:View? = (pagerView.parent as ViewGroup).findViewById(R.id.fast_scroller) val snackbarLayout:View = (pagerView.parent as ViewGroup).findViewById(R.id.snackbar_layout)
val coordLayout:View = (pagerView.parent as ViewGroup).findViewById(R.id.snackbar_layout) if (phoneLandscape) {
val phoneLandscape = (isLandscape() && !isTablet())
if (phoneLandscape)
shadow.alpha = 0f shadow.alpha = 0f
sheetBehavior?.peekHeight = 0
}
sheetBehavior?.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { sheetBehavior?.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
override fun onSlide(bottomSheet: View, progress: Float) { override fun onSlide(bottomSheet: View, progress: Float) {
top_bar.alpha = 1 - progress top_bar.alpha = 1 - max(0f, progress)
shadow2.alpha = (1 - progress) * 0.25f shadow2.alpha = (1 - max(0f, progress)) * 0.25f
if (phoneLandscape) if (phoneLandscape)
shadow.alpha = progress shadow.alpha = progress
else
shadow.alpha = 1 + min(0f, progress)
//if (progress >= 0)
updateRootPadding(progress) updateRootPadding(progress)
} }
override fun onStateChanged(p0: View, state: Int) { override fun onStateChanged(p0: View, state: Int) {
if (state == BottomSheetBehavior.STATE_COLLAPSED) { if (state == BottomSheetBehavior.STATE_COLLAPSED) {
if (phoneLandscape)
reSortViews() reSortViews()
if (phoneLandscape) if (phoneLandscape)
shadow.alpha = 0f shadow.alpha = 0f
else
shadow.alpha = 1f
pager?.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0)
snackbarLayout.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0)
preferences.hideFiltersAtStart().set(false)
} }
else setMainSortText() else setMainSortText()
if (state == BottomSheetBehavior.STATE_EXPANDED) { if (state == BottomSheetBehavior.STATE_EXPANDED) {
@ -147,37 +157,50 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
if (phoneLandscape) if (phoneLandscape)
shadow.alpha = 1f shadow.alpha = 1f
} }
top_bar.isClickable = state == BottomSheetBehavior.STATE_COLLAPSED if (state == BottomSheetBehavior.STATE_HIDDEN) {
top_bar.isFocusable = state == BottomSheetBehavior.STATE_COLLAPSED reSortViews()
shadow.alpha = 0f
pager?.updatePaddingRelative(bottom = 0)
snackbarLayout.updatePaddingRelative(bottom = 0)
preferences.hideFiltersAtStart().set(true)
}
//top_bar.isClickable = state == BottomSheetBehavior.STATE_COLLAPSED
//top_bar.isFocusable = state == BottomSheetBehavior.STATE_COLLAPSED
} }
}) })
if (preferences.hideFiltersAtStart().getOrDefault()) {
sheetBehavior?.state = BottomSheetBehavior.STATE_HIDDEN
shadow.alpha = 0f
}
else {
pager?.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0)
snackbarLayout.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0)
}
if (phoneLandscape && shadow2.visibility != View.GONE) { if (phoneLandscape && shadow2.visibility != View.GONE) {
shadow2.gone() shadow2.gone()
} }
if (phoneLandscape) /*top_bar.viewTreeObserver.addOnGlobalLayoutListener {
sheetBehavior?.peekHeight = 0 /*val peekingHeight = if (phoneLandscape) 0
top_bar.viewTreeObserver.addOnGlobalLayoutListener {
val peekingHeight = if (phoneLandscape) 0
else if (!title.text.isNullOrBlank()) top_bar.height else if (!title.text.isNullOrBlank()) top_bar.height
else if (peekHeight != 0) -1 else if (peekHeight != 0) -1
else 0 else 0
if (peekingHeight > -1 && (peekHeight == 0 || peekingHeight > 0)) { if (peekingHeight > -1 && (peekHeight == 0 || peekingHeight > 0)) {
sheetBehavior?.peekHeight = peekingHeight sheetBehavior?.peekHeight = peekingHeight
peekHeight = peekingHeight peekHeight = peekingHeight
} }*/
if (sheetBehavior?.state == BottomSheetBehavior.STATE_COLLAPSED) { if (sheetBehavior?.state == BottomSheetBehavior.STATE_COLLAPSED) {
val height = context.resources.getDimensionPixelSize(R.dimen.rounder_radius) val height = context.resources.getDimensionPixelSize(R.dimen.rounder_radius)
fastScroller?.updateLayoutParams<CoordinatorLayout.LayoutParams> { fastScroller?.updateLayoutParams<CoordinatorLayout.LayoutParams> {
bottomMargin = if (phoneLandscape) 0 else (top_bar.height - height) bottomMargin = if (phoneLandscape) 0 else (top_bar.height - height)
} }
pager?.setPadding(0, 0, 0, if (phoneLandscape) 0 else pager?.updatePaddingRelative(bottom = if (phoneLandscape) 0 else
(top_bar.height - height)) (top_bar.height - height))
coordLayout.setPadding(0, 0, 0, peekingHeight) coordLayout.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0)
} }
else { else {
updateRootPadding() updateRootPadding()
} }
} }*/
createTags() createTags()
sorting_layout.visibility = sorting_layout.visibility =
if (preferences.libraryAsSingleList().getOrDefault()) View.GONE if (preferences.libraryAsSingleList().getOrDefault()) View.GONE
@ -210,7 +233,7 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
override fun onRestoreInstanceState(state: Parcelable?) { override fun onRestoreInstanceState(state: Parcelable?) {
if (state is Bundle) // implicit null check if (state is Bundle) // implicit null check
{ {
this.peekHeight = state.getInt("peek") /*this.peekHeight = state.getInt("peek")
this.startingTitle = state.getString("title") ?: "" this.startingTitle = state.getString("title") ?: ""
val sheet = BottomSheetBehavior.from(this) val sheet = BottomSheetBehavior.from(this)
if (isLandscape() && !isTablet()) if (isLandscape() && !isTablet())
@ -222,9 +245,10 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
top_bar.alpha = top_bar.alpha =
if (sheet.state == BottomSheetBehavior.STATE_COLLAPSED) 1f if (sheet.state == BottomSheetBehavior.STATE_COLLAPSED) 1f
else 0f else 0f
*/
super.onRestoreInstanceState(state.getParcelable("superState"))
} }
else else super.onRestoreInstanceState(state)
super.onRestoreInstanceState(state)
} }
private fun isLandscape(): Boolean { private fun isLandscape(): Boolean {
@ -288,7 +312,10 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
val percent = (trueProgress * 100).roundToInt() val percent = (trueProgress * 100).roundToInt()
val value = (percent * (maxHeight - minHeight) / 100) + minHeight val value = (percent * (maxHeight - minHeight) / 100) + minHeight
val height = context.resources.getDimensionPixelSize(R.dimen.rounder_radius) val height = context.resources.getDimensionPixelSize(R.dimen.rounder_radius)
pager?.setPadding(0, 0, 0, value - height) if (trueProgress >= 0)
pager?.updatePaddingRelative(bottom = value - height)
else
pager?.updatePaddingRelative(bottom = (minHeight * (1 + trueProgress)).toInt())
} }
fun sorting(trueSort:Boolean = false): Int { fun sorting(trueSort:Boolean = false): Int {
@ -338,13 +365,13 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
} }
filter = preferences.filterMangaType().getOrDefault() filter = preferences.filterMangaType().getOrDefault()
if (filter > 0) { if (filter > 0) {
filters.add(if (filter == 1) R.string.manga_only else R.string.manhwa_only) filters.add(R.string.manhwa_only)
} }
return filters return filters
} }
fun createTags() { private fun createTags() {
categories = inflate(R.layout.filter_buttons) as FilterTagGroup categories = inflate(R.layout.filter_buttons) as FilterTagGroup
categories.setup(this, R.string.action_hide_categories) categories.setup(this, R.string.action_hide_categories)
@ -361,9 +388,7 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
tracked = inflate(R.layout.filter_buttons) as FilterTagGroup tracked = inflate(R.layout.filter_buttons) as FilterTagGroup
tracked.setup(this, R.string.action_filter_tracked, R.string.action_filter_not_tracked) tracked.setup(this, R.string.action_filter_tracked, R.string.action_filter_not_tracked)
filterItems.forEach { reSortViews()
filter_layout.addView(it)
}
checkForManhwa() checkForManhwa()
} }
@ -376,9 +401,7 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
launchUI { launchUI {
val mangaType = inflate(R.layout.filter_buttons) as FilterTagGroup val mangaType = inflate(R.layout.filter_buttons) as FilterTagGroup
mangaType.setup( mangaType.setup(
this@SortFilterBottomSheet, this@SortFilterBottomSheet, R.string.manhwa
R.string.manga,
R.string.manhwa
) )
this@SortFilterBottomSheet.mangaType = mangaType this@SortFilterBottomSheet.mangaType = mangaType
filter_layout.addView(mangaType) filter_layout.addView(mangaType)
@ -680,7 +703,7 @@ class SortFilterBottomSheet @JvmOverloads constructor(context: Context, attrs: A
onGroupClicked(action) onGroupClicked(action)
} }
fun reSortViews() { private fun reSortViews() {
filter_layout.removeAllViews() filter_layout.removeAllViews()
if (filterItems.any { it.isActivated }) if (filterItems.any { it.isActivated })
filter_layout.addView(clearButton) filter_layout.addView(clearButton)

View File

@ -168,8 +168,15 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
updateRecentsIcon() updateRecentsIcon()
} }
} }
R.id.nav_library, R.id.nav_catalogues, R.id.nav_library -> {
R.id.nav_settings -> router.popToRoot() if (router.backstack.size > 1) router.popToRoot()
else {
val controller = router.getControllerWithTag(id.toString()) as?
LibraryController
controller?.showFiltersBottomSheet()
}
}
R.id.nav_catalogues, R.id.nav_settings -> router.popToRoot()
} }
} }
true true

View File

@ -6,5 +6,5 @@
android:color="?attr/tabBarIconColor" /> android:color="?attr/tabBarIconColor" />
<item android:state_focused="false" <item android:state_focused="false"
android:color="?attr/tabBarIconInactive" /> android:color="?attr/tabBarIconInactive" />
<item android:color="?attr/tabBarIconColor" /> <item android:color="?attr/tabBarIconInactive" />
</selector> </selector>

View File

@ -3,7 +3,7 @@
android:shape="rectangle"> android:shape="rectangle">
<size <size
android:height="4dp" android:height="4dp"
android:width="25dp"/> android:width="50dp"/>
<corners android:radius="20dp" /> <corners android:radius="20dp" />
<solid android:color="?attr/actionBarTintColor"/> <solid android:color="?attr/actionBarTintColor"/>
</shape> </shape>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?android:attr/textColorPrimary"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M7,10l5,5 5,-5z"/>
</vector>

View File

@ -13,7 +13,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:background="@drawable/library_compact_grid_selector" android:background="@drawable/library_compact_grid_selector"
android:minHeight="200dp"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView

View File

@ -5,7 +5,7 @@
android:id="@+id/bottom_sheet" android:id="@+id/bottom_sheet"
style="@style/BottomSheetDialogTheme" style="@style/BottomSheetDialogTheme"
android:layout_width="match_parent" android:layout_width="match_parent"
app:behavior_peekHeight="0dp" app:behavior_peekHeight="60dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/bg_bottom_sheet_dialog_fragment" android:background="@drawable/bg_bottom_sheet_dialog_fragment"
android:orientation="vertical" android:orientation="vertical"
@ -16,6 +16,7 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<LinearLayout <LinearLayout
android:id="@+id/sheet_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -28,10 +29,10 @@
android:id="@+id/filter_scroll" android:id="@+id/filter_scroll"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="6dp" android:layout_marginTop="2dp"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingStart="20dp" android:paddingStart="20dp"
android:paddingTop="10dp" android:paddingTop="8dp"
android:paddingBottom="18dp" android:paddingBottom="18dp"
android:paddingEnd="20dp" android:paddingEnd="20dp"
android:scrollbars="none"> android:scrollbars="none">
@ -190,8 +191,6 @@
android:id="@+id/top_bar" android:id="@+id/top_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
tools:visibility="gone"
android:background="@drawable/bg_bottom_sheet_primary"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -203,7 +202,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:src="@drawable/draggable_pill" android:src="@drawable/draggable_pill"
android:alpha="0.15" android:alpha="0.25"
android:contentDescription="@string/drag_handle" android:contentDescription="@string/drag_handle"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@ -214,6 +213,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginStart="24dp" android:layout_marginStart="24dp"
android:visibility="gone"
android:src="@drawable/ic_sort_white_24dp" android:src="@drawable/ic_sort_white_24dp"
app:layout_constraintBottom_toBottomOf="@+id/title" app:layout_constraintBottom_toBottomOf="@+id/title"
android:contentDescription="@string/sorting_mode" android:contentDescription="@string/sorting_mode"
@ -228,6 +228,7 @@
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="15dp" android:layout_marginBottom="15dp"
android:visibility="gone"
android:textAlignment="textStart" android:textAlignment="textStart"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1" android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
android:textColor="?attr/actionBarTintColor" android:textColor="?attr/actionBarTintColor"

View File

@ -3,8 +3,7 @@
android:orientation="horizontal" android:layout_width="wrap_content" android:orientation="horizontal" android:layout_width="wrap_content"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/round_textview_border" android:background="@drawable/round_textview_border"
android:layout_marginStart="5dp" android:layout_margin="5dp"
android:layout_marginEnd="5dp"
android:layout_height="32dp"> android:layout_height="32dp">
<TextView <TextView
android:id="@+id/firstButton" android:id="@+id/firstButton"

View File

@ -9,7 +9,7 @@
<ImageView <ImageView
android:id="@+id/checkbox" android:id="@+id/checkbox"
android:padding="10dp" android:padding="5dp"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible" tools:visibility="visible"
tools:tint="?attr/colorAccent" tools:tint="?attr/colorAccent"
@ -29,14 +29,16 @@
<TextView <TextView
android:id="@+id/category_title" android:id="@+id/category_title"
style="@style/TextAppearance.MaterialComponents.Headline6" style="@style/TextAppearance.MaterialComponents.Headline6"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginBottom="10dp" android:layout_marginBottom="10dp"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center|start" android:gravity="center|start"
android:clickable="true"
android:focusable="true"
android:inputType="none" android:inputType="none"
android:maxLines="1" android:maxLines="2"
android:layout_marginTop="32dp" android:layout_marginTop="32dp"
app:layout_constrainedWidth="true" app:layout_constrainedWidth="true"
app:layout_constraintStart_toEndOf="@+id/checkbox" app:layout_constraintStart_toEndOf="@+id/checkbox"
@ -44,8 +46,8 @@
app:layout_constraintEnd_toStartOf="@id/update_button" app:layout_constraintEnd_toStartOf="@id/update_button"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintWidth_default="wrap" android:drawableEnd="@drawable/ic_arrow_drop_down_white_24dp"
tools:text="Title dfdsfsfsfsfsfsfs" /> tools:text="Title dfdsfsfsfsfsfdsfsfsfs" />
<Space <Space
android:id="@+id/space" android:id="@+id/space"
@ -63,12 +65,12 @@
android:padding="5dp" android:padding="5dp"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:layout_marginBottom="6dp"
tools:tint="?attr/colorAccent" tools:tint="?attr/colorAccent"
android:src="@drawable/ic_refresh_white_24dp" android:src="@drawable/ic_refresh_white_24dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="@id/category_title"
app:layout_constraintTop_toTopOf="@id/category_title"
app:layout_constraintEnd_toStartOf="@id/space" app:layout_constraintEnd_toStartOf="@id/space"
app:layout_constraintStart_toEndOf="@+id/category_title" app:layout_constraintStart_toEndOf="@id/category_title"
app:layout_constraintWidth_default="wrap" app:layout_constraintWidth_default="wrap"
app:rippleColor="@color/fullRippleColor" /> app:rippleColor="@color/fullRippleColor" />
@ -76,27 +78,27 @@
android:id="@+id/category_sort" android:id="@+id/category_sort"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="10dp" android:layout_marginEnd="2dp"
android:clickable="true" android:clickable="true"
android:drawableEnd="@drawable/ic_sort_white_24dp" android:drawableEnd="@drawable/ic_sort_white_24dp"
android:drawablePadding="6dp" android:drawablePadding="6dp"
android:layout_marginBottom="4dp"
android:drawableTint="@color/gray_button" android:drawableTint="@color/gray_button"
android:ellipsize="none" android:ellipsize="none"
android:focusable="true" android:focusable="true"
android:gravity="center|end" android:gravity="center|end"
android:textAlignment="textEnd" android:textAlignment="textEnd"
android:maxLines="3" android:maxLines="2"
android:padding="6dp" android:padding="6dp"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body2" android:textAppearance="@style/TextAppearance.MaterialComponents.Body2"
android:textColor="?android:attr/textColorPrimary" android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp" android:textSize="12sp"
android:textStyle="normal" android:textStyle="normal"
app:layout_constrainedWidth="true" app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="@id/category_title"
app:layout_constraintTop_toTopOf="@id/category_title"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0" app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@id/space" app:layout_constraintStart_toEndOf="@id/space"
app:layout_constraintWidth_min="80dp" app:layout_constraintWidth_min="100dp"
tools:text="Drag and Drop" /> tools:text="Drag and Drop" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -6,13 +6,6 @@
android:id="@+id/library_layout" android:id="@+id/library_layout"
android:layout_height="match_parent"> android:layout_height="match_parent">
<FrameLayout
android:id="@+id/recycler_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
<eu.davidea.fastscroller.FastScroller <eu.davidea.fastscroller.FastScroller
android:id="@+id/fast_scroller" android:id="@+id/fast_scroller"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -76,11 +76,12 @@
android:background="?attr/colorPrimary" android:background="?attr/colorPrimary"
app:itemIconTint="@drawable/bottom_nav_item_selector" app:itemIconTint="@drawable/bottom_nav_item_selector"
app:itemRippleColor="@color/rippleColor" app:itemRippleColor="@color/rippleColor"
app:itemTextColor="?attr/tabBarIconColor" app:itemTextColor="@drawable/bottom_nav_item_selector"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_navigation" app:menu="@menu/bottom_navigation"
app:labelVisibilityMode="labeled"
app:tabBackground="@color/rippleColor" app:tabBackground="@color/rippleColor"
app:tabRippleColor="@color/rippleColor" app:tabRippleColor="@color/rippleColor"
app:tabTextColor="?attr/tabBarIconColor" /> app:tabTextColor="?attr/tabBarIconColor" />

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="wrap_content"
android:orientation="horizontal"
android:id="@+id/title_layout"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:background="?colorPrimary"
android:clickable="true"
android:focusable="true"
xmlns:tools="http://schemas.android.com/tools">
<com.google.android.material.textview.MaterialTextView
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
android:maxLines="1"
android:ellipsize="end"
android:gravity="start"
android:textSize="20sp"
android:id="@+id/category_title"
android:textColor="?actionBarTintColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Title Text"/>
<ImageView
android:layout_gravity="center"
android:layout_marginStart="4dp"
android:background="@drawable/round_ripple"
android:id="@+id/dropdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="?actionBarTintColor"
android:src="@drawable/ic_arrow_drop_down_white_24dp"/>
</LinearLayout>

View File

@ -21,7 +21,7 @@
style="@style/TextAppearance.Regular.Caption.Light" style="@style/TextAppearance.Regular.Caption.Light"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/pale_green" android:background="@color/pale_red"
android:gravity="center" android:gravity="center"
android:maxLines="1" android:maxLines="1"
android:paddingStart="5dp" android:paddingStart="5dp"

View File

@ -14,10 +14,10 @@
<color name="fullRippleColor">#707070</color> <color name="fullRippleColor">#707070</color>
<color name="dialogBackground">@color/md_grey_800</color> <color name="dialogBackground">@color/md_grey_800</color>
<color name="colorAccent">#3399FF</color> <color name="colorAccent">#3399FF</color>
<color name="purePrimary">#212121</color>
<color name="splashBackground">#212121</color> <color name="splashBackground">#212121</color>
<color name="actionModeShadow">@color/md_white_1000_38</color> <color name="actionModeShadow">@color/md_white_1000_38</color>
<color name="tabBarIconHighlight">@color/colorAccent</color> <color name="tabBarIconHighlight">@color/colorAccent</color>
<color name="tabInactive">@color/md_white_1000_76</color>
<color name="textColorPrimary">@color/md_white_1000</color> <color name="textColorPrimary">@color/md_white_1000</color>
<color name="textColorSecondary">@color/md_white_1000_70</color> <color name="textColorSecondary">@color/md_white_1000_70</color>

View File

@ -35,6 +35,7 @@
<color name="oldNavBarBackground">#B3FFFFFF</color> <color name="oldNavBarBackground">#B3FFFFFF</color>
<color name="badgeColor">@color/material_red_accent_700</color> <color name="badgeColor">@color/material_red_accent_700</color>
<color name="tabBarIconHighlight">@color/md_white_1000</color> <color name="tabBarIconHighlight">@color/md_white_1000</color>
<color name="tabInactive">@color/md_white_1000_50</color>
<color name="preference_fallback_accent_color">@color/colorAccent</color> <color name="preference_fallback_accent_color">@color/colorAccent</color>
<color name="darkPrimaryColor">#212121</color> <color name="darkPrimaryColor">#212121</color>
@ -82,5 +83,6 @@
<color name="md_teal_500">#009688</color> <color name="md_teal_500">#009688</color>
<color name="pale_green">#99CC99</color> <color name="total_green">@color/material_green_800</color>
<color name="pale_red">@color/material_red_300</color>
</resources> </resources>

View File

@ -95,7 +95,7 @@
<string name="action_add_to_home_screen">Add to home screen</string> <string name="action_add_to_home_screen">Add to home screen</string>
<string name="action_display_mode">Display mode</string> <string name="action_display_mode">Display mode</string>
<string name="action_display">Display</string> <string name="action_display">Display</string>
<string name="action_display_comfy_grid">Comfortable</string> <string name="action_display_comfy_grid">Comfy Grid</string>
<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>

View File

@ -195,6 +195,10 @@
<item name="android:background">?attr/selectable_list_drawable</item> <item name="android:background">?attr/selectable_list_drawable</item>
</style> </style>
<style name="BottomNavigationTheme" parent="Widget.MaterialComponents.BottomNavigationView">
<item name="colorPrimary">?colorAccent</item>
</style>
<!-- set the rounded drawable as background to your bottom sheet --> <!-- set the rounded drawable as background to your bottom sheet -->
<style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal"> <style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
<item name="android:background">@drawable/bg_bottom_sheet_dialog_fragment</item> <item name="android:background">@drawable/bg_bottom_sheet_dialog_fragment</item>

View File

@ -25,7 +25,7 @@
<item name="android:listDivider">@drawable/line_divider_light</item> <item name="android:listDivider">@drawable/line_divider_light</item>
<item name="actionModeStyle">@style/CustomActionModeStyle</item> <item name="actionModeStyle">@style/CustomActionModeStyle</item>
<item name="tabBarIconColor">@color/tabBarIconHighlight</item> <item name="tabBarIconColor">@color/tabBarIconHighlight</item>
<item name="tabBarIconInactive">@color/md_white_1000_76</item> <item name="tabBarIconInactive">@color/tabInactive</item>
<!-- Themes --> <!-- Themes -->