Scrollable toolbar + centered + same color toolbar

I'm stealing from that reddit sync alpha
Also light blue theme is now broken...too bad
pull/3117/head
Jay 5 years ago
parent c8570759fa
commit b7e66fa404

@ -148,6 +148,10 @@
android:name=".data.backup.BackupRestoreService" android:name=".data.backup.BackupRestoreService"
android:exported="false"/> android:exported="false"/>
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
</application> </application>
</manifest> </manifest>

@ -0,0 +1,33 @@
package eu.kanade.tachiyomi.ui.base
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.graphics.drawable.DrawerArrowDrawable
import androidx.appcompat.widget.Toolbar
import kotlinx.android.synthetic.main.main_activity.view.*
class CenteredToolbar@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null): Toolbar
(context, attrs) {
override fun setTitle(resId: Int) {
if (navigationIcon is DrawerArrowDrawable) {
super.setTitle(resId)
toolbar_title.text = null
}
else {
toolbar_title.text = context.getString(resId)
super.setTitle(null)
}
}
override fun setTitle(title: CharSequence?) {
if (navigationIcon is DrawerArrowDrawable) {
super.setTitle(title)
toolbar_title.text = null
}
else {
toolbar_title.text = title
super.setTitle(null)
}
}
}

@ -26,9 +26,11 @@ import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.catalogue.browse.BrowseCatalogueController import eu.kanade.tachiyomi.ui.catalogue.browse.BrowseCatalogueController
import eu.kanade.tachiyomi.ui.catalogue.global_search.CatalogueSearchController import eu.kanade.tachiyomi.ui.catalogue.global_search.CatalogueSearchController
import eu.kanade.tachiyomi.ui.catalogue.latest.LatestUpdatesController import eu.kanade.tachiyomi.ui.catalogue.latest.LatestUpdatesController
import eu.kanade.tachiyomi.ui.main.RootSearchInterface
import eu.kanade.tachiyomi.ui.setting.SettingsSourcesController import eu.kanade.tachiyomi.ui.setting.SettingsSourcesController
import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController
import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.catalogue_main_controller.* import kotlinx.android.synthetic.main.catalogue_main_controller.*
@ -47,6 +49,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
SourceLoginDialog.Listener, SourceLoginDialog.Listener,
FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemClickListener,
CatalogueAdapter.OnBrowseClickListener, CatalogueAdapter.OnBrowseClickListener,
RootSearchInterface,
CatalogueAdapter.OnLatestClickListener { CatalogueAdapter.OnLatestClickListener {
/** /**
@ -113,6 +116,8 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
recycler.addItemDecoration(SourceDividerItemDecoration(view.context)) recycler.addItemDecoration(SourceDividerItemDecoration(view.context))
recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener)
scrollViewWith(recycler)
requestPermissionsSafe(arrayOf(WRITE_EXTERNAL_STORAGE), 301) requestPermissionsSafe(arrayOf(WRITE_EXTERNAL_STORAGE), 301)
} }
@ -216,7 +221,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
// Initialize option to open catalogue settings. // Initialize option to open catalogue settings.
R.id.action_settings -> { R.id.action_filter -> {
router.pushController((RouterTransaction.with(SettingsSourcesController())) router.pushController((RouterTransaction.with(SettingsSourcesController()))
.popChangeHandler(SettingsSourcesFadeChangeHandler()) .popChangeHandler(SettingsSourcesFadeChangeHandler())
.pushChangeHandler(FadeChangeHandler())) .pushChangeHandler(FadeChangeHandler()))

@ -37,11 +37,11 @@ import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.system.connectivityManager import eu.kanade.tachiyomi.util.system.connectivityManager
import eu.kanade.tachiyomi.util.view.HeightTopWindowInsetsListener import eu.kanade.tachiyomi.util.view.HeightTopWindowInsetsListener
import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForController
import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.util.view.inflate import eu.kanade.tachiyomi.util.view.inflate
import eu.kanade.tachiyomi.util.view.marginBottom import eu.kanade.tachiyomi.util.view.marginBottom
import eu.kanade.tachiyomi.util.view.marginTop import eu.kanade.tachiyomi.util.view.marginTop
import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.updateLayoutParams
import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.updatePaddingRelative
@ -140,13 +140,13 @@ open class BrowseCatalogueController(bundle: Bundle) :
override fun onViewCreated(view: View) { override fun onViewCreated(view: View) {
super.onViewCreated(view) super.onViewCreated(view)
view.applyWindowInsetsForController()
// Initialize adapter, scroll listener and recycler views // Initialize adapter, scroll listener and recycler views
adapter = FlexibleAdapter(null, this) adapter = FlexibleAdapter(null, this)
setupRecycler(view) setupRecycler(view)
navView?.setFilters(presenter.filterItems) navView?.setFilters(presenter.filterItems)
scrollViewWith(recycler!!, true)
progress?.visible() progress?.visible()
} }
@ -246,6 +246,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
} }
} }
} }
recycler.clipToPadding = false
recycler.setHasFixedSize(true) recycler.setHasFixedSize(true)
recycler.adapter = adapter recycler.adapter = adapter

@ -23,7 +23,7 @@ import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForController import eu.kanade.tachiyomi.util.view.scrollViewWith
import kotlinx.android.synthetic.main.extension_controller.* import kotlinx.android.synthetic.main.extension_controller.*
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
@ -64,7 +64,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(),
override fun onViewCreated(view: View) { override fun onViewCreated(view: View) {
super.onViewCreated(view) super.onViewCreated(view)
view.applyWindowInsetsForController() //view.applyWindowInsetsForController()
ext_swipe_refresh.isRefreshing = true ext_swipe_refresh.isRefreshing = true
ext_swipe_refresh.refreshes().subscribeUntilDestroy { ext_swipe_refresh.refreshes().subscribeUntilDestroy {
@ -78,6 +78,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(),
ext_recycler.adapter = adapter ext_recycler.adapter = adapter
ext_recycler.addItemDecoration(ExtensionDividerItemDecoration(view.context)) ext_recycler.addItemDecoration(ExtensionDividerItemDecoration(view.context))
ext_recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) ext_recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener)
scrollViewWith(ext_recycler, true, ext_swipe_refresh)
} }
override fun onDestroyView(view: View) { override fun onDestroyView(view: View) {

@ -43,6 +43,7 @@ import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.download.DownloadController import eu.kanade.tachiyomi.ui.download.DownloadController
import eu.kanade.tachiyomi.ui.library.filter.SortFilterBottomSheet import eu.kanade.tachiyomi.ui.library.filter.SortFilterBottomSheet
import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.main.RootSearchInterface
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
import eu.kanade.tachiyomi.ui.migration.MigrationInterface import eu.kanade.tachiyomi.ui.migration.MigrationInterface
import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController
@ -69,6 +70,7 @@ open class LibraryController(
ChangeMangaCategoriesDialog.Listener, ChangeMangaCategoriesDialog.Listener,
MigrationInterface, MigrationInterface,
DownloadServiceListener, DownloadServiceListener,
RootSearchInterface,
LibraryServiceListener { LibraryServiceListener {
/** /**

@ -7,10 +7,9 @@ import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.math.MathUtils.clamp 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
@ -28,12 +27,13 @@ import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.library.LibraryUpdateService
import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.main.SwipeGestureInterface import eu.kanade.tachiyomi.ui.main.SwipeGestureInterface
import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.view.inflate import eu.kanade.tachiyomi.util.view.inflate
import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.util.view.updateLayoutParams
import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.updatePaddingRelative
import kotlinx.android.synthetic.main.filter_bottom_sheet.* import kotlinx.android.synthetic.main.filter_bottom_sheet.*
import kotlinx.android.synthetic.main.library_grid_recycler.* import kotlinx.android.synthetic.main.library_grid_recycler.*
@ -61,7 +61,7 @@ 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 lateinit var customTitleSpinner: LinearLayout private lateinit var customTitleSpinner: ViewGroup
private lateinit var titlePopupMenu:PopupMenu private lateinit var titlePopupMenu:PopupMenu
private var switchingCategories = false private var switchingCategories = false
@ -73,13 +73,15 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
override fun contentView():View = recycler_layout override fun contentView():View = recycler_layout
override fun getTitle(): String? { /* override fun getTitle(): String? {
return when { return if (::customTitleSpinner.isInitialized) customTitleSpinner.category_title.text.toString()
spinnerAdapter?.array?.size ?: 0 > 1 -> null else super.getTitle()
spinnerAdapter?.array?.size == 1 -> return spinnerAdapter?.array?.firstOrNull() // when {
else -> return super.getTitle() // spinnerAdapter?.array?.size ?: 0 > 1 -> null
} // spinnerAdapter?.array?.size == 1 -> return spinnerAdapter?.array?.firstOrNull()
} // else -> return super.getTitle()
// }
}*/
private var scrollListener = object : RecyclerView.OnScrollListener () { private var scrollListener = object : RecyclerView.OnScrollListener () {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
@ -97,6 +99,9 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
val category = presenter.categories.find { it.order == order } val category = presenter.categories.find { it.order == order }
customTitleSpinner.category_title.text = category?.name ?: "" customTitleSpinner.category_title.text = category?.name ?: ""
val isCurrentController = router?.backstack?.lastOrNull()?.controller() ==
this@LibraryListController
if (isCurrentController) setTitle()
} }
} }
} }
@ -135,8 +140,8 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
val tv = TypedValue() val tv = TypedValue()
activity!!.theme.resolveAttribute(R.attr.actionBarTintColor, tv, true) activity!!.theme.resolveAttribute(R.attr.actionBarTintColor, tv, true)
customTitleSpinner = library_layout.inflate(R.layout.spinner_title) as LinearLayout customTitleSpinner = library_layout.inflate(R.layout.spinner_title) as ViewGroup
(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,
@ -151,12 +156,17 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
scrollToHeader(item.itemId) scrollToHeader(item.itemId)
true true
} }
(activity as MainActivity).supportActionBar?.customView = customTitleSpinner //(activity as MainActivity).supportActionBar?.customView = customTitleSpinner
scrollViewWith(recycler) { insets ->
fast_scroller.updateLayoutParams<CoordinatorLayout.LayoutParams> {
topMargin = insets.systemWindowInsetTop
}
}
} }
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) {
(activity as MainActivity).supportActionBar (activity as MainActivity).supportActionBar
?.setDisplayShowCustomEnabled(router?.backstack?.lastOrNull()?.controller() == ?.setDisplayShowCustomEnabled(router?.backstack?.lastOrNull()?.controller() ==
this && spinnerAdapter?.array?.size ?: 0 > 1) this && spinnerAdapter?.array?.size ?: 0 > 1)
@ -165,11 +175,11 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
(activity as MainActivity).toolbar.menu.findItem(R.id (activity as MainActivity).toolbar.menu.findItem(R.id
.action_search)?.collapseActionView() .action_search)?.collapseActionView()
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false) (activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false)
} }*/
} }
override fun onDestroy() { override fun onDestroy() {
(activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false) // (activity as MainActivity).supportActionBar?.setDisplayShowCustomEnabled(false)
super.onDestroy() super.onDestroy()
} }
@ -195,14 +205,14 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
val isCurrentController = router?.backstack?.lastOrNull()?.controller() == val isCurrentController = router?.backstack?.lastOrNull()?.controller() ==
this this
(activity as AppCompatActivity).supportActionBar // (activity as AppCompatActivity).supportActionBar
?.setDisplayShowCustomEnabled(isCurrentController && presenter.categories.size > 1) // ?.setDisplayShowCustomEnabled(isCurrentController && presenter.categories.size > 1)
if (isCurrentController) setTitle()
customTitleSpinner.category_title.text = customTitleSpinner.category_title.text =
presenter.categories[clamp(activeCategory, presenter.categories[clamp(activeCategory,
0, 0,
presenter.categories.size - 1)].name presenter.categories.size - 1)].name
if (isCurrentController) setTitle()
updateScroll = false updateScroll = false
if (!freshStart) { if (!freshStart) {
justStarted = false justStarted = false
@ -232,6 +242,7 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
val headerPosition = adapter.indexOf(pos) val headerPosition = adapter.indexOf(pos)
switchingCategories = true switchingCategories = true
if (headerPosition > -1) { if (headerPosition > -1) {
activity?.appbar?.y = 0f
recycler.suppressLayout(true) recycler.suppressLayout(true)
(recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset( (recycler.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(
headerPosition, if (headerPosition == 0) 0 else (-30).dpToPx headerPosition, if (headerPosition == 0) 0 else (-30).dpToPx
@ -544,7 +555,13 @@ class LibraryListController(bundle: Bundle? = null) : LibraryController(bundle),
} }
override fun onSwipeBottom(x: Float, y: Float) { } override fun onSwipeBottom(x: Float, y: Float) { }
override fun onSwipeTop(x: Float, y: Float) { }
override fun onSwipeTop(x: Float, y: Float) {
val sheetRect = Rect()
activity!!.navigationView.getGlobalVisibleRect(sheetRect)
if (sheetRect.contains(x.toInt(), y.toInt()))
showFiltersBottomSheet()
}
override fun onSwipeLeft(x: Float, y: Float) = goToNextCategory(x, y,-1) override fun onSwipeLeft(x: Float, y: Float) = goToNextCategory(x, y,-1)
override fun onSwipeRight(x: Float, y: Float) = goToNextCategory(x, y,1) override fun onSwipeRight(x: Float, y: Float) = goToNextCategory(x, y,1)

@ -617,7 +617,7 @@ class LibraryPresenter(
if (mangas.isEmpty()) return emptyList() if (mangas.isEmpty()) return emptyList()
return mangas.toSet() return mangas.toSet()
.map { db.getCategoriesForManga(it).executeAsBlocking() } .map { db.getCategoriesForManga(it).executeAsBlocking() }
.reduce { set1: Iterable<Category>, set2 -> set1.intersect(set2) } .reduce { set1: Iterable<Category>, set2 -> set1.intersect(set2).toMutableList() }
} }
/** /**

@ -8,9 +8,11 @@ import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Color import android.graphics.Color
import android.graphics.Rect import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.GestureDetector import android.view.GestureDetector
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
@ -18,6 +20,7 @@ import android.view.WindowManager
import android.webkit.WebView import android.webkit.WebView
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.graphics.drawable.DrawerArrowDrawable import androidx.appcompat.graphics.drawable.DrawerArrowDrawable
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.view.GestureDetectorCompat import androidx.core.view.GestureDetectorCompat
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
@ -79,6 +82,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
protected lateinit var router: Router protected lateinit var router: Router
protected var drawerArrow: DrawerArrowDrawable? = null protected var drawerArrow: DrawerArrowDrawable? = null
private var searchDrawable:Drawable? = null
private var currentGestureDelegate:SwipeGestureInterface? = null private var currentGestureDelegate:SwipeGestureInterface? = null
private lateinit var gestureDetector:GestureDetectorCompat private lateinit var gestureDetector:GestureDetectorCompat
@ -130,7 +134,8 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
drawerArrow = DrawerArrowDrawable(this) drawerArrow = DrawerArrowDrawable(this)
drawerArrow?.color = getResourceColor(R.attr.actionBarTintColor) drawerArrow?.color = getResourceColor(R.attr.actionBarTintColor)
toolbar.navigationIcon = drawerArrow searchDrawable = ContextCompat.getDrawable(this, R.drawable
.ic_search_white_24dp)
// tabAnimator = TabsAnimator(tabs) // tabAnimator = TabsAnimator(tabs)
@ -160,7 +165,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
setRoot(RecentlyReadController(), id) setRoot(RecentlyReadController(), id)
} }
R.id.nav_catalogues -> setRoot(CatalogueController(), id) R.id.nav_catalogues -> setRoot(CatalogueController(), id)
R.id.nav_settings -> setRoot(SettingsMainController(), id) //R.id.nav_settings -> setRoot(SettingsMainController(), id)
} }
} }
else if (currentRoot.tag()?.toIntOrNull() == id) { else if (currentRoot.tag()?.toIntOrNull() == id) {
@ -183,7 +188,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
controller?.showFiltersBottomSheet() controller?.showFiltersBottomSheet()
} }
} }
R.id.nav_catalogues, R.id.nav_settings -> router.popToRoot() R.id.nav_catalogues -> router.popToRoot()
} }
} }
true true
@ -221,7 +226,8 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
supportActionBar?.setDisplayShowCustomEnabled(true) supportActionBar?.setDisplayShowCustomEnabled(true)
window.statusBarColor = getResourceColor(android.R.attr.colorPrimary) window.statusBarColor = ColorUtils.setAlphaComponent(getResourceColor(android.R.attr
.colorBackground), 175)
content.setOnApplyWindowInsetsListener { v, insets -> content.setOnApplyWindowInsetsListener { v, insets ->
// if device doesn't support light nav bar // if device doesn't support light nav bar
window.navigationBarColor = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { window.navigationBarColor = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
@ -307,8 +313,15 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
} }
} }
toolbar.navigationIcon = if (router.backstackSize > 1) drawerArrow else searchDrawable
(router.backstack.lastOrNull()?.controller() as? BaseController)?.setTitle()
toolbar.setNavigationOnClickListener { toolbar.setNavigationOnClickListener {
onBackPressed() val rootSearchController = router.backstack.lastOrNull()?.controller()
if (rootSearchController is RootSearchInterface) {
toolbar.menu.findItem(R.id.action_search)?.expandActionView()
}
else onBackPressed()
} }
navigationView.visibility = if (router.backstackSize > 1) View.GONE else View.VISIBLE navigationView.visibility = if (router.backstackSize > 1) View.GONE else View.VISIBLE
@ -318,10 +331,12 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
container: ViewGroup, handler: ControllerChangeHandler) { container: ViewGroup, handler: ControllerChangeHandler) {
syncActivityViewWithController(to, from, isPush) syncActivityViewWithController(to, from, isPush)
appbar.y = 0f
} }
override fun onChangeCompleted(to: Controller?, from: Controller?, isPush: Boolean, override fun onChangeCompleted(to: Controller?, from: Controller?, isPush: Boolean,
container: ViewGroup, handler: ControllerChangeHandler) { container: ViewGroup, handler: ControllerChangeHandler) {
appbar.y = 0f
} }
}) })
@ -383,13 +398,13 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
private fun setExtensionsBadge() { private fun setExtensionsBadge() {
val updates = preferences.extensionUpdatesCount().getOrDefault() val updates = preferences.extensionUpdatesCount().getOrDefault()
if (updates > 0) { if (updates > 0) {
val badge = navigationView.getOrCreateBadge(R.id.nav_settings) val badge = navigationView.getOrCreateBadge(R.id.nav_catalogues)
badge.number = updates badge.number = updates
badge.backgroundColor = getResourceColor(R.attr.badgeColor) badge.backgroundColor = getResourceColor(R.attr.badgeColor)
badge.badgeTextColor = Color.WHITE badge.badgeTextColor = Color.WHITE
} }
else { else {
navigationView.removeBadge(R.id.nav_settings) navigationView.removeBadge(R.id.nav_catalogues)
} }
} }
@ -522,6 +537,19 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
router.setRoot(controller.withFadeTransaction().tag(id.toString())) router.setRoot(controller.withFadeTransaction().tag(id.toString()))
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
// Initialize option to open catalogue settings.
R.id.action_settings -> {
router.pushController((RouterTransaction.with(SettingsMainController()))
.popChangeHandler(FadeChangeHandler())
.pushChangeHandler(FadeChangeHandler()))
}
else -> return super.onOptionsItemSelected(item)
}
return super.onOptionsItemSelected(item)
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
gestureDetector.onTouchEvent(ev) gestureDetector.onTouchEvent(ev)
if (ev?.action == MotionEvent.ACTION_DOWN) { if (ev?.action == MotionEvent.ACTION_DOWN) {
@ -556,7 +584,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
} }
val onRoot = router.backstackSize == 1 val onRoot = router.backstackSize == 1
if (onRoot) { if (onRoot) {
toolbar.navigationIcon = null toolbar.navigationIcon = searchDrawable
} else { } else {
toolbar.navigationIcon = drawerArrow toolbar.navigationIcon = drawerArrow
} }
@ -581,8 +609,14 @@ open class MainActivity : BaseActivity(), DownloadServiceListener {
if (to is NoToolbarElevationController) { if (to is NoToolbarElevationController) {
appbar.disableElevation() appbar.disableElevation()
/*controller_container.updateLayoutParams<CoordinatorLayout.LayoutParams> {
behavior = null
}*/
} else { } else {
appbar.enableElevation() appbar.enableElevation()
/*controller_container.updateLayoutParams<CoordinatorLayout.LayoutParams> {
behavior = AppBarLayout.ScrollingViewBehavior()
}*/
} }
if (to !is DialogController) { if (to !is DialogController) {
@ -700,6 +734,8 @@ interface BottomNavBarInterface {
fun canChangeTabs(block: () -> Unit): Boolean fun canChangeTabs(block: () -> Unit): Boolean
} }
interface RootSearchInterface
interface SwipeGestureInterface { interface SwipeGestureInterface {
fun onSwipeRight(x: Float, y: Float) fun onSwipeRight(x: Float, y: Float)
fun onSwipeLeft(x: Float, y: Float) fun onSwipeLeft(x: Float, y: Float)

@ -320,13 +320,13 @@ class MangaDetailsController : BaseController,
if (type == ControllerChangeType.POP_EXIT) setHasOptionsMenu(false) if (type == ControllerChangeType.POP_EXIT) setHasOptionsMenu(false)
colorAnimator?.cancel() colorAnimator?.cancel()
(activity as MainActivity).toolbar.setBackgroundColor(activity?.getResourceColor( val colorPrimary = activity?.getResourceColor(
android.R.attr.colorPrimary android.R.attr.colorBackground
) ?: Color.BLACK)
activity?.window?.statusBarColor = activity?.getResourceColor(
android.R.attr.colorPrimary
) ?: Color.BLACK ) ?: Color.BLACK
(activity as MainActivity).appbar.setBackgroundColor(colorPrimary)
(activity as MainActivity).toolbar.setBackgroundColor(colorPrimary)
activity?.window?.statusBarColor = ColorUtils.setAlphaComponent(colorPrimary, 175)
} }
} }

@ -10,7 +10,7 @@ class RecentChaptersAdapter(val controller: RecentChaptersController) :
init { init {
setDisplayHeadersAtStartUp(true) setDisplayHeadersAtStartUp(true)
setStickyHeaders(true) //setStickyHeaders(true)
} }
interface OnCoverClickListener { interface OnCoverClickListener {

@ -20,7 +20,6 @@ import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.library.LibraryUpdateService
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.base.controller.NoToolbarElevationController
import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.MainActivity
@ -29,6 +28,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.recently_read.RecentlyReadController import eu.kanade.tachiyomi.ui.recently_read.RecentlyReadController
import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.notificationManager
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController
import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.snack
import kotlinx.android.synthetic.main.main_activity.* import kotlinx.android.synthetic.main.main_activity.*
import kotlinx.android.synthetic.main.recent_chapters_controller.* import kotlinx.android.synthetic.main.recent_chapters_controller.*
@ -42,7 +42,6 @@ import uy.kohesive.injekt.api.get
* UI related actions should be called from here. * UI related actions should be called from here.
*/ */
class RecentChaptersController : NucleusController<RecentChaptersPresenter>(), class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
NoToolbarElevationController,
ActionMode.Callback, ActionMode.Callback,
FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemClickListener,
FlexibleAdapter.OnItemLongClickListener, FlexibleAdapter.OnItemLongClickListener,
@ -111,7 +110,8 @@ class RecentChaptersController : NucleusController<RecentChaptersPresenter>(),
// It can be a very long operation, so we disable swipe refresh and show a snackbar. // It can be a very long operation, so we disable swipe refresh and show a snackbar.
swipe_refresh.isRefreshing = false swipe_refresh.isRefreshing = false
} }
//recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener)
scrollViewWith(recycler, swipeRefreshLayout = swipe_refresh)
} }
override fun onDestroyView(view: View) { override fun onDestroyView(view: View) {

@ -20,6 +20,7 @@ import eu.kanade.tachiyomi.ui.base.controller.BaseController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.catalogue.browse.ProgressItem import eu.kanade.tachiyomi.ui.catalogue.browse.ProgressItem
import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.main.RootSearchInterface
import eu.kanade.tachiyomi.ui.manga.MangaDetailsController import eu.kanade.tachiyomi.ui.manga.MangaDetailsController
import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.recent_updates.RecentChaptersController import eu.kanade.tachiyomi.ui.recent_updates.RecentChaptersController
@ -27,6 +28,7 @@ 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.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController
import eu.kanade.tachiyomi.util.view.scrollViewWith
import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener
import kotlinx.android.synthetic.main.main_activity.* import kotlinx.android.synthetic.main.main_activity.*
import kotlinx.android.synthetic.main.recently_read_controller.* import kotlinx.android.synthetic.main.recently_read_controller.*
@ -44,6 +46,7 @@ class RecentlyReadController(bundle: Bundle? = null) : BaseController(bundle),
RecentlyReadAdapter.OnRemoveClickListener, RecentlyReadAdapter.OnRemoveClickListener,
RecentlyReadAdapter.OnResumeClickListener, RecentlyReadAdapter.OnResumeClickListener,
RecentlyReadAdapter.OnCoverClickListener, RecentlyReadAdapter.OnCoverClickListener,
RootSearchInterface,
RemoveHistoryDialog.Listener { RemoveHistoryDialog.Listener {
init { init {
@ -89,6 +92,7 @@ class RecentlyReadController(bundle: Bundle? = null) : BaseController(bundle),
recycler.setHasFixedSize(true) recycler.setHasFixedSize(true)
recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener)
resetProgressItem() resetProgressItem()
scrollViewWith(recycler)
if (recentItems != null) if (recentItems != null)
adapter?.updateDataSet(recentItems!!.toList()) adapter?.updateDataSet(recentItems!!.toList())
@ -132,9 +136,10 @@ class RecentlyReadController(bundle: Bundle? = null) : BaseController(bundle),
override fun onUpdateEmptyView(size: Int) { override fun onUpdateEmptyView(size: Int) {
if (size > 0) { if (size > 0) {
empty_view?.hide() // empty_view?.hide()
} else { } else {
empty_view.show(R.drawable.ic_history_white_128dp, R.string.information_no_recent_manga) // empty_view.show(R.drawable.ic_history_white_128dp, R.string
//.information_no_recent_manga)
} }
} }

@ -17,8 +17,6 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.base.controller.BaseController
import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForController import eu.kanade.tachiyomi.util.view.applyWindowInsetsForController
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController
import kotlinx.android.synthetic.main.main_activity.*
import rx.Observable import rx.Observable
import rx.Subscription import rx.Subscription
import rx.subscriptions.CompositeSubscription import rx.subscriptions.CompositeSubscription
@ -37,12 +35,8 @@ abstract class SettingsController : PreferenceController() {
untilDestroySubscriptions = CompositeSubscription() untilDestroySubscriptions = CompositeSubscription()
} }
val view = super.onCreateView(inflater, container, savedInstanceState) val view = super.onCreateView(inflater, container, savedInstanceState)
if (this is SettingsMainController)
view.applyWindowInsetsForRootController(activity!!.navigationView)
else {
view.applyWindowInsetsForController() view.applyWindowInsetsForController()
listView.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) listView.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener)
}
return view return view
} }

