color for reader's loading/progress indicator
This commit is contained in:
parent
c8c4ad7be6
commit
a8728f332c
13 changed files with 275 additions and 40 deletions
|
|
@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.material3.AlertDialog
|
import androidx.compose.material3.AlertDialog
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.material3.TextButton
|
import androidx.compose.material3.TextButton
|
||||||
import androidx.compose.material3.surfaceColorAtElevation
|
import androidx.compose.material3.surfaceColorAtElevation
|
||||||
|
|
@ -580,7 +581,11 @@ class ReaderActivity : BaseActivity() {
|
||||||
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
CircularProgressIndicator()
|
CircularProgressIndicator(
|
||||||
|
// KMK -->
|
||||||
|
color = MaterialTheme.colorScheme.primary,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
Text(stringResource(MR.strings.loading))
|
Text(stringResource(MR.strings.loading))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -901,8 +906,17 @@ class ReaderActivity : BaseActivity() {
|
||||||
* Called from the presenter when a manga is ready. Used to instantiate the appropriate viewer.
|
* Called from the presenter when a manga is ready. Used to instantiate the appropriate viewer.
|
||||||
*/
|
*/
|
||||||
private fun updateViewer() {
|
private fun updateViewer() {
|
||||||
|
// KMK -->
|
||||||
|
val manga = viewModel.manga
|
||||||
|
// KMK <--
|
||||||
val prevViewer = viewModel.state.value.viewer
|
val prevViewer = viewModel.state.value.viewer
|
||||||
val newViewer = ReadingMode.toViewer(viewModel.getMangaReadingMode(), this)
|
val newViewer = ReadingMode.toViewer(
|
||||||
|
viewModel.getMangaReadingMode(),
|
||||||
|
this,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = manga?.asMangaCover()?.vibrantCoverColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
|
||||||
if (window.sharedElementEnterTransition is MaterialContainerTransform) {
|
if (window.sharedElementEnterTransition is MaterialContainerTransform) {
|
||||||
// Wait until transition is complete to avoid crash on API 26
|
// Wait until transition is complete to avoid crash on API 26
|
||||||
|
|
@ -930,7 +944,6 @@ class ReaderActivity : BaseActivity() {
|
||||||
viewModel.state.value.lastShiftDoubleState?.let { newViewer.config.shiftDoublePage = it }
|
viewModel.state.value.lastShiftDoubleState?.let { newViewer.config.shiftDoublePage = it }
|
||||||
}
|
}
|
||||||
|
|
||||||
val manga = viewModel.state.value.manga
|
|
||||||
val defaultReaderType = manga?.defaultReaderType(
|
val defaultReaderType = manga?.defaultReaderType(
|
||||||
manga.mangaType(sourceName = sourceManager.get(manga.source)?.name),
|
manga.mangaType(sourceName = sourceManager.get(manga.source)?.name),
|
||||||
)
|
)
|
||||||
|
|
@ -947,7 +960,12 @@ class ReaderActivity : BaseActivity() {
|
||||||
showReadingModeToast(viewModel.getMangaReadingMode())
|
showReadingModeToast(viewModel.getMangaReadingMode())
|
||||||
}
|
}
|
||||||
|
|
||||||
loadingIndicator = ReaderProgressIndicator(this)
|
loadingIndicator = ReaderProgressIndicator(
|
||||||
|
context = this,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = manga?.asMangaCover()?.vibrantCoverColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
binding.readerContainer.addView(loadingIndicator)
|
binding.readerContainer.addView(loadingIndicator)
|
||||||
|
|
||||||
startPostponedEnterTransition()
|
startPostponedEnterTransition()
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package eu.kanade.tachiyomi.ui.reader.setting
|
package eu.kanade.tachiyomi.ui.reader.setting
|
||||||
|
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import dev.icerock.moko.resources.StringResource
|
import dev.icerock.moko.resources.StringResource
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
|
|
@ -66,13 +67,45 @@ enum class ReadingMode(
|
||||||
return mode.type is ViewerType.Pager
|
return mode.type is ViewerType.Pager
|
||||||
}
|
}
|
||||||
|
|
||||||
fun toViewer(preference: Int?, activity: ReaderActivity): Viewer {
|
fun toViewer(
|
||||||
|
preference: Int?,
|
||||||
|
activity: ReaderActivity,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt seedColor: Int?
|
||||||
|
// KMK <--
|
||||||
|
): Viewer {
|
||||||
return when (fromPreference(preference)) {
|
return when (fromPreference(preference)) {
|
||||||
LEFT_TO_RIGHT -> L2RPagerViewer(activity)
|
LEFT_TO_RIGHT -> L2RPagerViewer(
|
||||||
RIGHT_TO_LEFT -> R2LPagerViewer(activity)
|
activity,
|
||||||
VERTICAL -> VerticalPagerViewer(activity)
|
// KMK -->
|
||||||
WEBTOON -> WebtoonViewer(activity)
|
seedColor = seedColor,
|
||||||
CONTINUOUS_VERTICAL -> WebtoonViewer(activity, isContinuous = false)
|
// KMK <--
|
||||||
|
)
|
||||||
|
RIGHT_TO_LEFT -> R2LPagerViewer(
|
||||||
|
activity,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
VERTICAL -> VerticalPagerViewer(
|
||||||
|
activity,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
WEBTOON -> WebtoonViewer(
|
||||||
|
activity,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
CONTINUOUS_VERTICAL -> WebtoonViewer(
|
||||||
|
activity,
|
||||||
|
isContinuous = false,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
DEFAULT -> throw IllegalStateException("Preference value must be resolved: $preference")
|
DEFAULT -> throw IllegalStateException("Preference value must be resolved: $preference")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,18 +5,25 @@ import android.util.AttributeSet
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.annotation.IntRange
|
import androidx.annotation.IntRange
|
||||||
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.material3.CircularProgressIndicator
|
import androidx.compose.material3.CircularProgressIndicator
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableFloatStateOf
|
import androidx.compose.runtime.mutableFloatStateOf
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.AbstractComposeView
|
import androidx.compose.ui.platform.AbstractComposeView
|
||||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.google.android.material.progressindicator.CircularProgressIndicator
|
import com.google.android.material.progressindicator.CircularProgressIndicator
|
||||||
|
import com.materialkolor.DynamicMaterialTheme
|
||||||
|
import eu.kanade.domain.ui.UiPreferences
|
||||||
import eu.kanade.presentation.theme.TachiyomiTheme
|
import eu.kanade.presentation.theme.TachiyomiTheme
|
||||||
import tachiyomi.presentation.core.components.CombinedCircularProgressIndicator
|
import tachiyomi.presentation.core.components.CombinedCircularProgressIndicator
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A wrapper for [CircularProgressIndicator] that always rotates.
|
* A wrapper for [CircularProgressIndicator] that always rotates.
|
||||||
|
|
@ -27,6 +34,9 @@ class ReaderProgressIndicator @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attrs: AttributeSet? = null,
|
attrs: AttributeSet? = null,
|
||||||
defStyleAttr: Int = 0,
|
defStyleAttr: Int = 0,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
) : AbstractComposeView(context, attrs, defStyleAttr) {
|
) : AbstractComposeView(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
@ -38,8 +48,25 @@ class ReaderProgressIndicator @JvmOverloads constructor(
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
override fun Content() {
|
override fun Content() {
|
||||||
TachiyomiTheme {
|
// KMK -->
|
||||||
CombinedCircularProgressIndicator(progress = { progress })
|
val uiPreferences = Injekt.get<UiPreferences>()
|
||||||
|
val themeDarkAmoled = uiPreferences.themeDarkAmoled().get()
|
||||||
|
val themeCoverBasedStyle = uiPreferences.themeCoverBasedStyle().get()
|
||||||
|
if (seedColor != null) {
|
||||||
|
DynamicMaterialTheme(
|
||||||
|
seedColor = Color(seedColor),
|
||||||
|
useDarkTheme = isSystemInDarkTheme(),
|
||||||
|
withAmoled = themeDarkAmoled,
|
||||||
|
style = themeCoverBasedStyle,
|
||||||
|
animate = true,
|
||||||
|
) {
|
||||||
|
CombinedCircularProgressIndicator(progress = { progress })
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// KMK <--
|
||||||
|
TachiyomiTheme {
|
||||||
|
CombinedCircularProgressIndicator(progress = { progress })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ package eu.kanade.tachiyomi.ui.reader.viewer
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
|
import androidx.compose.foundation.isSystemInDarkTheme
|
||||||
import androidx.compose.material3.LocalContentColor
|
import androidx.compose.material3.LocalContentColor
|
||||||
import androidx.compose.material3.LocalTextStyle
|
import androidx.compose.material3.LocalTextStyle
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
|
@ -10,15 +12,26 @@ import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.AbstractComposeView
|
import androidx.compose.ui.platform.AbstractComposeView
|
||||||
|
import com.materialkolor.DynamicMaterialTheme
|
||||||
|
import eu.kanade.domain.ui.UiPreferences
|
||||||
import eu.kanade.presentation.reader.ChapterTransition
|
import eu.kanade.presentation.reader.ChapterTransition
|
||||||
import eu.kanade.presentation.theme.TachiyomiTheme
|
import eu.kanade.presentation.theme.TachiyomiTheme
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.source.local.isLocal
|
import tachiyomi.source.local.isLocal
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
class ReaderTransitionView @JvmOverloads constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet? = null,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) :
|
||||||
AbstractComposeView(context, attrs) {
|
AbstractComposeView(context, attrs) {
|
||||||
|
|
||||||
private var data: Data? by mutableStateOf(null)
|
private var data: Data? by mutableStateOf(null)
|
||||||
|
|
@ -50,7 +63,10 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At
|
||||||
@Composable
|
@Composable
|
||||||
override fun Content() {
|
override fun Content() {
|
||||||
data?.let {
|
data?.let {
|
||||||
TachiyomiTheme {
|
// KMK -->
|
||||||
|
@Composable
|
||||||
|
fun content() {
|
||||||
|
// KMK <--
|
||||||
CompositionLocalProvider(
|
CompositionLocalProvider(
|
||||||
LocalTextStyle provides MaterialTheme.typography.bodySmall,
|
LocalTextStyle provides MaterialTheme.typography.bodySmall,
|
||||||
LocalContentColor provides MaterialTheme.colorScheme.onBackground,
|
LocalContentColor provides MaterialTheme.colorScheme.onBackground,
|
||||||
|
|
@ -62,6 +78,26 @@ class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: At
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// KMK -->
|
||||||
|
val uiPreferences = Injekt.get<UiPreferences>()
|
||||||
|
val themeDarkAmoled = uiPreferences.themeDarkAmoled().get()
|
||||||
|
val themeCoverBasedStyle = uiPreferences.themeCoverBasedStyle().get()
|
||||||
|
if (seedColor != null) {
|
||||||
|
DynamicMaterialTheme(
|
||||||
|
seedColor = Color(seedColor),
|
||||||
|
useDarkTheme = isSystemInDarkTheme(),
|
||||||
|
withAmoled = themeDarkAmoled,
|
||||||
|
style = themeCoverBasedStyle,
|
||||||
|
animate = true,
|
||||||
|
) {
|
||||||
|
content()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// KMK <--
|
||||||
|
TachiyomiTheme {
|
||||||
|
content()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import eu.kanade.tachiyomi.databinding.ReaderErrorBinding
|
import eu.kanade.tachiyomi.databinding.ReaderErrorBinding
|
||||||
import eu.kanade.tachiyomi.source.model.Page
|
import eu.kanade.tachiyomi.source.model.Page
|
||||||
|
|
@ -38,6 +39,9 @@ class PagerPageHolder(
|
||||||
val viewer: PagerViewer,
|
val viewer: PagerViewer,
|
||||||
val page: ReaderPage,
|
val page: ReaderPage,
|
||||||
private var extraPage: ReaderPage? = null,
|
private var extraPage: ReaderPage? = null,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
) : ReaderPageImageView(readerThemedContext), ViewPagerAdapter.PositionableView {
|
) : ReaderPageImageView(readerThemedContext), ViewPagerAdapter.PositionableView {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -49,7 +53,12 @@ class PagerPageHolder(
|
||||||
/**
|
/**
|
||||||
* Loading progress bar to indicate the current progress.
|
* Loading progress bar to indicate the current progress.
|
||||||
*/
|
*/
|
||||||
private val progressIndicator: ReaderProgressIndicator = ReaderProgressIndicator(readerThemedContext)
|
private val progressIndicator: ReaderProgressIndicator = ReaderProgressIndicator(
|
||||||
|
context = readerThemedContext,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error layout to show when the image fails to load.
|
* Error layout to show when the image fails to load.
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,12 @@ import android.view.ViewGroup
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.appcompat.widget.AppCompatTextView
|
import androidx.appcompat.widget.AppCompatTextView
|
||||||
import com.google.android.material.progressindicator.CircularProgressIndicator
|
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderButton
|
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderButton
|
||||||
|
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressIndicator
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderTransitionView
|
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderTransitionView
|
||||||
import eu.kanade.tachiyomi.util.system.dpToPx
|
import eu.kanade.tachiyomi.util.system.dpToPx
|
||||||
import eu.kanade.tachiyomi.widget.ViewPagerAdapter
|
import eu.kanade.tachiyomi.widget.ViewPagerAdapter
|
||||||
|
|
@ -31,6 +32,9 @@ class PagerTransitionHolder(
|
||||||
readerThemedContext: Context,
|
readerThemedContext: Context,
|
||||||
val viewer: PagerViewer,
|
val viewer: PagerViewer,
|
||||||
val transition: ChapterTransition,
|
val transition: ChapterTransition,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
) : LinearLayout(readerThemedContext), ViewPagerAdapter.PositionableView {
|
) : LinearLayout(readerThemedContext), ViewPagerAdapter.PositionableView {
|
||||||
|
|
||||||
private val scope = MainScope()
|
private val scope = MainScope()
|
||||||
|
|
@ -58,7 +62,12 @@ class PagerTransitionHolder(
|
||||||
val sidePadding = 64.dpToPx
|
val sidePadding = 64.dpToPx
|
||||||
setPadding(sidePadding, 0, sidePadding, 0)
|
setPadding(sidePadding, 0, sidePadding, 0)
|
||||||
|
|
||||||
val transitionView = ReaderTransitionView(context)
|
val transitionView = ReaderTransitionView(
|
||||||
|
context,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
addView(transitionView)
|
addView(transitionView)
|
||||||
addView(pagesContainer)
|
addView(pagesContainer)
|
||||||
|
|
||||||
|
|
@ -100,8 +109,12 @@ class PagerTransitionHolder(
|
||||||
* Sets the loading state on the pages container.
|
* Sets the loading state on the pages container.
|
||||||
*/
|
*/
|
||||||
private fun setLoading() {
|
private fun setLoading() {
|
||||||
val progress = CircularProgressIndicator(context)
|
// KMK -->
|
||||||
progress.isIndeterminate = true
|
val progress = ReaderProgressIndicator(
|
||||||
|
context = context,
|
||||||
|
seedColor = seedColor,
|
||||||
|
)
|
||||||
|
// KMK <--
|
||||||
|
|
||||||
val textView = AppCompatTextView(context).apply {
|
val textView = AppCompatTextView(context).apply {
|
||||||
wrapContent()
|
wrapContent()
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import android.view.KeyEvent
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup.LayoutParams
|
import android.view.ViewGroup.LayoutParams
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.core.view.children
|
import androidx.core.view.children
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
|
@ -30,7 +31,12 @@ import kotlin.math.min
|
||||||
* Implementation of a [Viewer] to display pages with a [ViewPager].
|
* Implementation of a [Viewer] to display pages with a [ViewPager].
|
||||||
*/
|
*/
|
||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
abstract class PagerViewer(val activity: ReaderActivity) : Viewer {
|
abstract class PagerViewer(
|
||||||
|
val activity: ReaderActivity,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) : Viewer {
|
||||||
|
|
||||||
val downloadManager: DownloadManager by injectLazy()
|
val downloadManager: DownloadManager by injectLazy()
|
||||||
|
|
||||||
|
|
@ -50,7 +56,12 @@ abstract class PagerViewer(val activity: ReaderActivity) : Viewer {
|
||||||
/**
|
/**
|
||||||
* Adapter of the pager.
|
* Adapter of the pager.
|
||||||
*/
|
*/
|
||||||
private val adapter = PagerViewerAdapter(this)
|
private val adapter = PagerViewerAdapter(
|
||||||
|
this,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Currently active item. It can be a chapter page or a chapter transition.
|
* Currently active item. It can be a chapter page or a chapter transition.
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager
|
||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.InsertPage
|
import eu.kanade.tachiyomi.ui.reader.model.InsertPage
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||||
|
|
@ -19,7 +20,12 @@ import kotlin.math.max
|
||||||
/**
|
/**
|
||||||
* Pager adapter used by this [viewer] to where [ViewerChapters] updates are posted.
|
* Pager adapter used by this [viewer] to where [ViewerChapters] updates are posted.
|
||||||
*/
|
*/
|
||||||
class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
class PagerViewerAdapter(
|
||||||
|
private val viewer: PagerViewer,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) : ViewPagerAdapter() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paired list of currently set items.
|
* Paired list of currently set items.
|
||||||
|
|
@ -162,8 +168,23 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
||||||
val item = joinedItems[position].first
|
val item = joinedItems[position].first
|
||||||
val item2 = joinedItems[position].second
|
val item2 = joinedItems[position].second
|
||||||
return when (item) {
|
return when (item) {
|
||||||
is ReaderPage -> PagerPageHolder(readerThemedContext, viewer, item, item2 as? ReaderPage)
|
is ReaderPage -> PagerPageHolder(
|
||||||
is ChapterTransition -> PagerTransitionHolder(readerThemedContext, viewer, item)
|
readerThemedContext,
|
||||||
|
viewer,
|
||||||
|
item,
|
||||||
|
item2 as? ReaderPage,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
is ChapterTransition -> PagerTransitionHolder(
|
||||||
|
readerThemedContext,
|
||||||
|
viewer,
|
||||||
|
item,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
// SY --> else -> throw NotImplementedError("Holder for ${item.javaClass} not implemented") SY <--
|
// SY --> else -> throw NotImplementedError("Holder for ${item.javaClass} not implemented") SY <--
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -378,10 +399,12 @@ class PagerViewerAdapter(private val viewer: PagerViewer) : ViewPagerAdapter() {
|
||||||
oldCurrent?.second == current ||
|
oldCurrent?.second == current ||
|
||||||
(current.index + 1) < (
|
(current.index + 1) < (
|
||||||
(
|
(
|
||||||
oldCurrent?.second
|
(
|
||||||
?: oldCurrent?.first
|
oldCurrent?.second
|
||||||
) as? ReaderPage
|
?: oldCurrent?.first
|
||||||
)?.index ?: 0,
|
) as? ReaderPage
|
||||||
|
)?.index ?: 0
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
// The listener may be removed when we split a page, so the ui may not have updated properly
|
// The listener may be removed when we split a page, so the ui may not have updated properly
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,17 @@
|
||||||
package eu.kanade.tachiyomi.ui.reader.viewer.pager
|
package eu.kanade.tachiyomi.ui.reader.viewer.pager
|
||||||
|
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of a left to right PagerViewer.
|
* Implementation of a left to right PagerViewer.
|
||||||
*/
|
*/
|
||||||
class L2RPagerViewer(activity: ReaderActivity) : PagerViewer(activity) {
|
class L2RPagerViewer(
|
||||||
|
activity: ReaderActivity,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) : PagerViewer(activity, seedColor) {
|
||||||
/**
|
/**
|
||||||
* Creates a new left to right pager.
|
* Creates a new left to right pager.
|
||||||
*/
|
*/
|
||||||
|
|
@ -17,7 +23,12 @@ class L2RPagerViewer(activity: ReaderActivity) : PagerViewer(activity) {
|
||||||
/**
|
/**
|
||||||
* Implementation of a right to left PagerViewer.
|
* Implementation of a right to left PagerViewer.
|
||||||
*/
|
*/
|
||||||
class R2LPagerViewer(activity: ReaderActivity) : PagerViewer(activity) {
|
class R2LPagerViewer(
|
||||||
|
activity: ReaderActivity,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) : PagerViewer(activity, seedColor) {
|
||||||
/**
|
/**
|
||||||
* Creates a new right to left pager.
|
* Creates a new right to left pager.
|
||||||
*/
|
*/
|
||||||
|
|
@ -43,7 +54,12 @@ class R2LPagerViewer(activity: ReaderActivity) : PagerViewer(activity) {
|
||||||
/**
|
/**
|
||||||
* Implementation of a vertical (top to bottom) PagerViewer.
|
* Implementation of a vertical (top to bottom) PagerViewer.
|
||||||
*/
|
*/
|
||||||
class VerticalPagerViewer(activity: ReaderActivity) : PagerViewer(activity) {
|
class VerticalPagerViewer(
|
||||||
|
activity: ReaderActivity,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) : PagerViewer(activity, seedColor) {
|
||||||
/**
|
/**
|
||||||
* Creates a new vertical pager.
|
* Creates a new vertical pager.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.webtoon
|
||||||
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
|
|
@ -15,7 +16,12 @@ import eu.kanade.tachiyomi.util.system.createReaderThemeContext
|
||||||
/**
|
/**
|
||||||
* RecyclerView Adapter used by this [viewer] to where [ViewerChapters] updates are posted.
|
* RecyclerView Adapter used by this [viewer] to where [ViewerChapters] updates are posted.
|
||||||
*/
|
*/
|
||||||
class WebtoonAdapter(val viewer: WebtoonViewer) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
class WebtoonAdapter(
|
||||||
|
val viewer: WebtoonViewer,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
|
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of currently set items.
|
* List of currently set items.
|
||||||
|
|
@ -117,11 +123,23 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : RecyclerView.Adapter<RecyclerV
|
||||||
return when (viewType) {
|
return when (viewType) {
|
||||||
PAGE_VIEW -> {
|
PAGE_VIEW -> {
|
||||||
val view = ReaderPageImageView(readerThemedContext, isWebtoon = true)
|
val view = ReaderPageImageView(readerThemedContext, isWebtoon = true)
|
||||||
WebtoonPageHolder(view, viewer)
|
WebtoonPageHolder(
|
||||||
|
view,
|
||||||
|
viewer,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
}
|
}
|
||||||
TRANSITION_VIEW -> {
|
TRANSITION_VIEW -> {
|
||||||
val view = LinearLayout(readerThemedContext)
|
val view = LinearLayout(readerThemedContext)
|
||||||
WebtoonTransitionHolder(view, viewer)
|
WebtoonTransitionHolder(
|
||||||
|
view,
|
||||||
|
viewer,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
}
|
}
|
||||||
else -> error("Unknown view type")
|
else -> error("Unknown view type")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import android.view.ViewGroup
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
import androidx.core.view.updateMargins
|
import androidx.core.view.updateMargins
|
||||||
|
|
@ -41,6 +42,9 @@ import tachiyomi.core.common.util.system.logcat
|
||||||
class WebtoonPageHolder(
|
class WebtoonPageHolder(
|
||||||
private val frame: ReaderPageImageView,
|
private val frame: ReaderPageImageView,
|
||||||
viewer: WebtoonViewer,
|
viewer: WebtoonViewer,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
) : WebtoonBaseHolder(frame, viewer) {
|
) : WebtoonBaseHolder(frame, viewer) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -261,7 +265,12 @@ class WebtoonPageHolder(
|
||||||
progressContainer = FrameLayout(context)
|
progressContainer = FrameLayout(context)
|
||||||
frame.addView(progressContainer, MATCH_PARENT, parentHeight)
|
frame.addView(progressContainer, MATCH_PARENT, parentHeight)
|
||||||
|
|
||||||
val progress = ReaderProgressIndicator(context).apply {
|
val progress = ReaderProgressIndicator(
|
||||||
|
context,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
).apply {
|
||||||
updateLayoutParams<FrameLayout.LayoutParams> {
|
updateLayoutParams<FrameLayout.LayoutParams> {
|
||||||
updateMargins(top = parentHeight / 4)
|
updateMargins(top = parentHeight / 4)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,14 @@ import android.view.Gravity
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.appcompat.widget.AppCompatButton
|
import androidx.appcompat.widget.AppCompatButton
|
||||||
import androidx.appcompat.widget.AppCompatTextView
|
import androidx.appcompat.widget.AppCompatTextView
|
||||||
import androidx.core.view.isNotEmpty
|
import androidx.core.view.isNotEmpty
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.google.android.material.progressindicator.CircularProgressIndicator
|
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||||
|
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressIndicator
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderTransitionView
|
import eu.kanade.tachiyomi.ui.reader.viewer.ReaderTransitionView
|
||||||
import eu.kanade.tachiyomi.util.system.dpToPx
|
import eu.kanade.tachiyomi.util.system.dpToPx
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
|
|
@ -26,12 +27,20 @@ import tachiyomi.i18n.MR
|
||||||
class WebtoonTransitionHolder(
|
class WebtoonTransitionHolder(
|
||||||
val layout: LinearLayout,
|
val layout: LinearLayout,
|
||||||
viewer: WebtoonViewer,
|
viewer: WebtoonViewer,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
) : WebtoonBaseHolder(layout, viewer) {
|
) : WebtoonBaseHolder(layout, viewer) {
|
||||||
|
|
||||||
private val scope = MainScope()
|
private val scope = MainScope()
|
||||||
private var stateJob: Job? = null
|
private var stateJob: Job? = null
|
||||||
|
|
||||||
private val transitionView = ReaderTransitionView(context)
|
private val transitionView = ReaderTransitionView(
|
||||||
|
context,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* View container of the current status of the transition page. Child views will be added
|
* View container of the current status of the transition page. Child views will be added
|
||||||
|
|
@ -102,8 +111,12 @@ class WebtoonTransitionHolder(
|
||||||
* Sets the loading state on the pages container.
|
* Sets the loading state on the pages container.
|
||||||
*/
|
*/
|
||||||
private fun setLoading() {
|
private fun setLoading() {
|
||||||
val progress = CircularProgressIndicator(context)
|
// KMK -->
|
||||||
progress.isIndeterminate = true
|
val progress = ReaderProgressIndicator(
|
||||||
|
context = context,
|
||||||
|
seedColor = seedColor,
|
||||||
|
)
|
||||||
|
// KMK <--
|
||||||
|
|
||||||
val textView = AppCompatTextView(context).apply {
|
val textView = AppCompatTextView(context).apply {
|
||||||
wrapContent()
|
wrapContent()
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
import android.view.animation.LinearInterpolator
|
import android.view.animation.LinearInterpolator
|
||||||
|
import androidx.annotation.ColorInt
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
|
@ -37,6 +38,9 @@ class WebtoonViewer(
|
||||||
val activity: ReaderActivity,
|
val activity: ReaderActivity,
|
||||||
val isContinuous: Boolean = true,
|
val isContinuous: Boolean = true,
|
||||||
private val tapByPage: Boolean = false,
|
private val tapByPage: Boolean = false,
|
||||||
|
// KMK -->
|
||||||
|
@ColorInt private val seedColor: Int? = null,
|
||||||
|
// KMK <--
|
||||||
) : Viewer {
|
) : Viewer {
|
||||||
|
|
||||||
val downloadManager: DownloadManager by injectLazy()
|
val downloadManager: DownloadManager by injectLazy()
|
||||||
|
|
@ -66,7 +70,12 @@ class WebtoonViewer(
|
||||||
/**
|
/**
|
||||||
* Adapter of the recycler view.
|
* Adapter of the recycler view.
|
||||||
*/
|
*/
|
||||||
private val adapter = WebtoonAdapter(this)
|
private val adapter = WebtoonAdapter(
|
||||||
|
this,
|
||||||
|
// KMK -->
|
||||||
|
seedColor = seedColor,
|
||||||
|
// KMK <--
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Distance to scroll when the user taps on one side of the recycler view.
|
* Distance to scroll when the user taps on one side of the recycler view.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue