Refactor reader sensitivity settings #1576
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user