Compare commits

..

15 Commits

Author SHA1 Message Date
semantic-release-bot
49c54c0e54 chore: Release v5.18.0-dev.1 [skip ci]
# [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)) ([842ba4f](842ba4fc4d))
2025-03-28 17:01:42 +00:00
LisoUseInAIKyrios
842ba4fc4d feat(YouTube): Support version 20.07.39 (#4677) 2025-03-28 17:49:12 +01:00
semantic-release-bot
66ecadce4f chore: Release v5.17.0 [skip ci]
# [5.17.0](https://github.com/ReVanced/revanced-patches/compare/v5.16.1...v5.17.0) (2025-03-28)

### Bug Fixes

* **Facebook - Hide 'Sponsored Stories':** Constrain patch to latest compatible version ([#4657](https://github.com/ReVanced/revanced-patches/issues/4657)) ([4d910fe](4d910fea93))
* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([ca4f960](ca4f960171))
* **Spotify - Unlock Premium:** Use correct patch description convention ([a486522](a4865228f8))
* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([497291c](497291c478))
* **YouTube - Navigation buttons:** Add user dialog message to 'Disable translucent status bar' ([bf91e12](bf91e127d8))

### Features

* **Spotify - Unlock Premium:** Disable the "Spotify Premium" upsell experiment in context menus ([c84be12](c84be120bd))
2025-03-28 16:39:31 +00:00
LisoUseInAIKyrios
73ca04da5e chore: Merge branch dev to main (#4658) 2025-03-28 17:36:31 +01:00
semantic-release-bot
a5d26208c1 chore: Release v5.17.0-dev.4 [skip ci]
# [5.17.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.3...v5.17.0-dev.4) (2025-03-28)

### Bug Fixes

* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([497291c](497291c478))
2025-03-28 16:14:49 +00:00
LisoUseInAIKyrios
497291c478 fix(X / Twitter): Constrain patches to latest compatible versions (#4683) 2025-03-28 17:11:30 +01:00
github-actions[bot]
b24278a544 chore: Sync translations (#4680) 2025-03-28 15:03:07 +01:00
semantic-release-bot
135f9ead3c chore: Release v5.17.0-dev.3 [skip ci]
# [5.17.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.2...v5.17.0-dev.3) (2025-03-28)

### Bug Fixes

* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([ca4f960](ca4f960171))
2025-03-28 10:55:04 +00:00
xC3FFF0E
ca4f960171 fix(Spotify - Unlock Premium): Override additional attributes (#4651)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
2025-03-28 11:52:23 +01:00
semantic-release-bot
7f228cc535 chore: Release v5.17.0-dev.2 [skip ci]
# [5.17.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.1...v5.17.0-dev.2) (2025-03-27)

### Bug Fixes

* **YouTube - Navigation buttons:** Add user dialog message to 'Disable translucent status bar' ([bf91e12](bf91e127d8))
2025-03-27 19:23:17 +00:00
LisoUseInAIKyrios
bf91e127d8 fix(YouTube - Navigation buttons): Add user dialog message to 'Disable translucent status bar' 2025-03-27 20:20:05 +01:00
semantic-release-bot
f07fc1ad93 chore: Release v5.17.0-dev.1 [skip ci]
# [5.17.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.16.2-dev.1...v5.17.0-dev.1) (2025-03-27)

### Bug Fixes

* **Spotify - Unlock Premium:** Use correct patch description convention ([a486522](a4865228f8))

### Features

* **Spotify - Unlock Premium:** Disable the "Spotify Premium" upsell experiment in context menus ([c84be12](c84be120bd))
2025-03-27 00:48:00 +00:00
oSumAtrIX
c84be120bd feat(Spotify - Unlock Premium): Disable the "Spotify Premium" upsell experiment in context menus 2025-03-27 01:40:54 +01:00
semantic-release-bot
e67f390e2b chore: Release v5.16.2-dev.1 [skip ci]
## [5.16.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.16.1...v5.16.2-dev.1) (2025-03-26)

### Bug Fixes

* **Facebook - Hide 'Sponsored Stories':** Constrain patch to latest compatible version ([#4657](https://github.com/ReVanced/revanced-patches/issues/4657)) ([4d910fe](4d910fea93))
2025-03-26 18:34:18 +00:00
LisoUseInAIKyrios
4d910fea93 fix(Facebook - Hide 'Sponsored Stories'): Constrain patch to latest compatible version (#4657) 2025-03-26 19:30:48 +01:00
139 changed files with 1132 additions and 671 deletions

View File

@@ -1,3 +1,66 @@
# [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)
### Bug Fixes
* **Facebook - Hide 'Sponsored Stories':** Constrain patch to latest compatible version ([#4657](https://github.com/ReVanced/revanced-patches/issues/4657)) ([46bd1c8](https://github.com/ReVanced/revanced-patches/commit/46bd1c829acd5f83600025e0ceb7d482ae80be69))
* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([568b40d](https://github.com/ReVanced/revanced-patches/commit/568b40da9692eae9039bbb3cec513a61ca627c24))
* **Spotify - Unlock Premium:** Use correct patch description convention ([a486522](https://github.com/ReVanced/revanced-patches/commit/a4865228f8481d2efc8fbf4e90902a03289d9a3f))
* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([f579728](https://github.com/ReVanced/revanced-patches/commit/f5797289f45186052537982c7f5db6f2b0769aee))
* **YouTube - Navigation buttons:** Add user dialog message to 'Disable translucent status bar' ([a4a0e68](https://github.com/ReVanced/revanced-patches/commit/a4a0e6869e23d15ee09262460f4e290c90629eeb))
### Features
* **Spotify - Unlock Premium:** Disable the "Spotify Premium" upsell experiment in context menus ([9a10ee4](https://github.com/ReVanced/revanced-patches/commit/9a10ee4d22fb53da2012a182e038749d3ad72377))
# [5.17.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.3...v5.17.0-dev.4) (2025-03-28)
### Bug Fixes
* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([f579728](https://github.com/ReVanced/revanced-patches/commit/f5797289f45186052537982c7f5db6f2b0769aee))
# [5.17.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.2...v5.17.0-dev.3) (2025-03-28)
### Bug Fixes
* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([568b40d](https://github.com/ReVanced/revanced-patches/commit/568b40da9692eae9039bbb3cec513a61ca627c24))
# [5.17.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.1...v5.17.0-dev.2) (2025-03-27)
### Bug Fixes
* **YouTube - Navigation buttons:** Add user dialog message to 'Disable translucent status bar' ([a4a0e68](https://github.com/ReVanced/revanced-patches/commit/a4a0e6869e23d15ee09262460f4e290c90629eeb))
# [5.17.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.16.2-dev.1...v5.17.0-dev.1) (2025-03-27)
### Bug Fixes
* **Spotify - Unlock Premium:** Use correct patch description convention ([a486522](https://github.com/ReVanced/revanced-patches/commit/a4865228f8481d2efc8fbf4e90902a03289d9a3f))
### Features
* **Spotify - Unlock Premium:** Disable the "Spotify Premium" upsell experiment in context menus ([9a10ee4](https://github.com/ReVanced/revanced-patches/commit/9a10ee4d22fb53da2012a182e038749d3ad72377))
## [5.16.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.16.1...v5.16.2-dev.1) (2025-03-26)
### Bug Fixes
* **Facebook - Hide 'Sponsored Stories':** Constrain patch to latest compatible version ([#4657](https://github.com/ReVanced/revanced-patches/issues/4657)) ([46bd1c8](https://github.com/ReVanced/revanced-patches/commit/46bd1c829acd5f83600025e0ceb7d482ae80be69))
## [5.16.1](https://github.com/ReVanced/revanced-patches/compare/v5.16.0...v5.16.1) (2025-03-26) ## [5.16.1](https://github.com/ReVanced/revanced-patches/compare/v5.16.0...v5.16.1) (2025-03-26)

View File

@@ -122,6 +122,21 @@ public class SpoofVideoStreamsPatch {
return false; 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. * Injection point.
*/ */

View File

@@ -1,3 +1,16 @@
dependencies { dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:spotify:stub")) compileOnly(project(":extensions:spotify:stub"))
compileOnly(libs.annotation)
}
android {
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
} }

View File

@@ -2,7 +2,7 @@ package app.revanced.extension.youtube.patches;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
/** @noinspection unused*/ @SuppressWarnings("unused")
public class DisableResumingStartupShortsPlayerPatch { public class DisableResumingStartupShortsPlayerPatch {
/** /**
@@ -11,4 +11,11 @@ public class DisableResumingStartupShortsPlayerPatch {
public static boolean disableResumingStartupShortsPlayer() { public static boolean disableResumingStartupShortsPlayer() {
return Settings.DISABLE_RESUMING_SHORTS_PLAYER.get(); return Settings.DISABLE_RESUMING_SHORTS_PLAYER.get();
} }
/**
* Injection point.
*/
public static boolean disableResumingStartupShortsPlayer(boolean original) {
return original && !Settings.DISABLE_RESUMING_SHORTS_PLAYER.get();
}
} }

View File

@@ -43,10 +43,13 @@ public final class MiniplayerPatch {
MODERN_2(null, 2), MODERN_2(null, 2),
MODERN_3(null, 3), MODERN_3(null, 3),
/** /**
* Half broken miniplayer, that might be work in progress or left over abandoned code. * Works and is functional with 20.03+
* Can force this type by editing the import/export settings.
*/ */
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. * Legacy tablet hook value.
@@ -126,12 +129,13 @@ public final class MiniplayerPatch {
private static final boolean DRAG_AND_DROP_ENABLED = private static final boolean DRAG_AND_DROP_ENABLED =
CURRENT_TYPE.isModern() && Settings.MINIPLAYER_DRAG_AND_DROP.get(); CURRENT_TYPE.isModern() && Settings.MINIPLAYER_DRAG_AND_DROP.get();
private static final boolean HIDE_EXPAND_CLOSE_ENABLED = private static final boolean HIDE_OVERLAY_BUTTONS_ENABLED =
Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.get() Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.get()
&& Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.isAvailable(); && Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.isAvailable();
private static final boolean HIDE_SUBTEXT_ENABLED = 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, // 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. // 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()); && (VersionCheckPatch.IS_19_34_OR_GREATER || Settings.MINIPLAYER_HIDE_REWIND_FORWARD.get());
private static final boolean MINIPLAYER_ROUNDED_CORNERS_ENABLED = 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 = private static final boolean MINIPLAYER_HORIZONTAL_DRAG_ENABLED =
DRAG_AND_DROP_ENABLED && Settings.MINIPLAYER_HORIZONTAL_DRAG.get(); 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 @Override
public boolean isAvailable() { public boolean isAvailable() {
MiniplayerType type = Settings.MINIPLAYER_TYPE.get(); 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 || (!IS_19_26_OR_GREATER && type == MODERN_1
&& !Settings.MINIPLAYER_DOUBLE_TAP_ACTION.get() && !Settings.MINIPLAYER_DRAG_AND_DROP.get()) && !Settings.MINIPLAYER_DOUBLE_TAP_ACTION.get() && !Settings.MINIPLAYER_DRAG_AND_DROP.get())
|| (IS_19_29_OR_GREATER && type == MODERN_3); || (IS_19_29_OR_GREATER && type == MODERN_3);
@@ -227,9 +232,13 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static void adjustMiniplayerOpacity(ImageView view) { public static void adjustMiniplayerOpacity(View view) {
if (CURRENT_TYPE == MODERN_1) { 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. * Injection point.
*/ */
public static boolean enableMiniplayerDoubleTapAction(boolean original) { public static boolean getMiniplayerDoubleTapAction(boolean original) {
if (CURRENT_TYPE == DEFAULT) { if (CURRENT_TYPE == DEFAULT) {
return original; return original;
} }
@@ -258,7 +267,7 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static boolean enableMiniplayerDragAndDrop(boolean original) { public static boolean getMiniplayerDragAndDrop(boolean original) {
if (CURRENT_TYPE == DEFAULT) { if (CURRENT_TYPE == DEFAULT) {
return original; return original;
} }
@@ -266,13 +275,36 @@ public final class MiniplayerPatch {
return DRAG_AND_DROP_ENABLED; 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. * Injection point.
*/ */
public static boolean setRoundedCorners(boolean original) { public static boolean getHorizontalDrag(boolean original) {
if (CURRENT_TYPE.isModern()) { if (CURRENT_TYPE == DEFAULT) {
return MINIPLAYER_ROUNDED_CORNERS_ENABLED; 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; return original;
@@ -281,7 +313,7 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static int setMiniplayerDefaultSize(int original) { public static int getMiniplayerDefaultSize(int original) {
if (CURRENT_TYPE.isModern()) { if (CURRENT_TYPE.isModern()) {
return MINIPLAYER_SIZE; return MINIPLAYER_SIZE;
} }
@@ -289,29 +321,26 @@ public final class MiniplayerPatch {
return original; return original;
} }
/**
* Injection point.
*/
public static void hideMiniplayerExpandClose(View view) {
Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view);
}
/** /**
* Injection point. * Injection point.
*/ */
public static boolean setHorizontalDrag(boolean original) { public static void hideMiniplayerActionButton(View view) {
if (CURRENT_TYPE.isModern()) { if (CURRENT_TYPE == MODERN_4) {
return MINIPLAYER_HORIZONTAL_DRAG_ENABLED; Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view);
} }
return original;
} }
/** /**
* Injection point. * Injection point.
*/ */
public static void hideMiniplayerExpandClose(ImageView view) { public static void hideMiniplayerRewindForward(View view) {
Utils.hideViewByRemovingFromParentUnderCondition(HIDE_EXPAND_CLOSE_ENABLED, view);
}
/**
* Injection point.
*/
public static void hideMiniplayerRewindForward(ImageView view) {
Utils.hideViewByRemovingFromParentUnderCondition(HIDE_REWIND_FORWARD_ENABLED, view); Utils.hideViewByRemovingFromParentUnderCondition(HIDE_REWIND_FORWARD_ENABLED, view);
} }

View File

@@ -3,11 +3,15 @@ package app.revanced.extension.youtube.patches;
import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.Utils;
public class VersionCheckPatch { public class VersionCheckPatch {
public static final boolean IS_19_17_OR_GREATER = Utils.getAppVersionName().compareTo("19.17.00") >= 0; private static boolean isVersionOrGreater(String version) {
public static final boolean IS_19_20_OR_GREATER = Utils.getAppVersionName().compareTo("19.20.00") >= 0; return Utils.getAppVersionName().compareTo(version) >= 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_17_OR_GREATER = isVersionOrGreater("19.17.00");
public static final boolean IS_19_34_OR_GREATER = Utils.getAppVersionName().compareTo("19.34.00") >= 0; public static final boolean IS_19_20_OR_GREATER = isVersionOrGreater("19.20.00");
public static final boolean IS_19_46_OR_GREATER = Utils.getAppVersionName().compareTo("19.46.00") >= 0; 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");
} }

View File

@@ -114,7 +114,7 @@ public class ReturnYouTubeDislike {
private static final Rect middleSeparatorBounds; 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; public static final int leftSeparatorShapePaddingPixels;
private static final ShapeDrawable leftSeparatorShape; private static final ShapeDrawable leftSeparatorShape;
@@ -129,7 +129,7 @@ public class ReturnYouTubeDislike {
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp); (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp);
middleSeparatorBounds = new Rect(0, 0, middleSeparatorSize, middleSeparatorSize); 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 = new ShapeDrawable(new RectShape());
leftSeparatorShape.setBounds(leftSeparatorBounds); leftSeparatorShape.setBounds(leftSeparatorBounds);
@@ -238,7 +238,7 @@ public class ReturnYouTubeDislike {
String leftSeparatorString = getTextDirectionString(); String leftSeparatorString = getTextDirectionString();
final Spannable leftSeparatorSpan; final Spannable leftSeparatorSpan;
if (isRollingNumber) { if (isRollingNumber) {
leftSeparatorSpan = new SpannableString(leftSeparatorString); leftSeparatorSpan = new SpannableString(leftSeparatorString);
} else { } else {
leftSeparatorString += " "; leftSeparatorString += " ";
leftSeparatorSpan = new SpannableString(leftSeparatorString); leftSeparatorSpan = new SpannableString(leftSeparatorString);

View File

@@ -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.ChangeStartPagePatch.StartPage;
import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode; 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.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.MiniplayerHorizontalDragAvailability;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL; 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.StillImagesAvailability;
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption;
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime;
import app.revanced.extension.youtube.patches.MiniplayerPatch;
import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings;
public class Settings extends BaseSettings { 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_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_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_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_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_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); public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN);
@@ -233,7 +233,8 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_hide_notifications_button", FALSE, true); public static final BooleanSetting HIDE_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_hide_notifications_button", FALSE, true);
public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true,
"revanced_switch_create_with_notifications_button_user_dialog_message"); "revanced_switch_create_with_notifications_button_user_dialog_message");
public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true); public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true,
"revanced_disable_translucent_status_bar_user_dialog_message");
public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true);
public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = new BooleanSetting("revanced_disable_translucent_navigation_bar_dark", FALSE, true); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = new BooleanSetting("revanced_disable_translucent_navigation_bar_dark", FALSE, true);

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true org.gradle.parallel = true
android.useAndroidX = true android.useAndroidX = true
kotlin.code.style = official kotlin.code.style = official
version = 5.16.1 version = 5.18.0-dev.1

View File

@@ -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 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 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;ILjava/lang/Object;)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 { public final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatchKt {
@@ -820,6 +820,10 @@ public final class app/revanced/patches/spotify/misc/UnlockPremiumPatchKt {
public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }
public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt {
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt {
public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }
@@ -1181,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 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 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 { public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt {
@@ -1386,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_46_or_greater ()Z
public static final fun is_19_47_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_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 { public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {

View File

@@ -14,7 +14,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
val hideSponsoredStoriesPatch = bytecodePatch( val hideSponsoredStoriesPatch = bytecodePatch(
name = "Hide 'Sponsored Stories'", name = "Hide 'Sponsored Stories'",
) { ) {
compatibleWith("com.facebook.katana") compatibleWith("com.facebook.katana"("490.0.0.63.82"))
execute { execute {
val sponsoredDataModelTemplateMethod = getSponsoredDataModelTemplateFingerprint.originalMethod val sponsoredDataModelTemplateMethod = getSponsoredDataModelTemplateFingerprint.originalMethod

View File

@@ -145,7 +145,25 @@ internal val patchIncludedExtensionMethodFingerprint = fingerprint {
internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L
internal val mediaFetchHotConfigFingerprint = fingerprint { internal val mediaFetchHotConfigFingerprint = fingerprint {
literal { literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG }
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 }
} }

View File

@@ -31,7 +31,9 @@ internal const val EXTENSION_CLASS_DESCRIPTOR =
fun spoofVideoStreamsPatch( fun spoofVideoStreamsPatch(
block: BytecodePatchBuilder.() -> Unit = {}, block: BytecodePatchBuilder.() -> Unit = {},
applyMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false }, fixMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false },
fixMediaFetchHotConfigAlternativeChanges: BytecodePatchBuilder.() -> Boolean = { false },
fixParsePlaybackResponseFeatureFlag: BytecodePatchBuilder.() -> Boolean = { false },
executeBlock: BytecodePatchContext.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {},
) = bytecodePatch( ) = bytecodePatch(
name = "Spoof video streams", name = "Spoof video streams",
@@ -241,13 +243,27 @@ fun spoofVideoStreamsPatch(
// region turn off stream config replacement feature flag. // region turn off stream config replacement feature flag.
if (applyMediaFetchHotConfigChanges()) { if (fixMediaFetchHotConfigChanges()) {
mediaFetchHotConfigFingerprint.method.insertFeatureFlagBooleanOverride( mediaFetchHotConfigFingerprint.method.insertFeatureFlagBooleanOverride(
MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG, MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" "$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 // endregion
executeBlock() executeBlock()

View File

@@ -10,6 +10,7 @@ import org.w3c.dom.Element
val customThemePatch = resourcePatch( val customThemePatch = resourcePatch(
name = "Custom theme", name = "Custom theme",
description = "Applies a custom theme.", description = "Applies a custom theme.",
use = false,
) { ) {
compatibleWith("com.spotify.music") compatibleWith("com.spotify.music")

View File

@@ -16,3 +16,8 @@ internal val productStateProtoFingerprint = fingerprint {
internal val buildQueryParametersFingerprint = fingerprint { internal val buildQueryParametersFingerprint = fingerprint {
strings("trackRows", "device_type:tablet") strings("trackRows", "device_type:tablet")
} }
internal val contextMenuExperimentsFingerprint = fingerprint {
parameters("L")
strings("remove_ads_upsell_enabled")
}

View File

@@ -0,0 +1,5 @@
package app.revanced.patches.spotify.misc.extension
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
val sharedExtensionPatch = sharedExtensionPatch("spotify", spotifyMainActivityOnCreate)

View File

@@ -0,0 +1,10 @@
package app.revanced.patches.spotify.misc.extension
import app.revanced.patches.shared.misc.extension.extensionHook
internal val spotifyMainActivityOnCreate = extensionHook {
custom { method, classDef ->
classDef.type == "Lcom/spotify/music/SpotifyMainActivity;" &&
method.name == "onCreate"
}
}

View File

@@ -10,7 +10,13 @@ val dynamicColorPatch = resourcePatch(
name = "Dynamic color", name = "Dynamic color",
description = "Replaces the default X (Formerly Twitter) Blue with the user's Material You palette.", description = "Replaces the default X (Formerly Twitter) Blue with the user's Material You palette.",
) { ) {
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
"10.84.0-release.0",
"10.60.0-release.0",
"10.48.0-release.0"
)
)
execute { execute {
val resDirectory = get("res") val resDirectory = get("res")

View File

@@ -11,7 +11,15 @@ fun hookPatch(
) = bytecodePatch(name) { ) = bytecodePatch(name) {
dependsOn(jsonHookPatch) dependsOn(jsonHookPatch)
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
// 10.85+ uses Pairip and requires additional changes to work.
"10.84.0-release.0",
// Confirmed to not show reply ads. Slightly newer versions may also work.
"10.60.0-release.0",
"10.48.0-release.0"
)
)
execute { execute {
addJsonHook(JsonHook(hookClassDescriptor)) addJsonHook(JsonHook(hookClassDescriptor))

View File

@@ -37,7 +37,13 @@ val changeLinkSharingDomainPatch = bytecodePatch(
sharedExtensionPatch, sharedExtensionPatch,
) )
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
"10.84.0-release.0",
"10.60.0-release.0",
"10.48.0-release.0"
)
)
val domainName by stringOption( val domainName by stringOption(
key = "domainName", key = "domainName",

View File

@@ -8,7 +8,13 @@ val sanitizeSharingLinksPatch = bytecodePatch(
name = "Sanitize sharing links", name = "Sanitize sharing links",
description = "Removes the tracking query parameters from links before they are shared.", description = "Removes the tracking query parameters from links before they are shared.",
) { ) {
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
"10.84.0-release.0",
"10.60.0-release.0",
"10.48.0-release.0"
)
)
execute { execute {
sanitizeSharingLinksFingerprint.method.addInstructions( sanitizeSharingLinksFingerprint.method.addInstructions(

View File

@@ -82,9 +82,8 @@ val hideAdsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -29,9 +29,8 @@ val hideGetPremiumPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -27,9 +27,8 @@ val videoAdsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -57,9 +57,8 @@ val copyVideoUrlPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val removeViewerDiscretionDialogPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -72,9 +72,8 @@ val downloadsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -27,9 +27,8 @@ val disablePreciseSeekingGesturePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -30,9 +30,8 @@ val enableSeekbarTappingPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -39,9 +39,8 @@ val enableSlideToSeekPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val seekbarThumbnailsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -84,9 +84,8 @@ val swipeControlsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -26,9 +26,8 @@ val autoCaptionsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -47,9 +47,8 @@ val customBrandingPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -45,9 +45,8 @@ val changeHeaderPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -26,9 +26,8 @@ val hideButtonsPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -44,9 +44,8 @@ val navigationButtonsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -58,9 +58,8 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -37,9 +37,8 @@ val changeFormFactorPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -63,9 +63,8 @@ val hideEndscreenCardsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -35,9 +35,8 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val disableFullscreenAmbientModePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -15,7 +15,21 @@ internal val hideShowMoreButtonFingerprint = fingerprint {
literal { expandButtonDownId } literal { expandButtonDownId }
} }
/**
* 20.07+
*/
internal val parseElementFromBufferFingerprint = fingerprint { 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") parameters("L", "L", "[B", "L", "L")
opcodes( opcodes(
Opcode.IGET_OBJECT, Opcode.IGET_OBJECT,
@@ -110,7 +124,6 @@ internal val showFloatingMicrophoneButtonFingerprint = fingerprint {
opcodes( opcodes(
Opcode.IGET_BOOLEAN, Opcode.IGET_BOOLEAN,
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.RETURN_VOID,
) )
literal { fabButtonId } literal { fabButtonId }
} }

View File

@@ -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.litho.filter.lithoFilterPatch
import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch 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_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.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference 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.Opcode
import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
@@ -132,6 +135,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -247,29 +251,32 @@ val hideLayoutComponentsPatch = bytecodePatch(
// region Mix playlists // region Mix playlists
parseElementFromBufferFingerprint.method.apply { (if (is_20_07_or_greater) parseElementFromBufferFingerprint
val startIndex = parseElementFromBufferFingerprint.patternMatch!!.startIndex else parseElementFromBufferLegacyFingerprint).let {
// Target code is a mess with a lot of register moves. it.method.apply {
// There is no simple way to find a free register for all versions so this is hard coded. // Target code is a mess with a lot of register moves.
val freeRegister = if (is_19_47_or_greater) 6 else 0 // There is no simple way to find a free register for all versions so this is hard coded.
val byteArrayParameter = "p3" val freeRegister = if (is_19_47_or_greater) 6 else 0
val conversionContextRegister = getInstruction<TwoRegisterInstruction>(startIndex).registerA val byteArrayParameter = "p3"
val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } val startIndex = it.patternMatch!!.startIndex
val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC val conversionContextRegister = getInstruction<TwoRegisterInstruction>(startIndex).registerA
val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC }
val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC
addInstructionsWithLabels( addInstructionsWithLabels(
startIndex + 1, startIndex + 1,
""" """
invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z
move-result v$freeRegister move-result v$freeRegister
if-eqz v$freeRegister, :show if-eqz v$freeRegister, :show
move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 move-object v$returnEmptyComponentRegister, p1 # Required for 19.47
goto :return_empty_component goto :return_empty_component
:show :show
const/4 v$freeRegister, 0x0 # Restore register, required for 19.16 const/4 v$freeRegister, 0x0 # Restore register, required for 19.16
""", """,
ExternalLabel("return_empty_component", returnEmptyComponentInstruction), ExternalLabel("return_empty_component", returnEmptyComponentInstruction),
) )
}
} }
// endregion // endregion
@@ -345,19 +352,18 @@ val hideLayoutComponentsPatch = bytecodePatch(
// region hide floating microphone // region hide floating microphone
showFloatingMicrophoneButtonFingerprint.let { showFloatingMicrophoneButtonFingerprint.method.apply {
it.method.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow(fabButtonId)
val startIndex = it.patternMatch!!.startIndex val booleanIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.IGET_BOOLEAN)
val register = getInstruction<TwoRegisterInstruction>(startIndex).registerA val register = getInstruction<TwoRegisterInstruction>(booleanIndex).registerA
addInstructions( addInstructions(
startIndex + 1, booleanIndex + 1,
""" """
invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z
move-result v$register move-result v$register
""", """
) )
}
} }
// endregion // endregion

View File

@@ -61,9 +61,8 @@ val hideInfoCardsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val disableRollingNumberAnimationPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -29,9 +29,8 @@ val hideSeekbarPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -176,9 +176,8 @@ val hideShortsComponentsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -25,9 +25,8 @@ val hideTimestampPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -30,7 +30,7 @@ internal val miniplayerModernAddViewListenerFingerprint = fingerprint {
internal val miniplayerModernCloseButtonFingerprint = fingerprint { internal val miniplayerModernCloseButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerClose } literal { modernMiniplayerClose }
} }
@@ -62,7 +62,7 @@ internal val miniplayerOnCloseHandlerFingerprint = fingerprint {
*/ */
internal val miniplayerModernExpandButtonFingerprint = fingerprint { internal val miniplayerModernExpandButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerExpand } literal { modernMiniplayerExpand }
} }
@@ -82,7 +82,7 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint {
*/ */
internal val miniplayerModernForwardButtonFingerprint = fingerprint { internal val miniplayerModernForwardButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerForwardButton } literal { modernMiniplayerForwardButton }
} }
@@ -92,7 +92,6 @@ internal val miniplayerModernForwardButtonFingerprint = fingerprint {
*/ */
internal val miniplayerModernOverlayViewFingerprint = fingerprint { internal val miniplayerModernOverlayViewFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters() parameters()
literal { scrimOverlay } literal { scrimOverlay }
} }
@@ -102,7 +101,7 @@ internal val miniplayerModernOverlayViewFingerprint = fingerprint {
*/ */
internal val miniplayerModernRewindButtonFingerprint = fingerprint { internal val miniplayerModernRewindButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerRewindButton } literal { modernMiniplayerRewindButton }
} }
@@ -114,6 +113,13 @@ internal val miniplayerModernViewParentFingerprint = fingerprint {
strings("player_overlay_modern_mini_player_controls") 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 { internal val miniplayerMinimumSizeFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
custom { method, _ -> custom { method, _ ->

View File

@@ -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.ImmutableMethod
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
var floatyBarButtonTopMargin = -1L internal var floatyBarButtonTopMargin = -1L
private set private set
// Only available in 19.15 and upwards. // Only available in 19.15 and upwards.
var ytOutlineXWhite24 = -1L internal var ytOutlineXWhite24 = -1L
private set private set
var ytOutlinePictureInPictureWhite24 = -1L internal var ytOutlinePictureInPictureWhite24 = -1L
private set private set
var scrimOverlay = -1L internal var scrimOverlay = -1L
private set private set
var modernMiniplayerClose = -1L internal var modernMiniplayerClose = -1L
private set private set
var modernMiniplayerExpand = -1L internal var modernMiniplayerExpand = -1L
private set private set
var modernMiniplayerRewindButton = -1L internal var modernMiniplayerRewindButton = -1L
private set private set
var modernMiniplayerForwardButton = -1L internal var modernMiniplayerForwardButton = -1L
private set private set
var playerOverlays = -1L internal var modernMiniPlayerOverlayActionButton = -1L
private set private set
var miniplayerMaxSize = -1L internal var playerOverlays = -1L
private set
internal var miniplayerMaxSize = -1L
private set private set
private val miniplayerResourcePatch = resourcePatch { private val miniplayerResourcePatch = resourcePatch {
@@ -100,6 +102,11 @@ private val miniplayerResourcePatch = resourcePatch {
"modern_miniplayer_forward_button", "modern_miniplayer_forward_button",
] ]
modernMiniPlayerOverlayActionButton = resourceMappings[
"id",
"modern_miniplayer_overlay_action_button"
]
// Resource id is not used during patching, but is used by extension. // Resource id is not used during patching, but is used by extension.
// Verify the resource is present while patching. // Verify the resource is present while patching.
resourceMappings[ resourceMappings[
@@ -167,6 +174,7 @@ val miniplayerPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -175,19 +183,25 @@ val miniplayerPatch = bytecodePatch(
val preferences = mutableSetOf<BasePreference>() val preferences = mutableSetOf<BasePreference>()
preferences += preferences +=
if (is_19_43_or_greater) { if (is_20_03_or_greater) {
ListPreference( ListPreference(
"revanced_miniplayer_type", "revanced_miniplayer_type",
summaryKey = null, 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 { } else {
ListPreference( ListPreference(
"revanced_miniplayer_type", "revanced_miniplayer_type",
summaryKey = null, summaryKey = null,
entriesKey = "revanced_miniplayer_type_legacy_entries", entriesKey = "revanced_miniplayer_type_legacy_19_16_entries",
entryValuesKey = "revanced_miniplayer_type_legacy_entry_values", entryValuesKey = "revanced_miniplayer_type_legacy_19_16_entry_values",
) )
} }
@@ -209,13 +223,13 @@ val miniplayerPatch = bytecodePatch(
preferences += SwitchPreference("revanced_miniplayer_hide_subtext") preferences += SwitchPreference("revanced_miniplayer_hide_subtext")
preferences += if (is_19_26_or_greater) { preferences += if (is_19_26_or_greater) {
SwitchPreference("revanced_miniplayer_hide_expand_close") SwitchPreference("revanced_miniplayer_hide_overlay_buttons")
} else { } else {
SwitchPreference( SwitchPreference(
key = "revanced_miniplayer_hide_expand_close", key = "revanced_miniplayer_hide_overlay_buttons",
titleKey = "revanced_miniplayer_hide_expand_close_legacy_title", titleKey = "revanced_miniplayer_hide_overlay_buttons_legacy_title",
summaryOnKey = "revanced_miniplayer_hide_expand_close_legacy_summary_on", summaryOnKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_on",
summaryOffKey = "revanced_miniplayer_hide_expand_close_legacy_summary_off", summaryOffKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_off",
) )
} }
@@ -365,7 +379,7 @@ val miniplayerPatch = bytecodePatch(
if (is_19_23_or_greater) { if (is_19_23_or_greater) {
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_DRAG_DROP_FEATURE_KEY, MINIPLAYER_DRAG_DROP_FEATURE_KEY,
"enableMiniplayerDragAndDrop", "getMiniplayerDragAndDrop",
) )
} }
@@ -382,7 +396,7 @@ val miniplayerPatch = bytecodePatch(
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_DOUBLE_TAP_FEATURE_KEY, MINIPLAYER_DOUBLE_TAP_FEATURE_KEY,
"enableMiniplayerDoubleTapAction", "getMiniplayerDoubleTapAction",
) )
} }
@@ -398,7 +412,7 @@ val miniplayerPatch = bytecodePatch(
addInstructions( addInstructions(
targetIndex + 1, 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 move-result v$register
""", """,
) )
@@ -421,7 +435,7 @@ val miniplayerPatch = bytecodePatch(
if (is_19_36_or_greater) { if (is_19_36_or_greater) {
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY, MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY,
"setRoundedCorners", "getRoundedCorners",
) )
} }
@@ -433,7 +447,7 @@ val miniplayerPatch = bytecodePatch(
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY,
"setHorizontalDrag", "getHorizontalDrag",
) )
} }
@@ -473,6 +487,11 @@ val miniplayerPatch = bytecodePatch(
modernMiniplayerClose, modernMiniplayerClose,
"hideMiniplayerExpandClose", "hideMiniplayerExpandClose",
), ),
Triple(
miniplayerModernActionButtonFingerprint,
modernMiniPlayerOverlayActionButton,
"hideMiniplayerActionButton"
),
Triple( Triple(
miniplayerModernRewindButtonFingerprint, miniplayerModernRewindButtonFingerprint,
modernMiniplayerRewindButton, modernMiniplayerRewindButton,
@@ -490,12 +509,25 @@ val miniplayerPatch = bytecodePatch(
), ),
).forEach { (fingerprint, literalValue, methodName) -> ).forEach { (fingerprint, literalValue, methodName) ->
fingerprint.match( fingerprint.match(
miniplayerModernViewParentFingerprint.classDef, miniplayerModernViewParentFingerprint.originalClassDef
).method.hookInflatedView( ).method.apply {
literalValue, val literalIndex = indexOfFirstLiteralInstructionOrThrow(literalValue)
"Landroid/widget/ImageView;", val checkCastIndex = indexOfFirstInstruction(literalIndex) {
"$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", opcode == Opcode.CHECK_CAST &&
) getReference<TypeReference>()?.type == "Landroid/widget/ImageView;"
}
val viewIndex = if (checkCastIndex >= 0) {
checkCastIndex
} else {
indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT)
}
val viewRegister = getInstruction<OneRegisterInstruction>(viewIndex).registerA
addInstruction(
viewIndex + 1,
"invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V"
)
}
} }
miniplayerModernAddViewListenerFingerprint.match( miniplayerModernAddViewListenerFingerprint.match(
@@ -510,33 +542,40 @@ val miniplayerPatch = bytecodePatch(
// Modern 2 uses the same overlay controls as the regular video player, // Modern 2 uses the same overlay controls as the regular video player,
// and the overlay views are added at runtime. // and the overlay views are added at runtime.
// Add a hook to the overlay class, and pass the added views to extension. // 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. // 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. // This patch code could be used to hide other player overlays that do not use Litho.
playerOverlaysLayoutFingerprint.classDef.methods.add( if (!is_19_17_or_greater) {
ImmutableMethod( playerOverlaysLayoutFingerprint.classDef.methods.add(
YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, ImmutableMethod(
"addView", YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME,
listOf( "addView",
ImmutableMethodParameter("Landroid/view/View;", null, null), listOf(
ImmutableMethodParameter("I", null, null), ImmutableMethodParameter("Landroid/view/View;", null, null),
ImmutableMethodParameter("Landroid/view/ViewGroup\$LayoutParams;", null, null), ImmutableMethodParameter("I", null, null),
), ImmutableMethodParameter(
"V", "Landroid/view/ViewGroup\$LayoutParams;",
AccessFlags.PUBLIC.value, null,
null, null
null, ),
MutableMethodImplementation(4), ),
).toMutable().apply { "V",
addInstructions( AccessFlags.PUBLIC.value,
""" null,
invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V null,
invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V MutableMethodImplementation(4),
return-void ).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 // endregion
} }

View File

@@ -25,9 +25,8 @@ val playerPopupPanelsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -16,9 +16,8 @@ val playerControlsBackgroundPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -25,9 +25,8 @@ internal val exitFullscreenPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -27,6 +27,7 @@ val openVideosFullscreenPatch = bytecodePatch(
"com.google.android.youtube"( "com.google.android.youtube"(
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -56,9 +56,8 @@ val customPlayerOverlayOpacityPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -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.litho.filter.lithoFilterPatch
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch 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_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.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.addSettingPreference import app.revanced.patches.youtube.misc.settings.addSettingPreference
import app.revanced.patches.youtube.misc.settings.newIntent import app.revanced.patches.youtube.misc.settings.newIntent
@@ -56,9 +57,8 @@ val returnYouTubeDislikePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -121,7 +121,7 @@ val returnYouTubeDislikePatch = bytecodePatch(
val tempRegister: Int val tempRegister: Int
val charSequenceRegister: Int val charSequenceRegister: Int
if (is_19_33_or_greater) { if (is_19_33_or_greater && !is_20_10_or_greater) {
insertIndex = indexOfFirstInstructionOrThrow { insertIndex = indexOfFirstInstructionOrThrow {
(opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE)
&& getReference<MethodReference>()?.returnType == textDataClassType && getReference<MethodReference>()?.returnType == textDataClassType

View File

@@ -33,9 +33,8 @@ val wideSearchbarPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -37,12 +37,25 @@ internal val shortsSeekbarColorFingerprint = fingerprint {
literal { reelTimeBarPlayedColorId } literal { reelTimeBarPlayedColorId }
} }
internal val playerSeekbarHandleColorFingerprint = fingerprint { internal val playerSeekbarHandle1ColorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("Landroid/content/Context;") 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 { internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V") returns("V")

View File

@@ -53,6 +53,10 @@ internal var ytYoutubeMagentaColorId = -1L
private set private set
internal var ytStaticBrandRedId = -1L internal var ytStaticBrandRedId = -1L
private set private set
internal var ytTextSecondaryId = -1L
private set
internal var inlineTimeBarLiveSeekableRangeId = -1L
private set
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
@@ -76,6 +80,18 @@ private val seekbarColorResourcePatch = resourcePatch {
"color", "color",
"inline_time_bar_played_not_highlighted_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. // Modify the resume playback drawable and replace the progress bar with a custom drawable.
document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> document("res/drawable/resume_playback_progressbar_drawable.xml").use { document ->
@@ -211,7 +227,7 @@ val seekbarColorPatch = bytecodePatch(
) )
execute { execute {
fun MutableMethod.addColorChangeInstructions(resourceId: Long, methodName: String) { fun MutableMethod.addColorChangeInstructions(resourceId: Long) {
val index = indexOfFirstLiteralInstructionOrThrow(resourceId) val index = indexOfFirstLiteralInstructionOrThrow(resourceId)
val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT) val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT)
val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA
@@ -219,19 +235,19 @@ val seekbarColorPatch = bytecodePatch(
addInstructions( addInstructions(
insertIndex + 1, 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 move-result v$register
""" """
) )
} }
playerSeekbarColorFingerprint.method.apply { playerSeekbarColorFingerprint.method.apply {
addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId, "getVideoPlayerSeekbarColor") addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId)
addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId, "getVideoPlayerSeekbarColor") addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId)
} }
shortsSeekbarColorFingerprint.method.apply { shortsSeekbarColorFingerprint.method.apply {
addColorChangeInstructions(reelTimeBarPlayedColorId, "getVideoPlayerSeekbarColor") addColorChangeInstructions(reelTimeBarPlayedColorId)
} }
setSeekbarClickedColorFingerprint.originalMethod.let { setSeekbarClickedColorFingerprint.originalMethod.let {
@@ -257,8 +273,11 @@ val seekbarColorPatch = bytecodePatch(
// 19.25+ changes // 19.25+ changes
playerSeekbarHandleColorFingerprint.method.apply { arrayOf(
addColorChangeInstructions(ytStaticBrandRedId, "getVideoPlayerSeekbarColor") playerSeekbarHandle1ColorFingerprint,
playerSeekbarHandle2ColorFingerprint
).forEach {
it.method.addColorChangeInstructions(ytStaticBrandRedId)
} }
// If hiding feed seekbar thumbnails, then turn off the cairo gradient // If hiding feed seekbar thumbnails, then turn off the cairo gradient

View File

@@ -37,9 +37,8 @@ val shortsAutoplayPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -45,9 +45,8 @@ val openShortsInRegularPlayerPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -110,9 +110,8 @@ val sponsorBlockPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -62,9 +62,8 @@ val spoofAppVersionPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val changeStartPagePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -1,18 +1,22 @@
package app.revanced.patches.youtube.layout.startupshortsreset package app.revanced.patches.youtube.layout.startupshortsreset
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 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.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch 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.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.addInstructionsAtControlFlowLabel
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import com.android.tools.smali.dexlib2.Opcode 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.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -38,6 +42,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -48,25 +53,51 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
SwitchPreference("revanced_disable_resuming_shorts_player"), SwitchPreference("revanced_disable_resuming_shorts_player"),
) )
userWasInShortsFingerprint.method.apply { if (is_20_02_or_greater) {
val listenableInstructionIndex = indexOfFirstInstructionOrThrow { userWasInShortsAlternativeFingerprint.let {
opcode == Opcode.INVOKE_INTERFACE && it.method.apply {
getReference<MethodReference>()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && val stringIndex = it.stringMatches!!.first().index
getReference<MethodReference>()?.name == "isDone" val booleanValueIndex = indexOfFirstInstructionReversedOrThrow(stringIndex) {
} opcode == Opcode.INVOKE_VIRTUAL &&
val freeRegister = getInstruction<OneRegisterInstruction>(listenableInstructionIndex + 1).registerA getReference<MethodReference>()?.name == "booleanValue"
}
val booleanValueRegister =
getInstruction<OneRegisterInstruction>(booleanValueIndex + 1).registerA
addInstructionsAtControlFlowLabel( addInstructions(
listenableInstructionIndex, booleanValueIndex + 2, """
""" invoke-static {v$booleanValueRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z move-result v$booleanValueRegister
move-result v$freeRegister """
if-eqz v$freeRegister, :show_startup_shorts_player )
return-void }
:show_startup_shorts_player }
nop } else {
""", userWasInShortsLegacyFingerprint.method.apply {
) val listenableInstructionIndex = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>()
opcode == Opcode.INVOKE_INTERFACE &&
reference?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" &&
reference.name == "isDone"
}
val originalInstructionRegister =
getInstruction<FiveRegisterInstruction>(listenableInstructionIndex).registerC
val freeRegister =
getInstruction<OneRegisterInstruction>(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( userWasInShortsConfigFingerprint.method.addInstructions(

View File

@@ -4,7 +4,17 @@ import app.revanced.patcher.fingerprint
import app.revanced.util.literal import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags 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") returns("V")
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("Ljava/lang/Object;") parameters("Ljava/lang/Object;")

View File

@@ -221,9 +221,8 @@ val themePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -37,9 +37,8 @@ val alternativeThumbnailsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -31,9 +31,8 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -27,9 +27,8 @@ val announcementsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val autoRepeatPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -52,9 +52,8 @@ val backgroundPlaybackPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -38,9 +38,8 @@ val enableDebuggingPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val spoofDeviceDimensionsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -25,9 +25,8 @@ val checkWatchHistoryDomainNameResolutionPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -39,9 +39,8 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
} }

View File

@@ -13,9 +13,11 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction 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.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction 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.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
val bypassURLRedirectsPatch = bytecodePatch( val bypassURLRedirectsPatch = bytecodePatch(
name = "Bypass URL redirects", name = "Bypass URL redirects",
@@ -37,6 +39,7 @@ val bypassURLRedirectsPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -80,3 +83,8 @@ internal fun Method.findUriParseIndex() = indexOfFirstInstruction {
val reference = getReference<MethodReference>() val reference = getReference<MethodReference>()
reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse" reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse"
} }
internal fun Method.findWebViewCheckCastIndex() = indexOfFirstInstruction {
val reference = getReference<TypeReference>()
opcode == Opcode.CHECK_CAST && reference?.type?.endsWith("/WebviewEndpointOuterClass${'$'}WebviewEndpoint;") == true
}

View File

@@ -11,12 +11,21 @@ internal val abUriParserFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Ljava/lang/Object") returns("Ljava/lang/Object")
parameters("Ljava/lang/Object") parameters("Ljava/lang/Object")
strings(
"Found entityKey=`",
"` that does not contain a PlaylistVideoEntityId message as it's identifier.",
)
custom { method, _ -> 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 { internal val httpUriParserLegacyFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Landroid/net/Uri") returns("Landroid/net/Uri")

View File

@@ -45,9 +45,8 @@ val openLinksExternallyPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -10,7 +10,11 @@ import com.android.tools.smali.dexlib2.Opcode
* In 19.18+ this resolves to a different method. * In 19.18+ this resolves to a different method.
*/ */
internal val componentContextParserFingerprint = fingerprint { 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 { internal val lithoFilterFingerprint = fingerprint {

View File

@@ -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.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_18_or_greater 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_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.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow 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 // 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. // 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 { lithoComponentNameUpbFeatureFlagFingerprint.method.apply {
// Don't use return early, so the debug patch logs if this was originally on. // Don't use return early, so the debug patch logs if this was originally on.
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN) val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN)

View File

@@ -46,6 +46,18 @@ var is_19_47_or_greater = false
private set private set
var is_19_49_or_greater = false var is_19_49_or_greater = false
private set 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( val versionCheckPatch = resourcePatch(
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", 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_46_or_greater = 244705000 <= playStoreServicesVersion
is_19_47_or_greater = 244799000 <= playStoreServicesVersion is_19_47_or_greater = 244799000 <= playStoreServicesVersion
is_19_49_or_greater = 245005000 <= 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
} }
} }

View File

@@ -34,9 +34,8 @@ val removeTrackingQueryParameterPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -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.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch 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_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.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
@@ -18,9 +20,8 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -31,6 +32,10 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
) )
}, { }, {
is_19_34_or_greater is_19_34_or_greater
}, {
is_20_10_or_greater
}, {
is_20_03_or_greater
}, { }, {
addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch")

View File

@@ -25,9 +25,8 @@ val zoomHapticsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -45,9 +45,8 @@ val forceOriginalAudioPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -32,9 +32,8 @@ val disableHdrPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -2,11 +2,65 @@ package app.revanced.patches.youtube.video.playerresponse
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags 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 { 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) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("L") returns("L")
parameters( parameters(

View File

@@ -1,11 +1,14 @@
package app.revanced.patches.youtube.video.playerresponse 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.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch 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_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 import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
private val hooks = mutableSetOf<Hook>() private val hooks = mutableSetOf<Hook>()
@@ -35,15 +38,21 @@ val playerResponseMethodHookPatch = bytecodePatch {
) )
execute { 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 parameterIsShortAndOpeningOrPlaying = 12
fingerprint = playerParameterBuilder2002Fingerprint
playerParameterBuilderFingerprint } else if (is_19_23_or_greater) {
parameterIsShortAndOpeningOrPlaying = 12
fingerprint = playerParameterBuilder1925Fingerprint
} else { } else {
parameterIsShortAndOpeningOrPlaying = 11 parameterIsShortAndOpeningOrPlaying = 11
fingerprint = playerParameterBuilderLegacyFingerprint
playerParameterBuilderLegacyFingerprint }
}.method playerResponseMethod = fingerprint.method
// On some app targets the method has too many registers pushing the parameters past v15. // 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. // If needed, move the parameters to 4-bit registers, so they can be passed to the extension.

View File

@@ -27,9 +27,8 @@ val videoQualityPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -32,9 +32,8 @@ val playbackSpeedPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -22,14 +22,6 @@ internal val speedArrayGeneratorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("[L") returns("[L")
parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") 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#") strings("0.0#")
} }

View File

@@ -555,6 +555,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_translucent_status_bar_title">ØĒØšØˇŲŠŲ„ Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ø§Ų„Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_status_bar_title">ØĒØšØˇŲŠŲ„ Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ø§Ų„Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_status_bar_summary_on">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ ØēŲŠØą Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_status_bar_summary_on">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ ØēŲŠØą Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_status_bar_summary_off">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ų…ØšØĒŲ… ØŖŲˆ Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_status_bar_summary_off">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ų…ØšØĒŲ… ØŖŲˆ Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">؁؊ بؚØļ Ø§Ų„ØŖØŦŲ‡Ø˛ØŠØŒ Ų‚Ø¯ ŲŠØ¤Ø¯ŲŠ ØĒŲ…ŲƒŲŠŲ† Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ ØĨŲ„Ų‰ ØĒØēŲŠŲŠØą Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„Ų†Ø¸Ø§Ų… ØĨŲ„Ų‰ Ø´ŲØ§Ų.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">ØĒØšØˇŲŠŲ„ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„Ø´ŲØ§Ų Ø§Ų„ŲØ§ØĒØ­</string> <string name="revanced_disable_translucent_navigation_bar_light_title">ØĒØšØˇŲŠŲ„ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„Ø´ŲØ§Ų Ø§Ų„ŲØ§ØĒØ­</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ ØēŲŠØą Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ ØēŲŠØą Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ Ų…ØšØĒŲ… Ø§Ųˆ Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ Ų…ØšØĒŲ… Ø§Ųˆ Ø´ŲØ§Ų</string>
@@ -1173,14 +1174,14 @@ Second \"item\" text"</string>
ŲŠŲ…ŲƒŲ† ØŗØ­Ø¨ Ø§Ų„Ų…Ø´ØēŲ„ Ø§Ų„Ų…ØĩØēØą ØŽØ§ØąØŦ Ø§Ų„Ø´Ø§Ø´ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲŠØŗØ§Øą ØŖŲˆ Ø§Ų„ŲŠŲ…ŲŠŲ†"</string> ŲŠŲ…ŲƒŲ† ØŗØ­Ø¨ Ø§Ų„Ų…Ø´ØēŲ„ Ø§Ų„Ų…ØĩØēØą ØŽØ§ØąØŦ Ø§Ų„Ø´Ø§Ø´ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲŠØŗØ§Øą ØŖŲˆ Ø§Ų„ŲŠŲ…ŲŠŲ†"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĨŲŠŲ…Ø§ØĄØŠ Ø§Ų„ØŗØ­Ø¨ Ø§Ų„ØŖŲŲ‚ŲŠØŠ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĨŲŠŲ…Ø§ØĄØŠ Ø§Ų„ØŗØ­Ø¨ Ø§Ų„ØŖŲŲ‚ŲŠØŠ</string>
<string name="revanced_miniplayer_hide_expand_close_title">ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">؊ØĒŲ… ØšØąØļ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">؊ØĒŲ… ØšØąØļ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ØŖØ˛ØąØ§Øą <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ØŖØ˛ØąØ§Øą
Ų…ØąØą Ų„Ų„ØĒŲˆØŗŲŠØš ØŖŲˆ Ø§Ų„ØĨØēŲ„Ø§Ų‚"</string> Ų…ØąØą Ų„Ų„ØĒŲˆØŗŲŠØš ØŖŲˆ Ø§Ų„ØĨØēŲ„Ø§Ų‚"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">؊ØĒŲ… ØšØąØļ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">؊ØĒŲ… ØšØąØļ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_subtext_title">ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string> <string name="revanced_miniplayer_hide_subtext_title">ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string> <string name="revanced_miniplayer_hide_subtext_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string> <string name="revanced_miniplayer_hide_subtext_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string>

View File

@@ -1159,14 +1159,14 @@ Kiçik oynadÄącÄą ekranÄąn istənilən kÃŧncÃŧnə sÃŧrÃŧklənə bilər"</string>
Kiçik oynadÄącÄą ekrandan sola və ya sağa sÃŧrÃŧklənə bilər"</string> Kiçik oynadÄącÄą ekrandan sola və ya sağa sÃŧrÃŧklənə bilər"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">ÜfÃŧqi sÃŧrÃŧkləmə jesti qapatÄąldÄą</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">ÜfÃŧqi sÃŧrÃŧkləmə jesti qapatÄąldÄą</string>
<string name="revanced_miniplayer_hide_expand_close_title">\"Bağla\" dÃŧyməsini gizlət</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">\"Bağla\" dÃŧyməsini gizlət</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">\"Bağla\" dÃŧyməsi gizlidir</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">\"Bağla\" dÃŧyməsi gizlidir</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">\"Bağla\" dÃŧyməsi gÃļstərilir</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">\"Bağla\" dÃŧyməsi gÃļstərilir</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">Genişləndir və bağla dÃŧymələrini gizlət</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Genişləndir və bağla dÃŧymələrini gizlət</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"DÃŧymələr gizlidir <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"DÃŧymələr gizlidir
Genişləndirmək və ya bağlamaq ÃŧçÃŧn sÃŧrÃŧşdÃŧr"</string> Genişləndirmək və ya bağlamaq ÃŧçÃŧn sÃŧrÃŧşdÃŧr"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">Genişləndir və bağla dÃŧymələri gÃļstərilir</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Genişləndir və bağla dÃŧymələri gÃļstərilir</string>
<string name="revanced_miniplayer_hide_subtext_title">Alt mətnləri gizlət</string> <string name="revanced_miniplayer_hide_subtext_title">Alt mətnləri gizlət</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">Alt mətnlər gizlədilir</string> <string name="revanced_miniplayer_hide_subtext_summary_on">Alt mətnlər gizlədilir</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Alt mətnlər gÃļstərilir</string> <string name="revanced_miniplayer_hide_subtext_summary_off">Alt mətnlər gÃļstərilir</string>

View File

@@ -555,6 +555,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_translucent_status_bar_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃</string> <string name="revanced_disable_translucent_status_bar_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃</string>
<string name="revanced_disable_translucent_status_bar_summary_on">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string> <string name="revanced_disable_translucent_status_bar_summary_on">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string>
<string name="revanced_disable_translucent_status_bar_summary_off">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string> <string name="revanced_disable_translucent_status_bar_summary_off">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">На ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ… ĐŋҀҋĐģĐ°Đ´Đ°Ņ… ҃ĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°Đš Ņ„ŅƒĐŊĐē҆ҋҖ ĐŧĐžĐļа СĐŧŅĐŊŅ–Ņ†ŅŒ ĐŋаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– ŅŅ–ŅŅ‚ŅĐŧŅ‹ ĐŊа ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅĐ˛ĐĩŅ‚ĐģŅƒŅŽ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ</string> <string name="revanced_disable_translucent_navigation_bar_light_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅĐ˛ĐĩŅ‚ĐģŅƒŅŽ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģŅ‹Đŧ Ņ€ŅĐļŅ‹ĐŧĐĩ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģŅ‹Đŧ Ņ€ŅĐļŅ‹ĐŧĐĩ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģаК Ņ‚ŅĐŧĐĩ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģаК Ņ‚ŅĐŧĐĩ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string>
@@ -1174,14 +1175,14 @@ Second \"item\" text"</string>
ĐœŅ–ĐŊŅ–-ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐģҌĐŊŅ–Đē ĐŧĐžĐļĐŊа ĐŋĐĩŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ Са ĐŧĐĩĐļŅ‹ ŅĐēŅ€Đ°ĐŊа ŅžĐģĐĩва ҆Җ ŅžĐŋŅ€Đ°Đ˛Đ°"</string> ĐœŅ–ĐŊŅ–-ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐģҌĐŊŅ–Đē ĐŧĐžĐļĐŊа ĐŋĐĩŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ Са ĐŧĐĩĐļŅ‹ ŅĐēŅ€Đ°ĐŊа ŅžĐģĐĩва ҆Җ ŅžĐŋŅ€Đ°Đ˛Đ°"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">Đ“ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đš ĐļĐĩҁ҂ ĐŋĐĩŅ€ĐĩŅ‚Đ°ŅĐēиваĐŊĐ¸Ņ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">Đ“ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đš ĐļĐĩҁ҂ ĐŋĐĩŅ€ĐĩŅ‚Đ°ŅĐēиваĐŊĐ¸Ņ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ</string>
<string name="revanced_miniplayer_hide_expand_close_title">ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐēĐŊĐžĐŋĐē҃ СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐēĐŊĐžĐŋĐē҃ СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">КĐŊĐžĐŋĐēа СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ ҁĐēŅ€Ņ‹Ņ‚Đ°</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">КĐŊĐžĐŋĐēа СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ ҁĐēŅ€Ņ‹Ņ‚Đ°</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">КĐŊĐžĐŋĐēа СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ŅŅ</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">КĐŊĐžĐŋĐēа СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ŅŅ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐžŅ€Ņ‚Đ˛Đ°ĐŊĐŊŅ Ņ– СаĐēŅ€Ņ‹Ņ†Ņ†Ņ</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐžŅ€Ņ‚Đ˛Đ°ĐŊĐŊŅ Ņ– СаĐēŅ€Ņ‹Ņ†Ņ†Ņ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"КĐŊĐžĐŋĐēŅ– ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹ <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"КĐŊĐžĐŋĐēŅ– ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹
ĐŸŅ€Đ°Ņ†ŅĐŗĐ˛Đ°ĐšŅ†Đĩ ĐŋаĐģŅŒŅ†Đ°Đŧ, Đēай Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ айО СаĐēŅ€Ņ‹Ņ†ŅŒ"</string> ĐŸŅ€Đ°Ņ†ŅĐŗĐ˛Đ°ĐšŅ†Đĩ ĐŋаĐģŅŒŅ†Đ°Đŧ, Đēай Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ айО СаĐēŅ€Ņ‹Ņ†ŅŒ"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ Ņ– СаĐēŅ€Ņ‹Ņ†ŅŒ</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ Ņ– СаĐēŅ€Ņ‹Ņ†ŅŒ</string>
<string name="revanced_miniplayer_hide_subtext_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string> <string name="revanced_miniplayer_hide_subtext_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ĐŸĐ°Đ´Ņ‚ŅĐēҁ҂ҋ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹Ņ</string> <string name="revanced_miniplayer_hide_subtext_summary_on">ĐŸĐ°Đ´Ņ‚ŅĐēҁ҂ҋ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹Ņ</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string> <string name="revanced_miniplayer_hide_subtext_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string>

View File

@@ -555,6 +555,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_translucent_status_bar_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž</string> <string name="revanced_disable_translucent_status_bar_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž</string>
<string name="revanced_disable_translucent_status_bar_summary_on">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_status_bar_summary_on">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
<string name="revanced_disable_translucent_status_bar_summary_off">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_status_bar_summary_off">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">На ĐŊŅĐēОи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ ĐŧĐžĐļĐĩ да ĐŋŅ€ĐžĐŧĐĩĐŊи ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ĐŊа ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° ĐŊа ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ŅĐ˛ĐĩŅ‚Đģа ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string> <string name="revanced_disable_translucent_navigation_bar_light_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ŅĐ˛ĐĩŅ‚Đģа ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
@@ -1173,14 +1174,14 @@ Second \"item\" text"</string>
МиĐŊи ĐŋĐģĐĩĐšŅŠŅ€ŅŠŅ‚ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊ Đ¸ĐˇĐ˛ŅŠĐŊ ĐĩĐēŅ€Đ°ĐŊа ĐŊаĐģŅĐ˛Đž иĐģи ĐŊĐ°Đ´ŅŅĐŊĐž"</string> МиĐŊи ĐŋĐģĐĩĐšŅŠŅ€ŅŠŅ‚ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊ Đ¸ĐˇĐ˛ŅŠĐŊ ĐĩĐēŅ€Đ°ĐŊа ĐŊаĐģŅĐ˛Đž иĐģи ĐŊĐ°Đ´ŅŅĐŊĐž"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">ЖĐĩŅŅ‚ŅŠŅ‚ Са Ņ…ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊĐž ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">ЖĐĩŅŅ‚ŅŠŅ‚ Са Ņ…ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊĐž ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_miniplayer_hide_expand_close_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">ПоĐēаСаĐŊ Đĩ ĐąŅƒŅ‚ĐžĐŊ Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">ПоĐēаСаĐŊ Đĩ ĐąŅƒŅ‚ĐžĐŊ Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸ <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸
ПĐģŅŠĐˇĐŊĐĩŅ‚Đĩ, Са да Ņ€Đ°ĐˇĐŗŅŠĐŊĐĩŅ‚Đĩ иĐģи ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ"</string> ПĐģŅŠĐˇĐŊĐĩŅ‚Đĩ, Са да Ņ€Đ°ĐˇĐŗŅŠĐŊĐĩŅ‚Đĩ иĐģи ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа ŅĐ° видиĐŧи</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа ŅĐ° видиĐŧи</string>
<string name="revanced_miniplayer_hide_subtext_title">ЕĐēŅ€Đ°ĐŊĐŊи Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đĩ, ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸</string> <string name="revanced_miniplayer_hide_subtext_title">ЕĐēŅ€Đ°ĐŊĐŊи Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đĩ, ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ¸</string> <string name="revanced_miniplayer_hide_subtext_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">ПоĐēĐ°ĐˇĐ˛Đ°Ņ‚ ҁĐĩ</string> <string name="revanced_miniplayer_hide_subtext_summary_off">ПоĐēĐ°ĐˇĐ˛Đ°Ņ‚ ҁĐĩ</string>

View File

@@ -555,6 +555,7 @@ MicroG-āĻāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ
<string name="revanced_disable_translucent_status_bar_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string> <string name="revanced_disable_translucent_status_bar_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string>
<string name="revanced_disable_translucent_status_bar_summary_on">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_status_bar_summary_on">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string>
<string name="revanced_disable_translucent_status_bar_summary_off">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_status_bar_summary_off">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">āĻ•āĻŋāϛ⧁ āĻĄāĻŋāĻ­āĻžāχāϏ⧇, āĻāχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϞ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻ¸ā§āĻŦāĻšā§āĻ› āĻšā§Ÿā§‡ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻšāĻžāϞāĻ•āĻž āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string> <string name="revanced_disable_translucent_navigation_bar_light_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻšāĻžāϞāĻ•āĻž āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">āĻšāĻžāϞāĻ•āĻž āĻŽā§‹āĻĄ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">āĻšāĻžāϞāĻ•āĻž āĻŽā§‹āĻĄ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">āϞāĻžāχāϟ āĻŽā§‹āĻĄ āĻ¨ā§āϝāĻžāĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">āϞāĻžāχāϟ āĻŽā§‹āĻĄ āĻ¨ā§āϝāĻžāĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string>
@@ -1173,14 +1174,14 @@ Miniplayer āĻ¸ā§āĻ•ā§āϰāĻŋāύ⧇āϰ āϝ⧇āϕ⧋āύ⧋ āϕ⧋āϪ⧇ āϟāĻžāύ
Miniplayer āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻŽā§‡ āĻŦāĻž āĻĄāĻžāύ⧇ āϟāĻžāύāĻž āϝāĻžāĻŦ⧇"</string> Miniplayer āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻŽā§‡ āĻŦāĻž āĻĄāĻžāύ⧇ āϟāĻžāύāĻž āϝāĻžāĻŦ⧇"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">āĻ…āύ⧁āĻ­ā§‚āĻŽāĻŋāĻ• āĻĄā§āĻ°ā§āϝāĻžāĻ— āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ āĻ…āĻ•ā§āώāĻŽ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">āĻ…āύ⧁āĻ­ā§‚āĻŽāĻŋāĻ• āĻĄā§āĻ°ā§āϝāĻžāĻ— āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ āĻ…āĻ•ā§āώāĻŽ</string>
<string name="revanced_miniplayer_hide_expand_close_title">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ“ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻžāϰ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ“ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻžāϰ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"āĻŦā§‹āϤāĻžāĻŽāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āĻšāϝāĻŧ <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"āĻŦā§‹āϤāĻžāĻŽāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āĻšāϝāĻŧ
āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ•āϰāϤ⧇ āĻŦāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āϏ⧋āϝāĻŧāĻžāχāĻĒ āĻ•āϰ⧁āύ"</string> āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ•āϰāϤ⧇ āĻŦāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āϏ⧋āϝāĻŧāĻžāχāĻĒ āĻ•āϰ⧁āύ"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string>
<string name="revanced_miniplayer_hide_subtext_title">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻžāύ</string> <string name="revanced_miniplayer_hide_subtext_title">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻŋā§Ÿā§‡ āĻ°ā§Ÿā§‡āϛ⧇</string> <string name="revanced_miniplayer_hide_subtext_summary_on">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻŋā§Ÿā§‡ āĻ°ā§Ÿā§‡āϛ⧇</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">āωāĻĒāĻĒāĻžāĻ  āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string> <string name="revanced_miniplayer_hide_subtext_summary_off">āωāĻĒāĻĒāĻžāĻ  āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string>

View File

@@ -555,6 +555,7 @@ Si canviar aquesta opciÃŗ no tÊ cap efecte, prova a canviar al mode d'incÃ˛gnit
<string name="revanced_disable_translucent_status_bar_title">Desactiva la barra d\'estat translÃēcida</string> <string name="revanced_disable_translucent_status_bar_title">Desactiva la barra d\'estat translÃēcida</string>
<string name="revanced_disable_translucent_status_bar_summary_on">La barra d\'estat Ês opaca</string> <string name="revanced_disable_translucent_status_bar_summary_on">La barra d\'estat Ês opaca</string>
<string name="revanced_disable_translucent_status_bar_summary_off">La barra d\'estat Ês opaca o translÃēcida</string> <string name="revanced_disable_translucent_status_bar_summary_off">La barra d\'estat Ês opaca o translÃēcida</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">En alguns dispositius, habilitar aquesta funciÃŗ pot canviar la barra de navegaciÃŗ del sistema a transparent.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">Desactiva la barra translÃēcida de navegaciÃŗ clara</string> <string name="revanced_disable_translucent_navigation_bar_light_title">Desactiva la barra translÃēcida de navegaciÃŗ clara</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">La barra de navegaciÃŗ del mode clar Ês opaca</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">La barra de navegaciÃŗ del mode clar Ês opaca</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">La barra de navegaciÃŗ del mode clar Ês opaca o translÃēcida</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">La barra de navegaciÃŗ del mode clar Ês opaca o translÃēcida</string>
@@ -1172,14 +1173,14 @@ El minireproductor es pot arrossegar a qualsevol racÃŗ de la pantalla"</string>
El minireproductor es pot arrossegar fora de la pantalla cap a l'esquerra o la dreta"</string> El minireproductor es pot arrossegar fora de la pantalla cap a l'esquerra o la dreta"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">Gest d\'arrossegar horitzontalment deshabilitat</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">Gest d\'arrossegar horitzontalment deshabilitat</string>
<string name="revanced_miniplayer_hide_expand_close_title">Amaga el botÃŗ de tancament</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">Amaga el botÃŗ de tancament</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">El botÃŗ de tancament està amagat</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">El botÃŗ de tancament està amagat</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">El botÃŗ de tancament es mostra</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">El botÃŗ de tancament es mostra</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">Amaga els botons d\'expansiÃŗ i tancament</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Amaga els botons d\'expansiÃŗ i tancament</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"Els botons estan ocults <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Els botons estan ocults
Desliza para ampliar o cerrar"</string> Desliza para ampliar o cerrar"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">Els botons d\'expansiÃŗ i tancament es mostren</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Els botons d\'expansiÃŗ i tancament es mostren</string>
<string name="revanced_miniplayer_hide_subtext_title">Amaga els subtítols</string> <string name="revanced_miniplayer_hide_subtext_title">Amaga els subtítols</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">Els subtítols estan amagats</string> <string name="revanced_miniplayer_hide_subtext_summary_on">Els subtítols estan amagats</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Els subtítols es mostren</string> <string name="revanced_miniplayer_hide_subtext_summary_off">Els subtítols es mostren</string>

Some files were not shown because too many files have changed in this diff Show More