@ -21,7 +21,11 @@ import androidx.annotation.Px
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
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.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.amulyakhare.textdrawable.TextDrawable 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
@ -29,9 +33,12 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
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
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.getResourceColor
import kotlinx.android.synthetic.main.main_activity.*
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import kotlin.math.abs
import kotlin.math.min import kotlin.math.min
/** /**
@ -231,7 +238,8 @@ fun View.applyWindowInsetsForRootController(bottomNav: View) {
view.updateLayoutParams<FrameLayout.LayoutParams> { view.updateLayoutParams<FrameLayout.LayoutParams> {
val attrsArray = intArrayOf(android.R.attr.actionBarSize) val attrsArray = intArrayOf(android.R.attr.actionBarSize)
val array = view.context.obtainStyledAttributes(attrsArray) val array = view.context.obtainStyledAttributes(attrsArray)
topMargin = insets.systemWindowInsetTop + array.getDimensionPixelSize(0, 0) //topMargin = insets.systemWindowInsetTop + array
//.getDimensionPixelSize(0, 0)
bottomMargin = bottomNav.height bottomMargin = bottomNav.height
array.recycle() array.recycle()
} }
@ -304,6 +312,66 @@ fun Controller.setOnQueryTextChangeListener(searchView: SearchView, f: (text: St
}) })
} }
fun Controller.scrollViewWith(recycler: RecyclerView,
padBottom: Boolean = false,
swipeRefreshLayout: SwipeRefreshLayout? = null,
f: ((WindowInsets) -> Unit)? = null) {
var statusBarHeight = -1
activity!!.appbar.y = 0f
recycler.doOnApplyWindowInsets { view, insets, _ ->
val attrsArray = intArrayOf(android.R.attr.actionBarSize)
val array = view.context.obtainStyledAttributes(attrsArray)
val headerHeight = insets.systemWindowInsetTop + array.getDimensionPixelSize(0, 0)
view.updatePaddingRelative(
top = headerHeight,
bottom = if (padBottom) insets.systemWindowInsetBottom else 0
)
swipeRefreshLayout?.setProgressViewOffset(false, headerHeight + (-60).dpToPx,
headerHeight + 10.dpToPx)
statusBarHeight = insets.systemWindowInsetTop
array.recycle()
f?.invoke(insets)
}
recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (router.backstack.lastOrNull()?.controller() == this@scrollViewWith &&
statusBarHeight > -1 &&
activity!!.appbar.height > 0) {
activity!!.appbar.y -= dy
activity!!.appbar.y = clamp(
activity!!.appbar.y,
-activity!!.appbar.height.toFloat(),// + statusBarHeight,
0f
)
}
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (router.backstack.lastOrNull()?.controller() == this@scrollViewWith &&
statusBarHeight > -1 &&
activity!!.appbar.height > 0) {
val halfWay = abs((-activity!!.appbar.height.toFloat()) / 2)
val shortAnimationDuration = resources?.getInteger(
android.R.integer.config_shortAnimTime
) ?: 0
val closerToTop = abs(activity!!.appbar.y) - halfWay > 0
val atTop = (recycler.layoutManager as LinearLayoutManager)
.findFirstVisibleItemPosition() < 2
activity!!.appbar.animate()
.y(if (closerToTop && !atTop)
(-activity!!.appbar.height.toFloat())
else 0f)
.setDuration(shortAnimationDuration.toLong())
.start()
}
}
}
})
}
inline fun View.updatePaddingRelative( inline fun View.updatePaddingRelative(
@Px start: Int = paddingStart, @Px start: Int = paddingStart,
@Px top: Int = paddingTop, @Px top: Int = paddingTop,

@ -19,15 +19,15 @@ class ElevationAppBarLayout @JvmOverloads constructor(
} }
fun enableElevation() { fun enableElevation() {
if (stateListAnimator == null) { /* if (stateListAnimator == null) {
stateListAnimator = origStateAnimator stateListAnimator = origStateAnimator
elevation = origElevation elevation = origElevation
} }*/
} }
fun disableElevation() { fun disableElevation() {
stateListAnimator = null // stateListAnimator = null
elevation = 0f //elevation = 0f
//translationZ = 0.1f.dpToPx //translationZ = 0.1f.dpToPx
} }

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto"
app:fontProviderAuthority="com.google.android.gms.fonts"
app:fontProviderPackage="com.google.android.gms"
app:fontProviderQuery="name=Roboto&amp;weight=500"
app:fontProviderCerts="@array/com_google_android_gms_fonts_certs">
</font-family>

