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);