Adjust chapter download button visual (#5213)

* Removed the blinking icon and added back the indeterminate indicator for
queued items
* Make the downloading indicator a solid circle
This commit is contained in:
Ivan Iskandar 2021-05-29 09:38:03 +07:00 committed by GitHub
parent 9f744bc445
commit 9de07c11a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 47 deletions

View file

@ -1,14 +1,17 @@
package eu.kanade.tachiyomi.ui.manga.chapter package eu.kanade.tachiyomi.ui.manga.chapter
import android.animation.ObjectAnimator
import android.content.Context import android.content.Context
import android.content.res.ColorStateList
import android.util.AttributeSet import android.util.AttributeSet
import android.view.LayoutInflater import android.view.LayoutInflater
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.google.android.material.progressindicator.BaseProgressIndicator
import com.mikepenz.aboutlibraries.util.getThemeColor
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.databinding.ChapterDownloadViewBinding import eu.kanade.tachiyomi.databinding.ChapterDownloadViewBinding
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.view.setVectorCompat import eu.kanade.tachiyomi.util.view.setVectorCompat
class ChapterDownloadView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : class ChapterDownloadView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
@ -17,17 +20,15 @@ class ChapterDownloadView @JvmOverloads constructor(context: Context, attrs: Att
private val binding: ChapterDownloadViewBinding = private val binding: ChapterDownloadViewBinding =
ChapterDownloadViewBinding.inflate(LayoutInflater.from(context), this, false) ChapterDownloadViewBinding.inflate(LayoutInflater.from(context), this, false)
private var state = Download.State.NOT_DOWNLOADED private var state: Download.State? = null
private var progress = 0 private var progress = -1
private var downloadIconAnimator: ObjectAnimator? = null
init { init {
addView(binding.root) addView(binding.root)
} }
fun setState(state: Download.State, progress: Int = 0) { fun setState(state: Download.State, progress: Int = -1) {
val isDirty = this.state.value != state.value || this.progress != progress val isDirty = this.state?.value != state.value || this.progress != progress
if (isDirty) { if (isDirty) {
updateLayout(state, progress) updateLayout(state, progress)
} }
@ -36,29 +37,45 @@ class ChapterDownloadView @JvmOverloads constructor(context: Context, attrs: Att
private fun updateLayout(state: Download.State, progress: Int) { private fun updateLayout(state: Download.State, progress: Int) {
binding.downloadIcon.isVisible = state == Download.State.NOT_DOWNLOADED || binding.downloadIcon.isVisible = state == Download.State.NOT_DOWNLOADED ||
state == Download.State.DOWNLOADING || state == Download.State.QUEUE state == Download.State.DOWNLOADING || state == Download.State.QUEUE
if (state == Download.State.DOWNLOADING || state == Download.State.QUEUE) { binding.downloadIcon.imageTintList = if (state == Download.State.DOWNLOADING && progress > 0) {
if (downloadIconAnimator == null) { ColorStateList.valueOf(context.getThemeColor(android.R.attr.colorBackground))
downloadIconAnimator = } else {
ObjectAnimator.ofFloat(binding.downloadIcon, "alpha", 1f, 0f).apply { ColorStateList.valueOf(context.getThemeColor(android.R.attr.textColorHint))
duration = 1000
repeatCount = ObjectAnimator.INFINITE
repeatMode = ObjectAnimator.REVERSE
}
downloadIconAnimator?.start()
}
downloadIconAnimator?.currentPlayTime = System.currentTimeMillis() % 2000
} else if (downloadIconAnimator != null) {
downloadIconAnimator?.cancel()
downloadIconAnimator = null
binding.downloadIcon.alpha = 1f
} }
binding.downloadProgress.isVisible = state == Download.State.DOWNLOADING || binding.downloadProgress.apply {
state == Download.State.NOT_DOWNLOADED || state == Download.State.QUEUE val shouldBeVisible = state == Download.State.DOWNLOADING ||
if (state == Download.State.DOWNLOADING) { state == Download.State.NOT_DOWNLOADED || state == Download.State.QUEUE
binding.downloadProgress.setProgressCompat(progress, true) if (shouldBeVisible) {
} else { hideAnimationBehavior = BaseProgressIndicator.HIDE_NONE
binding.downloadProgress.setProgressCompat(100, true) show()
if (state == Download.State.NOT_DOWNLOADED || state == Download.State.QUEUE) {
trackThickness = 2.dpToPx
setIndicatorColor(context.getThemeColor(android.R.attr.textColorHint))
if (state == Download.State.NOT_DOWNLOADED) {
if (isIndeterminate) {
hide()
isIndeterminate = false
}
setProgressCompat(100, false)
} else if (!isIndeterminate) {
hide()
isIndeterminate = true
show()
}
} else if (state == Download.State.DOWNLOADING) {
if (isIndeterminate) {
hide()
}
trackThickness = 12.dpToPx
setIndicatorColor(context.getThemeColor(android.R.attr.textColorPrimary))
setProgressCompat(progress, true)
}
} else {
hideAnimationBehavior = BaseProgressIndicator.HIDE_OUTWARD
hide()
}
} }
binding.downloadStatusIcon.apply { binding.downloadStatusIcon.apply {

View file

@ -7,6 +7,22 @@
android:background="@drawable/ripple_regular" android:background="@drawable/ripple_regular"
android:padding="8dp"> android:padding="8dp">
<ImageView
android:id="@+id/download_status_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
tools:ignore="ContentDescription" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/download_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp"
android:progress="100"
app:indicatorInset="0dp"
app:indicatorSize="22dp" />
<ImageView <ImageView
android:id="@+id/download_icon" android:id="@+id/download_icon"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -17,22 +33,4 @@
app:tint="?android:attr/textColorHint" app:tint="?android:attr/textColorHint"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/download_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="1dp"
android:progress="100"
app:indicatorColor="?android:attr/textColorHint"
app:indicatorInset="0dp"
app:indicatorSize="24dp"
app:trackThickness="2dp" />
<ImageView
android:id="@+id/download_status_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
tools:ignore="ContentDescription" />
</FrameLayout> </FrameLayout>

View file

@ -6,7 +6,7 @@
android:layout_height="?android:attr/listPreferredItemHeight" android:layout_height="?android:attr/listPreferredItemHeight"
android:background="@drawable/list_item_selector_background" android:background="@drawable/list_item_selector_background"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingEnd="4dp"> android:paddingEnd="5dp">
<ImageView <ImageView
android:id="@+id/bookmark_icon" android:id="@+id/bookmark_icon"