@ -4,7 +4,6 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:id="@+id/catalouge_layout" android:id="@+id/catalouge_layout"
android:fitsSystemWindows="true"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <LinearLayout

@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/manga_layout" android:id="@+id/manga_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
tools:background="?android:attr/colorBackground"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom"> android:layout_gravity="bottom">

@ -3,7 +3,6 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

@ -4,7 +4,6 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:id="@+id/ext_swipe_refresh"> android:id="@+id/ext_swipe_refresh">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView

@ -9,11 +9,13 @@
<com.bluelinelabs.conductor.ChangeHandlerFrameLayout <com.bluelinelabs.conductor.ChangeHandlerFrameLayout
android:id="@+id/controller_container" android:id="@+id/controller_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0">
</com.bluelinelabs.conductor.ChangeHandlerFrameLayout> </com.bluelinelabs.conductor.ChangeHandlerFrameLayout>
@ -21,16 +23,32 @@
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?android:attr/colorBackground"
android:stateListAnimator="@null"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar <eu.kanade.tachiyomi.ui.base.CenteredToolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary" android:background="?android:attr/colorBackground">
android:theme="?attr/actionBarTheme" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/toolbar_title"
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:ellipsize="end"
android:gravity="start"
android:maxLines="1"
android:text="@string/label_library"
android:textColor="?actionBarTintColor"
android:textSize="20sp"
app:fontFamily="@font/roboto_medium" />
</eu.kanade.tachiyomi.ui.base.CenteredToolbar>
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/tabs" android:id="@+id/tabs"

