Refactor reader sensitivity settings #1576

This commit is contained in:
Koitharu
2025-10-14 10:23:47 +03:00
parent 9197b9cc3a
commit 6a9682a077
5 changed files with 24 additions and 25 deletions

View File

@@ -138,12 +138,10 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
get() = prefs.getBoolean(KEY_READER_DOUBLE_PAGES, false) get() = prefs.getBoolean(KEY_READER_DOUBLE_PAGES, false)
set(value) = prefs.edit { putBoolean(KEY_READER_DOUBLE_PAGES, value) } set(value) = prefs.edit { putBoolean(KEY_READER_DOUBLE_PAGES, value) }
val readerDoublePagesSensitivity: Float @get:FloatRange(0.0, 1.0)
get() = prefs.getFloat(KEY_READER_DOUBLE_PAGES_SENSITIVITY, 12f) / 10f var readerDoublePagesSensitivity: Float
get() = prefs.getFloat(KEY_READER_DOUBLE_PAGES_SENSITIVITY, 0.5f)
fun setReaderDoublePagesSensitivity(value: Float) { set(@FloatRange(0.0, 1.0) value) = prefs.edit { putFloat(KEY_READER_DOUBLE_PAGES_SENSITIVITY, value) }
prefs.edit { putFloat(KEY_READER_DOUBLE_PAGES_SENSITIVITY, value) }
}
val readerScreenOrientation: Int val readerScreenOrientation: Int
get() = prefs.getString(KEY_READER_ORIENTATION, null)?.toIntOrNull() get() = prefs.getString(KEY_READER_ORIENTATION, null)?.toIntOrNull()

View File

