|
|
|
@ -2,40 +2,54 @@ package org.koitharu.kotatsu.reader.ui.colorfilter
|
|
|
|
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.Context
|
|
|
|
import android.content.Intent
|
|
|
|
import android.content.Intent
|
|
|
|
import android.graphics.Color
|
|
|
|
import android.content.res.Resources
|
|
|
|
import android.graphics.LightingColorFilter
|
|
|
|
|
|
|
|
import android.os.Bundle
|
|
|
|
import android.os.Bundle
|
|
|
|
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.core.graphics.Insets
|
|
|
|
import androidx.core.graphics.Insets
|
|
|
|
import androidx.core.view.updateLayoutParams
|
|
|
|
import androidx.core.view.updateLayoutParams
|
|
|
|
import androidx.core.view.updatePadding
|
|
|
|
import androidx.core.view.updatePadding
|
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
|
|
|
|
|
import coil.ImageLoader
|
|
|
|
import coil.ImageLoader
|
|
|
|
import coil.request.ImageRequest
|
|
|
|
import coil.request.ImageRequest
|
|
|
|
import coil.size.Scale
|
|
|
|
import coil.size.Scale
|
|
|
|
import coil.size.ViewSizeResolver
|
|
|
|
import coil.size.ViewSizeResolver
|
|
|
|
|
|
|
|
import com.google.android.material.R as materialR
|
|
|
|
|
|
|
|
import com.google.android.material.slider.LabelFormatter
|
|
|
|
import com.google.android.material.slider.Slider
|
|
|
|
import com.google.android.material.slider.Slider
|
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.R
|
|
|
|
import org.koitharu.kotatsu.base.ui.BaseActivity
|
|
|
|
import org.koitharu.kotatsu.base.ui.BaseActivity
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga
|
|
|
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPages
|
|
|
|
import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPages
|
|
|
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.databinding.ActivityColorFilterBinding
|
|
|
|
import org.koitharu.kotatsu.databinding.ActivityColorFilterBinding
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.parsers.model.Manga
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaPage
|
|
|
|
import org.koitharu.kotatsu.parsers.model.MangaPage
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.parsers.util.format
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.reader.domain.ReaderColorFilter
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.utils.ext.assistedViewModels
|
|
|
|
import org.koitharu.kotatsu.utils.ext.enqueueWith
|
|
|
|
import org.koitharu.kotatsu.utils.ext.enqueueWith
|
|
|
|
|
|
|
|
import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat
|
|
|
|
import org.koitharu.kotatsu.utils.ext.referer
|
|
|
|
import org.koitharu.kotatsu.utils.ext.referer
|
|
|
|
import javax.inject.Inject
|
|
|
|
|
|
|
|
import kotlin.math.roundToInt
|
|
|
|
|
|
|
|
import com.google.android.material.R as materialR
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@AndroidEntryPoint
|
|
|
|
@AndroidEntryPoint
|
|
|
|
class ColorFilterConfigActivity : BaseActivity<ActivityColorFilterBinding>(), Slider.OnChangeListener {
|
|
|
|
class ColorFilterConfigActivity :
|
|
|
|
|
|
|
|
BaseActivity<ActivityColorFilterBinding>(),
|
|
|
|
|
|
|
|
Slider.OnChangeListener,
|
|
|
|
|
|
|
|
View.OnClickListener {
|
|
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
@Inject
|
|
|
|
lateinit var coil: ImageLoader
|
|
|
|
lateinit var coil: ImageLoader
|
|
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
@Inject
|
|
|
|
lateinit var mangaRepositoryFacotry: MangaRepository.Factory
|
|
|
|
lateinit var viewModelFactory: ColorFilterConfigViewModel.Factory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private val viewModel: ColorFilterConfigViewModel by assistedViewModels {
|
|
|
|
|
|
|
|
viewModelFactory.create(
|
|
|
|
|
|
|
|
manga = checkNotNull(intent.getParcelableExtraCompat<ParcelableManga>(EXTRA_MANGA)?.manga),
|
|
|
|
|
|
|
|
page = checkNotNull(intent.getParcelableExtraCompat<ParcelableMangaPages>(EXTRA_PAGES)?.pages?.firstOrNull()),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
@ -44,14 +58,38 @@ class ColorFilterConfigActivity : BaseActivity<ActivityColorFilterBinding>(), Sl
|
|
|
|
setDisplayHomeAsUpEnabled(true)
|
|
|
|
setDisplayHomeAsUpEnabled(true)
|
|
|
|
setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material)
|
|
|
|
setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
binding.sliderLightness.addOnChangeListener(this)
|
|
|
|
binding.sliderBrightness.addOnChangeListener(this)
|
|
|
|
binding.sliderSaturation.addOnChangeListener(this)
|
|
|
|
binding.sliderContrast.addOnChangeListener(this)
|
|
|
|
initPreview()
|
|
|
|
val formatter = PercentLabelFormatter(resources)
|
|
|
|
updateFilter()
|
|
|
|
binding.sliderContrast.setLabelFormatter(formatter)
|
|
|
|
|
|
|
|
binding.sliderBrightness.setLabelFormatter(formatter)
|
|
|
|
|
|
|
|
binding.buttonDone.setOnClickListener(this)
|
|
|
|
|
|
|
|
binding.buttonReset.setOnClickListener(this)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onBackPressedDispatcher.addCallback(ColorFilterConfigBackPressedDispatcher(this, viewModel))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
viewModel.colorFilter.observe(this, this::onColorFilterChanged)
|
|
|
|
|
|
|
|
viewModel.isLoading.observe(this, this::onLoadingChanged)
|
|
|
|
|
|
|
|
viewModel.preview.observe(this, this::onPreviewChanged)
|
|
|
|
|
|
|
|
viewModel.onDismiss.observe(this) {
|
|
|
|
|
|
|
|
finishAfterTransition()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
|
|
|
|
override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
|
|
|
|
updateFilter()
|
|
|
|
if (fromUser) {
|
|
|
|
|
|
|
|
when (slider.id) {
|
|
|
|
|
|
|
|
R.id.slider_brightness -> viewModel.setBrightness(value)
|
|
|
|
|
|
|
|
R.id.slider_contrast -> viewModel.setContrast(value)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onClick(v: View) {
|
|
|
|
|
|
|
|
when (v.id) {
|
|
|
|
|
|
|
|
R.id.button_done -> viewModel.save()
|
|
|
|
|
|
|
|
R.id.button_reset -> viewModel.reset()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
override fun onWindowInsetsChanged(insets: Insets) {
|
|
|
|
override fun onWindowInsetsChanged(insets: Insets) {
|
|
|
|
@ -67,42 +105,49 @@ class ColorFilterConfigActivity : BaseActivity<ActivityColorFilterBinding>(), Sl
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun updateFilter() {
|
|
|
|
private fun onColorFilterChanged(readerColorFilter: ReaderColorFilter?) {
|
|
|
|
|
|
|
|
binding.sliderBrightness.value = readerColorFilter?.brightness ?: 0f
|
|
|
|
fun Int.toColor() = Color.rgb(this, this, this)
|
|
|
|
binding.sliderContrast.value = readerColorFilter?.contrast ?: 0f
|
|
|
|
|
|
|
|
binding.imageViewAfter.colorFilter = readerColorFilter?.toColorFilter()
|
|
|
|
val cf = LightingColorFilter(
|
|
|
|
|
|
|
|
binding.sliderSaturation.value.roundToInt().toColor(),
|
|
|
|
|
|
|
|
binding.sliderLightness.value.roundToInt().toColor(),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
binding.imageViewAfter.colorFilter = cf
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private fun initPreview() {
|
|
|
|
private fun onPreviewChanged(preview: MangaPage?) {
|
|
|
|
val page = intent?.getParcelableExtra<ParcelableMangaPages>(EXTRA_PAGES)?.pages?.firstOrNull()
|
|
|
|
if (preview == null) return
|
|
|
|
if (page == null) {
|
|
|
|
|
|
|
|
finishAfterTransition()
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
lifecycleScope.launch {
|
|
|
|
|
|
|
|
val repository = mangaRepositoryFacotry.create(page.source)
|
|
|
|
|
|
|
|
val url = repository.getPageUrl(page)
|
|
|
|
|
|
|
|
ImageRequest.Builder(this@ColorFilterConfigActivity)
|
|
|
|
ImageRequest.Builder(this@ColorFilterConfigActivity)
|
|
|
|
.data(url)
|
|
|
|
.data(preview.url)
|
|
|
|
.referer(page.referer)
|
|
|
|
.referer(preview.referer)
|
|
|
|
.scale(Scale.FILL)
|
|
|
|
.scale(Scale.FILL)
|
|
|
|
|
|
|
|
.error(R.drawable.ic_error_placeholder)
|
|
|
|
.size(ViewSizeResolver(binding.imageViewBefore))
|
|
|
|
.size(ViewSizeResolver(binding.imageViewBefore))
|
|
|
|
.allowRgb565(false)
|
|
|
|
.allowRgb565(false)
|
|
|
|
.target(ShadowViewTarget(binding.imageViewBefore, binding.imageViewAfter))
|
|
|
|
.target(ShadowViewTarget(binding.imageViewBefore, binding.imageViewAfter))
|
|
|
|
.enqueueWith(coil)
|
|
|
|
.enqueueWith(coil)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private fun onLoadingChanged(isLoading: Boolean) {
|
|
|
|
|
|
|
|
binding.sliderContrast.isEnabled = !isLoading
|
|
|
|
|
|
|
|
binding.sliderBrightness.isEnabled = !isLoading
|
|
|
|
|
|
|
|
binding.buttonDone.isEnabled = !isLoading
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private class PercentLabelFormatter(resources: Resources) : LabelFormatter {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private val pattern = resources.getString(R.string.percent_string_pattern)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun getFormattedValue(value: Float): String {
|
|
|
|
|
|
|
|
val percent = ((value + 1f) * 100).format(0)
|
|
|
|
|
|
|
|
return pattern.format(percent)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
companion object {
|
|
|
|
|
|
|
|
|
|
|
|
private const val EXTRA_PAGES = "pages"
|
|
|
|
private const val EXTRA_PAGES = "pages"
|
|
|
|
|
|
|
|
private const val EXTRA_MANGA = "manga_id"
|
|
|
|
|
|
|
|
|
|
|
|
fun newIntent(context: Context, page: MangaPage) = Intent(context, ColorFilterConfigActivity::class.java)
|
|
|
|
fun newIntent(context: Context, manga: Manga, page: MangaPage) =
|
|
|
|
|
|
|
|
Intent(context, ColorFilterConfigActivity::class.java)
|
|
|
|
|
|
|
|
.putExtra(EXTRA_MANGA, ParcelableManga(manga, false))
|
|
|
|
.putExtra(EXTRA_PAGES, ParcelableMangaPages(listOf(page)))
|
|
|
|
.putExtra(EXTRA_PAGES, ParcelableMangaPages(listOf(page)))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|