mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-25 19:51:03 +00:00
Compare commits
5 Commits
v5.28.1-de
...
v5.29.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c764c4f197 | ||
|
|
6b719dfcd7 | ||
|
|
ccd169121a | ||
|
|
dcfbd8bf93 | ||
|
|
b65697603d |
19
CHANGELOG.md
19
CHANGELOG.md
@@ -1,3 +1,22 @@
|
|||||||
|
# [5.29.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.1-dev.2...v5.29.0-dev.1) (2025-06-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube:** Always use single threaded layout to resolve layout bugs in unpatched YouTube ([#5226](https://github.com/ReVanced/revanced-patches/issues/5226)) ([1f539b1](https://github.com/ReVanced/revanced-patches/commit/1f539b1396526b2c767d77a804bd0308ee4a42ec))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube:** Add an option to disable toasts when changing default playback speed or quality ([#5230](https://github.com/ReVanced/revanced-patches/issues/5230)) ([c68cde3](https://github.com/ReVanced/revanced-patches/commit/c68cde3a896450874cc571be5c4723387db96032))
|
||||||
|
|
||||||
|
## [5.28.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.28.1-dev.1...v5.28.1-dev.2) (2025-06-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Hide ads:** Hide new type of product ad in video description ([#5225](https://github.com/ReVanced/revanced-patches/issues/5225)) ([1e2efad](https://github.com/ReVanced/revanced-patches/commit/1e2efad7b2714c395ed6b0a77cbbf8a2265df520))
|
||||||
|
|
||||||
## [5.28.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.0...v5.28.1-dev.1) (2025-06-22)
|
## [5.28.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.0...v5.28.1-dev.1) (2025-06-22)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -121,12 +121,14 @@ public final class AdsFilter extends Filter {
|
|||||||
|
|
||||||
playerShoppingShelf = new StringFilterGroup(
|
playerShoppingShelf = new StringFilterGroup(
|
||||||
Settings.HIDE_PLAYER_STORE_SHELF,
|
Settings.HIDE_PLAYER_STORE_SHELF,
|
||||||
|
"expandable_list.eml",
|
||||||
"horizontal_shelf.eml"
|
"horizontal_shelf.eml"
|
||||||
);
|
);
|
||||||
|
|
||||||
playerShoppingShelfBuffer = new ByteArrayFilterGroup(
|
playerShoppingShelfBuffer = new ByteArrayFilterGroup(
|
||||||
null,
|
null,
|
||||||
"shopping_item_card_list.eml"
|
"shopping_link_item",
|
||||||
|
"shopping_item_card_list"
|
||||||
);
|
);
|
||||||
|
|
||||||
channelProfile = new StringFilterGroup(
|
channelProfile = new StringFilterGroup(
|
||||||
|
|||||||
@@ -74,6 +74,29 @@ public final class LithoFilterPatch {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Litho layout fixed thread pool size override.
|
||||||
|
* <p>
|
||||||
|
* Unpatched YouTube uses a layout fixed thread pool between 1 and 3 threads:
|
||||||
|
* <pre>
|
||||||
|
* 1 thread - > Device has less than 6 cores
|
||||||
|
* 2 threads -> Device has over 6 cores and less than 6GB of memory
|
||||||
|
* 3 threads -> Device has over 6 cores and more than 6GB of memory
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* Using more than 1 thread causes layout issues such as the You tab watch/playlist shelf
|
||||||
|
* that is sometimes incorrectly hidden (ReVanced is not hiding it), and seems to
|
||||||
|
* fix a race issue if using the active navigation tab status with litho filtering.
|
||||||
|
*/
|
||||||
|
private static final int LITHO_LAYOUT_THREAD_POOL_SIZE = 1;
|
||||||
|
|
||||||
|
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Placeholder for actual filters.
|
||||||
|
*/
|
||||||
|
private static final class DummyFilter extends Filter { }
|
||||||
|
|
||||||
private static final Filter[] filters = new Filter[] {
|
private static final Filter[] filters = new Filter[] {
|
||||||
new DummyFilter() // Replaced by patch.
|
new DummyFilter() // Replaced by patch.
|
||||||
};
|
};
|
||||||
@@ -81,8 +104,6 @@ public final class LithoFilterPatch {
|
|||||||
private static final StringTrieSearch pathSearchTree = new StringTrieSearch();
|
private static final StringTrieSearch pathSearchTree = new StringTrieSearch();
|
||||||
private static final StringTrieSearch identifierSearchTree = new StringTrieSearch();
|
private static final StringTrieSearch identifierSearchTree = new StringTrieSearch();
|
||||||
|
|
||||||
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Because litho filtering is multi-threaded and the buffer is passed in from a different injection point,
|
* Because litho filtering is multi-threaded and the buffer is passed in from a different injection point,
|
||||||
* the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads.
|
* the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads.
|
||||||
@@ -213,9 +234,28 @@ public final class LithoFilterPatch {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Placeholder for actual filters.
|
* Injection point.
|
||||||
*/
|
*/
|
||||||
final class DummyFilter extends Filter { }
|
public static int getExecutorCorePoolSize(int originalCorePoolSize) {
|
||||||
|
if (originalCorePoolSize != LITHO_LAYOUT_THREAD_POOL_SIZE) {
|
||||||
|
Logger.printDebug(() -> "Overriding core thread pool size from: " + originalCorePoolSize
|
||||||
|
+ " to: " + LITHO_LAYOUT_THREAD_POOL_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return LITHO_LAYOUT_THREAD_POOL_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injection point.
|
||||||
|
*/
|
||||||
|
public static int getExecutorMaxThreads(int originalMaxThreads) {
|
||||||
|
if (originalMaxThreads != LITHO_LAYOUT_THREAD_POOL_SIZE) {
|
||||||
|
Logger.printDebug(() -> "Overriding max thread pool size from: " + originalMaxThreads
|
||||||
|
+ " to: " + LITHO_LAYOUT_THREAD_POOL_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return LITHO_LAYOUT_THREAD_POOL_SIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,10 +64,11 @@ public class RememberVideoQualityPatch {
|
|||||||
else videoQualityWifi.save(defaultQuality);
|
else videoQualityWifi.save(defaultQuality);
|
||||||
networkTypeMessage = str("revanced_remember_video_quality_wifi");
|
networkTypeMessage = str("revanced_remember_video_quality_wifi");
|
||||||
}
|
}
|
||||||
Utils.showToastShort(str(
|
if (Settings.REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST.get())
|
||||||
useShortsPreference ? "revanced_remember_video_quality_toast_shorts" : "revanced_remember_video_quality_toast",
|
Utils.showToastShort(str(
|
||||||
networkTypeMessage, (defaultQuality + "p")
|
useShortsPreference ? "revanced_remember_video_quality_toast_shorts" : "revanced_remember_video_quality_toast",
|
||||||
));
|
networkTypeMessage, (defaultQuality + "p")
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -617,9 +617,9 @@ public class CustomPlaybackSpeedPatch {
|
|||||||
* @return The rounded speed, constrained to the specified bounds.
|
* @return The rounded speed, constrained to the specified bounds.
|
||||||
*/
|
*/
|
||||||
private static float roundSpeedToNearestIncrement(float speed) {
|
private static float roundSpeedToNearestIncrement(float speed) {
|
||||||
// Round to nearest 0.05 speed.
|
// Round to nearest 0.05 speed. Must use double precision otherwise rounding error can occur.
|
||||||
final float roundedSpeed = Math.round(speed / 0.05f) * 0.05f;
|
final double roundedSpeed = Math.round(speed / 0.05) * 0.05;
|
||||||
return Utils.clamp(roundedSpeed, 0.05f, PLAYBACK_SPEED_MAXIMUM);
|
return Utils.clamp((float) roundedSpeed, 0.05f, PLAYBACK_SPEED_MAXIMUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ public final class RememberPlaybackSpeedPatch {
|
|||||||
}
|
}
|
||||||
Settings.PLAYBACK_SPEED_DEFAULT.save(finalPlaybackSpeed);
|
Settings.PLAYBACK_SPEED_DEFAULT.save(finalPlaybackSpeed);
|
||||||
|
|
||||||
Utils.showToastShort(str("revanced_remember_playback_speed_toast", (finalPlaybackSpeed + "x")));
|
if (Settings.REMEMBER_PLAYBACK_SPEED_LAST_SELECTED_TOAST.get())
|
||||||
|
Utils.showToastShort(str("revanced_remember_playback_speed_toast", (finalPlaybackSpeed + "x")));
|
||||||
}, TOAST_DELAY_MILLISECONDS);
|
}, TOAST_DELAY_MILLISECONDS);
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ public class Settings extends BaseSettings {
|
|||||||
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2);
|
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2);
|
||||||
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2);
|
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2);
|
||||||
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE);
|
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE);
|
||||||
|
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_video_quality_last_selected_toast", TRUE, false,
|
||||||
|
parent(REMEMBER_VIDEO_QUALITY_LAST_SELECTED));
|
||||||
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_shorts_quality_default_wifi", -2, true);
|
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_shorts_quality_default_wifi", -2, true);
|
||||||
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_shorts_quality_default_mobile", -2, true);
|
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_shorts_quality_default_mobile", -2, true);
|
||||||
public static final BooleanSetting REMEMBER_SHORTS_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_shorts_quality_last_selected", FALSE);
|
public static final BooleanSetting REMEMBER_SHORTS_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_shorts_quality_last_selected", FALSE);
|
||||||
@@ -60,6 +62,8 @@ public class Settings extends BaseSettings {
|
|||||||
// Speed
|
// Speed
|
||||||
public static final FloatSetting SPEED_TAP_AND_HOLD = new FloatSetting("revanced_speed_tap_and_hold", 2.0f, true);
|
public static final FloatSetting SPEED_TAP_AND_HOLD = new FloatSetting("revanced_speed_tap_and_hold", 2.0f, true);
|
||||||
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED = new BooleanSetting("revanced_remember_playback_speed_last_selected", FALSE);
|
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED = new BooleanSetting("revanced_remember_playback_speed_last_selected", FALSE);
|
||||||
|
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_playback_speed_last_selected_toast", TRUE, false,
|
||||||
|
parent(REMEMBER_PLAYBACK_SPEED_LAST_SELECTED));
|
||||||
public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE);
|
public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE);
|
||||||
public static final FloatSetting PLAYBACK_SPEED_DEFAULT = new FloatSetting("revanced_playback_speed_default", -2.0f);
|
public static final FloatSetting PLAYBACK_SPEED_DEFAULT = new FloatSetting("revanced_playback_speed_default", -2.0f);
|
||||||
public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds",
|
public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds",
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ public class PlaybackSpeedDialogButton {
|
|||||||
: Settings.PLAYBACK_SPEED_DEFAULT.get();
|
: Settings.PLAYBACK_SPEED_DEFAULT.get();
|
||||||
|
|
||||||
VideoInformation.overridePlaybackSpeed(speed);
|
VideoInformation.overridePlaybackSpeed(speed);
|
||||||
showToastShort(str("revanced_custom_playback_speeds_reset_toast", (speed + "x")));
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.printException(() -> "speed button reset failure", ex);
|
Logger.printException(() -> "speed button reset failure", ex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
android.useAndroidX = true
|
android.useAndroidX = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 5.28.1-dev.1
|
version = 5.29.0-dev.1
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package app.revanced.patches.youtube.misc.litho.filter
|
package app.revanced.patches.youtube.misc.litho.filter
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint
|
import app.revanced.patcher.fingerprint
|
||||||
|
import app.revanced.util.containsLiteralInstruction
|
||||||
import app.revanced.util.literal
|
import app.revanced.util.literal
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
@@ -52,6 +53,15 @@ internal val emptyComponentFingerprint = fingerprint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal val lithoThreadExecutorFingerprint = fingerprint {
|
||||||
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||||
|
parameters("I", "I", "I")
|
||||||
|
custom { method, classDef ->
|
||||||
|
classDef.superclass == "Ljava/util/concurrent/ThreadPoolExecutor;" &&
|
||||||
|
method.containsLiteralInstruction(1L) // 1L = default thread timeout.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint {
|
internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
returns("Z")
|
returns("Z")
|
||||||
|
|||||||
@@ -209,6 +209,22 @@ val lithoFilterPatch = bytecodePatch(
|
|||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
|
// region Change Litho thread executor to 1 thread to fix layout issue in unpatched YouTube.
|
||||||
|
|
||||||
|
lithoThreadExecutorFingerprint.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorCorePoolSize(I)I
|
||||||
|
move-result p1
|
||||||
|
invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorMaxThreads(I)I
|
||||||
|
move-result p2
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
// endregion
|
||||||
|
|
||||||
|
|
||||||
// region A/B test of new Litho native code.
|
// region A/B test of new Litho native code.
|
||||||
|
|
||||||
// Turn off native code that handles litho component names. If this feature is on then nearly
|
// Turn off native code that handles litho component names. If this feature is on then nearly
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ val rememberVideoQualityPatch = bytecodePatch {
|
|||||||
entriesKey = "revanced_shorts_quality_default_entries",
|
entriesKey = "revanced_shorts_quality_default_entries",
|
||||||
entryValuesKey = "revanced_shorts_quality_default_entry_values"
|
entryValuesKey = "revanced_shorts_quality_default_entry_values"
|
||||||
),
|
),
|
||||||
SwitchPreference("revanced_remember_shorts_quality_last_selected")
|
SwitchPreference("revanced_remember_shorts_quality_last_selected"),
|
||||||
|
SwitchPreference("revanced_remember_video_quality_last_selected_toast")
|
||||||
))
|
))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch {
|
|||||||
entryValuesKey = null,
|
entryValuesKey = null,
|
||||||
tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference"
|
tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference"
|
||||||
),
|
),
|
||||||
SwitchPreference("revanced_remember_playback_speed_last_selected")
|
SwitchPreference("revanced_remember_playback_speed_last_selected"),
|
||||||
|
SwitchPreference("revanced_remember_playback_speed_last_selected_toast")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1465,6 +1465,9 @@ Enabling this can unlock higher video qualities"</string>
|
|||||||
<string name="revanced_remember_video_quality_last_selected_title">Remember video quality changes</string>
|
<string name="revanced_remember_video_quality_last_selected_title">Remember video quality changes</string>
|
||||||
<string name="revanced_remember_video_quality_last_selected_summary_on">Quality changes apply to all videos</string>
|
<string name="revanced_remember_video_quality_last_selected_summary_on">Quality changes apply to all videos</string>
|
||||||
<string name="revanced_remember_video_quality_last_selected_summary_off">Quality changes only apply to the current video</string>
|
<string name="revanced_remember_video_quality_last_selected_summary_off">Quality changes only apply to the current video</string>
|
||||||
|
<string name="revanced_remember_video_quality_last_selected_toast_title">Show toast on video quality changes</string>
|
||||||
|
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">A toast is shown when the default video quality is changed</string>
|
||||||
|
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">A toast is not shown when the default video quality is changed</string>
|
||||||
<string name="revanced_video_quality_default_wifi_title">Default video quality on Wi-Fi network</string>
|
<string name="revanced_video_quality_default_wifi_title">Default video quality on Wi-Fi network</string>
|
||||||
<string name="revanced_video_quality_default_mobile_title">Default video quality on mobile network</string>
|
<string name="revanced_video_quality_default_mobile_title">Default video quality on mobile network</string>
|
||||||
<string name="revanced_remember_shorts_quality_last_selected_title">Remember Shorts quality changes</string>
|
<string name="revanced_remember_shorts_quality_last_selected_title">Remember Shorts quality changes</string>
|
||||||
@@ -1491,7 +1494,6 @@ Enabling this can unlock higher video qualities"</string>
|
|||||||
<string name="revanced_custom_playback_speeds_invalid">Custom speeds must be less than %s</string>
|
<string name="revanced_custom_playback_speeds_invalid">Custom speeds must be less than %s</string>
|
||||||
<string name="revanced_custom_playback_speeds_parse_exception">Invalid custom playback speeds</string>
|
<string name="revanced_custom_playback_speeds_parse_exception">Invalid custom playback speeds</string>
|
||||||
<string name="revanced_custom_playback_speeds_auto">Auto</string>
|
<string name="revanced_custom_playback_speeds_auto">Auto</string>
|
||||||
<string name="revanced_custom_playback_speeds_reset_toast">Playback speed reset to: %s</string>
|
|
||||||
<string name="revanced_speed_tap_and_hold_title">Custom tap and hold speed</string>
|
<string name="revanced_speed_tap_and_hold_title">Custom tap and hold speed</string>
|
||||||
<string name="revanced_speed_tap_and_hold_summary">Playback speed between 0-8</string>
|
<string name="revanced_speed_tap_and_hold_summary">Playback speed between 0-8</string>
|
||||||
</patch>
|
</patch>
|
||||||
@@ -1499,6 +1501,9 @@ Enabling this can unlock higher video qualities"</string>
|
|||||||
<string name="revanced_remember_playback_speed_last_selected_title">Remember playback speed changes</string>
|
<string name="revanced_remember_playback_speed_last_selected_title">Remember playback speed changes</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_summary_on">Playback speed changes apply to all videos</string>
|
<string name="revanced_remember_playback_speed_last_selected_summary_on">Playback speed changes apply to all videos</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_summary_off">Playback speed changes only apply to the current video</string>
|
<string name="revanced_remember_playback_speed_last_selected_summary_off">Playback speed changes only apply to the current video</string>
|
||||||
|
<string name="revanced_remember_playback_speed_last_selected_toast_title">Show toast on playback speed changes</string>
|
||||||
|
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">A toast is shown when the default playback speed is changed</string>
|
||||||
|
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">A toast is not shown when the default playback speed is changed</string>
|
||||||
<string name="revanced_playback_speed_default_title">Default playback speed</string>
|
<string name="revanced_playback_speed_default_title">Default playback speed</string>
|
||||||
<string name="revanced_remember_playback_speed_toast">Changed default speed to: %s</string>
|
<string name="revanced_remember_playback_speed_toast">Changed default speed to: %s</string>
|
||||||
</patch>
|
</patch>
|
||||||
|
|||||||
Reference in New Issue
Block a user