diff --git a/CHANGELOG.md b/CHANGELOG.md index 33de9ef48..eb77c86c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# [5.18.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.18.0-dev.1...v5.18.0-dev.2) (2025-03-28) + + +### Bug Fixes + +* **Spotify:** Ignore optional attributes if not present ([#4688](https://github.com/ReVanced/revanced-patches/issues/4688)) ([84f5854](https://github.com/ReVanced/revanced-patches/commit/84f585492e4be3604c6c7680ffb3bebcea5a675f)) + +# [5.18.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.17.0...v5.18.0-dev.1) (2025-03-28) + + +### Features + +* **YouTube:** Support version `20.07.39` ([#4677](https://github.com/ReVanced/revanced-patches/issues/4677)) ([c1379f6](https://github.com/ReVanced/revanced-patches/commit/c1379f6e520c683d2c9d6a490a69ca542168b3b3)) + # [5.17.0](https://github.com/ReVanced/revanced-patches/compare/v5.16.1...v5.17.0) (2025-03-28) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java index 07af5ed43..d999b9678 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java @@ -122,6 +122,21 @@ public class SpoofVideoStreamsPatch { return false; } + /** + * Injection point. + * Turns off a feature flag that interferes with video playback. + */ + public static boolean usePlaybackStartFeatureFlag(boolean original) { + if (original) { + Logger.printDebug(() -> "usePlaybackStartFeatureFlag is set on"); + } + + if (!SPOOF_STREAMING_DATA) { + return original; + } + return false; + } + /** * Injection point. */ diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java index b295b39e1..1410b308e 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java @@ -1,54 +1,87 @@ package app.revanced.extension.spotify.misc; +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; + import com.spotify.remoteconfig.internal.AccountAttribute; -import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.Objects; import app.revanced.extension.shared.Logger; -/** - * @noinspection unused - */ +@SuppressWarnings("unused") public final class UnlockPremiumPatch { - private static final Map OVERRIDES = new HashMap<>() {{ - // Disables player and app ads. - put("ads", false); - // Works along on-demand, allows playing any song without restriction. - put("player-license", "premium"); - // Disables shuffle being initially enabled when first playing a playlist. - put("shuffle", false); - // Allows playing any song on-demand, without a shuffled order. - put("on-demand", true); - // Make sure playing songs is not disabled remotely and playlists show up. - put("streaming", true); - // Allows adding songs to queue and removes the smart shuffle mode restriction, - // allowing to pick any of the other modes. - put("pick-and-shuffle", false); - // Disables shuffle-mode streaming-rule, which forces songs to be played shuffled - // and breaks the player when other patches are applied. - put("streaming-rules", ""); - // Enables premium UI in settings and removes the premium button in the nav-bar. - put("nft-disabled", "1"); - // Enable Cross-Platform Spotify Car Thing. - put("can_use_superbird", true); - // Removes the premium button in the nav-bar for tablet users. - put("tablet-free", false); - }}; + private static class OverrideAttribute { + /** + * Account attribute key. + */ + final String key; + + /** + * Override value. + */ + final Object overrideValue; + + /** + * If this attribute is expected to be present in all situations. + * If false, then no error is raised if the attribute is missing. + */ + final boolean isExpected; + + OverrideAttribute(String key, Object overrideValue) { + this(key, overrideValue, true); + } + + OverrideAttribute(String key, Object overrideValue, boolean isExpected) { + this.key = Objects.requireNonNull(key); + this.overrideValue = Objects.requireNonNull(overrideValue); + this.isExpected = isExpected; + } + } + + private static final List OVERRIDES = List.of( + // Disables player and app ads. + new OverrideAttribute("ads", FALSE), + // Works along on-demand, allows playing any song without restriction. + new OverrideAttribute("player-license", "premium"), + // Disables shuffle being initially enabled when first playing a playlist. + new OverrideAttribute("shuffle", FALSE), + // Allows playing any song on-demand, without a shuffled order. + new OverrideAttribute("on-demand", TRUE), + // Make sure playing songs is not disabled remotely and playlists show up. + new OverrideAttribute("streaming", TRUE), + // Allows adding songs to queue and removes the smart shuffle mode restriction, + // allowing to pick any of the other modes. + new OverrideAttribute("pick-and-shuffle", FALSE), + // Disables shuffle-mode streaming-rule, which forces songs to be played shuffled + // and breaks the player when other patches are applied. + new OverrideAttribute("streaming-rules", ""), + // Enables premium UI in settings and removes the premium button in the nav-bar. + new OverrideAttribute("nft-disabled", "1"), + // Enable Spotify Car Thing hardware device. + // Device is discontinued and no longer works with the latest releases, + // but it might still work with older app targets. + new OverrideAttribute("can_use_superbird", TRUE, false), + // Removes the premium button in the nav-bar for tablet users. + new OverrideAttribute("tablet-free", FALSE, false) + ); /** * Injection point. */ public static void overrideAttribute(Map attributes) { try { - for (var entry : OVERRIDES.entrySet()) { - var key = entry.getKey(); - var attribute = attributes.get(key); + for (var override : OVERRIDES) { + var attribute = attributes.get(override.key); if (attribute == null) { - Logger.printException(() -> "Account attribute not found: " + key); + if (override.isExpected) { + Logger.printException(() -> "''" + override.key + "' expected but not found"); + } } else { - attribute.value_ = entry.getValue(); + attribute.value_ = override.overrideValue; } } } catch (Exception ex) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java index 938ac5458..2e8c3cc06 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableResumingStartupShortsPlayerPatch.java @@ -2,7 +2,7 @@ package app.revanced.extension.youtube.patches; import app.revanced.extension.youtube.settings.Settings; -/** @noinspection unused*/ +@SuppressWarnings("unused") public class DisableResumingStartupShortsPlayerPatch { /** @@ -11,4 +11,11 @@ public class DisableResumingStartupShortsPlayerPatch { public static boolean disableResumingStartupShortsPlayer() { return Settings.DISABLE_RESUMING_SHORTS_PLAYER.get(); } + + /** + * Injection point. + */ + public static boolean disableResumingStartupShortsPlayer(boolean original) { + return original && !Settings.DISABLE_RESUMING_SHORTS_PLAYER.get(); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index be27811c9..1b41e44c6 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -43,10 +43,13 @@ public final class MiniplayerPatch { MODERN_2(null, 2), MODERN_3(null, 3), /** - * Half broken miniplayer, that might be work in progress or left over abandoned code. - * Can force this type by editing the import/export settings. + * Works and is functional with 20.03+ */ - MODERN_4(null, 4); + MODERN_4(null, 4), + /** + * Half broken miniplayer, and in 20.02 and earlier is declared as type 4. + */ + MODERN_5(null, 5); /** * Legacy tablet hook value. @@ -126,12 +129,13 @@ public final class MiniplayerPatch { private static final boolean DRAG_AND_DROP_ENABLED = CURRENT_TYPE.isModern() && Settings.MINIPLAYER_DRAG_AND_DROP.get(); - private static final boolean HIDE_EXPAND_CLOSE_ENABLED = - Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.get() - && Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.isAvailable(); + private static final boolean HIDE_OVERLAY_BUTTONS_ENABLED = + Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.get() + && Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.isAvailable(); private static final boolean HIDE_SUBTEXT_ENABLED = - (CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3) && Settings.MINIPLAYER_HIDE_SUBTEXT.get(); + (CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3 || CURRENT_TYPE == MODERN_4) + && Settings.MINIPLAYER_HIDE_SUBTEXT.get(); // 19.25 is last version that has forward/back buttons for phones, // but buttons still show for tablets/foldable devices and they don't work well so always hide. @@ -139,7 +143,7 @@ public final class MiniplayerPatch { && (VersionCheckPatch.IS_19_34_OR_GREATER || Settings.MINIPLAYER_HIDE_REWIND_FORWARD.get()); private static final boolean MINIPLAYER_ROUNDED_CORNERS_ENABLED = - Settings.MINIPLAYER_ROUNDED_CORNERS.get(); + CURRENT_TYPE.isModern() && Settings.MINIPLAYER_ROUNDED_CORNERS.get(); private static final boolean MINIPLAYER_HORIZONTAL_DRAG_ENABLED = DRAG_AND_DROP_ENABLED && Settings.MINIPLAYER_HORIZONTAL_DRAG.get(); @@ -172,11 +176,12 @@ public final class MiniplayerPatch { } } - public static final class MiniplayerHideExpandCloseAvailability implements Setting.Availability { + public static final class MiniplayerHideOverlayButtonsAvailability implements Setting.Availability { @Override public boolean isAvailable() { MiniplayerType type = Settings.MINIPLAYER_TYPE.get(); - return (!IS_19_20_OR_GREATER && (type == MODERN_1 || type == MODERN_3)) + return type == MODERN_4 + || (!IS_19_20_OR_GREATER && (type == MODERN_1 || type == MODERN_3)) || (!IS_19_26_OR_GREATER && type == MODERN_1 && !Settings.MINIPLAYER_DOUBLE_TAP_ACTION.get() && !Settings.MINIPLAYER_DRAG_AND_DROP.get()) || (IS_19_29_OR_GREATER && type == MODERN_3); @@ -227,9 +232,13 @@ public final class MiniplayerPatch { /** * Injection point. */ - public static void adjustMiniplayerOpacity(ImageView view) { + public static void adjustMiniplayerOpacity(View view) { if (CURRENT_TYPE == MODERN_1) { - view.setImageAlpha(OPACITY_LEVEL); + if (view instanceof ImageView imageView) { + imageView.setImageAlpha(OPACITY_LEVEL); + } else { + Logger.printException(() -> "Unknown miniplayer overlay view: " + view); + } } } @@ -247,7 +256,7 @@ public final class MiniplayerPatch { /** * Injection point. */ - public static boolean enableMiniplayerDoubleTapAction(boolean original) { + public static boolean getMiniplayerDoubleTapAction(boolean original) { if (CURRENT_TYPE == DEFAULT) { return original; } @@ -258,7 +267,7 @@ public final class MiniplayerPatch { /** * Injection point. */ - public static boolean enableMiniplayerDragAndDrop(boolean original) { + public static boolean getMiniplayerDragAndDrop(boolean original) { if (CURRENT_TYPE == DEFAULT) { return original; } @@ -266,13 +275,36 @@ public final class MiniplayerPatch { return DRAG_AND_DROP_ENABLED; } + /** + * Injection point. + */ + public static boolean getRoundedCorners(boolean original) { + if (CURRENT_TYPE == DEFAULT) { + return original; + } + + return MINIPLAYER_ROUNDED_CORNERS_ENABLED; + } /** * Injection point. */ - public static boolean setRoundedCorners(boolean original) { - if (CURRENT_TYPE.isModern()) { - return MINIPLAYER_ROUNDED_CORNERS_ENABLED; + public static boolean getHorizontalDrag(boolean original) { + if (CURRENT_TYPE == DEFAULT) { + return original; + } + + return MINIPLAYER_HORIZONTAL_DRAG_ENABLED; + } + + /** + * Injection point. + */ + public static boolean getMaximizeAnimation(boolean original) { + // This must be forced on if horizontal drag is enabled, + // otherwise the UI has visual glitches when maximizing the miniplayer. + if (MINIPLAYER_HORIZONTAL_DRAG_ENABLED) { + return true; } return original; @@ -281,7 +313,7 @@ public final class MiniplayerPatch { /** * Injection point. */ - public static int setMiniplayerDefaultSize(int original) { + public static int getMiniplayerDefaultSize(int original) { if (CURRENT_TYPE.isModern()) { return MINIPLAYER_SIZE; } @@ -289,29 +321,26 @@ public final class MiniplayerPatch { return original; } + /** + * Injection point. + */ + public static void hideMiniplayerExpandClose(View view) { + Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view); + } /** * Injection point. */ - public static boolean setHorizontalDrag(boolean original) { - if (CURRENT_TYPE.isModern()) { - return MINIPLAYER_HORIZONTAL_DRAG_ENABLED; + public static void hideMiniplayerActionButton(View view) { + if (CURRENT_TYPE == MODERN_4) { + Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view); } - - return original; } /** * Injection point. */ - public static void hideMiniplayerExpandClose(ImageView view) { - Utils.hideViewByRemovingFromParentUnderCondition(HIDE_EXPAND_CLOSE_ENABLED, view); - } - - /** - * Injection point. - */ - public static void hideMiniplayerRewindForward(ImageView view) { + public static void hideMiniplayerRewindForward(View view) { Utils.hideViewByRemovingFromParentUnderCondition(HIDE_REWIND_FORWARD_ENABLED, view); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java index c825b88d3..14e136f28 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java @@ -3,11 +3,15 @@ package app.revanced.extension.youtube.patches; import app.revanced.extension.shared.Utils; public class VersionCheckPatch { - public static final boolean IS_19_17_OR_GREATER = Utils.getAppVersionName().compareTo("19.17.00") >= 0; - public static final boolean IS_19_20_OR_GREATER = Utils.getAppVersionName().compareTo("19.20.00") >= 0; - public static final boolean IS_19_21_OR_GREATER = Utils.getAppVersionName().compareTo("19.21.00") >= 0; - public static final boolean IS_19_26_OR_GREATER = Utils.getAppVersionName().compareTo("19.26.00") >= 0; - public static final boolean IS_19_29_OR_GREATER = Utils.getAppVersionName().compareTo("19.29.00") >= 0; - public static final boolean IS_19_34_OR_GREATER = Utils.getAppVersionName().compareTo("19.34.00") >= 0; - public static final boolean IS_19_46_OR_GREATER = Utils.getAppVersionName().compareTo("19.46.00") >= 0; + private static boolean isVersionOrGreater(String version) { + return Utils.getAppVersionName().compareTo(version) >= 0; + } + + public static final boolean IS_19_17_OR_GREATER = isVersionOrGreater("19.17.00"); + public static final boolean IS_19_20_OR_GREATER = isVersionOrGreater("19.20.00"); + public static final boolean IS_19_21_OR_GREATER = isVersionOrGreater("19.21.00"); + public static final boolean IS_19_26_OR_GREATER = isVersionOrGreater("19.26.00"); + public static final boolean IS_19_29_OR_GREATER = isVersionOrGreater("19.29.00"); + public static final boolean IS_19_34_OR_GREATER = isVersionOrGreater("19.34.00"); + public static final boolean IS_19_46_OR_GREATER = isVersionOrGreater("19.46.00"); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java index 6752840ec..a258dffd2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java @@ -114,7 +114,7 @@ public class ReturnYouTubeDislike { private static final Rect middleSeparatorBounds; /** - * Left separator horizontal padding for Rolling Number layout. + * Horizontal padding between the left and middle separator. */ public static final int leftSeparatorShapePaddingPixels; private static final ShapeDrawable leftSeparatorShape; @@ -129,7 +129,7 @@ public class ReturnYouTubeDislike { (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp); middleSeparatorBounds = new Rect(0, 0, middleSeparatorSize, middleSeparatorSize); - leftSeparatorShapePaddingPixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10.0f, dp); + leftSeparatorShapePaddingPixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8.4f, dp); leftSeparatorShape = new ShapeDrawable(new RectShape()); leftSeparatorShape.setBounds(leftSeparatorBounds); @@ -238,7 +238,7 @@ public class ReturnYouTubeDislike { String leftSeparatorString = getTextDirectionString(); final Spannable leftSeparatorSpan; if (isRollingNumber) { - leftSeparatorSpan = new SpannableString(leftSeparatorString); + leftSeparatorSpan = new SpannableString(leftSeparatorString); } else { leftSeparatorString += " "; leftSeparatorSpan = new SpannableString(leftSeparatorString); @@ -623,7 +623,7 @@ public class ReturnYouTubeDislike { userVote = vote; clearUICache(); } - + if (future.isDone()) { // Update the fetched vote data. RYDVoteData voteData = getFetchData(MAX_MILLISECONDS_TO_BLOCK_UI_WAITING_FOR_FETCH); 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 e781af838..b082704af 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 @@ -10,7 +10,6 @@ import static app.revanced.extension.youtube.patches.ChangeFormFactorPatch.FormF import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.StartPage; import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode; import static app.revanced.extension.youtube.patches.ForceOriginalAudioPatch.ForceOriginalAudioAvailability; -import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideExpandCloseAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL; @@ -40,6 +39,7 @@ import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.DeArrow import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime; +import app.revanced.extension.youtube.patches.MiniplayerPatch; import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; public class Settings extends BaseSettings { @@ -156,7 +156,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_DRAG_AND_DROP = new BooleanSetting("revanced_miniplayer_drag_and_drop", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_HORIZONTAL_DRAG = new BooleanSetting("revanced_miniplayer_horizontal_drag", FALSE, true, new MiniplayerHorizontalDragAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_EXPAND_CLOSE = new BooleanSetting("revanced_miniplayer_hide_expand_close", FALSE, true, new MiniplayerHideExpandCloseAvailability()); + public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability()); public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3)); public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, MINIPLAYER_TYPE.availability(MODERN_1)); public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN); diff --git a/gradle.properties b/gradle.properties index 22b8aa367..deb166345 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.17.0 +version = 5.18.0-dev.2 diff --git a/patches/api/patches.api b/patches/api/patches.api index f933fdf66..e672bf3ad 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -776,8 +776,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/TextPref } public final class app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatchKt { - public static final fun spoofVideoStreamsPatch (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun spoofVideoStreamsPatch$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun spoofVideoStreamsPatch (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun spoofVideoStreamsPatch$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatchKt { @@ -1185,17 +1185,7 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa } public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatchKt { - public static final fun getFloatyBarButtonTopMargin ()J - public static final fun getMiniplayerMaxSize ()J public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getModernMiniplayerClose ()J - public static final fun getModernMiniplayerExpand ()J - public static final fun getModernMiniplayerForwardButton ()J - public static final fun getModernMiniplayerRewindButton ()J - public static final fun getPlayerOverlays ()J - public static final fun getScrimOverlay ()J - public static final fun getYtOutlinePictureInPictureWhite24 ()J - public static final fun getYtOutlineXWhite24 ()J } public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt { @@ -1390,6 +1380,12 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_19_46_or_greater ()Z public static final fun is_19_47_or_greater ()Z public static final fun is_19_49_or_greater ()Z + public static final fun is_20_02_or_greater ()Z + public static final fun is_20_03_or_greater ()Z + public static final fun is_20_05_or_greater ()Z + public static final fun is_20_07_or_greater ()Z + public static final fun is_20_09_or_greater ()Z + public static final fun is_20_10_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 8cd04d0af..e6169bacb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -145,7 +145,25 @@ internal val patchIncludedExtensionMethodFingerprint = fingerprint { internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L internal val mediaFetchHotConfigFingerprint = fingerprint { - literal { - MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG - } + literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG } +} + +// 20.10+ +internal const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L + +internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint { + literal { MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG } +} + +// Feature flag that enables different code for parsing and starting video playback, +// but it's exact purpose is not known. If this flag is enabled while stream spoofing +// then videos will never start playback and load forever. +// Flag does not seem to affect playback if spoofing is off. +internal const val PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG = 45665455L + +internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters() + returns("Z") + literal { PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 55f72a938..a24d1c334 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -31,7 +31,9 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = fun spoofVideoStreamsPatch( block: BytecodePatchBuilder.() -> Unit = {}, - applyMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false }, + fixMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false }, + fixMediaFetchHotConfigAlternativeChanges: BytecodePatchBuilder.() -> Boolean = { false }, + fixParsePlaybackResponseFeatureFlag: BytecodePatchBuilder.() -> Boolean = { false }, executeBlock: BytecodePatchContext.() -> Unit = {}, ) = bytecodePatch( name = "Spoof video streams", @@ -241,13 +243,27 @@ fun spoofVideoStreamsPatch( // region turn off stream config replacement feature flag. - if (applyMediaFetchHotConfigChanges()) { + if (fixMediaFetchHotConfigChanges()) { mediaFetchHotConfigFingerprint.method.insertFeatureFlagBooleanOverride( MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG, "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" ) } + if (fixMediaFetchHotConfigAlternativeChanges()) { + mediaFetchHotConfigAlternativeFingerprint.method.insertFeatureFlagBooleanOverride( + MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG, + "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" + ) + } + + if (fixParsePlaybackResponseFeatureFlag()) { + playbackStartDescriptorFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride( + PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG, + "$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z" + ) + } + // endregion executeBlock() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index a36d3ff5d..5e0ca3b6b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -82,9 +82,8 @@ val hideAdsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 49d7a460d..b98bebdc6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -29,9 +29,8 @@ val hideGetPremiumPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index e2a00c496..285ac733c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -27,9 +27,8 @@ val videoAdsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt index 928b87355..13f1a3128 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt @@ -57,9 +57,8 @@ val copyVideoUrlPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index 054c18e1c..28cae5018 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -28,9 +28,8 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt index 22f971e42..ea7951222 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt @@ -72,9 +72,8 @@ val downloadsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt index 79e788961..4f0357954 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/DisablePreciseSeekingGesturePatch.kt @@ -27,9 +27,8 @@ val disablePreciseSeekingGesturePatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index d4d6e84cd..60a424e28 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -30,9 +30,8 @@ val enableSeekbarTappingPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 2fb042567..e7dc185a4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -39,9 +39,8 @@ val enableSlideToSeekPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt index a539aaa5b..a890d6c11 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt @@ -33,9 +33,8 @@ val seekbarThumbnailsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ) ) 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 f127357d4..f385f3543 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 @@ -84,9 +84,8 @@ val swipeControlsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index c8fa4c558..4af370bc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -26,9 +26,8 @@ val autoCaptionsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index b20a3fe6c..79a1f3c09 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -47,9 +47,8 @@ val customBrandingPatch = resourcePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index 3219333cf..1ff78cbe3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -45,9 +45,8 @@ val changeHeaderPatch = resourcePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 8bfa54d22..f6a8a0ff6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -26,9 +26,8 @@ val hideButtonsPatch = resourcePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index dd6666bcf..20b557807 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -44,9 +44,8 @@ val navigationButtonsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index d02407c71..7ab7431b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -58,9 +58,8 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index b516e90b5..4c431fa52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -37,9 +37,8 @@ val changeFormFactorPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt index 55a70aa1a..876238ee3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt @@ -63,9 +63,8 @@ val hideEndscreenCardsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt index 569214ee5..5ebcc637b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt @@ -35,9 +35,8 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index 0b9badbe8..d7115ac81 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -33,9 +33,8 @@ val disableFullscreenAmbientModePatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 463e4cdc6..5216ea89a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -15,7 +15,21 @@ internal val hideShowMoreButtonFingerprint = fingerprint { literal { expandButtonDownId } } +/** + * 20.07+ + */ internal val parseElementFromBufferFingerprint = fingerprint { + parameters("L", "L", "[B", "L", "L") + opcodes( + Opcode.IGET_OBJECT, + Opcode.IGET_BOOLEAN, + Opcode.INVOKE_INTERFACE, + Opcode.MOVE_RESULT_OBJECT, + ) + strings("Failed to parse Element") // String is a partial match. +} + +internal val parseElementFromBufferLegacyFingerprint = fingerprint { parameters("L", "L", "[B", "L", "L") opcodes( Opcode.IGET_OBJECT, @@ -110,7 +124,6 @@ internal val showFloatingMicrophoneButtonFingerprint = fingerprint { opcodes( Opcode.IGET_BOOLEAN, Opcode.IF_EQZ, - Opcode.RETURN_VOID, ) literal { fabButtonId } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 29e9a9802..2d96d134b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -21,11 +21,14 @@ import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -132,6 +135,7 @@ val hideLayoutComponentsPatch = bytecodePatch( "19.45.38", "19.46.42", "19.47.53", + "20.07.39", ), ) @@ -247,29 +251,32 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Mix playlists - parseElementFromBufferFingerprint.method.apply { - val startIndex = parseElementFromBufferFingerprint.patternMatch!!.startIndex - // Target code is a mess with a lot of register moves. - // There is no simple way to find a free register for all versions so this is hard coded. - val freeRegister = if (is_19_47_or_greater) 6 else 0 - val byteArrayParameter = "p3" - val conversionContextRegister = getInstruction(startIndex).registerA - val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } - val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC + (if (is_20_07_or_greater) parseElementFromBufferFingerprint + else parseElementFromBufferLegacyFingerprint).let { + it.method.apply { + // Target code is a mess with a lot of register moves. + // There is no simple way to find a free register for all versions so this is hard coded. + val freeRegister = if (is_19_47_or_greater) 6 else 0 + val byteArrayParameter = "p3" + val startIndex = it.patternMatch!!.startIndex + val conversionContextRegister = getInstruction(startIndex).registerA + val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } + val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC - addInstructionsWithLabels( - startIndex + 1, - """ - invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z - move-result v$freeRegister - if-eqz v$freeRegister, :show - move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 - goto :return_empty_component - :show - const/4 v$freeRegister, 0x0 # Restore register, required for 19.16 - """, - ExternalLabel("return_empty_component", returnEmptyComponentInstruction), - ) + addInstructionsWithLabels( + startIndex + 1, + """ + invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z + move-result v$freeRegister + if-eqz v$freeRegister, :show + move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 + goto :return_empty_component + :show + const/4 v$freeRegister, 0x0 # Restore register, required for 19.16 + """, + ExternalLabel("return_empty_component", returnEmptyComponentInstruction), + ) + } } // endregion @@ -345,19 +352,18 @@ val hideLayoutComponentsPatch = bytecodePatch( // region hide floating microphone - showFloatingMicrophoneButtonFingerprint.let { - it.method.apply { - val startIndex = it.patternMatch!!.startIndex - val register = getInstruction(startIndex).registerA + showFloatingMicrophoneButtonFingerprint.method.apply { + val literalIndex = indexOfFirstLiteralInstructionOrThrow(fabButtonId) + val booleanIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.IGET_BOOLEAN) + val register = getInstruction(booleanIndex).registerA - addInstructions( - startIndex + 1, - """ + addInstructions( + booleanIndex + 1, + """ invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z move-result v$register - """, - ) - } + """ + ) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index 8c9e5bec9..883fa1f16 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -61,9 +61,8 @@ val hideInfoCardsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index 057e18718..c17e4668d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -28,9 +28,8 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index f689fe3c8..cf2b23464 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -33,9 +33,8 @@ val disableRollingNumberAnimationPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt index 4d0adeaee..68b516ebb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt @@ -29,9 +29,8 @@ val hideSeekbarPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index c1153586e..025f9a1d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -176,9 +176,8 @@ val hideShortsComponentsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index 2943d7fd2..e6d3f8768 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -25,9 +25,8 @@ val hideTimestampPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 5a2f47239..8c139aee4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -30,7 +30,7 @@ internal val miniplayerModernAddViewListenerFingerprint = fingerprint { internal val miniplayerModernCloseButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() literal { modernMiniplayerClose } } @@ -62,7 +62,7 @@ internal val miniplayerOnCloseHandlerFingerprint = fingerprint { */ internal val miniplayerModernExpandButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() literal { modernMiniplayerExpand } } @@ -82,7 +82,7 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { */ internal val miniplayerModernForwardButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() literal { modernMiniplayerForwardButton } } @@ -92,7 +92,6 @@ internal val miniplayerModernForwardButtonFingerprint = fingerprint { */ internal val miniplayerModernOverlayViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") parameters() literal { scrimOverlay } } @@ -102,7 +101,7 @@ internal val miniplayerModernOverlayViewFingerprint = fingerprint { */ internal val miniplayerModernRewindButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Landroid/widget/ImageView;") + returns("L") parameters() literal { modernMiniplayerRewindButton } } @@ -114,6 +113,13 @@ internal val miniplayerModernViewParentFingerprint = fingerprint { strings("player_overlay_modern_mini_player_controls") } +internal val miniplayerModernActionButtonFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("L") + parameters() + literal { modernMiniPlayerOverlayActionButton } +} + internal val miniplayerMinimumSizeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index f367a1ae2..8f8ba6b4e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -34,27 +34,29 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -var floatyBarButtonTopMargin = -1L +internal var floatyBarButtonTopMargin = -1L private set // Only available in 19.15 and upwards. -var ytOutlineXWhite24 = -1L +internal var ytOutlineXWhite24 = -1L private set -var ytOutlinePictureInPictureWhite24 = -1L +internal var ytOutlinePictureInPictureWhite24 = -1L private set -var scrimOverlay = -1L +internal var scrimOverlay = -1L private set -var modernMiniplayerClose = -1L +internal var modernMiniplayerClose = -1L private set -var modernMiniplayerExpand = -1L +internal var modernMiniplayerExpand = -1L private set -var modernMiniplayerRewindButton = -1L +internal var modernMiniplayerRewindButton = -1L private set -var modernMiniplayerForwardButton = -1L +internal var modernMiniplayerForwardButton = -1L private set -var playerOverlays = -1L +internal var modernMiniPlayerOverlayActionButton = -1L private set -var miniplayerMaxSize = -1L +internal var playerOverlays = -1L + private set +internal var miniplayerMaxSize = -1L private set private val miniplayerResourcePatch = resourcePatch { @@ -100,6 +102,11 @@ private val miniplayerResourcePatch = resourcePatch { "modern_miniplayer_forward_button", ] + modernMiniPlayerOverlayActionButton = resourceMappings[ + "id", + "modern_miniplayer_overlay_action_button" + ] + // Resource id is not used during patching, but is used by extension. // Verify the resource is present while patching. resourceMappings[ @@ -167,6 +174,7 @@ val miniplayerPatch = bytecodePatch( "19.45.38", "19.46.42", "19.47.53", + "20.07.39", ), ) @@ -175,19 +183,25 @@ val miniplayerPatch = bytecodePatch( val preferences = mutableSetOf() - preferences += - if (is_19_43_or_greater) { + if (is_20_03_or_greater) { ListPreference( "revanced_miniplayer_type", summaryKey = null, ) + } else if (is_19_43_or_greater) { + ListPreference( + "revanced_miniplayer_type", + summaryKey = null, + entriesKey = "revanced_miniplayer_type_legacy_19_43_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_19_43_entry_values", + ) } else { ListPreference( "revanced_miniplayer_type", summaryKey = null, - entriesKey = "revanced_miniplayer_type_legacy_entries", - entryValuesKey = "revanced_miniplayer_type_legacy_entry_values", + entriesKey = "revanced_miniplayer_type_legacy_19_16_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_19_16_entry_values", ) } @@ -209,13 +223,13 @@ val miniplayerPatch = bytecodePatch( preferences += SwitchPreference("revanced_miniplayer_hide_subtext") preferences += if (is_19_26_or_greater) { - SwitchPreference("revanced_miniplayer_hide_expand_close") + SwitchPreference("revanced_miniplayer_hide_overlay_buttons") } else { SwitchPreference( - key = "revanced_miniplayer_hide_expand_close", - titleKey = "revanced_miniplayer_hide_expand_close_legacy_title", - summaryOnKey = "revanced_miniplayer_hide_expand_close_legacy_summary_on", - summaryOffKey = "revanced_miniplayer_hide_expand_close_legacy_summary_off", + key = "revanced_miniplayer_hide_overlay_buttons", + titleKey = "revanced_miniplayer_hide_overlay_buttons_legacy_title", + summaryOnKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_on", + summaryOffKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_off", ) } @@ -365,7 +379,7 @@ val miniplayerPatch = bytecodePatch( if (is_19_23_or_greater) { miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DRAG_DROP_FEATURE_KEY, - "enableMiniplayerDragAndDrop", + "getMiniplayerDragAndDrop", ) } @@ -382,7 +396,7 @@ val miniplayerPatch = bytecodePatch( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DOUBLE_TAP_FEATURE_KEY, - "enableMiniplayerDoubleTapAction", + "getMiniplayerDoubleTapAction", ) } @@ -398,7 +412,7 @@ val miniplayerPatch = bytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setMiniplayerDefaultSize(I)I + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getMiniplayerDefaultSize(I)I move-result v$register """, ) @@ -421,7 +435,7 @@ val miniplayerPatch = bytecodePatch( if (is_19_36_or_greater) { miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY, - "setRoundedCorners", + "getRoundedCorners", ) } @@ -433,7 +447,7 @@ val miniplayerPatch = bytecodePatch( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, - "setHorizontalDrag", + "getHorizontalDrag", ) } @@ -473,6 +487,11 @@ val miniplayerPatch = bytecodePatch( modernMiniplayerClose, "hideMiniplayerExpandClose", ), + Triple( + miniplayerModernActionButtonFingerprint, + modernMiniPlayerOverlayActionButton, + "hideMiniplayerActionButton" + ), Triple( miniplayerModernRewindButtonFingerprint, modernMiniplayerRewindButton, @@ -490,12 +509,25 @@ val miniplayerPatch = bytecodePatch( ), ).forEach { (fingerprint, literalValue, methodName) -> fingerprint.match( - miniplayerModernViewParentFingerprint.classDef, - ).method.hookInflatedView( - literalValue, - "Landroid/widget/ImageView;", - "$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", - ) + miniplayerModernViewParentFingerprint.originalClassDef + ).method.apply { + val literalIndex = indexOfFirstLiteralInstructionOrThrow(literalValue) + val checkCastIndex = indexOfFirstInstruction(literalIndex) { + opcode == Opcode.CHECK_CAST && + getReference()?.type == "Landroid/widget/ImageView;" + } + val viewIndex = if (checkCastIndex >= 0) { + checkCastIndex + } else { + indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT) + } + val viewRegister = getInstruction(viewIndex).registerA + + addInstruction( + viewIndex + 1, + "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" + ) + } } miniplayerModernAddViewListenerFingerprint.match( @@ -510,33 +542,40 @@ val miniplayerPatch = bytecodePatch( // Modern 2 uses the same overlay controls as the regular video player, // and the overlay views are added at runtime. // Add a hook to the overlay class, and pass the added views to extension. + // Problem is fixed in 19.21+ // // NOTE: Modern 2 uses the same video UI as the regular player except resized to smaller. // This patch code could be used to hide other player overlays that do not use Litho. - playerOverlaysLayoutFingerprint.classDef.methods.add( - ImmutableMethod( - YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, - "addView", - listOf( - ImmutableMethodParameter("Landroid/view/View;", null, null), - ImmutableMethodParameter("I", null, null), - ImmutableMethodParameter("Landroid/view/ViewGroup\$LayoutParams;", null, null), - ), - "V", - AccessFlags.PUBLIC.value, - null, - null, - MutableMethodImplementation(4), - ).toMutable().apply { - addInstructions( - """ - invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V - invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V - return-void - """ - ) - } - ) + if (!is_19_17_or_greater) { + playerOverlaysLayoutFingerprint.classDef.methods.add( + ImmutableMethod( + YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, + "addView", + listOf( + ImmutableMethodParameter("Landroid/view/View;", null, null), + ImmutableMethodParameter("I", null, null), + ImmutableMethodParameter( + "Landroid/view/ViewGroup\$LayoutParams;", + null, + null + ), + ), + "V", + AccessFlags.PUBLIC.value, + null, + null, + MutableMethodImplementation(4), + ).toMutable().apply { + addInstructions( + """ + invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V + invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V + return-void + """ + ) + } + ) + } // endregion } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index 69cdf7f92..ec30f3593 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -25,9 +25,8 @@ val playerPopupPanelsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt index 6455f69b7..c2f3b5414 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt @@ -16,9 +16,8 @@ val playerControlsBackgroundPatch = resourcePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 415b970fd..30daf219b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -25,9 +25,8 @@ internal val exitFullscreenPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt index 7f117ca9b..a5ab54772 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt @@ -27,6 +27,7 @@ val openVideosFullscreenPatch = bytecodePatch( "com.google.android.youtube"( "19.46.42", "19.47.53", + "20.07.39", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index 98cb3eb00..1c1b5b87c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -56,9 +56,8 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 037f0875c..02d9aa46d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -12,6 +12,7 @@ import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.addSettingPreference import app.revanced.patches.youtube.misc.settings.newIntent @@ -56,9 +57,8 @@ val returnYouTubeDislikePatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) @@ -121,7 +121,7 @@ val returnYouTubeDislikePatch = bytecodePatch( val tempRegister: Int val charSequenceRegister: Int - if (is_19_33_or_greater) { + if (is_19_33_or_greater && !is_20_10_or_greater) { insertIndex = indexOfFirstInstructionOrThrow { (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) && getReference()?.returnType == textDataClassType diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 81b9bb3fa..6bb9aad78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -33,9 +33,8 @@ val wideSearchbarPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 4f7c8eaba..8ed9c4e44 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -37,12 +37,25 @@ internal val shortsSeekbarColorFingerprint = fingerprint { literal { reelTimeBarPlayedColorId } } -internal val playerSeekbarHandleColorFingerprint = fingerprint { +internal val playerSeekbarHandle1ColorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;") - literal { ytStaticBrandRedId } + custom { method, _ -> + method.containsLiteralInstruction(ytTextSecondaryId) && + method.containsLiteralInstruction(ytStaticBrandRedId) + } } +internal val playerSeekbarHandle2ColorFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters("Landroid/content/Context;") + custom { method, _ -> + method.containsLiteralInstruction(inlineTimeBarLiveSeekableRangeId) && + method.containsLiteralInstruction(ytStaticBrandRedId) + } +} + + internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index daf11528d..dbfacc7d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -53,6 +53,10 @@ internal var ytYoutubeMagentaColorId = -1L private set internal var ytStaticBrandRedId = -1L private set +internal var ytTextSecondaryId = -1L + private set +internal var inlineTimeBarLiveSeekableRangeId = -1L + private set internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" @@ -76,6 +80,18 @@ private val seekbarColorResourcePatch = resourcePatch { "color", "inline_time_bar_played_not_highlighted_color", ] + ytStaticBrandRedId = resourceMappings[ + "attr", + "ytStaticBrandRed" + ] + ytTextSecondaryId = resourceMappings[ + "attr", + "ytTextSecondary" + ] + inlineTimeBarLiveSeekableRangeId = resourceMappings[ + "color", + "inline_time_bar_live_seekable_range" + ] // Modify the resume playback drawable and replace the progress bar with a custom drawable. document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> @@ -211,7 +227,7 @@ val seekbarColorPatch = bytecodePatch( ) execute { - fun MutableMethod.addColorChangeInstructions(resourceId: Long, methodName: String) { + fun MutableMethod.addColorChangeInstructions(resourceId: Long) { val index = indexOfFirstLiteralInstructionOrThrow(resourceId) val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT) val register = getInstruction(insertIndex).registerA @@ -219,19 +235,19 @@ val seekbarColorPatch = bytecodePatch( addInstructions( insertIndex + 1, """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(I)I + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I move-result v$register """ ) } playerSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId, "getVideoPlayerSeekbarColor") - addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId, "getVideoPlayerSeekbarColor") + addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId) + addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId) } shortsSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(reelTimeBarPlayedColorId, "getVideoPlayerSeekbarColor") + addColorChangeInstructions(reelTimeBarPlayedColorId) } setSeekbarClickedColorFingerprint.originalMethod.let { @@ -257,8 +273,11 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - playerSeekbarHandleColorFingerprint.method.apply { - addColorChangeInstructions(ytStaticBrandRedId, "getVideoPlayerSeekbarColor") + arrayOf( + playerSeekbarHandle1ColorFingerprint, + playerSeekbarHandle2ColorFingerprint + ).forEach { + it.method.addColorChangeInstructions(ytStaticBrandRedId) } // If hiding feed seekbar thumbnails, then turn off the cairo gradient diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt index 63f598576..40a2c59d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt @@ -37,9 +37,8 @@ val shortsAutoplayPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 8ef858590..bf17b3792 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -45,9 +45,8 @@ val openShortsInRegularPlayerPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 3c9571f47..5e33ebd2d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -110,9 +110,8 @@ val sponsorBlockPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index 66f15c0c3..9268ed086 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -62,9 +62,8 @@ val spoofAppVersionPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index d788aad60..54106b5fc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -33,9 +33,8 @@ val changeStartPagePatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 60ba9483e..3d5d73639 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -1,18 +1,22 @@ package app.revanced.patches.youtube.layout.startupshortsreset import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -38,6 +42,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( "19.45.38", "19.46.42", "19.47.53", + "20.07.39", ), ) @@ -48,25 +53,51 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( SwitchPreference("revanced_disable_resuming_shorts_player"), ) - userWasInShortsFingerprint.method.apply { - val listenableInstructionIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_INTERFACE && - getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && - getReference()?.name == "isDone" - } - val freeRegister = getInstruction(listenableInstructionIndex + 1).registerA + if (is_20_02_or_greater) { + userWasInShortsAlternativeFingerprint.let { + it.method.apply { + val stringIndex = it.stringMatches!!.first().index + val booleanValueIndex = indexOfFirstInstructionReversedOrThrow(stringIndex) { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "booleanValue" + } + val booleanValueRegister = + getInstruction(booleanValueIndex + 1).registerA - addInstructionsAtControlFlowLabel( - listenableInstructionIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z - move-result v$freeRegister - if-eqz v$freeRegister, :show_startup_shorts_player - return-void - :show_startup_shorts_player - nop - """, - ) + addInstructions( + booleanValueIndex + 2, """ + invoke-static {v$booleanValueRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z + move-result v$booleanValueRegister + """ + ) + } + } + } else { + userWasInShortsLegacyFingerprint.method.apply { + val listenableInstructionIndex = indexOfFirstInstructionOrThrow { + val reference = getReference() + opcode == Opcode.INVOKE_INTERFACE && + reference?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && + reference.name == "isDone" + } + val originalInstructionRegister = + getInstruction(listenableInstructionIndex).registerC + val freeRegister = + getInstruction(listenableInstructionIndex + 1).registerA + + addInstructionsWithLabels( + listenableInstructionIndex + 1, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z + move-result v$freeRegister + if-eqz v$freeRegister, :show + return-void + :show + invoke-interface {v$originalInstructionRegister}, Lcom/google/common/util/concurrent/ListenableFuture;->isDone()Z + """ + ) + removeInstruction(listenableInstructionIndex) + } } userWasInShortsConfigFingerprint.method.addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 1ae9ce7fe..b1fab6fcb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -4,7 +4,17 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val userWasInShortsFingerprint = fingerprint { +/** + * YouTube 20.02.08 ~ + */ +internal val userWasInShortsAlternativeFingerprint = fingerprint { + returns("V") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters("Ljava/lang/Object;") + strings("userIsInShorts: ") +} + +internal val userWasInShortsLegacyFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index 30960ca52..77bba81ed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -221,9 +221,8 @@ val themePatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 1fa6868b3..f86e19f38 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -37,9 +37,8 @@ val alternativeThumbnailsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt index 9ce2382e1..f353b7811 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt @@ -31,9 +31,8 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index ad35f26d1..d3ff7c1cd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -27,9 +27,8 @@ val announcementsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt index 04aa54085..e29154e63 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt @@ -28,9 +28,8 @@ val autoRepeatPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt index a817b68da..646a47a7d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -52,9 +52,8 @@ val backgroundPlaybackPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index 148c49c33..b244f0dc9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -38,9 +38,8 @@ val enableDebuggingPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 38a517010..2f9a2602b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -28,9 +28,8 @@ val spoofDeviceDimensionsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index 81b946e51..558d67674 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -25,9 +25,8 @@ val checkWatchHistoryDomainNameResolutionPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index e9dc66521..e80e804db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -39,9 +39,8 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 53e761564..2172d75b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -13,9 +13,11 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.reference.TypeReference val bypassURLRedirectsPatch = bytecodePatch( name = "Bypass URL redirects", @@ -37,6 +39,7 @@ val bypassURLRedirectsPatch = bytecodePatch( "19.45.38", "19.46.42", "19.47.53", + "20.07.39", ), ) @@ -80,3 +83,8 @@ internal fun Method.findUriParseIndex() = indexOfFirstInstruction { val reference = getReference() reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse" } + +internal fun Method.findWebViewCheckCastIndex() = indexOfFirstInstruction { + val reference = getReference() + opcode == Opcode.CHECK_CAST && reference?.type?.endsWith("/WebviewEndpointOuterClass${'$'}WebviewEndpoint;") == true +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 73f6fae75..6f231693b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -11,12 +11,21 @@ internal val abUriParserFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Object") parameters("Ljava/lang/Object") - strings( - "Found entityKey=`", - "` that does not contain a PlaylistVideoEntityId message as it's identifier.", - ) custom { method, _ -> - method.findUriParseIndex() >= 0 + method.findUriParseIndex() >= 0 && method.findWebViewCheckCastIndex() >= 0 + } +} + +/** + * Target 19.33+ + */ +internal val httpUriParserFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returns("Landroid/net/Uri") + parameters("Ljava/lang/String") + strings("https", "://", "https:") + custom { methodDef, _ -> + methodDef.findUriParseIndex() >= 0 } } @@ -47,19 +56,6 @@ internal val abUriParserLegacyFingerprint = fingerprint { } } -/** - * Target 19.33+ - */ -internal val httpUriParserFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - strings("https", "https:", "://") - custom { methodDef, _ -> - methodDef.findUriParseIndex() >= 0 - } -} - internal val httpUriParserLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 7acddae54..7d3cc99f4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -45,9 +45,8 @@ val openLinksExternallyPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index ac158ee12..89db01f0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -10,7 +10,11 @@ import com.android.tools.smali.dexlib2.Opcode * In 19.18+ this resolves to a different method. */ internal val componentContextParserFingerprint = fingerprint { - strings("Component was not found %s because it was removed due to duplicate converter bindings.") + strings( + "TreeNode result must be set.", + // String is a partial match and changed slightly in 20.03+ + "it was removed due to duplicate converter bindings." + ) } internal val lithoFilterFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index d40ab3aa4..b586bf2e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -14,6 +14,7 @@ import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_18_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_05_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -235,7 +236,10 @@ val lithoFilterPatch = bytecodePatch( // Turn off native code that handles litho component names. If this feature is on then nearly // all litho components have a null name and identifier/path filtering is completely broken. - if (is_19_25_or_greater) { + // + // Flag was removed in 20.05. It appears a new flag might be used instead (45660109L), + // but if the flag is forced on then litho filtering still works correctly. + if (is_19_25_or_greater && !is_20_05_or_greater) { lithoComponentNameUpbFeatureFlagFingerprint.method.apply { // Don't use return early, so the debug patch logs if this was originally on. val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index bb1e3558e..2d76094af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -46,6 +46,18 @@ var is_19_47_or_greater = false private set var is_19_49_or_greater = false private set +var is_20_02_or_greater = false + private set +var is_20_03_or_greater = false + private set +var is_20_05_or_greater = false + private set +var is_20_07_or_greater = false + private set +var is_20_09_or_greater = false + private set +var is_20_10_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -80,5 +92,11 @@ val versionCheckPatch = resourcePatch( is_19_46_or_greater = 244705000 <= playStoreServicesVersion is_19_47_or_greater = 244799000 <= playStoreServicesVersion is_19_49_or_greater = 245005000 <= playStoreServicesVersion + is_20_02_or_greater = 250299000 <= playStoreServicesVersion + is_20_03_or_greater = 250405000 <= playStoreServicesVersion + is_20_05_or_greater = 250605000 <= playStoreServicesVersion + is_20_07_or_greater = 250805000 <= playStoreServicesVersion + is_20_09_or_greater = 251006000 <= playStoreServicesVersion + is_20_10_or_greater = 251105000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 32c53ae4d..95897a8ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -34,9 +34,8 @@ val removeTrackingQueryParameterPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index 28a913c38..27ccc881d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -7,6 +7,8 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_03_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -18,9 +20,8 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({ "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) @@ -31,6 +32,10 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({ ) }, { is_19_34_or_greater +}, { + is_20_10_or_greater +}, { + is_20_03_or_greater }, { addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt index cbf524865..23d9ced21 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt @@ -25,9 +25,8 @@ val zoomHapticsPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index 32bfeadd6..dcb83a963 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -45,9 +45,8 @@ val forceOriginalAudioPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt index c9f4383f0..76f996738 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt @@ -32,9 +32,8 @@ val disableHdrPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index 603329de7..562156fad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -2,11 +2,65 @@ package app.revanced.patches.youtube.video.playerresponse import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags +import org.stringtemplate.v4.compiler.Bytecode.instructions /** - * For targets 19.25 and later. + * For targets 20.10 and later. */ internal val playerParameterBuilderFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("L") + parameters( + "Ljava/lang/String;", // VideoId. + "[B", + "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", + "I", + "Z", + "I", + "L", + "Ljava/util/Set;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L", + "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", + "Z", + "Z" + ) + strings("psps") +} + +/** + * For targets 20.02 to 20.09. + */ +internal val playerParameterBuilder2002Fingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("L") + parameters( + "Ljava/lang/String;", // VideoId. + "[B", + "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", + "I", + "I", + "L", // 19.25+ parameter + "Ljava/util/Set;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L", + "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", + "Z", + "Z", + ) + strings("psps") +} + +/** + * For targets 19.25 to 19.50. + */ +internal val playerParameterBuilder1925Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt index b990d74af..4b02324bc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt @@ -1,11 +1,14 @@ package app.revanced.patches.youtube.video.playerresponse +import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch private val hooks = mutableSetOf() @@ -35,15 +38,21 @@ val playerResponseMethodHookPatch = bytecodePatch { ) execute { - playerResponseMethod = if (is_19_23_or_greater) { + val fingerprint : Fingerprint + if (is_20_10_or_greater) { + parameterIsShortAndOpeningOrPlaying = 13 + fingerprint = playerParameterBuilderFingerprint + } else if (is_20_02_or_greater) { parameterIsShortAndOpeningOrPlaying = 12 - - playerParameterBuilderFingerprint + fingerprint = playerParameterBuilder2002Fingerprint + } else if (is_19_23_or_greater) { + parameterIsShortAndOpeningOrPlaying = 12 + fingerprint = playerParameterBuilder1925Fingerprint } else { parameterIsShortAndOpeningOrPlaying = 11 - - playerParameterBuilderLegacyFingerprint - }.method + fingerprint = playerParameterBuilderLegacyFingerprint + } + playerResponseMethod = fingerprint.method // On some app targets the method has too many registers pushing the parameters past v15. // If needed, move the parameters to 4-bit registers, so they can be passed to the extension. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index a01cf6f56..bf696a7ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -27,9 +27,8 @@ val videoQualityPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index ef83ccb64..d86cf49d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -32,9 +32,8 @@ val playbackSpeedPatch = bytecodePatch( "19.25.37", "19.34.42", "19.43.41", - "19.45.38", - "19.46.42", "19.47.53", + "20.07.39", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index d3aa805d8..7d4b23ba4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -22,14 +22,6 @@ internal val speedArrayGeneratorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("[L") parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") - opcodes( - Opcode.IF_NEZ, - Opcode.SGET_OBJECT, - Opcode.GOTO_16, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_OBJECT, - ) strings("0.0#") } diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index ea37c1072..7e27d1a07 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -1155,6 +1155,7 @@ Second \"item\" text" حديث 1 حديث 2 حديث 3 + الوضع الحديث 4 تمكين الزوايا المستديرة الزوايا مستديرة الزوايا مربعة @@ -1174,14 +1175,14 @@ Second \"item\" text" يمكن سحب المشغل المصغر خارج الشاشة إلى اليسار أو اليمين" تم تعطيل إيماءة السحب الأفقية - إخفاء زر الإغلاق - تم إخفاء زر الإغلاق - يتم عرض زر الإغلاق - إخفاء أزرار التوسيع والإغلاق - "تم إخفاء الأزرار + إخفاء أزرار التراكب + أزرار التراكب مخفية + أزرار التراكب ظاهرة + إخفاء زري التوسيع والإغلاق + "الأزرار مخفية -مرر للتوسيع أو الإغلاق" - يتم عرض أزرار التوسيع والإغلاق +اسحب للتوسيع أو الإغلاق" + زرا التوسيع والإغلاق ظاهران إخفاء النصوص الفرعية تم إخفاء النصوص الفرعية يتم عرض النصوص الفرعية diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index 8e280cde3..2aeee9144 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -1159,14 +1159,6 @@ Kiçik oynadıcı ekranın istənilən küncünə sürüklənə bilər" Kiçik oynadıcı ekrandan sola və ya sağa sürüklənə bilər" Üfüqi sürükləmə jesti qapatıldı - \"Bağla\" düyməsini gizlət - \"Bağla\" düyməsi gizlidir - \"Bağla\" düyməsi göstərilir - Genişləndir və bağla düymələrini gizlət - "Düymələr gizlidir - -Genişləndirmək və ya bağlamaq üçün sürüşdür" - Genişləndir və bağla düymələri göstərilir Alt mətnləri gizlət Alt mətnlər gizlədilir Alt mətnlər göstərilir diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index f153c2b72..85f0645fb 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -1156,6 +1156,7 @@ Second \"item\" text" Сучасны 1 Сучасны 2 Сучасны 3 + Сучасны 4 Включить закругленные углы Углы закруглены Углы квадратные @@ -1175,14 +1176,14 @@ Second \"item\" text" Міні-прайгравальнік можна перацягнуць за межы экрана ўлева ці ўправа" Горизонтальный жест перетаскивания отключен - Скрыть кнопку закрытия - Кнопка закрытия скрыта - Кнопка закрытия отображается - Схаваць кнопкі разгортвання і закрыцця - "Кнопкі схаваны + Схаваць кнопкі накладання + Кнопкі накладання схаваныя + Кнопкі накладання паказаны + Схаваць кнопкі разгортвання і закрыцця + "Кнопкі схаваныя -Працягвайце пальцам, каб разгарнуць або закрыць" - Паказваюцца кнопкі разгарнуць і закрыць +Правядзіце пальцам, каб разгарнуць ці закрыць" + Кнопкі разгортвання і закрыцця паказаны Схаваць падтэксты Падтэксты схаваныя Паказваюцца падтэксты diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index c47424de4..ef2e19571 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -1155,6 +1155,7 @@ Second \"item\" text" Модерен 1 Модерен 2 Модерен 3 + Модерен 4 Активирайте заоблени ъгли Ъглите са заоблени Ъглите са нормални @@ -1174,14 +1175,14 @@ Second \"item\" text" Мини плейърът може да бъде плъзган извън екрана наляво или надясно" Жестът за хоризонтално плъзгане е деактивиран - Скриване на бутона за затваряне - Бутонът за затваряне е скрит - Показан е бутон за затваряне - Бутони за разширяване и свиване на екрана - "Бутоните са скрити + Скриване на бутоните за наслагване + Бутоните за наслагване са скрити + Бутоните за наслагване са показани + Скриване на бутоните за разгъване и затваряне + "Бутоните са скрити Плъзнете, за да разгънете или затворите" - Бутони за разширяване и свиване на екрана са видими + Бутоните за разгъване и затваряне са показани Екранни текстове, етикети Скрити Показват се diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index cb0f3d4f0..7441d9f9e 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -1155,6 +1155,7 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন মর্ডান ১ মর্ডান ২ মর্ডান ৩ + আধুনিক ৪ গোলাকার কোণ সক্ষম করুন কোণগুলি গোলাকার কোণগুলি বর্গাকার @@ -1174,14 +1175,14 @@ Miniplayer স্ক্রিনের যেকোনো কোণে টান Miniplayer স্ক্রিন থেকে বামে বা ডানে টানা যাবে" অনুভূমিক ড্র্যাগ অঙ্গভঙ্গি অক্ষম - বন্ধ বোতাম লুকান - বন্ধ বোতাম লুকানো আছে - বন্ধ বোতাম দেখানো হচ্ছে - বিস্তৃত ও বন্ধ করার বোতাম লুকান - "বোতামগুলি লুকানো হয় + ওভারলে বোতাম লুকান + ওভারলে বোতাম লুকানো আছে + ওভারলে বোতাম দেখানো হয়েছে + বিস্তৃত এবং বন্ধ বোতাম লুকান + "বোতাম লুকানো আছে -বিস্তৃত করতে বা বন্ধ করতে সোয়াইপ করুন" - বিস্তৃত এবং বন্ধ বোতাম দেখানো হচ্ছে +বিস্তৃত করতে বা বন্ধ করতে সোয়াইপ করুন" + বিস্তৃত এবং বন্ধ করার বোতাম দেখানো হয়েছে উপপাঠ লুকান উপপাঠ লুকিয়ে রয়েছে উপপাঠ প্রদর্শিত হয়েছে diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index 1bff9b43e..7ec2d035b 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -1154,6 +1154,7 @@ Si després es desactiva, es recomana esborrar les dades de l'aplicació per evi Modern 1 Modern 2 Modern 3 + Modern 4 Habilita cantonades arrodonides Les cantonades són arrodonides Les cantonades són quadrades @@ -1173,14 +1174,14 @@ El minireproductor es pot arrossegar a qualsevol racó de la pantalla" El minireproductor es pot arrossegar fora de la pantalla cap a l'esquerra o la dreta" Gest d\'arrossegar horitzontalment deshabilitat - Amaga el botó de tancament - El botó de tancament està amagat - El botó de tancament es mostra - Amaga els botons d\'expansió i tancament - "Els botons estan ocults + Amaga els botons de superposició + Els botons de superposició estan amagats + Es mostren els botons de superposició + Amaga els botons per expandir i tancar + "S'han amagat els botons -Desliza para ampliar o cerrar" - Els botons d\'expansió i tancament es mostren +Llisca per expandir o tancar" + Es mostren els botons per expandir i tancar Amaga els subtítols Els subtítols estan amagats Els subtítols es mostren diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index 42f95bb78..8d1ed3833 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -1154,6 +1154,7 @@ Pokud bude později vypnuta, doporučujeme vymazat data aplikace, aby se zabrán Moderní 1 Moderní 2 Moderní 3 + Moderní 4 Povolit zaoblené rohy Rohy jsou zaoblené Rohy jsou čtvercové @@ -1173,14 +1174,14 @@ Pokud bude později vypnuta, doporučujeme vymazat data aplikace, aby se zabrán \"Miniplayer\" lze přetáhnout z obrazovky doleva nebo doprava" Horizontální posun je zakázán - Skrýt tlačítko zavření - Tlačítko zavření je skryto - Tlačítko zavření je zobrazeno - Skrýt tlačítka pro rozbalení a zavření - "Tlačítka jsou skryta + Skrýt tlačítka překrytí + Tlačítka překrytí jsou skrytá + Tlačítka překrytí jsou zobrazena + Skrýt tlačítka rozbalení a zavření + "Tlačítka jsou skrytá -Přejeďte prstem pro rozbalení nebo zavření" - Tlačítka pro rozbalení a zavření jsou zobrazena +Rozbalte nebo zavřete přejetím prstem" + Tlačítka rozbalení a zavření jsou zobrazena Skrýt podtexty Podtexty jsou skryty Podtexty jsou zobrazeny diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index 49109b30c..970685280 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -1100,6 +1100,7 @@ Hvis det senere slås fra, anbefales det at rydde app-dataene for at forhindre U Moderne 1 Moderne 2 Moderne 3 + Moderne 4 Aktiver afrundede hjørner Hjørner er afrundede Hjørner er firkantede @@ -1119,14 +1120,14 @@ Miniafspiller kan trækkes til et hvilket som helst hjørne af skærmen" Vandret trækbevægelse deaktiveret - Skjul lukkeknap - Luk knappen er skjult - Luk knappen vises - Skjul udvid og luk knapper - "Knapper er skjult + Skjul overlay-knapper + Overlay-knapper er skjult + Overlay-knapper vises + Skjul udvid- og luk-knapper + "Knapper er skjult Stryg for at udvide eller lukke" - Udvid og luk knapper vises + Udvid- og luk-knapper vises Skjul undertekster Undertekster er skjult Undertekster er vist diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index d46eca858..9382d2484 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -1148,6 +1148,7 @@ Wenn Sie die Funktion später deaktivieren, wird empfohlen, die App-Daten zu lö Modern 1 Modern 2 Modern 3 + Modern 4 Abgerundete Ecken aktivieren Ecken sind abgerundet Ecken sind Quadrat @@ -1167,14 +1168,14 @@ Der Mini-Player kann in jede Ecke des Bildschirms gezogen werden" Der Mini-Player kann mit einer Wischgeste vom Bildschirm nach links oder rechts gezogen werden" Horizontale Drag Geste deaktiviert - Schließen-Button ausblenden - Schließen-Button ist ausgeblendet - Schließen-Schaltfläche wird angezeigt - Ausklappen und Schließen der Tasten ausblenden - "Schaltflächen sind ausgeblendet + Overlay-Buttons ausblenden + Overlay-Buttons sind ausgeblendet + Overlay-Buttons werden angezeigt + Schaltflächen zum Erweitern und Schließen ausblenden + "Schaltflächen sind ausgeblendet -Wischen Sie, um zu erweitern oder zu schließen" - Erweitern und Schließen Tasten werden angezeigt +Zum Erweitern oder Schließen wischen" + Schaltflächen zum Erweitern und Schließen werden angezeigt Untertexte ausblenden Subtexte sind ausgeblendet Untertexte werden angezeigt diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index 6ec4bb5d4..bc343772b 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -1156,6 +1156,7 @@ Second \"item\" text" Μοντέρνος 1 Μοντέρνος 2 Μοντέρνος 3 + Μοντέρνος 4 Στρογγυλεμένες γωνίες Οι γωνίες είναι στρογγυλεμένες Οι γωνίες είναι τετράγωνες @@ -1175,14 +1176,14 @@ Second \"item\" text" Η ελαχιστοποιημένη οθόνη μπορεί να συρθεί εκτός οθόνης προς τα αριστερά ή δεξιά" Η χειρονομία οριζόντιας σύρσης είναι απενεργοποιημένη - Κουμπί κλεισίματος - Κρυμμένο - Εμφανίζεται - Κουμπιά επέκτασης και κλεισίματος - "Κρυμμένα + Κουμπιά επικάλυψης οθόνης αναπαραγωγής + Κρυμμένα + Εμφανίζονται + Κουμπιά επέκτασης και κλεισίματος + "Τα κουμπιά δεν εμφανίζονται -Σύρετε την ελαχιστοποιημένη οθόνη αναπαραγωγής για επέκταση ή κλείσιμο του βίντεο" - Εμφανίζονται +Σύρετε για να αναπτύξετε ή να κλείσετε" + Τα κουμπιά εμφανίζονται Κείμενα οθόνης αναπαραγωγής Κρυμμένα Εμφανίζονται diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index 13d358881..3c6fd9195 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -1143,6 +1143,7 @@ Si se desactiva posteriormente, se recomienda borrar los datos de la aplicación Moderna 1 Moderna 2 Moderna 3 + Moderno 4 Habilitar esquinas redondeadas Las esquinas están redondeadas Las esquinas son cuadradas @@ -1162,14 +1163,14 @@ El minireproductor se puede arrastrar a cualquier esquina de la pantalla" Gesto de arrastre horizontal desactivado - Ocultar botón de cerrar - El botón de cierre está oculto - Se muestra el botón de cerrar - Ocultar botones de expansión y cierre - "Los botones están ocultos + Ocultar botones de superposición + Los botones de superposición están ocultos + Se muestran los botones de superposición + Ocultar botones de expandir y cerrar + "Los botones están ocultos -Desliza para expandir o cerrar" - Mostrar los botones de ampliación y cierre +Desliza el dedo para expandir o cerrar" + Se muestran los botones de expandir y cerrar Ocultar subtextos Los subtextos están ocultos Los subtextos se muestran diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index f22b7f7cf..cd076e3db 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -1155,6 +1155,7 @@ Kui see hiljem välja lülitatakse, on soovitatav rakenduse andmed kustutada, et Kaasaegne 1 Kaasaegne 2 Kaasaegne 3 + Moodne 4 Lülita ümarate nurkade režiim sisse Nurgad on ümarad Nurgad on ruudukujulised @@ -1174,14 +1175,14 @@ Minimaalset mängijat saab lohistada ekraani mis tahes nurka" Minimaalset mängijat saab lohistada ekraanilt vasakule või paremale" Horisontaalse lohistamise žest on keelatud - Peida sulgemisnupp - Sulgemisnupp on peidetud - Sulgemisnupp on nähtav - Peida laiendamis- ja sulgemisnupud - "Nupud on peidetud + Peida ülekatteliidese nupud + Ülekatteliidese nupud on peidetud + Ülekatteliidese nupud on nähtaval + Peida laiendus- ja sulgemisnupud + "Nupud on peidetud -Pühkige laiendamiseks või sulgemiseks" - Laiendamis- ja sulgemisnupud on nähtavad +Laiendamiseks või sulgemiseks libista" + Laiendus- ja sulgemisnupud on nähtaval Peida alatähed Alatähed on peidetud Alatähed on nähtavad diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index 25b698101..27289064e 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -1141,6 +1141,7 @@ Jos tämä poistetaan myöhemmin käytöstä, on suositeltavaa tyhjentää sovel Moderni 1 Moderni 2 Moderni 3 + Moderni 4 Ota pyöristetyt kulmat käyttöön Kulmat on pyöristetty Kulmat ovat suorakulmaisia @@ -1160,14 +1161,11 @@ Minisoitin voidaan vetää mihin tahansa näytön kulmaan" Minisoitin voidaan vetää pois näytöltä vasemmalle tai oikealle" Vaakasuuntainen vetoele ei ole käytössä - Piilota sulje-painike - Sulje-painike on piilotettu - Sulje-painike näytetään - Piilota laajenna- ja sulje-painikkeet - "Painikkeet piilotetaan + Piilota laajenna- ja sulje-painikkeet + "Painikkeet piilotetaan Pyyhkäise laajentaaksesi tai sulkeaksesi" - Laajenna- ja sulje-painikkeet näytetään + Laajenna- ja sulje-painikkeet näytetään Piilota alatekstit Alatekstit on piilotettu Alatekstit näytetään diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index 3842e4c83..ecdb5326a 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -1153,6 +1153,7 @@ Kung mamaya ay patayin, inirerekumenda na i-clear ang data ng app upang maiwasan Moderno 1 Moderno 2 Moderno 3 + Makabagong 4 Paganahin ang mga bilugan na sulok Bilugan ang mga sulok Parihaba ang mga sulok @@ -1172,14 +1173,14 @@ Ang \"miniplayer\" ay maaaring i-drag sa anumang sulok ng screen" Ang \"miniplayer\" ay maaaring i-drag palabas ng screen sa kaliwa o kanan" Hindi pinagana ang pahalang na drag gesture - Itago ang pindutan ng pagsara - Nakatago ang pindutan ng pagsara - Ipinapakita ang pindutan ng pagsara - Itago ang mga button na palawakin at isara - "Ang mga pindutan ay nakatago + Itago ang mga button ng overlay + Nakatago ang mga button ng overlay + Ipinapakita ang mga button ng overlay + Itago ang mga button para palawakin at isara + "Nakatago ang mga button -Mag-swipe upang palawakin o isara" - Ang mga pindutan ng palawakin at isara ay ipinapakita +Mag-swipe para palawakin o isara" + Ipinapakita ang mga button para palawakin at isara Itago ang mga subtext Nakatago ang mga subtext Ipinapakita ang mga subtext diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index 773c3b856..82689ba73 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -1154,6 +1154,7 @@ Si désactivé ultérieurement, il est recommandé d'effacer les données de l'a Moderne 1 Moderne 2 Moderne 3 + Moderne 4 Activer les coins arrondis Les coins sont arrondis Les coins sont carrés @@ -1173,14 +1174,14 @@ Le lecteur réduit peut être déplacé vers n'importe quel coin de l'écran" Geste de déplacement horizontal désactivé - Masquer le bouton de fermeture - Le bouton de fermeture est masqué - Le bouton de fermeture est affiché - Masquer les boutons Agrandir et Fermer - "Les boutons sont masqués + Masquer les boutons de superposition + Les boutons de superposition sont masqués + Les boutons de superposition sont affichés + Masquer les boutons Agrandir et Fermer + "Les boutons sont masqués Balayez pour développer ou fermer" - Les boutons Agrandir et Fermer sont affichés + Les boutons Agrandir et Fermer sont affichés Masquer les sous-textes Les sous-textes sont masqués Les sous-textes sont affichés diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index 35b205ad1..1c2cf502e 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -1155,6 +1155,7 @@ Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buga Nua-aimseartha 1 Nua-Aimseartha 2 Nua-aimseartha 3 + Nua-aimseartha 4 Cumasaigh coirnéil chothromú Déantar coirnéil a shlánú Tá coirnéil cearnach @@ -1174,14 +1175,14 @@ Is féidir an mhion-imreoir a tharraingt go haon chúinne den scáileán" Díchumasaíodh an comhartha tarraingthe cothrománach - Folaigh cnaipe dúnta - Tá an cnaipe dúnta i bhfolach - Taispeántar an cnaipe dúnta - Folaigh cnaipí leathnú agus dún - "Tá cnaipí i bhfolach + Folaigh cnaipí forleathana + Tá cnaipí forleathana i bhfolach + Taispeántar cnaipí forleathana + Folaigh cnaipí leathnaithe agus dún + "Tá cnaipí i bhfolach -Swipe chun leathnú nó dúnadh" - Taispeántar cnaipí leathnaigh agus dún +Svaidhpeáil chun leathnú nó dúnadh" + Taispeántar cnaipí leathnaithe agus dún Folaigh fothéacsanna Tá fothéacsanna i bhfolach Taispeántar fothéacsanna diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 3b0685c87..f5b24ff4c 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -1154,6 +1154,7 @@ Ha később kikapcsolja, akkor ajánlott az alkalmazás adatait törölni, hogy Modern 1 Modern 2 Modern 3 + Modern 4 Lekerekített sarkok engedélyezése A sarkok lekerekítettek A sarkok négyzet alakúak @@ -1173,14 +1174,14 @@ A miniatűr képernyőt a képernyő bármely sarkába húzhatja" A miniatűr képernyőt a képernyő bal vagy jobb szélére húzhatja" A vízszintes húzómozdulat letiltva - Bezárás gomb elrejtése - A Bezárás gomb el van rejtve - A Bezárás gomb látható - Kibontás és bezárás gombok elrejtése - "A gombok el vannak rejtve + Fedőgomb elrejtése + A fedőgombok rejtve vannak + A fedőgombok láthatók + A kibontás és bezárás gombok elrejtése + "A gombok el vannak rejtve Húzza el a képernyőt a kibontáshoz vagy bezáráshoz" - A Kibontás és Bezárás gombok láthatók + A Kibontás és Bezárás gombok láthatók Alszövegek elrejtése Az alfeliratok el vannak rejtve Az alfeliratok meg vannak jelenítve diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index ab23012ca..b6331f7fa 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -1155,6 +1155,7 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ Ժամանակակից 1 Ժամանակակից 2 Ժամանակակից 3 + Ժամանակակից 4 Աктиվացնել կլորացված անկյունները Անկյունները կլորացված են Անկյունները քառակուսի են @@ -1174,14 +1175,14 @@ Mini-player-ը կարող է գրավվել էկրանի ցանկացած անկ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի ձախ կամ աջ։" Հորիզոնական քարշելու ժեստը անջատված է - Թաքցնել փակման կոճակը - Փակման կոճակը թաքցված է - Փակման կոճակը ցուցադրվում է - Թաքցնել ընդլայնման և փակման կոճակները - "Կոճակները թաքցվում են + Թաքցնել վերադիր կոճակները + Վերադիր կոճակները թաքցված են + Վերադիր կոճակները ցուցադրվում են + Թաքցնել ընդարձակման և փակման կոճակները + "Կոճակները թաքցված են -Գրավել՝ մեծացնելու կամ փակելու համար։" - Ընդլայնման և փակման կոճակները ցուցադրվում են +Սահեցրեք՝ ընդարձակելու կամ փակելու համար" + Ընդարձակման և փակման կոճակները ցուցադրվում են Թաքցնել ենթատեքստերը Ենթատեքստերը թաքցված են Ենթատեքստերը ցուցադրվում են diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 6717286b1..29c8e3b53 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -1154,6 +1154,7 @@ Jika kemudian dimatikan, disarankan untuk menghapus data aplikasi untuk mencegah Modern 1 Modern 2 Modern 3 + Modern 4 Aktifkan sudut membulat Sudutnya membulat Sudutnya persegi @@ -1173,14 +1174,14 @@ Miniplayer dapat diseret ke sudut layar mana pun" Miniplayer dapat diseret keluar layar ke kiri atau kanan" Gerakan seret horizontal dinonaktifkan - Sembunyikan tombol tutup - Tombol tutup disembunyikan - Tombol tutup ditampilkan - Sembunyikan perbesar dan tutup - "Tombol disembunyikan + Sembunyikan tombol overlay + Tombol overlay disembunyikan + Tombol overlay ditampilkan + Sembunyikan tombol perluas dan tutup + "Tombol disembunyikan -Usap untuk memperluas atau menutup" - Tombol bentang dan tutup ditampilkan +Geser untuk memperluas atau menutup" + Tombol perluas dan tutup ditampilkan Sembunyikan subteks Subteks disembunyikan Subteks ditampilkan diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index eda9392bb..97e1870f9 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -1154,6 +1154,7 @@ Se in seguito verrà disattivato, si consiglia di cancellare i dati dell'app per Moderno 1 Moderno 2 Moderno 3 + Moderno 4 Abilita angoli arrotondati Gli angoli sono arrotondati Gli angoli sono quadrati @@ -1173,14 +1174,14 @@ Il riproduttore minimizzato può essere trascinato in qualsiasi angolo dello sch Il riproduttore minimizzato può essere trascinato fuori dallo schermo a sinistra o a destra" Gesto di trascinamento orizzontale disabilitato - Nascondi pulsante di chiusura - Il pulsante di chiusura è nascosto - Il pulsante Chiudi è visibile - Nascondi i pulsanti Espandi e Chiudi - "I pulsanti sono nascosti + Nascondi i pulsanti di overlay + I pulsanti di overlay sono nascosti + I pulsanti di overlay sono visualizzati + Nascondi i pulsanti di espansione e chiusura + "I pulsanti sono nascosti -Scorrere per espandere o chiudere" - I pulsanti Espandi e chiudi sono visibili +Scorri per espandere o chiudere" + I pulsanti Espandi e chiudi sono visibili Nascondi sottotitoli I sottotitoli sono nascosti I sottotitoli sono visibili diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index b953c4c74..5282a73e4 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -1141,6 +1141,7 @@ Second \"item\" text" מודרני 1 מודרני 2 מודרני 3 + מודרני 4 הפעל פינות מעוגלות הפינות מעוגלות הפינות מרובעות @@ -1160,14 +1161,11 @@ Second \"item\" text" מיני-נגן ניתן לגרירה מחוץ למסך לשמאל או לימין" מחוות גרירה אופקית מושבתת - הסתר לחצן סגירה - לחצן סגירה מוסתר - לחצן סגירה מוצג - הסתר לחצני סגירה והרחבה - "הלחצנים מוסתרים + הסתר לחצני סגירה והרחבה + "הלחצנים מוסתרים החלק כדי להרחיב או לסגור" - לחצני הרחבה וסגירה מוצגים + לחצני הרחבה וסגירה מוצגים הסתר תת-טקסטים תת-טקסטים מוסתרים תת-טקסטים מוצגים diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index b612222ab..e3a0b0d9f 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -1156,6 +1156,7 @@ Automotive レイアウト モダン 1 モダン 2 モダン 3 + モダン 4 角を丸くする ミニプレーヤーの四角は丸角です ミニプレーヤーの四角は直角です @@ -1175,14 +1176,14 @@ Automotive レイアウト ミニプレーヤーを画面の左または右端で最小化できます" 横方向ドラッグ ジェスチャーは無効です - 閉じるボタンを非表示 - 閉じるボタンは表示されません - 閉じるボタンは表示されます - 拡大ボタンと閉じるボタンを非表示 - "ボタンは表示されません + オーバーレイ ボタンを非表示 + オーバーレイ ボタンは非表示 + オーバーレイ ボタンは表示されます + 拡大ボタンと閉じるボタンを非表示 + "ボタンは表示されません 拡大する / 閉じるにはスワイプしてください" - 拡大ボタンと閉じるボタンは表示されます + 拡大ボタンと閉じるボタンは表示されます サブテキストを非表示 サブテキストは表示されません サブテキストは表示されます diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 4c757f964..af248a46b 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -1155,6 +1155,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 모던 스타일 1 모던 스타일 2 모던 스타일 3 + 모던 스타일 4 둥근 모서리 활성화하기 모서리를 둥글게 활성화합니다 모서리를 각지게 활성화합니다 @@ -1174,16 +1175,16 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 • 미니 플레이어 절반 정도를 왼쪽 밖 또는 오른쪽 밖으로 드래그하여 숨길 수 있습니다" 수평 드래그 제스처를 비활성화합니다 - \'닫기\' 버튼 숨기기 - \'닫기\' 버튼이 숨겨집니다\n\n• YouTube v19.24.xx까지 모던 스타일 1, 3에서 \'펼치기 & 닫기 버튼 숨기기\' 기능이 작동됩니다\n• YouTube v19.34.xx부터 모던 스타일 3에서만 \'닫기 버튼 숨기기\' 기능이 작동됩니다 - \'닫기\' 버튼이 표시됩니다\n\n• YouTube v19.24.xx까지 모던 스타일 1, 3에서 \'펼치기 & 닫기 버튼 숨기기\' 기능이 작동됩니다\n• YouTube v19.34.xx부터 모던 스타일 3에서만 \'닫기 버튼 숨기기\' 기능이 작동됩니다 - \'펼치기\' & \'닫기\' 버튼 숨기기 - "'펼치기' & '닫기' 버튼이 숨겨집니다 + 오버레이 버튼 숨기기 + 오버레이 버튼이 숨겨집니다. + 오버레이 버튼이 표시됩니다. + \'펼치기\' & \'닫기\' 버튼 숨기기 + "'펼치기' & '닫기' 버튼이 숨겨집니다 • YouTube v19.24.xx까지 모던 스타일 1, 3에서 '펼치기 & 닫기 버튼 숨기기' 기능이 작동됩니다 • YouTube v19.34.xx부터 모던 스타일 3에서만 '닫기 버튼 숨기기' 기능이 작동됩니다 • 미니 플레이어를 스와이프하여 펼치거나 닫을 수 있습니다" - \'펼치기\' & \'닫기\' 버튼이 표시됩니다\n\n• YouTube v19.24.xx까지 모던 스타일 1, 3에서 \'펼치기 & 닫기 버튼 숨기기\' 기능이 작동됩니다\n• YouTube v19.34.xx부터 모던 스타일 3에서만 \'닫기 버튼 숨기기\' 기능이 작동됩니다 + \'펼치기\' & \'닫기\' 버튼이 표시됩니다\n\n• YouTube v19.24.xx까지 모던 스타일 1, 3에서 \'펼치기 & 닫기 버튼 숨기기\' 기능이 작동됩니다\n• YouTube v19.34.xx부터 모던 스타일 3에서만 \'닫기 버튼 숨기기\' 기능이 작동됩니다 서브텍스트 숨기기 서브텍스트가 숨겨집니다\n\n• 왼쪽 하단에서 표시되는 \'유료 광고 포함\'과 같은 라벨 서브텍스트가 표시됩니다\n\n• 왼쪽 하단에서 표시되는 \'유료 광고 포함\'과 같은 라벨 diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 169b5c50b..fd26f159b 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -1156,6 +1156,7 @@ Jei vėliau išjungta, rekomenduojama išvalyti programos duomenis, kad būtų i Modernus 1 Modernus 2 Modernus 3 + Modernus 4 Įgalinti suapvalintus kampus Kampai yra suapvalinti Kampai yra kvadratiniai @@ -1175,14 +1176,14 @@ Jei vėliau išjungta, rekomenduojama išvalyti programos duomenis, kad būtų i \"Miniplayer\" galima vilkti nuo ekrano į kairę arba dešinę" Horizontalaus vilkimo gestas išjungtas - Slėpti uždarymo mygtuką - Uždarymo mygtukas yra paslėptas - Uždarymo mygtukas yra rodomas - Slėpti išplėtimo ir uždarymo mygtukus - "Mygtukai paslėpti + Slėpti perdangos mygtukus + Perdangos mygtukai paslėpti + Perdangos mygtukai rodomi + Slėpti išplėtimo ir uždarymo mygtukus + "Mygtukai paslėpti Braukite, kad išplėstumėte arba uždarytumėte" - Išplėtimo ir uždarymo mygtukai yra rodomi + Išplėtimo ir uždarymo mygtukai yra rodomi Slėpti antraštes Antraštės yra paslėptos Antraštės yra rodomos diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index deabac184..6e57ca5c0 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -1154,6 +1154,7 @@ Ja vēlāk tiks izslēgts, ieteicams notīrīt lietotnes datus, lai novērstu li Moderns 1 Moderns 2 Moderns 3 + Moderns 4 Iespējot noapaļotus stūrus Stūri ir noapaļoti Stūri ir kvadrātveida @@ -1173,14 +1174,14 @@ Miniatskaņotāju var pārvilkt uz jebkuru ekrāna stūri" Miniatskaņotāju var pārvilkt no ekrāna uz kreiso vai labo pusi" Horizontāls velci ir atspējots - Slēpt aizvēršanas pogu - Aizvēršanas poga ir paslēpta - Aizvēršanas poga ir redzama - Slēpt izvēršanas un aizvēršanas pogas - "Pogas ir paslēptas + Paslēpt pārklājuma pogas + Pārklājuma pogas ir paslēptas + Pārklājuma pogas ir redzamas + Paslēpt izvēršanas un aizvēršanas pogas + "Pogas ir paslēptas -Pārvelciet, lai paplašinātu vai aizvērtu" - Izvēršanas un aizvēršanas pogas ir redzamas +Velciet, lai izvērstu vai aizvērtu" + Izvēršanas un aizvēršanas pogas ir redzamas Slēpt apakštekstu Apakšteksts ir paslēpts Apakšteksts ir redzams diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index 2910f22af..60bd42c07 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -1154,6 +1154,7 @@ Als het later wordt uitgeschakeld, wordt aanbevolen om de app-gegevens te wissen Modern 1 Modern 2 Modern 3 + Modern 4 Schakel afgeronde hoeken in Hoeken zijn afgerond Hoeken zijn vierkant @@ -1173,14 +1174,14 @@ De miniplayer kan naar elke hoek van het scherm worden gesleept" De miniplayer kan naar links of rechts van het scherm worden gesleept" Horizontaal sleepgebaar uitgeschakeld - Verberg de sluitknop - De sluitknop is verborgen - De sluitknop is zichtbaar - Verberg uitvouwen en sluiten knoppen - "Knoppen zijn verborgen + Overlayknoppen verbergen + Overlayknoppen zijn verborgen + Overlayknoppen worden weergegeven + Knoppen voor uitvouwen en sluiten verbergen + "Knoppen zijn verborgen -Veeg om uit te vouwen of te sluiten" - Uitvouwen en sluiten knoppen zijn zichtbaar +Swipe om uit te vouwen of te sluiten" + Knoppen voor uitvouwen en sluiten worden weergegeven Verberg subteksten Subteksten zijn verborgen Subteksten zijn zichtbaar diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 04c1e1abe..3ebd7d5ef 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -1155,6 +1155,7 @@ Jeśli później zostanie wyłączony, zaleca się wyczyszczenie danych aplikacj Nowoczesny 1 Nowoczesny 2 Nowoczesny 3 + Nowoczesny 4 Zaokrąglone narożniki Narożniki są zaokrąglone Narożniki są kwadratowe @@ -1174,14 +1175,14 @@ Odtwarzacz można przeciągnąć do dowolnego rogu ekranu" Odtwarzacz można przeciągnąć poza ekran w lewo lub w prawo" Gest przeciągania w poziomie jest wyłączony - Przycisk zamykania - Przycisk zamykania jest ukryty - Przycisk zamykania jest widoczny - Przyciski rozszerzania i zamykania - "Przyciski są ukryte + Ukryj przyciski nakładki + Przyciski nakładki są ukryte + Przyciski nakładki są widoczne + Ukryj przyciski rozwijania i zamykania + "Przyciski są ukryte Przesuń, aby rozwinąć lub zamknąć" - Przyciski są widoczne + Przyciski rozwijania i zamykania są widoczne Podteksty Podteksty są ukryte Podteksty są widoczne diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index 398ca7f95..a7517d7fb 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -1151,6 +1151,7 @@ Se posteriormente desativado, é recomendável limpar os dados do aplicativo par Moderno 1 Moderno 2 Moderno 3 + Moderno 4 Ativar cantos arredondados Os cantos são arredondados Os cantos são quadrados @@ -1170,14 +1171,14 @@ O miniplayer pode ser arrastado para qualquer canto da tela" O miniplayer pode ser arrastado para fora da tela para a esquerda ou direita" Gesto de arrastar horizontal desativado - Ocultar botão fechar - O botão fechar está oculto - Botão fechar é mostrado - Ocultar botões de expansão e fechar - "Os botões estão ocultos + Ocultar botões de sobreposição + Botões de sobreposição estão ocultos + Botões de sobreposição são mostrados + Ocultar botões de expandir e fechar + "Botões estão ocultos -Deslize para expandir ou fechar" - Os botões de expansão e fechar são mostrados +Passe o dedo para expandir ou fechar" + Botões de expandir e fechar são mostrados Ocultar subtextos Subtextos estão ocultos Subtextos são exibidos diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index e5e65d040..981ae9a6a 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -1155,6 +1155,7 @@ Nếu sau này tắt, bạn nên xóa dữ liệu ứng dụng để tránh lỗ Moderno 1 Moderno 2 Moderno 3 + Moderno 4 Ativar cantos arredondados Bordas são arredondadas Os cantos estão quadrados @@ -1174,14 +1175,14 @@ Miniplayer có thể được kéo đến bất kỳ góc nào của màn hình" Miniplayer có thể được kéo ra khỏi màn hình sang trái hoặc phải" Gestos de arrastar horizontais desativados - Ocultar botão fechar - O botão fechar está oculto - Botão fechar é mostrado - Ocultar botões de expansão e fechamento - "Nút bị ẩn + Ocultar botões de sobreposição + Os botões de sobreposição estão ocultos + Os botões de sobreposição são mostrados + Ocultar botões de expansão e fechar + "Os botões estão ocultos -Vuốt để mở rộng hoặc đóng" - Botões de expansão e fechamento são mostrados +Deslize para expandir ou fechar" + Os botões de expansão e fechar são mostrados Ocultar subtextos Subtextos estão ocultos Subtextos são exibidos diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index bfe5d625b..2914a06b4 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -1154,6 +1154,7 @@ Dacă este dezactivat ulterior, se recomandă să ștergeți datele aplicației Modern 1 Modern 2 Modern 3 + Modern 4 Activează colțurile rotunjite Colţurile sunt rotunjite Colţurile sunt pătrate @@ -1173,14 +1174,14 @@ Miniplayerul poate fi tras în orice colț al ecranului" Miniplayerul poate fi tras pe ecran spre stânga sau spre dreapta" Gest de tragere orizontal dezactivat - Ascunde butonul de închidere - Butonul de închidere este ascuns - Butonul de închidere este afișat - Ascunde extinderea și închiderea butoanelor - "Butoanele sunt ascunse + Ascunde butoanele suprapuse + Butoanele suprapuse sunt ascunse + Butoanele suprapuse sunt afișate + Ascunde extinderea și închiderea butoanelor + "Butoanele sunt ascunse Trageți pentru a extinde sau a închide" - Afișarea și închiderea butoanelor sunt afișate + Butoanele de extindere și închidere sunt afișate Ascunde subtexte Subtexte sunt ascunse Subtexte sunt afișate diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index ab8df5009..90e125001 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -1155,6 +1155,7 @@ Second \"item\" text" Современный 1 Современный 2 Современный 3 + Современный 4 Включить закругление углов Углы миниплеера закруглены Углы миниплеера квадратны @@ -1174,14 +1175,14 @@ Second \"item\" text" Миниплеер можно перетаскивать за пределы экрана влево или вправо" Жест горизонтального перетаскивания отключен - Скрыть кнопку закрытия - Кнопка закрытия миниплеера скрыта - Кнопка закрытия миниплеера показана - Скрыть кнопки разворачивания и закрытия - "Кнопки разворачивания и закрытия скрыты + Скрыть кнопки наложения + Кнопки наложения скрыты + Кнопки наложения отображаются + Скрыть кнопки разворачивания и закрытия + "Кнопки разворачивания и закрытия скрыты Проведите по миниплееру для его разворачивания или закрытия" - Кнопки разворачивания и закрытия показаны + Кнопки разворачивания и закрытия показаны Скрыть подтексты Подтексты в миниплеере скрыты Подтексты в миниплеере показаны diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index a4b5e1a70..e5de17297 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -1145,6 +1145,7 @@ Ak sa neskôr vypne, odporúča sa vymazať údaje aplikácie, aby sa zabránilo Moderné 1 Moderné 2 Moderné 3 + Moderné 4 Povoliť zaoblené rohy Rohy sú zaoblené Rohy sú štvorcové @@ -1162,14 +1163,14 @@ Ak sa neskôr vypne, odporúča sa vymazať údaje aplikácie, aby sa zabránilo Miniprehrávač sa dá potiahnuť mimo obrazovky doľava alebo doprava" Zakázané je horizontálne posunutie - Skryť tlačidlo pre zatvorenie - Tlačidlo pre zatvorenie je skryté - Tlačidlo pre zatvorenie je zobrazené - Skryť tlačidlá rozbalenia a zatvorenia - "Tlačidlá sú skryté + Skryť tlačidlá prekrytia + Tlačidlá prekrytia sú skryté + Zobrazujú sa tlačidlá prekrytia + Skryť tlačidlá na rozbalenie a zatvorenie + "Tlačidlá sú skryté -Potiahnite prstom na rozbalenie alebo zatvorenie" - Zobrazia sa tlačidlá rozbalenia a zatvorenia +Potiahnutím rozbalíte alebo zatvoríte" + Zobrazujú sa tlačidlá na rozbalenie a zatvorenie Skryť podtexty Podtexty sú skryté Zobrazia sa podtexty diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index 4345711b1..450247101 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -1154,6 +1154,7 @@ To bo spremenilo videz in funkcije aplikacije, vendar se lahko pojavijo neznani Sodobno 1 Sodobno 2 Sodobno 3 + Sodobno 4 Omogoči zaobljene robove Robovi so zaobljeni Robovi so kvadratni @@ -1173,14 +1174,14 @@ Minipredvajalnik lahko povlečete v kateri koli kot zaslona" Minipredvajalnik lahko povlečete z zaslona na levo ali desno" Vodoravna kretnja vlečenja je onemogočena - Skrij gumb za zapiranje - Gumb za zapiranje je skrit - Gumb za zapiranje je prikazan - Skrij gumbe za razširitev in zapiranje - "Gumbi so skriti + Skrij prekrivne gumbe + Prekrivni gumbi so skriti + Prekrivni gumbi so prikazani + Skrij gumbe za razširitev in zapiranje + "Gumbi so skriti Podrsnite za razširitev ali zapiranje" - Gumbi za razširitev in zapiranje so prikazani + Gumbi za razširitev in zapiranje so prikazani Skrij podnaslove Podnaslovi so skriti Podnaslovi so prikazani diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index 6762716ef..c5d1fe7a5 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -1153,6 +1153,7 @@ Nëse më vonë është çaktivizuar, është e rekomanduar të fshiheni të dh Modern 1 Modern 2 Modern 3 + Modern 4 Aktivizo qoshet e rrumbullakosura Qoshet janë të rrumbullakosura Qoshet janë katrore @@ -1172,14 +1173,14 @@ Miniplayer mund të tërhiqet në çdo qoshe të ekranit" Miniplayer mund të tërhiqet jashtë ekranit në të majtë ose në të djathtë" Gjestet e tërheqjes horizontale janë të çaktivizuara - Fsheh butonin e mbylljes - Butoni i mbylljes është i fshehur - Butoni i mbylljes është i dukshëm - Fsheh butonat e zgjerimit dhe mbylljes - "Butonat janë të fshehura + Fshih butonat e mbivendosjes + Butonat e mbivendosjes janë të fshehur + Butonat e mbivendosjes janë të dukshëm + Fshih butonat e zgjerimit dhe mbylljes + "Butonat janë të fshehur -Lëviz gishtin për të zgjeruar ose mbyllur" - Butonat e zgjerimit dhe mbylljes janë të dukshëm +Rrëshqit për të zgjeruar ose mbyllur" + Butonat e zgjerimit dhe mbylljes janë të dukshëm Fsheh nëntekstet Nëntekstet janë të fshehura Nëntekstet janë të dukshme diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index bb00f512c..8e0c04188 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -1154,6 +1154,7 @@ Ako se kasnije isključi, preporučuje se da izbrišete podatke aplikacije da bi Moderan 1 Moderan 2 Moderan 3 + Moderno 4 Omogući zaobljene uglove Uglovi su zaobljeni Uglovi su kvadratni @@ -1173,14 +1174,14 @@ Mini-plejer se može prevući u bilo koji ugao ekrana" Mini-plejer se može prevući sa ekrana ulevo ili udesno" Pokret horizontalnog prevlačenja je onemogućen - Sakrij dugme za zatvaranje - Dugme za zatvaranje je skriveno - Dugme za zatvaranje je prikazano - Sakrij dugmad za proširenje i zatvaranje - "Dugmad su skrivena + Sakrij dugmad za preklapanje + Dugmad za preklapanje su skrivena + Dugmad za preklapanje su prikazana + Sakrij dugmad za proširivanje i zatvaranje + "Dugmad su skrivena -Prevucite za proširenje ili zatvaranje" - Dugmad za proširenje i zatvaranje su prikazana +Prevucite da biste proširili ili zatvorili" + Dugmad za proširivanje i zatvaranje su prikazana Sakrij podtekstove Podtekstovi su skriveni Podtekstovi su prikazani diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 4fb68e75a..a5c4ea62a 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -1154,6 +1154,7 @@ Second \"item\" text" Модеран 1 Модеран 2 Модеран 3 + Модеран 4 Омогући заобљене углове Углови су заобљени Углови су квадратни @@ -1173,14 +1174,14 @@ Second \"item\" text" Мини-плејер се може превући са екрана улево или удесно" Покрет хоризонталног превлачења је онемогућен - Сакриј дугме за затварање - Дугме за затварање је скривено - Дугме за затварање је приказано - Сакриј дугмад за проширење и затварање - "Дугмад су скривена + Сакриј дугмад преклапања + Дугмад преклапања су сакривена + Дугмад преклапања су приказана + Сакриј дугмад за проширивање и затварање + "Дугмад су сакривена -Превуците за проширење или затварање" - Дугмад за проширење и затварање су приказана +Превуците да бисте проширили или затворили" + Дугмад за проширивање и затварање су приказана Сакриј подтекстове Подтекстови су скривени Подтекстови су приказани diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index c58032c32..294e44817 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -1153,6 +1153,7 @@ Om det senare stängs av rekommenderas det att rensa appens data för att förhi Modern 1 Modern 2 Modern 3 + Modern 4 Aktivera rundade hörn Hörnen är rundade Hörnen är kvadratiska @@ -1172,14 +1173,14 @@ Minispelaren kan dras till valfritt hörn av skärmen" Minispelare kan dras av skärmen till vänster eller höger" Horisontell drag gest inaktiverad - Dölj stängningsknappen - Stäng knappen är dold - Stäng knappen visas - Dölj expandera och stäng knappar - "Knappar är dolda + Dölj överlagringsknappar + Överlagringsknappar är dolda + Överlagringsknappar visas + Dölj expanderings- och stängningsknappar + "Knapparna är dolda Svep för att expandera eller stänga" - Expandera och stäng knappar visas + Expanderings- och stängningsknappar visas Dölj undertexter Undertexter är dolda Undertexter visas diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index f45845c3d..64c0e343f 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -1153,6 +1153,7 @@ User id ของคุณเหมือนกับรหัสผ่าน ทันสมัย 1 ทันสมัย 2 ทันสมัย 3 + ทันสมัย 4 เปิดใช้งานมุมโค้งมน มุมโค้งมน มุมเป็นสี่เหลี่ยม @@ -1172,14 +1173,14 @@ User id ของคุณเหมือนกับรหัสผ่าน สามารถลาก miniplayer ออกจากหน้าจอไปทางซ้ายหรือขวา" ท่าทางการลากแบบแนวนอนปิดใช้งานแล้ว - ซ่อนปุ่มปิด - ปุ่มปิดถูกซ่อน - ปุ่มปิดแสดงอยู่ - ซ่อนปุ่มขยายและปิด - "ปุ่มถูกซ่อน + ซ่อนปุ่มโอเวอร์เลย์ + ปุ่มโอเวอร์เลย์ถูกซ่อน + ปุ่มโอเวอร์เลย์ถูกแสดง + ซ่อนปุ่มขยายและปิด + "ปุ่มถูกซ่อน ปัดเพื่อขยายหรือปิด" - ปุ่มขยายและปิดแสดงอยู่ + ปุ่มขยายและปิดถูกแสดง ซ่อนข้อความย่อย ข้อความย่อยถูกซ่อน ข้อความย่อยแสดงอยู่ diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index 0694d0003..2e218c0ff 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -1155,6 +1155,7 @@ Daha sonra kapatılırsa, arayüz hatalarını önlemek için uygulama verilerin Modern 1 Modern 2 Modern 3 + Modern 4 Yuvarlatılmış köşeleri etkinleştir Köşeler yuvarlatılmış Köşeler kare şeklinde @@ -1174,14 +1175,14 @@ Mini oynatıcı, ekranın herhangi bir köşesine sürüklenebilir" Mini oynatıcı, ekranın dışına sağa veya sola sürüklenebilir" Yatay sürükleme hareketi devre dışı - Kapatma düğmesini gizle - Kapatma düğmesi gizli - Kapatma düğmesi görünür - Büyütme ve kapatma düğmelerini gizle - "Düğmeler gizli + Katman düğmelerini gizle + Katman düğmeleri gizli + Katman düğmeleri görünür + Büyütme ve kapatma düğmelerini gizle + "Düğmeler gizli Genişletmek veya kapatmak için kaydırın" - Büyütme ve kapatma düğmeleri görünür + Büyütme ve kapatma düğmeleri görünür Alt metinleri gizle Alt metinler gizli Alt metinler görünür diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index 1851927e3..4d039d025 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -1154,6 +1154,7 @@ Second \"item\" text" Новітній 1 Новітній 2 Новітній 3 + Новітній 4 Увімкнути закруглені кути Кути закруглені Кути квадратні @@ -1173,14 +1174,14 @@ Second \"item\" text" Мініплеєр можна перетягнути за межі екрана вліво або вправо" Жест горизонтального перетягування вимкнено - Приховати кнопку закриття - Кнопку закриття мініплеєру приховано - Кнопка закриття мініплеєру показується - Кнопки розгортання та закриття - "Кнопки розгортання та закриття приховано + Приховати кнопки накладання + Кнопки накладання приховано + Кнопки накладання відображаються + Кнопки розгортання та закриття + "Кнопки розгортання та закриття приховано Проведіть по мініплеєру, щоб розгорнути чи закрити" - Кнопки розгортання та закриття показуються + Кнопки розгортання та закриття показуються Приховати підтексти Підтексти в мініплеєрі приховано Підтексти в мініплеєрі показуються diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index 17c3e547b..2f793161d 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -1154,6 +1154,7 @@ Nếu sau này tắt đi, bạn nên xóa dữ liệu ứng dụng để tránh Hiện đại 1 Hiện đại 2 Hiện đại 3 + Hiện đại 4 Bật góc bo tròn Góc được bo tròn Góc vuông @@ -1173,14 +1174,14 @@ Trình phát nhỏ có thể được kéo đến bất kỳ góc nào của mà Trình phát nhỏ có thể được kéo ra khỏi màn hình sang trái hoặc phải" Cử chỉ kéo ngang được tắt - Ẩn nút đóng - Nút đóng được ẩn - Nút đóng được hiện - Ẩn các nút mở rộng và đóng - "Nút bị ẩn + Ẩn các nút lớp phủ + Các nút lớp phủ bị ẩn + Các nút lớp phủ được hiển thị + Ẩn các nút mở rộng và đóng + "Nút bị ẩn Vuốt để mở rộng hoặc đóng" - Các nút mở rộng và đóng được hiện + Các nút mở rộng và đóng được hiện Ẩn văn bản phụ Văn bản phụ được ẩn Văn bản phụ được hiện diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index 8eeb0ae89..2ae3f1256 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -1158,6 +1158,7 @@ Second \"item\" text" 现代 1 现代 2 现代 3 + 现代 4 启用圆角 已启用圆角 已禁用圆角 @@ -1177,14 +1178,14 @@ Second \"item\" text" 迷你播放器可以拖动到屏幕的左侧或右侧" 已禁用水平拖动 - 隐藏关闭按钮 - 关闭按钮已隐藏 - 关闭按钮已显示 - 隐藏展开和关闭按钮 - "按钮已隐藏 + 隐藏悬浮窗按钮 + 悬浮窗按钮已隐藏 + 悬浮窗按钮已显示 + 隐藏展开和关闭按钮 + "按钮已隐藏 -滑动以展开或关闭" - 展开和关闭按钮显示 +滑动即可展开或关闭" + 展开和关闭按钮已显示 隐藏副标题 副标题已隐藏 副标题已显示 diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index e455020d5..bed33c7fd 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -1168,14 +1168,6 @@ Second \"item\" text" 迷你播放器可水平拖曳至螢幕左右兩側之外" 已停用水平拖曳手勢 - 隱藏「關閉」按鈕 - 已隱藏「關閉」按鈕 - 已顯示「關閉」按鈕 - 隱藏「展開」和「關閉」按鈕 - "已隱藏按鈕 - -向上或向下滑動以展開或關閉" - 已顯示「展開」和「關閉」按鈕 隱藏字幕 已隱藏字幕 已顯示字幕 diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index eeed9854b..1e11eb9a1 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -190,6 +190,7 @@ @string/revanced_miniplayer_type_entry_4 @string/revanced_miniplayer_type_entry_5 @string/revanced_miniplayer_type_entry_6 + @string/revanced_miniplayer_type_entry_7 @@ -200,8 +201,10 @@ MODERN_1 MODERN_2 MODERN_3 + MODERN_4 - + + @string/revanced_miniplayer_type_entry_0 @string/revanced_miniplayer_type_entry_1 @string/revanced_miniplayer_type_entry_2 @string/revanced_miniplayer_type_entry_3 @@ -209,8 +212,24 @@ @string/revanced_miniplayer_type_entry_5 @string/revanced_miniplayer_type_entry_6 - - + + DISABLED + DEFAULT + MINIMAL + TABLET + MODERN_1 + MODERN_2 + MODERN_3 + + + @string/revanced_miniplayer_type_entry_1 + @string/revanced_miniplayer_type_entry_2 + @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 + @string/revanced_miniplayer_type_entry_5 + @string/revanced_miniplayer_type_entry_6 + + DEFAULT MINIMAL TABLET diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 24790c8e8..7df5fd7d5 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1222,6 +1222,7 @@ If later turned off, it is recommended to clear the app data to prevent UI bugs. Modern 1 Modern 2 Modern 3 + Modern 4 Enable rounded corners Corners are rounded Corners are square @@ -1241,14 +1242,14 @@ Miniplayer can be dragged to any corner of the screen" Miniplayer can be dragged off-screen to the left or right" Horizontal drag gesture disabled - Hide close button - Close button is hidden - Close button is shown - Hide expand and close buttons - "Buttons are hidden + Hide overlay buttons + Overlay buttons are hidden + Overlay buttons are shown + Hide expand and close buttons + "Buttons are hidden Swipe to expand or close" - Expand and close buttons are shown + Expand and close buttons are shown Hide subtexts Subtexts are hidden Subtexts are shown