mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Add downloaded icon in TransitionView when chapter is downloaded (#7575)
* Add downloaded icon in TransitionView * Change icon
This commit is contained in:
		| @@ -1,15 +1,24 @@ | ||||
| package eu.kanade.tachiyomi.ui.reader.viewer | ||||
|  | ||||
| import android.content.Context | ||||
| import android.text.SpannableStringBuilder | ||||
| import android.text.style.ImageSpan | ||||
| import android.util.AttributeSet | ||||
| import android.view.LayoutInflater | ||||
| import android.widget.LinearLayout | ||||
| import androidx.core.content.ContextCompat | ||||
| import androidx.core.text.bold | ||||
| import androidx.core.text.buildSpannedString | ||||
| import androidx.core.text.inSpans | ||||
| import androidx.core.view.isVisible | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.databinding.ReaderTransitionViewBinding | ||||
| import eu.kanade.tachiyomi.ui.reader.loader.DownloadPageLoader | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition | ||||
| import eu.kanade.tachiyomi.util.system.dpToPx | ||||
| import kotlin.math.roundToInt | ||||
|  | ||||
| class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : | ||||
|     LinearLayout(context, attrs) { | ||||
| @@ -21,10 +30,11 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At | ||||
|         layoutParams = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) | ||||
|     } | ||||
|  | ||||
|     fun bind(transition: ChapterTransition) { | ||||
|     fun bind(transition: ChapterTransition, downloadManager: DownloadManager, manga: Manga?) { | ||||
|         manga ?: return | ||||
|         when (transition) { | ||||
|             is ChapterTransition.Prev -> bindPrevChapterTransition(transition) | ||||
|             is ChapterTransition.Next -> bindNextChapterTransition(transition) | ||||
|             is ChapterTransition.Prev -> bindPrevChapterTransition(transition, downloadManager, manga) | ||||
|             is ChapterTransition.Next -> bindNextChapterTransition(transition, downloadManager, manga) | ||||
|         } | ||||
|         missingChapterWarning(transition) | ||||
|     } | ||||
| @@ -32,20 +42,32 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At | ||||
|     /** | ||||
|      * Binds a previous chapter transition on this view and subscribes to the page load status. | ||||
|      */ | ||||
|     private fun bindPrevChapterTransition(transition: ChapterTransition) { | ||||
|         val prevChapter = transition.to | ||||
|     private fun bindPrevChapterTransition( | ||||
|         transition: ChapterTransition, | ||||
|         downloadManager: DownloadManager, | ||||
|         manga: Manga, | ||||
|     ) { | ||||
|         val prevChapter = transition.to?.chapter | ||||
|  | ||||
|         val hasPrevChapter = prevChapter != null | ||||
|         binding.lowerText.isVisible = hasPrevChapter | ||||
|         if (hasPrevChapter) { | ||||
|         binding.lowerText.isVisible = prevChapter != null | ||||
|         if (prevChapter != null) { | ||||
|             binding.upperText.textAlignment = TEXT_ALIGNMENT_TEXT_START | ||||
|             val isPrevDownloaded = downloadManager.isChapterDownloaded( | ||||
|                 prevChapter.name, | ||||
|                 prevChapter.scanlator, | ||||
|                 manga.title, | ||||
|                 manga.source, | ||||
|             ) | ||||
|             val isCurrentDownloaded = transition.from.pageLoader is DownloadPageLoader | ||||
|             binding.upperText.text = buildSpannedString { | ||||
|                 bold { append(context.getString(R.string.transition_previous)) } | ||||
|                 append("\n${prevChapter!!.chapter.name}") | ||||
|                 append("\n${prevChapter.name}") | ||||
|                 if (isPrevDownloaded) addDLImageSpan() | ||||
|             } | ||||
|             binding.lowerText.text = buildSpannedString { | ||||
|                 bold { append(context.getString(R.string.transition_current)) } | ||||
|                 append("\n${transition.from.chapter.name}") | ||||
|                 if (isCurrentDownloaded) addDLImageSpan() | ||||
|             } | ||||
|         } else { | ||||
|             binding.upperText.textAlignment = TEXT_ALIGNMENT_CENTER | ||||
| @@ -56,20 +78,32 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At | ||||
|     /** | ||||
|      * Binds a next chapter transition on this view and subscribes to the load status. | ||||
|      */ | ||||
|     private fun bindNextChapterTransition(transition: ChapterTransition) { | ||||
|         val nextChapter = transition.to | ||||
|     private fun bindNextChapterTransition( | ||||
|         transition: ChapterTransition, | ||||
|         downloadManager: DownloadManager, | ||||
|         manga: Manga, | ||||
|     ) { | ||||
|         val nextChapter = transition.to?.chapter | ||||
|  | ||||
|         val hasNextChapter = nextChapter != null | ||||
|         binding.lowerText.isVisible = hasNextChapter | ||||
|         if (hasNextChapter) { | ||||
|         binding.lowerText.isVisible = nextChapter != null | ||||
|         if (nextChapter != null) { | ||||
|             binding.upperText.textAlignment = TEXT_ALIGNMENT_TEXT_START | ||||
|             val isCurrentDownloaded = transition.from.pageLoader is DownloadPageLoader | ||||
|             val isNextDownloaded = downloadManager.isChapterDownloaded( | ||||
|                 nextChapter.name, | ||||
|                 nextChapter.scanlator, | ||||
|                 manga.title, | ||||
|                 manga.source, | ||||
|             ) | ||||
|             binding.upperText.text = buildSpannedString { | ||||
|                 bold { append(context.getString(R.string.transition_finished)) } | ||||
|                 append("\n${transition.from.chapter.name}") | ||||
|                 if (isCurrentDownloaded) addDLImageSpan() | ||||
|             } | ||||
|             binding.lowerText.text = buildSpannedString { | ||||
|                 bold { append(context.getString(R.string.transition_next)) } | ||||
|                 append("\n${nextChapter!!.chapter.name}") | ||||
|                 append("\n${nextChapter.name}") | ||||
|                 if (isNextDownloaded) addDLImageSpan() | ||||
|             } | ||||
|         } else { | ||||
|             binding.upperText.textAlignment = TEXT_ALIGNMENT_CENTER | ||||
| @@ -77,6 +111,17 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private fun SpannableStringBuilder.addDLImageSpan() { | ||||
|         val icon = ContextCompat.getDrawable(context, R.drawable.ic_offline_pin_24dp)?.mutate() | ||||
|             ?.apply { | ||||
|                 val size = binding.lowerText.textSize + 4.dpToPx | ||||
|                 setTint(binding.lowerText.currentTextColor) | ||||
|                 setBounds(0, 0, size.roundToInt(), size.roundToInt()) | ||||
|             } ?: return | ||||
|         append(" ") | ||||
|         inSpans(ImageSpan(icon)) { append("image") } | ||||
|     } | ||||
|  | ||||
|     private fun missingChapterWarning(transition: ChapterTransition) { | ||||
|         if (transition.to == null) { | ||||
|             binding.warning.isVisible = false | ||||
|   | ||||
| @@ -61,7 +61,7 @@ class PagerTransitionHolder( | ||||
|         addView(transitionView) | ||||
|         addView(pagesContainer) | ||||
|  | ||||
|         transitionView.bind(transition) | ||||
|         transitionView.bind(transition, viewer.downloadManager, viewer.activity.presenter.manga) | ||||
|  | ||||
|         transition.to?.let { observeStatus(it) } | ||||
|     } | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import androidx.core.view.isGone | ||||
| import androidx.core.view.isVisible | ||||
| import androidx.viewpager.widget.ViewPager | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.ui.reader.ReaderActivity | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition | ||||
| import eu.kanade.tachiyomi.ui.reader.model.InsertPage | ||||
| @@ -21,6 +22,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation.NavigationRegion | ||||
| import eu.kanade.tachiyomi.util.system.logcat | ||||
| import kotlinx.coroutines.MainScope | ||||
| import kotlinx.coroutines.cancel | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import kotlin.math.min | ||||
|  | ||||
| /** | ||||
| @@ -29,6 +31,8 @@ import kotlin.math.min | ||||
| @Suppress("LeakingThis") | ||||
| abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { | ||||
|  | ||||
|     val downloadManager: DownloadManager by injectLazy() | ||||
|  | ||||
|     private val scope = MainScope() | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -63,7 +63,7 @@ class WebtoonTransitionHolder( | ||||
|      * Binds the given [transition] with this view holder, subscribing to its state. | ||||
|      */ | ||||
|     fun bind(transition: ChapterTransition) { | ||||
|         transitionView.bind(transition) | ||||
|         transitionView.bind(transition, viewer.downloadManager, viewer.activity.presenter.manga) | ||||
|  | ||||
|         transition.to?.let { observeStatus(it, transition) } | ||||
|     } | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import androidx.core.view.isGone | ||||
| import androidx.core.view.isVisible | ||||
| import androidx.recyclerview.widget.RecyclerView | ||||
| import androidx.recyclerview.widget.WebtoonLayoutManager | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.ui.reader.ReaderActivity | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition | ||||
| @@ -24,6 +25,7 @@ import kotlinx.coroutines.cancel | ||||
| import rx.subscriptions.CompositeSubscription | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import kotlin.math.max | ||||
| import kotlin.math.min | ||||
|  | ||||
| @@ -32,6 +34,8 @@ import kotlin.math.min | ||||
|  */ | ||||
| class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = true) : BaseViewer { | ||||
|  | ||||
|     val downloadManager: DownloadManager by injectLazy() | ||||
|  | ||||
|     private val scope = MainScope() | ||||
|  | ||||
|     /** | ||||
|   | ||||
		Reference in New Issue
	
	Block a user