@ -3,7 +3,7 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="32dp" android:layout_height="32dp"
android:background="?attr/colorPrimary" android:background="?android:attr/colorBackground"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingStart="?android:attr/listPreferredItemPaddingStart"

@ -1,12 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler" android:id="@+id/recycler"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -16,12 +10,3 @@
tools:listitem="@layout/recently_read_item"> tools:listitem="@layout/recently_read_item">
</androidx.recyclerview.widget.RecyclerView> </androidx.recyclerview.widget.RecyclerView>
<eu.kanade.tachiyomi.widget.EmptyView
android:id="@+id/empty_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
</FrameLayout>

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

@ -15,10 +15,5 @@
android:id="@+id/nav_catalogues" android:id="@+id/nav_catalogues"
android:icon="@drawable/ic_explore_black_24dp" android:icon="@drawable/ic_explore_black_24dp"
android:title="@string/short_catalogues" /> android:title="@string/short_catalogues" />
<item
android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings_black_24dp"
android:title="@string/label_settings"
android:checkable="false" />
</group> </group>
</menu> </menu>

@ -6,11 +6,19 @@
android:id="@+id/action_search" android:id="@+id/action_search"
android:title="@string/action_search" android:title="@string/action_search"
android:icon="@drawable/ic_search_white_24dp" android:icon="@drawable/ic_search_white_24dp"
android:visible="false"
app:showAsAction="collapseActionView|ifRoom" app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="androidx.appcompat.widget.SearchView"/> app:actionViewClass="androidx.appcompat.widget.SearchView"/>
<item android:id="@+id/action_settings" <item android:id="@+id/action_filter"
android:title="@string/pref_category_sources" android:title="@string/action_filter"
android:icon="@drawable/ic_filter_list_white_24dp"
app:showAsAction="never"/>
<item
android:id="@+id/action_settings"
android:icon="@drawable/ic_settings_white_24dp" android:icon="@drawable/ic_settings_white_24dp"
app:showAsAction="ifRoom"/> android:title="@string/label_settings"
app:showAsAction="never"
/>
</menu> </menu>