@@ -5,13 +5,13 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.SeekBar
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.google.android.material.button.MaterialButtonToggleGroup import com.google.android.material.button.MaterialButtonToggleGroup
import com.google.android.material.slider.Slider
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
@@ -26,7 +26,9 @@ import org.koitharu.kotatsu.core.ui.sheet.BaseAdaptiveSheet
import org.koitharu.kotatsu.core.util.ext.consume import org.koitharu.kotatsu.core.util.ext.consume
import org.koitharu.kotatsu.core.util.ext.findParentCallback import org.koitharu.kotatsu.core.util.ext.findParentCallback
import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.setValueRounded
import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope
import org.koitharu.kotatsu.core.util.progress.IntPercentLabelFormatter
import org.koitharu.kotatsu.databinding.SheetReaderConfigBinding import org.koitharu.kotatsu.databinding.SheetReaderConfigBinding
import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.ReaderViewModel import org.koitharu.kotatsu.reader.ui.ReaderViewModel
@@ -38,7 +40,8 @@ class ReaderConfigSheet :
BaseAdaptiveSheet<SheetReaderConfigBinding>(), BaseAdaptiveSheet<SheetReaderConfigBinding>(),
View.OnClickListener, View.OnClickListener,
MaterialButtonToggleGroup.OnButtonCheckedListener, MaterialButtonToggleGroup.OnButtonCheckedListener,
CompoundButton.OnCheckedChangeListener { CompoundButton.OnCheckedChangeListener,
Slider.OnChangeListener {
private val viewModel by activityViewModels<ReaderViewModel>() private val viewModel by activityViewModels<ReaderViewModel>()
@@ -92,7 +95,8 @@ class ReaderConfigSheet :
binding.textSensitivity.isVisible = settings.isReaderDoubleOnLandscape binding.textSensitivity.isVisible = settings.isReaderDoubleOnLandscape
binding.seekbarSensitivity.isVisible = settings.isReaderDoubleOnLandscape binding.seekbarSensitivity.isVisible = settings.isReaderDoubleOnLandscape
binding.seekbarSensitivity.progress = (settings.readerDoublePagesSensitivity * 100).toInt() binding.seekbarSensitivity.setValueRounded(settings.readerDoublePagesSensitivity * 100f)
binding.seekbarSensitivity.setLabelFormatter(IntPercentLabelFormatter(binding.root.context))
binding.checkableGroup.addOnButtonCheckedListener(this) binding.checkableGroup.addOnButtonCheckedListener(this)
binding.buttonSavePage.setOnClickListener(this) binding.buttonSavePage.setOnClickListener(this)
@@ -104,16 +108,7 @@ class ReaderConfigSheet :
binding.buttonBookmark.setOnClickListener(this) binding.buttonBookmark.setOnClickListener(this)
binding.switchDoubleReader.setOnCheckedChangeListener(this) binding.switchDoubleReader.setOnCheckedChangeListener(this)
binding.switchPullGesture.setOnCheckedChangeListener(this) binding.switchPullGesture.setOnCheckedChangeListener(this)
binding.seekbarSensitivity.addOnChangeListener(this)
binding.seekbarSensitivity.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
settings.setReaderDoublePagesSensitivity(progress / 10f)
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
viewModel.isBookmarkAdded.observe(viewLifecycleOwner) { viewModel.isBookmarkAdded.observe(viewLifecycleOwner) {
binding.buttonBookmark.setText(if (it) R.string.bookmark_remove else R.string.bookmark_add) binding.buttonBookmark.setText(if (it) R.string.bookmark_remove else R.string.bookmark_add)
@@ -199,6 +194,10 @@ class ReaderConfigSheet :
} }
} }
override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
settings.readerDoublePagesSensitivity = value / 100f
}
override fun onButtonChecked( override fun onButtonChecked(
group: MaterialButtonToggleGroup?, group: MaterialButtonToggleGroup?,
checkedId: Int, checkedId: Int,

View File

@@ -251,7 +251,7 @@ class DoublePageSnapHelper(private val settings: AppSettings) : SnapHelper() {
equal to zero. equal to zero.
*/ */
fun getPositionsToMove(llm: LinearLayoutManager, scroll: Int, itemSize: Int): Int { fun getPositionsToMove(llm: LinearLayoutManager, scroll: Int, itemSize: Int): Int {
val sensitivity = settings.readerDoublePagesSensitivity val sensitivity = settings.readerDoublePagesSensitivity.coerceIn(0f, 1f) * 2.5
var positionsToMove = (scroll.toDouble() / (itemSize * (2.5 - sensitivity))).roundToInt() var positionsToMove = (scroll.toDouble() / (itemSize * (2.5 - sensitivity))).roundToInt()
// Apply a maximum threshold // Apply a maximum threshold

View File

@@ -37,7 +37,7 @@ import javax.inject.Inject
private const val STATUS_ONLINE = "online" private const val STATUS_ONLINE = "online"
private const val STATUS_IDLE = "idle" private const val STATUS_IDLE = "idle"
private const val BUTTON_TEXT_LIMIT = 32 private const val BUTTON_TEXT_LIMIT = 32
private const val DEBOUNCE_TIMEOUT = 6_000L // 6 sec private const val DEBOUNCE_TIMEOUT = 16_000L // 16 sec
@ViewModelScoped @ViewModelScoped
class DiscordRpc @Inject constructor( class DiscordRpc @Inject constructor(

View File

@@ -138,14 +138,16 @@
android:text="@string/two_page_scroll_sensitivity" android:text="@string/two_page_scroll_sensitivity"
android:textAppearance="@style/TextAppearance.Kotatsu.GridTitle" /> android:textAppearance="@style/TextAppearance.Kotatsu.GridTitle" />
<SeekBar <com.google.android.material.slider.Slider
android:id="@+id/seekbar_sensitivity" android:id="@+id/seekbar_sensitivity"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/margin_normal" android:layout_marginHorizontal="@dimen/margin_small"
android:layout_marginTop="@dimen/margin_small" android:layout_marginTop="@dimen/margin_small"
android:max="100" android:valueFrom="0"
tools:progress="50" /> android:valueTo="100"
app:labelBehavior="floating"
tools:value="50" />
<com.google.android.material.materialswitch.MaterialSwitch <com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_pull_gesture" android:id="@+id/switch_pull_gesture"