diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 22d6ecda5..5917b03bc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -132,11 +132,14 @@
+
+ android:foregroundServiceType="dataSync"
+ android:stopWithTask="false" />
(), Slider.OnChangeListener {
+
+ @Inject
+ lateinit var coil: ImageLoader
+
+ @Inject
+ lateinit var mangaRepositoryFacotry: MangaRepository.Factory
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(ActivityColorFilterBinding.inflate(layoutInflater))
+ supportActionBar?.run {
+ setDisplayHomeAsUpEnabled(true)
+ setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material)
+ }
+ binding.sliderLightness.addOnChangeListener(this)
+ binding.sliderSaturation.addOnChangeListener(this)
+ initPreview()
+ updateFilter()
+ }
+
+ override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
+ updateFilter()
+ }
+
+ override fun onWindowInsetsChanged(insets: Insets) {
+ binding.root.updatePadding(
+ left = insets.left,
+ right = insets.right,
+ )
+ binding.scrollView.updatePadding(
+ bottom = insets.bottom,
+ )
+ binding.toolbar.updateLayoutParams {
+ topMargin = insets.top
+ }
+ }
+
+ private fun updateFilter() {
+
+ fun Int.toColor() = Color.rgb(this, this, this)
+
+ val cf = LightingColorFilter(
+ binding.sliderSaturation.value.roundToInt().toColor(),
+ binding.sliderLightness.value.roundToInt().toColor(),
+ )
+ binding.imageViewAfter.colorFilter = cf
+ }
+
+ private fun initPreview() {
+ val page = intent?.getParcelableExtra(EXTRA_PAGES)?.pages?.firstOrNull()
+ if (page == null) {
+ finishAfterTransition()
+ return
+ }
+ lifecycleScope.launch {
+ val repository = mangaRepositoryFacotry.create(page.source)
+ val url = repository.getPageUrl(page)
+ ImageRequest.Builder(this@ColorFilterConfigActivity)
+ .data(url)
+ .referer(page.referer)
+ .scale(Scale.FILL)
+ .size(ViewSizeResolver(binding.imageViewBefore))
+ .allowRgb565(false)
+ .target(ShadowViewTarget(binding.imageViewBefore, binding.imageViewAfter))
+ .enqueueWith(coil)
+ }
+ }
+
+ companion object {
+
+ private const val EXTRA_PAGES = "pages"
+
+ fun newIntent(context: Context, page: MangaPage) = Intent(context, ColorFilterConfigActivity::class.java)
+ .putExtra(EXTRA_PAGES, ParcelableMangaPages(listOf(page)))
+ }
+}
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ShadowViewTarget.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ShadowViewTarget.kt
new file mode 100644
index 000000000..fcd05cbd3
--- /dev/null
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/colorfilter/ShadowViewTarget.kt
@@ -0,0 +1,18 @@
+package org.koitharu.kotatsu.reader.ui.colorfilter
+
+import android.graphics.drawable.Drawable
+import android.widget.ImageView
+import coil.target.ImageViewTarget
+
+class ShadowViewTarget(
+ view: ImageView,
+ private val shadowView: ImageView,
+) : ImageViewTarget(view) {
+
+ override var drawable: Drawable?
+ get() = super.drawable
+ set(value) {
+ super.drawable = value
+ shadowView.setImageDrawable(value?.constantState?.newDrawable())
+ }
+}
diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt
index e7f088c94..1ba6d2413 100644
--- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt
@@ -20,6 +20,7 @@ import org.koitharu.kotatsu.core.prefs.ReaderMode
import org.koitharu.kotatsu.databinding.SheetReaderConfigBinding
import org.koitharu.kotatsu.reader.ui.PageSaveContract
import org.koitharu.kotatsu.reader.ui.ReaderViewModel
+import org.koitharu.kotatsu.reader.ui.colorfilter.ColorFilterConfigActivity
import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.utils.ScreenOrientationHelper
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
@@ -59,6 +60,7 @@ class ReaderConfigBottomSheet :
binding.buttonSavePage.setOnClickListener(this)
binding.buttonScreenRotate.setOnClickListener(this)
binding.buttonSettings.setOnClickListener(this)
+ binding.buttonColorFilter.setOnClickListener(this)
binding.sliderTimer.addOnSliderTouchListener(this)
binding.sliderTimer.setLabelFormatter(PageSwitchTimer.DelayLabelFormatter(view.resources))
@@ -80,6 +82,10 @@ class ReaderConfigBottomSheet :
R.id.button_screen_rotate -> {
orientationHelper?.toggleOrientation()
}
+ R.id.button_color_filter -> {
+ val page = viewModel.getCurrentPage() ?: return
+ startActivity(ColorFilterConfigActivity.newIntent(v.context, page))
+ }
}
}
diff --git a/app/src/main/res/drawable/ic_arrow_forward.xml b/app/src/main/res/drawable/ic_arrow_forward.xml
index 8d3848e66..d9a7ec3f8 100644
--- a/app/src/main/res/drawable/ic_arrow_forward.xml
+++ b/app/src/main/res/drawable/ic_arrow_forward.xml
@@ -1,5 +1,12 @@
-
-
+
+
diff --git a/app/src/main/res/layout/activity_color_filter.xml b/app/src/main/res/layout/activity_color_filter.xml
new file mode 100644
index 000000000..782673328
--- /dev/null
+++ b/app/src/main/res/layout/activity_color_filter.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_main_header.xml b/app/src/main/res/layout/item_main_header.xml
deleted file mode 100644
index 298b9304d..000000000
--- a/app/src/main/res/layout/item_main_header.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/sheet_reader_config.xml b/app/src/main/res/layout/sheet_reader_config.xml
index 34e0efcad..9d28b4ebc 100644
--- a/app/src/main/res/layout/sheet_reader_config.xml
+++ b/app/src/main/res/layout/sheet_reader_config.xml
@@ -133,6 +133,17 @@
+
+
You can delete the original file from storage to save space
Import will start soon
Feed
+ Color filter