@ -8,12 +8,14 @@
android:id="@+id/action_search" android:id="@+id/action_search"
android:icon="@drawable/ic_search_white_24dp" android:icon="@drawable/ic_search_white_24dp"
android:title="@string/action_search" android:title="@string/action_search"
android:visible="false"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|ifRoom" /> app:showAsAction="collapseActionView|ifRoom" />
<item <item
android:id="@+id/action_library_filter" android:id="@+id/action_library_filter"
android:icon="@drawable/ic_filter_list_white_24dp" android:icon="@drawable/ic_filter_list_white_24dp"
android:visible="false"
android:title="@string/action_filter" android:title="@string/action_filter"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
@ -21,7 +23,14 @@
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:title="@string/action_view_options" android:title="@string/action_view_options"
app:showAsAction="ifRoom" app:showAsAction="never"
/>
<item
android:id="@+id/action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="@string/label_settings"
app:showAsAction="never"
/> />
</menu> </menu>

@ -6,5 +6,12 @@
android:id="@+id/action_recents" android:id="@+id/action_recents"
android:icon="@drawable/ic_history_black_24dp" android:icon="@drawable/ic_history_black_24dp"
android:title="@string/label_recent_manga" android:title="@string/label_recent_manga"
app:showAsAction="ifRoom" /> app:showAsAction="never" />
<item
android:id="@+id/action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="@string/label_settings"
app:showAsAction="never"
/>
</menu> </menu>

