From 8957325d78eb42e087c4c1ff0abedb2146aa4423 Mon Sep 17 00:00:00 2001
From: Kamil Kras <38427679+xVemu@users.noreply.github.com>
Date: Mon, 14 Apr 2025 10:43:21 +0200
Subject: [PATCH] feat(YouTube - Swipe controls): Add option to change volume
swipe sensitivity (step size) (#4557)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
---
.../extension/youtube/settings/Settings.java | 1 +
.../SwipeControlsConfigurationProvider.kt | 24 ++++++++++++++-----
.../SwipeControlsHostActivity.kt | 2 +-
.../controller/VolumeKeysController.kt | 2 +-
.../gesture/core/BaseGestureController.kt | 1 +
.../core/VolumeAndBrightnessScroller.kt | 4 +++-
.../views/SwipeControlsOverlayLayout.kt | 2 +-
.../swipecontrols/SwipeControlsPatch.kt | 1 +
.../resources/addresources/values/strings.xml | 2 ++
9 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java
index 75128e3dd..dfc727bda 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java
@@ -319,6 +319,7 @@ public class Settings extends BaseSettings {
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
public static final IntegerSetting SWIPE_MAGNITUDE_THRESHOLD = new IntegerSetting("revanced_swipe_threshold", 30, true,
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
+ public static final IntegerSetting SWIPE_VOLUME_SENSITIVITY = new IntegerSetting("revanced_swipe_volume_sensitivity", 1, true, parent(SWIPE_VOLUME));
public static final BooleanSetting SWIPE_SHOW_CIRCULAR_OVERLAY = new BooleanSetting("revanced_swipe_show_circular_overlay", FALSE, true,
parentsAny(SWIPE_BRIGHTNESS, SWIPE_VOLUME));
public static final BooleanSetting SWIPE_OVERLAY_MINIMAL_STYLE = new BooleanSetting("revanced_swipe_overlay_minimal_style", FALSE, true,
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsConfigurationProvider.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsConfigurationProvider.kt
index 08e7e0480..697926244 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsConfigurationProvider.kt
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsConfigurationProvider.kt
@@ -1,6 +1,5 @@
package app.revanced.extension.youtube.swipecontrols
-import android.content.Context
import android.graphics.Color
import app.revanced.extension.shared.StringRef.str
import app.revanced.extension.shared.Utils
@@ -9,12 +8,8 @@ import app.revanced.extension.youtube.shared.PlayerType
/**
* provider for configuration for volume and brightness swipe controls
- *
- * @param context the context to create in
*/
-class SwipeControlsConfigurationProvider(
- private val context: Context,
-) {
+class SwipeControlsConfigurationProvider {
//region swipe enable
/**
* should swipe controls be enabled? (global setting)
@@ -60,6 +55,23 @@ class SwipeControlsConfigurationProvider(
*/
val swipeMagnitudeThreshold: Int
get() = Settings.SWIPE_MAGNITUDE_THRESHOLD.get()
+
+ /**
+ * How much volume will change by single swipe.
+ * If it is set to 0, it will reset to the default value because 0 would disable swiping.
+ * */
+ val volumeSwipeSensitivity: Int
+ get() {
+ val sensitivity = Settings.SWIPE_VOLUME_SENSITIVITY.get()
+
+ if (sensitivity < 1) {
+ Settings.SWIPE_VOLUME_SENSITIVITY.resetToDefault()
+
+ return Settings.SWIPE_VOLUME_SENSITIVITY.get()
+ }
+
+ return sensitivity
+ }
//endregion
//region overlay adjustments
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt
index c889c6d4c..10b70ed95 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt
@@ -127,7 +127,7 @@ class SwipeControlsHostActivity : Activity() {
private fun initialize() {
// create controllers
printDebug { "initializing swipe controls controllers" }
- config = SwipeControlsConfigurationProvider(this)
+ config = SwipeControlsConfigurationProvider()
keys = VolumeKeysController(this)
audio = createAudioController()
screen = createScreenController()
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt
index d2b8788df..5d206dfa9 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/VolumeKeysController.kt
@@ -41,7 +41,7 @@ class VolumeKeysController(
private fun handleVolumeKeyEvent(event: KeyEvent, volumeUp: Boolean): Boolean {
if (event.action == KeyEvent.ACTION_DOWN) {
controller.audio?.apply {
- volume += if (volumeUp) 1 else -1
+ volume += controller.config.volumeSwipeSensitivity * if (volumeUp) 1 else -1
controller.overlay.onVolumeChanged(volume, maxVolume)
}
}
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/BaseGestureController.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/BaseGestureController.kt
index 286a6fe43..a07cf7490 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/BaseGestureController.kt
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/BaseGestureController.kt
@@ -24,6 +24,7 @@ abstract class BaseGestureController(
controller.overlay,
10,
1,
+ controller.config.volumeSwipeSensitivity,
) {
/**
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/VolumeAndBrightnessScroller.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/VolumeAndBrightnessScroller.kt
index e398696df..ec50aedd7 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/VolumeAndBrightnessScroller.kt
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/VolumeAndBrightnessScroller.kt
@@ -41,6 +41,7 @@ interface VolumeAndBrightnessScroller {
* @param overlayController overlay controller instance
* @param volumeDistance unit distance for volume scrolling, in dp
* @param brightnessDistance unit distance for brightness scrolling, in dp
+ * @param volumeSwipeSensitivity how much volume will change by single swipe
*/
class VolumeAndBrightnessScrollerImpl(
context: Context,
@@ -49,6 +50,7 @@ class VolumeAndBrightnessScrollerImpl(
private val overlayController: SwipeControlsOverlay,
volumeDistance: Int = 10,
brightnessDistance: Int = 1,
+ private val volumeSwipeSensitivity: Int,
) : VolumeAndBrightnessScroller {
// region volume
@@ -60,7 +62,7 @@ class VolumeAndBrightnessScrollerImpl(
),
) { _, _, direction ->
volumeController?.run {
- volume += direction
+ volume += direction * volumeSwipeSensitivity
overlayController.onVolumeChanged(volume, maxVolume)
}
}
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt
index 2874303f7..8df6aeeee 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt
@@ -25,7 +25,7 @@ class SwipeControlsOverlayLayout(
private val config: SwipeControlsConfigurationProvider,
) : RelativeLayout(context), SwipeControlsOverlay {
- constructor(context: Context) : this(context, SwipeControlsConfigurationProvider(context))
+ constructor(context: Context) : this(context, SwipeControlsConfigurationProvider())
// Drawable icons for brightness and volume
private val autoBrightnessIcon: Drawable = getDrawable("revanced_ic_sc_brightness_auto")
diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt
index a22537c3e..d20ebf9a7 100644
--- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt
@@ -47,6 +47,7 @@ private val swipeControlsResourcePatch = resourcePatch {
TextPreference("revanced_swipe_overlay_background_opacity", inputType = InputType.NUMBER),
TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER),
TextPreference("revanced_swipe_threshold", inputType = InputType.NUMBER),
+ TextPreference("revanced_swipe_volume_sensitivity", inputType = InputType.NUMBER),
)
copyResources(
diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml
index 3d8330396..af43602b4 100644
--- a/patches/src/main/resources/addresources/values/strings.xml
+++ b/patches/src/main/resources/addresources/values/strings.xml
@@ -527,6 +527,8 @@ Adjust volume by swiping vertically on the right side of the screen"
Swipe opacity must be between 0-100
Swipe magnitude threshold
The amount of threshold for swipe to occur
+ Volume swipe sensitivity
+ How much the volume changes per swipe
Show circular overlay
Circular overlay is shown
Horizontal overlay is shown