From 658f3ecad9f79ba06eb48e77805c272abac5bfd0 Mon Sep 17 00:00:00 2001
From: klaviartur <_github@fambit.de>
Date: Mon, 20 Jan 2025 17:35:57 +0100
Subject: [PATCH 1/3] Add third gesture area in the middle third of player
screen Add third gesture option: tempo / playback speed Add settings item for
middle gesture
---
.../gesture/MainPlayerGestureListener.kt | 62 +++++++++++++++++--
.../helper/PlaybackParameterDialog.java | 13 ++++
.../newpipe/player/helper/PlayerHelper.java | 6 ++
.../newpipe/player/ui/MainPlayerUi.java | 1 +
app/src/main/res/layout/player.xml | 28 +++++++++
app/src/main/res/values-de/strings.xml | 6 +-
app/src/main/res/values/settings_keys.xml | 24 ++++++-
app/src/main/res/values/strings.xml | 6 +-
app/src/main/res/xml/video_audio_settings.xml | 10 +++
9 files changed, 146 insertions(+), 10 deletions(-)
diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt
index ff0bb269d0..3b52611fa8 100644
--- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt
+++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt
@@ -14,10 +14,12 @@ import org.schabi.newpipe.ktx.AnimationType
import org.schabi.newpipe.ktx.animate
import org.schabi.newpipe.player.Player
import org.schabi.newpipe.player.helper.AudioReactor
+import org.schabi.newpipe.player.helper.PlaybackParameterDialog
import org.schabi.newpipe.player.helper.PlayerHelper
import org.schabi.newpipe.player.ui.MainPlayerUi
import org.schabi.newpipe.util.ThemeHelper.getAndroidDimenPx
import kotlin.math.abs
+import kotlin.math.roundToInt
/**
* GestureListener for the player
@@ -102,6 +104,7 @@ class MainPlayerGestureListener(
binding.volumeRelativeLayout.animate(true, 200, AnimationType.SCALE_AND_ALPHA)
}
binding.brightnessRelativeLayout.isVisible = false
+ binding.playbackSpeedRelativeLayout.isVisible = false
}
private fun onScrollBrightness(distanceY: Float) {
@@ -147,6 +150,42 @@ class MainPlayerGestureListener(
binding.brightnessRelativeLayout.animate(true, 200, AnimationType.SCALE_AND_ALPHA)
}
binding.volumeRelativeLayout.isVisible = false
+ binding.playbackSpeedRelativeLayout.isVisible = false
+ }
+
+ private fun onScrollPlaybackSpeed(distanceY: Float) {
+ val bar: ProgressBar = binding.playbackSpeedProgressBar
+ val maxPlaybackSpeed: Float = PlaybackParameterDialog.getMaxPitchOrSpeed()
+ val minPlaybackSpeed: Float = PlaybackParameterDialog.getMinPitchOrSpeed()
+ val playbackSpeedStep: Float = PlaybackParameterDialog.getCurrentStepSize(player.context) / maxPlaybackSpeed
+
+ // If we just started sliding, change the progress bar to match the current playback speed
+ if (!binding.playbackSpeedRelativeLayout.isVisible) {
+ val playbackSpeedPercent: Float = player.playbackSpeed / maxPlaybackSpeed
+ bar.progress = (playbackSpeedPercent * bar.max).toInt()
+ }
+
+ // Update progress bar
+ bar.incrementProgressBy(distanceY.toInt())
+
+ // Update playback speed
+ val currentProgressPercent: Float = (bar.progress / bar.max.toFloat() / playbackSpeedStep).roundToInt() * playbackSpeedStep
+ val currentPlaybackSpeed: Float = (currentProgressPercent * maxPlaybackSpeed).coerceIn(minPlaybackSpeed, maxPlaybackSpeed)
+
+ player.playbackSpeed = currentPlaybackSpeed
+ if (DEBUG) {
+ Log.d(TAG, "onScroll().playbackSpeedControl, currentPlaybackSpeed = $currentPlaybackSpeed")
+ }
+
+ // Update player center image
+ binding.playbackSpeedTextView.text = PlayerHelper.formatSpeed(currentPlaybackSpeed.toDouble())
+
+ // Make sure the correct layout is visible
+ if (!binding.playbackSpeedRelativeLayout.isVisible) {
+ binding.playbackSpeedRelativeLayout.animate(true, 200, AnimationType.SCALE_AND_ALPHA)
+ }
+ binding.brightnessRelativeLayout.isVisible = false
+ binding.volumeRelativeLayout.isVisible = false
}
override fun onScrollEnd(event: MotionEvent) {
@@ -157,6 +196,9 @@ class MainPlayerGestureListener(
if (binding.brightnessRelativeLayout.isVisible) {
binding.brightnessRelativeLayout.animate(false, 200, AnimationType.SCALE_AND_ALPHA, 200)
}
+ if (binding.playbackSpeedRelativeLayout.isVisible) {
+ binding.playbackSpeedRelativeLayout.animate(false, 200, AnimationType.SCALE_AND_ALPHA, 200)
+ }
}
override fun onScroll(
@@ -190,23 +232,35 @@ class MainPlayerGestureListener(
isMoving = true
- // -- Brightness and Volume control --
- if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) {
+ // -- Brightness Volume and Tempo control --
+ if (getDisplayPortion(initialEvent) == DisplayPortion.RIGHT) {
when (PlayerHelper.getActionForRightGestureSide(player.context)) {
player.context.getString(R.string.volume_control_key) ->
onScrollVolume(distanceY)
player.context.getString(R.string.brightness_control_key) ->
onScrollBrightness(distanceY)
+ player.context.getString(R.string.playback_speed_control_key) ->
+ onScrollPlaybackSpeed(distanceY)
}
- } else {
+ } else if (getDisplayPortion(initialEvent) == DisplayPortion.LEFT) {
when (PlayerHelper.getActionForLeftGestureSide(player.context)) {
player.context.getString(R.string.volume_control_key) ->
onScrollVolume(distanceY)
player.context.getString(R.string.brightness_control_key) ->
onScrollBrightness(distanceY)
+ player.context.getString(R.string.playback_speed_control_key) ->
+ onScrollPlaybackSpeed(distanceY)
+ }
+ } else {
+ when (PlayerHelper.getActionForMiddleGestureSide(player.context)) {
+ player.context.getString(R.string.volume_control_key) ->
+ onScrollVolume(distanceY)
+ player.context.getString(R.string.brightness_control_key) ->
+ onScrollBrightness(distanceY)
+ player.context.getString(R.string.playback_speed_control_key) ->
+ onScrollPlaybackSpeed(distanceY)
}
}
-
return true
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
index 43581d3008..8514d1d498 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
@@ -590,6 +590,19 @@ private static String getPercentString(final double percent) {
return PlayerHelper.formatPitch(percent);
}
+ public static float getCurrentStepSize(final Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ .getFloat(context.getString(R.string.adjustment_step_key), (float) DEFAULT_STEP);
+ }
+
+ public static float getMinPitchOrSpeed() {
+ return (float) MIN_PITCH_OR_SPEED;
+ }
+
+ public static float getMaxPitchOrSpeed() {
+ return (float) MAX_PITCH_OR_SPEED;
+ }
+
public interface Callback {
void onPlaybackParameterChanged(float playbackTempo, float playbackPitch,
boolean playbackSkipSilence);
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
index a110a80d67..6a51bdbea4 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
@@ -234,6 +234,12 @@ public static String getActionForRightGestureSide(@NonNull final Context context
context.getString(R.string.default_right_gesture_control_value));
}
+ public static String getActionForMiddleGestureSide(@NonNull final Context context) {
+ return getPreferences(context)
+ .getString(context.getString(R.string.middle_gesture_control_key),
+ context.getString(R.string.default_middle_gesture_control_value));
+ }
+
public static String getActionForLeftGestureSide(@NonNull final Context context) {
return getPreferences(context)
.getString(context.getString(R.string.left_gesture_control_key),
diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java
index 03f90a3446..3a61ff16d9 100644
--- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java
+++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java
@@ -555,6 +555,7 @@ public void onLayoutChange(final View view, final int l, final int t, final int
binding.volumeProgressBar.setMax(maxGestureLength);
binding.brightnessProgressBar.setMax(maxGestureLength);
+ binding.playbackSpeedProgressBar.setMax(maxGestureLength);
setInitialGestureValues();
binding.itemsListPanel.getLayoutParams().height =
diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml
index bad22dd1e4..d491d03a29 100644
--- a/app/src/main/res/layout/player.xml
+++ b/app/src/main/res/layout/player.xml
@@ -758,6 +758,34 @@
tools:src="@drawable/ic_brightness_high" />
+
+
+
+
+
+
+
Demnächst
Vollständig angeschaut
Teilweise angeschaut
- Geste für die linke Hälfte des Player-Bildschirms auswählen
- Geste für die rechte Hälfte des Player-Bildschirms auswählen
+ Geste für den linken Teil des Player-Bildschirms auswählen
+ Mittlere Gestenaktion
+ Geste für den rechten Teil des Player-Bildschirms auswählen
Keine
Rechte Gestenaktion
Linke Gestenaktion
@@ -826,4 +827,5 @@
\nMöchtest du wirklich fortfahren?
Die Einstellungen in dem zu importierenden Export verwenden ein angreifbares Format, das seit NewPipe 0.27.0 veraltet ist. Stellen Sie sicher, dass der zu importierende Export aus einer vertrauenswürdigen Quelle stammt, und verwenden Sie in Zukunft nur noch Exporte, die aus NewPipe 0.27.0 oder neuer stammen. Die Unterstützung für den Import von Einstellungen in diesem angreifbaren Format wird bald vollständig entfernt werden, und dann werden alte Versionen von NewPipe nicht mehr in der Lage sein, Einstellungen von Exporten aus neuen Versionen zu importieren.
Sekundär
+ Geste für den mittleren Teil des Player-Bildschirms auswählen
\ No newline at end of file
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index 6858e5d62f..693166d325 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -204,28 +204,48 @@
@string/brightness_control_key
brightness_control
volume_control
+ playback_speed_control
none_control
- @string/brightness
- @string/volume
+ - @string/playback_tempo
- @string/none
- @string/brightness_control_key
- @string/volume_control_key
+ - @string/playback_speed_control_key
+ - @string/none_control_key
+
+
+ middle_gesture_control
+ @string/playback_speed_control_key
+
+ - @string/brightness
+ - @string/volume
+ - @string/playback_tempo
+ - @string/none
+
+
+ - @string/brightness_control_key
+ - @string/volume_control_key
+ - @string/playback_speed_control_key
- @string/none_control_key
right_gesture_control
@string/volume_control_key
- - @string/volume
- @string/brightness
+ - @string/volume
+ - @string/playback_tempo
- @string/none
- - @string/volume_control_key
- @string/brightness_control_key
+ - @string/volume_control_key
+ - @string/playback_speed_control_key
- @string/none_control_key
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0f862ef524..aed6bc26fd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -106,9 +106,11 @@
Auto-enqueue next stream
Continue ending (non-repeating) playback queue by appending a related stream
Auto-enqueuing
- Choose gesture for left half of player screen
+ Choose gesture for left part of player screen
Left gesture action
- Choose gesture for right half of player screen
+ Choose gesture for middle part of player screen
+ Middle gesture action
+ Choose gesture for right part of player screen
Right gesture action
Brightness
Volume
diff --git a/app/src/main/res/xml/video_audio_settings.xml b/app/src/main/res/xml/video_audio_settings.xml
index 727ce4df40..3d13e0b71e 100644
--- a/app/src/main/res/xml/video_audio_settings.xml
+++ b/app/src/main/res/xml/video_audio_settings.xml
@@ -198,6 +198,16 @@
app:singleLineTitle="false"
app:iconSpaceReserved="false" />
+
+
Date: Mon, 20 Jan 2025 21:04:35 +0300
Subject: [PATCH 2/3] Update ci.yml
move to checkout action
---
.github/workflows/ci.yml | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d107683509..79cbd79d82 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,6 +20,8 @@ on:
branches:
- dev
- master
+ - extended
+ - '**-feature-**'
paths-ignore:
- 'README.md'
- 'doc/**'
@@ -36,13 +38,9 @@ jobs:
permissions: write-all
steps:
- - name: Checkout branch "${{ github.ref_name }}"
- env:
- BRANCH: ${{ github.ref_name }}
- run: |
- git clone --no-checkout https://github.com/MaintainTeam/LastPipeBender.git .
- git checkout --progress --force "$BRANCH"
-
+ - name: Checkout
+ uses: actions/checkout@v4
+
- name: Set up JDK
uses: actions/setup-java@v4
with:
From b1d10aacef33235deb9179e53c2889e65f4a2219 Mon Sep 17 00:00:00 2001
From: klaviartur <_github@fambit.de>
Date: Mon, 20 Jan 2025 23:20:50 +0100
Subject: [PATCH 3/3] Fixed pitch not changing with speed, when not unhooked
Fixed speed resetting to 1.0x on menu call
---
.../java/org/schabi/newpipe/player/Player.java | 4 ++++
.../player/gesture/MainPlayerGestureListener.kt | 9 +++++++++
.../player/helper/PlaybackParameterDialog.java | 16 +++++++++++++++-
3 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java
index edb7685242..ac6c9f7bc2 100644
--- a/app/src/main/java/org/schabi/newpipe/player/Player.java
+++ b/app/src/main/java/org/schabi/newpipe/player/Player.java
@@ -893,6 +893,10 @@ public float getPlaybackPitch() {
return getPlaybackParameters().pitch;
}
+ public void setPlaybackPitch(final float pitch) {
+ setPlaybackParameters(getPlaybackSpeed(), pitch, getPlaybackSkipSilence());
+ }
+
public boolean getPlaybackSkipSilence() {
return !exoPlayerIsNull() && simpleExoPlayer.getSkipSilenceEnabled();
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt
index 3b52611fa8..e33b393ad0 100644
--- a/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt
+++ b/app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt
@@ -16,6 +16,7 @@ import org.schabi.newpipe.player.Player
import org.schabi.newpipe.player.helper.AudioReactor
import org.schabi.newpipe.player.helper.PlaybackParameterDialog
import org.schabi.newpipe.player.helper.PlayerHelper
+import org.schabi.newpipe.player.helper.PlayerSemitoneHelper
import org.schabi.newpipe.player.ui.MainPlayerUi
import org.schabi.newpipe.util.ThemeHelper.getAndroidDimenPx
import kotlin.math.abs
@@ -173,6 +174,14 @@ class MainPlayerGestureListener(
val currentPlaybackSpeed: Float = (currentProgressPercent * maxPlaybackSpeed).coerceIn(minPlaybackSpeed, maxPlaybackSpeed)
player.playbackSpeed = currentPlaybackSpeed
+ if (!PlaybackParameterDialog.getPlaybackUnhooked(player.context)) {
+ if (!PlaybackParameterDialog.getPitchControlModeSemitone(player.context)) {
+ player.playbackPitch = currentPlaybackSpeed
+ } else {
+ player.playbackPitch = PlayerSemitoneHelper.semitonesToPercent(PlayerSemitoneHelper.percentToSemitones(currentPlaybackSpeed.toDouble())).toFloat()
+ }
+ }
+
if (DEBUG) {
Log.d(TAG, "onScroll().playbackSpeedControl, currentPlaybackSpeed = $currentPlaybackSpeed")
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
index 8514d1d498..136262c031 100644
--- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
+++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
@@ -60,6 +60,7 @@ public class PlaybackParameterDialog extends DialogFragment {
private static final double DEFAULT_PITCH_PERCENT = 1.00f;
private static final double DEFAULT_STEP = STEP_25_PERCENT_VALUE;
private static final boolean DEFAULT_SKIP_SILENCE = false;
+ private static final boolean DEFAULT_PLAYBACK_UNHOOK = true;
private static final SliderStrategy QUADRATIC_STRATEGY = new SliderStrategy.Quadratic(
MIN_PITCH_OR_SPEED,
@@ -261,7 +262,7 @@ private void initUI() {
bindCheckboxWithBoolPref(
binding.unhookCheckbox,
R.string.playback_unhook_key,
- true,
+ DEFAULT_PLAYBACK_UNHOOK,
isChecked -> {
if (!isChecked) {
// when unchecked, slide back to the minimum of current tempo or pitch
@@ -590,6 +591,19 @@ private static String getPercentString(final double percent) {
return PlayerHelper.formatPitch(percent);
}
+
+ public static boolean getPlaybackUnhooked(final Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(context.getString(R.string.playback_unhook_key),
+ DEFAULT_PLAYBACK_UNHOOK);
+ }
+
+ public static boolean getPitchControlModeSemitone(final Context context) {
+ return PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(context.getString(R.string.playback_adjust_by_semitones_key),
+ PITCH_CTRL_MODE_PERCENT);
+ }
+
public static float getCurrentStepSize(final Context context) {
return PreferenceManager.getDefaultSharedPreferences(context)
.getFloat(context.getString(R.string.adjustment_step_key), (float) DEFAULT_STEP);