Disable elevation in recent chapters. Improve downloads discovery

This commit is contained in:
len 2017-01-22 23:13:07 +01:00
parent c6b89a826c
commit cdf5bbadea
4 changed files with 74 additions and 18 deletions

View file

@ -17,6 +17,7 @@ import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.toast import eu.kanade.tachiyomi.util.toast
import eu.kanade.tachiyomi.widget.DeletingChaptersDialog import eu.kanade.tachiyomi.widget.DeletingChaptersDialog
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_recent_chapters.* import kotlinx.android.synthetic.main.fragment_recent_chapters.*
import nucleus.factory.RequiresPresenter import nucleus.factory.RequiresPresenter
import timber.log.Timber import timber.log.Timber
@ -101,13 +102,14 @@ class RecentChaptersFragment:
setToolbarTitle(R.string.label_recent_updates) setToolbarTitle(R.string.label_recent_updates)
// Disable toolbar elevation, it looks better with sticky headers. // Disable toolbar elevation, it looks better with sticky headers.
// ViewCompat.setElevation(activity.appbar, 0f) activity.appbar.disableElevation()
} }
// override fun onDestroyView() { override fun onDestroyView() {
// ViewCompat.setElevation(activity.appbar, 4.dpToPx.toFloat()) // Restore toolbar elevation.
// super.onDestroyView() activity.appbar.enableElevation()
// } super.onDestroyView()
}
/** /**
* Returns selected chapters * Returns selected chapters

View file

@ -82,8 +82,8 @@ class RecentChaptersPresenter : BasePresenter<RecentChaptersFragment>() {
// Find an active download for this chapter. // Find an active download for this chapter.
val download = downloadManager.queue.find { it.chapter.id == item.chapter.id } val download = downloadManager.queue.find { it.chapter.id == item.chapter.id }
// If there's an active download, assign it, otherwise ask the manager if the chapter is // If there's an active download, assign it, otherwise ask the manager if
// downloaded and assign it to the status. // the chapter is downloaded and assign it to the status.
if (download != null) { if (download != null) {
item.download = download item.download = download
} }
@ -126,30 +126,36 @@ class RecentChaptersPresenter : BasePresenter<RecentChaptersFragment>() {
* @param items the list of chapter from the database. * @param items the list of chapter from the database.
*/ */
private fun setDownloadedChapters(items: List<RecentChapterItem>) { private fun setDownloadedChapters(items: List<RecentChapterItem>) {
// Cached list of downloaded manga directories. // Cached list of downloaded manga directories. Directory name is also cached because
val mangaDirectories = mutableMapOf<Long, Array<UniFile>>() // it's slow when using SAF.
val mangaDirsForSource = mutableMapOf<Long, Map<String?, UniFile>>()
// Cached list of downloaded chapter directories for a manga. // Cached list of downloaded chapter directories for a manga.
val chapterDirectories = mutableMapOf<Long, Array<UniFile>>() val chapterDirsForManga = mutableMapOf<Long, Map<String?, UniFile>>()
for (item in items) { for (item in items) {
val manga = item.manga val manga = item.manga
val chapter = item.chapter val chapter = item.chapter
val source = sourceManager.get(manga.source) ?: continue val source = sourceManager.get(manga.source) ?: continue
val mangaDirs = mangaDirectories.getOrPut(source.id) { // Get the directories for the source of the manga.
downloadManager.findSourceDir(source)?.listFiles() ?: emptyArray() val dirsForSource = mangaDirsForSource.getOrPut(source.id) {
val sourceDir = downloadManager.findSourceDir(source)
sourceDir?.listFiles()?.associateBy { it.name }.orEmpty()
} }
// Get the manga directory in the source or continue.
val mangaDirName = downloadManager.getMangaDirName(manga) val mangaDirName = downloadManager.getMangaDirName(manga)
val mangaDir = mangaDirs.find { it.name == mangaDirName } ?: continue val mangaDir = dirsForSource[mangaDirName] ?: continue
val chapterDirs = chapterDirectories.getOrPut(manga.id!!) { // Get the directories for the manga.
mangaDir.listFiles() ?: emptyArray() val chapterDirs = chapterDirsForManga.getOrPut(manga.id!!) {
mangaDir.listFiles()?.associateBy { it.name }.orEmpty()
} }
// Assign the download if the directory exists.
val chapterDirName = downloadManager.getChapterDirName(chapter) val chapterDirName = downloadManager.getChapterDirName(chapter)
if (chapterDirs.any { it.name == chapterDirName }) { if (chapterDirName in chapterDirs) {
item.status = Download.DOWNLOADED item.status = Download.DOWNLOADED
} }
} }

View file

@ -0,0 +1,48 @@
package eu.kanade.tachiyomi.widget
import android.animation.ObjectAnimator
import android.animation.StateListAnimator
import android.content.Context
import android.os.Build
import android.support.design.R
import android.support.design.widget.AppBarLayout
import android.util.AttributeSet
class ElevationAppBarLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : AppBarLayout(context, attrs) {
private var origStateAnimator: StateListAnimator? = null
init {
if (Build.VERSION.SDK_INT >= 21) {
origStateAnimator = stateListAnimator
}
}
fun enableElevation() {
if (Build.VERSION.SDK_INT >= 21) {
stateListAnimator = origStateAnimator
}
}
fun disableElevation() {
if (Build.VERSION.SDK_INT >= 21) {
stateListAnimator = StateListAnimator().apply {
val objAnimator = ObjectAnimator.ofFloat(this, "elevation", 0f)
// Enabled and collapsible, but not collapsed means not elevated
addState(intArrayOf(android.R.attr.enabled, R.attr.state_collapsible, -R.attr.state_collapsed),
objAnimator)
// Default enabled state
addState(intArrayOf(android.R.attr.enabled), objAnimator)
// Disabled state
addState(IntArray(0), objAnimator)
}
}
}
}

View file

@ -12,7 +12,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout <eu.kanade.tachiyomi.widget.ElevationAppBarLayout
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">
@ -30,7 +30,7 @@
app:tabMode="scrollable" app:tabMode="scrollable"
app:tabMinWidth="75dp"/> app:tabMinWidth="75dp"/>
</android.support.design.widget.AppBarLayout> </eu.kanade.tachiyomi.widget.ElevationAppBarLayout>
<FrameLayout <FrameLayout