@ -4,6 +4,7 @@
android:id="@+id/action_search" android:id="@+id/action_search"
android:icon="@drawable/ic_search_white_24dp" android:icon="@drawable/ic_search_white_24dp"
android:title="@string/action_search" android:title="@string/action_search"
android:visible="false"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView" /> app:showAsAction="ifRoom|collapseActionView" />
@ -11,6 +12,12 @@
android:id="@+id/action_recents" android:id="@+id/action_recents"
android:icon="@drawable/ic_update_black_24dp" android:icon="@drawable/ic_update_black_24dp"
android:title="@string/label_recent_updates" android:title="@string/label_recent_updates"
app:showAsAction="ifRoom" /> app:showAsAction="never" />
<item
android:id="@+id/action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="@string/label_settings"
app:showAsAction="never"
/>
</menu> </menu>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="com_google_android_gms_fonts_certs">
<item>@array/com_google_android_gms_fonts_certs_dev</item>
<item>@array/com_google_android_gms_fonts_certs_prod</item>
</array>
<string-array name="com_google_android_gms_fonts_certs_dev">
<item>
MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
</item>
</string-array>
<string-array name="com_google_android_gms_fonts_certs_prod">
<item>
MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
</item>
</string-array>
</resources>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="preloaded_fonts" translatable="false">
<item>@font/roboto_medium</item>
</array>
</resources>
Loading…
Cancel
Save