Compare commits

..

23 Commits

Author SHA1 Message Date
semantic-release-bot
2d8f5641f9 chore: Release v5.29.0-dev.3 [skip ci]
# [5.29.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.2...v5.29.0-dev.3) (2025-06-23)

### Bug Fixes

* **YouTube:** Fix refactoring app startup exception ([0dbd058](0dbd058099))
2025-06-23 09:18:27 +00:00
LisoUseInAIKyrios
0dbd058099 fix(YouTube): Fix refactoring app startup exception 2025-06-23 13:15:43 +04:00
semantic-release-bot
c1a8fd0766 chore: Release v5.29.0-dev.2 [skip ci]
# [5.29.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.1...v5.29.0-dev.2) (2025-06-23)

### Features

* **Crunchyroll:** Add `Hide ads` patch ([#5201](https://github.com/ReVanced/revanced-patches/issues/5201)) ([d338989](d338989cb4))
2025-06-23 08:47:04 +00:00
hoodles
d338989cb4 feat(Crunchyroll): Add Hide ads patch (#5201) 2025-06-23 12:44:07 +04:00
github-actions[bot]
b94daacf01 chore: Sync translations (#5236) 2025-06-23 12:43:45 +04:00
semantic-release-bot
c764c4f197 chore: Release v5.29.0-dev.1 [skip ci]
# [5.29.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.1-dev.2...v5.29.0-dev.1) (2025-06-23)

### Bug Fixes

* **YouTube:** Always use single threaded layout to resolve layout bugs in unpatched YouTube ([#5226](https://github.com/ReVanced/revanced-patches/issues/5226)) ([ccd1691](ccd169121a))

### Features

* **YouTube:** Add an option to disable toasts when changing default playback speed or quality ([#5230](https://github.com/ReVanced/revanced-patches/issues/5230)) ([6b719df](6b719dfcd7))
2025-06-23 08:24:13 +00:00
MarcaD
6b719dfcd7 feat(YouTube): Add an option to disable toasts when changing default playback speed or quality (#5230) 2025-06-23 12:20:37 +04:00
LisoUseInAIKyrios
ccd169121a fix(YouTube): Always use single threaded layout to resolve layout bugs in unpatched YouTube (#5226) 2025-06-23 12:19:07 +04:00
semantic-release-bot
dcfbd8bf93 chore: Release v5.28.1-dev.2 [skip ci]
## [5.28.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.28.1-dev.1...v5.28.1-dev.2) (2025-06-23)

### Bug Fixes

* **YouTube - Hide ads:** Hide new type of product ad in video description ([#5225](https://github.com/ReVanced/revanced-patches/issues/5225)) ([b656976](b65697603d))
2025-06-23 07:19:38 +00:00
ILoveOpenSourceApplications
b65697603d fix(YouTube - Hide ads): Hide new type of product ad in video description (#5225) 2025-06-23 11:17:08 +04:00
semantic-release-bot
25da5cca8b chore: Release v5.28.1-dev.1 [skip ci]
## [5.28.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.0...v5.28.1-dev.1) (2025-06-22)

### Bug Fixes

* Add scrollable content to modern style settings dialogs ([#5211](https://github.com/ReVanced/revanced-patches/issues/5211)) ([2b62fc2](2b62fc2224))
2025-06-22 11:23:52 +00:00
MarcaD
2b62fc2224 fix: Add scrollable content to modern style settings dialogs (#5211) 2025-06-22 15:21:00 +04:00
semantic-release-bot
a9e9456b6b chore: Release v5.28.0 [skip ci]
# [5.28.0](https://github.com/ReVanced/revanced-patches/compare/v5.27.0...v5.28.0) (2025-06-20)

### Bug Fixes

* **Google Photos:** Resolve startup crash if MicroG GmsCore does not already have granted permissions ([1cea6bf](1cea6bfdff))
* **Messenger - Remove Meta AI:** Improve patch logic ([#5153](https://github.com/ReVanced/revanced-patches/issues/5153)) ([a8d2a1e](a8d2a1e028))
* **Pandora - Disable ads:** Support latest app target ([#5185](https://github.com/ReVanced/revanced-patches/issues/5185)) ([90868ff](90868ff025))
* **Spotify:** Fix `Hide Create button` and `Sanitize sharing links` for older but supported app targets ([#5159](https://github.com/ReVanced/revanced-patches/issues/5159)) ([5540136](55401368b8))
* **Threads - Hide ads:** Constrain patch to the last working app target ([#5189](https://github.com/ReVanced/revanced-patches/issues/5189)) ([e138501](e138501657))
* **YouTube:** Remove old app targets that are no longer supported by YouTube ([#5192](https://github.com/ReVanced/revanced-patches/issues/5192)) ([e790cfb](e790cfbf59))

### Features

* **Spotify:** Add `Change lyrics provider` patch ([#4937](https://github.com/ReVanced/revanced-patches/issues/4937)) ([7bbaca7](7bbaca77ad))
* Use modern style settings dialogs ([#5109](https://github.com/ReVanced/revanced-patches/issues/5109)) ([a426e2a](a426e2af50))
2025-06-20 08:17:57 +00:00
LisoUseInAIKyrios
b01523e97d chore: Merge branch dev to main (#5160) 2025-06-20 12:14:29 +04:00
github-actions[bot]
b8afb4e821 chore: Sync translations (#5210) 2025-06-20 12:13:39 +04:00
github-actions[bot]
0d2198faed chore: Sync translations (#5207) 2025-06-20 01:33:20 +04:00
semantic-release-bot
5c7c407b82 chore: Release v5.28.0-dev.8 [skip ci]
# [5.28.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.7...v5.28.0-dev.8) (2025-06-19)

### Bug Fixes

* **Messenger - Remove Meta AI:** Improve patch logic ([#5153](https://github.com/ReVanced/revanced-patches/issues/5153)) ([a8d2a1e](a8d2a1e028))
2025-06-19 06:10:06 +00:00
Dawid Krajcarz
a8d2a1e028 fix(Messenger - Remove Meta AI): Improve patch logic (#5153) 2025-06-19 10:06:46 +04:00
semantic-release-bot
d31624cae8 chore: Release v5.28.0-dev.7 [skip ci]
# [5.28.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.6...v5.28.0-dev.7) (2025-06-18)

### Bug Fixes

* **YouTube:** Remove old app targets that are no longer supported by YouTube ([#5192](https://github.com/ReVanced/revanced-patches/issues/5192)) ([e790cfb](e790cfbf59))
2025-06-18 10:38:43 +00:00
LisoUseInAIKyrios
e790cfbf59 fix(YouTube): Remove old app targets that are no longer supported by YouTube (#5192) 2025-06-18 12:35:43 +02:00
LisoUseInAIKyrios
a54d408d3e chore: Fix string typos, fix missing long/wide returnEarly/returnLate 2025-06-18 11:06:48 +02:00
semantic-release-bot
5d3769e921 chore: Release v5.28.0-dev.6 [skip ci]
# [5.28.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.5...v5.28.0-dev.6) (2025-06-17)

### Bug Fixes

* **Threads - Hide ads:** Constrain patch to the last working app target ([#5189](https://github.com/ReVanced/revanced-patches/issues/5189)) ([e138501](e138501657))
2025-06-17 21:07:00 +00:00
LisoUseInAIKyrios
e138501657 fix(Threads - Hide ads): Constrain patch to the last working app target (#5189) 2025-06-17 23:03:35 +02:00
138 changed files with 958 additions and 2128 deletions

View File

@@ -1,3 +1,82 @@
# [5.29.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.2...v5.29.0-dev.3) (2025-06-23)
### Bug Fixes
* **YouTube:** Fix refactoring app startup exception ([1b00c90](https://github.com/ReVanced/revanced-patches/commit/1b00c907f4b90f4659afb4a54ba61ac2835b460d))
# [5.29.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.1...v5.29.0-dev.2) (2025-06-23)
### Features
* **Crunchyroll:** Add `Hide ads` patch ([#5201](https://github.com/ReVanced/revanced-patches/issues/5201)) ([46b4398](https://github.com/ReVanced/revanced-patches/commit/46b4398fd6ca223391ed8f497a8347c2313421b7))
# [5.29.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.1-dev.2...v5.29.0-dev.1) (2025-06-23)
### Bug Fixes
* **YouTube:** Always use single threaded layout to resolve layout bugs in unpatched YouTube ([#5226](https://github.com/ReVanced/revanced-patches/issues/5226)) ([1f539b1](https://github.com/ReVanced/revanced-patches/commit/1f539b1396526b2c767d77a804bd0308ee4a42ec))
### Features
* **YouTube:** Add an option to disable toasts when changing default playback speed or quality ([#5230](https://github.com/ReVanced/revanced-patches/issues/5230)) ([c68cde3](https://github.com/ReVanced/revanced-patches/commit/c68cde3a896450874cc571be5c4723387db96032))
## [5.28.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.28.1-dev.1...v5.28.1-dev.2) (2025-06-23)
### Bug Fixes
* **YouTube - Hide ads:** Hide new type of product ad in video description ([#5225](https://github.com/ReVanced/revanced-patches/issues/5225)) ([1e2efad](https://github.com/ReVanced/revanced-patches/commit/1e2efad7b2714c395ed6b0a77cbbf8a2265df520))
## [5.28.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.28.0...v5.28.1-dev.1) (2025-06-22)
### Bug Fixes
* Add scrollable content to modern style settings dialogs ([#5211](https://github.com/ReVanced/revanced-patches/issues/5211)) ([e6876d5](https://github.com/ReVanced/revanced-patches/commit/e6876d510d28f6a3a41ec1722a033b3e30a22c65))
# [5.28.0](https://github.com/ReVanced/revanced-patches/compare/v5.27.0...v5.28.0) (2025-06-20)
### Bug Fixes
* **Google Photos:** Resolve startup crash if MicroG GmsCore does not already have granted permissions ([a93d74d](https://github.com/ReVanced/revanced-patches/commit/a93d74d26e7ef87a3745df2b9fe82722d65a0e59))
* **Messenger - Remove Meta AI:** Improve patch logic ([#5153](https://github.com/ReVanced/revanced-patches/issues/5153)) ([4ad4887](https://github.com/ReVanced/revanced-patches/commit/4ad488744d87543c31e453dc7b6d8182b3a7f440))
* **Pandora - Disable ads:** Support latest app target ([#5185](https://github.com/ReVanced/revanced-patches/issues/5185)) ([ca83047](https://github.com/ReVanced/revanced-patches/commit/ca83047f5c4acbb267d5b98db80ad111999086e0))
* **Spotify:** Fix `Hide Create button` and `Sanitize sharing links` for older but supported app targets ([#5159](https://github.com/ReVanced/revanced-patches/issues/5159)) ([e7dd061](https://github.com/ReVanced/revanced-patches/commit/e7dd061c513af90861c0ab0d7adc6ee43be57ce2))
* **Threads - Hide ads:** Constrain patch to the last working app target ([#5189](https://github.com/ReVanced/revanced-patches/issues/5189)) ([3558c44](https://github.com/ReVanced/revanced-patches/commit/3558c44a05c13f19fefdbbf14b364181a79f17c0))
* **YouTube:** Remove old app targets that are no longer supported by YouTube ([#5192](https://github.com/ReVanced/revanced-patches/issues/5192)) ([c9e54e1](https://github.com/ReVanced/revanced-patches/commit/c9e54e1d36243945ac1ec3108fe38edf0e15d772))
### Features
* **Spotify:** Add `Change lyrics provider` patch ([#4937](https://github.com/ReVanced/revanced-patches/issues/4937)) ([8736b6a](https://github.com/ReVanced/revanced-patches/commit/8736b6a80b48cb1f4562c9f9919804006ddb18bd))
* Use modern style settings dialogs ([#5109](https://github.com/ReVanced/revanced-patches/issues/5109)) ([312b6dc](https://github.com/ReVanced/revanced-patches/commit/312b6dc04e01c2758cd304ca8606306027aa2f01))
# [5.28.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.7...v5.28.0-dev.8) (2025-06-19)
### Bug Fixes
* **Messenger - Remove Meta AI:** Improve patch logic ([#5153](https://github.com/ReVanced/revanced-patches/issues/5153)) ([4ad4887](https://github.com/ReVanced/revanced-patches/commit/4ad488744d87543c31e453dc7b6d8182b3a7f440))
# [5.28.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.6...v5.28.0-dev.7) (2025-06-18)
### Bug Fixes
* **YouTube:** Remove old app targets that are no longer supported by YouTube ([#5192](https://github.com/ReVanced/revanced-patches/issues/5192)) ([c9e54e1](https://github.com/ReVanced/revanced-patches/commit/c9e54e1d36243945ac1ec3108fe38edf0e15d772))
# [5.28.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.5...v5.28.0-dev.6) (2025-06-17)
### Bug Fixes
* **Threads - Hide ads:** Constrain patch to the last working app target ([#5189](https://github.com/ReVanced/revanced-patches/issues/5189)) ([3558c44](https://github.com/ReVanced/revanced-patches/commit/3558c44a05c13f19fefdbbf14b364181a79f17c0))
# [5.28.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.28.0-dev.4...v5.28.0-dev.5) (2025-06-17)

View File

@@ -1,15 +1,23 @@
package app.revanced.extension.messenger.metaai;
import java.util.*;
import app.revanced.extension.shared.Logger;
@SuppressWarnings("unused")
public class RemoveMetaAIPatch {
private static final Set<Long> loggedIDs = Collections.synchronizedSet(new HashSet<>());
public static boolean overrideBooleanFlag(long id, boolean value) {
// This catches all flag IDs related to Meta AI.
// The IDs change slightly with every update,
// so to work around this, IDs from different versions were compared
// to find what they have in common, which turned out to be those first bits.
// TODO: Find the specific flags that we care about and patch the code they control instead.
if ((id & 0x7FFFFFC000000000L) == 0x810A8000000000L) {
return false;
try {
if (Long.toString(id).startsWith("REPLACED_BY_PATCH")) {
if (loggedIDs.add(id))
Logger.printInfo(() -> "Overriding " + id + " from " + value + " to false");
return false;
}
} catch (Exception ex) {
Logger.printException(() -> "overrideBooleanFlag failure", ex);
}
return value;

View File

@@ -42,6 +42,7 @@ import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;
@@ -773,16 +774,15 @@ public class Utils {
Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // Remove default title bar.
// Create main layout.
LinearLayout mainLayout = new LinearLayout(context);
mainLayout.setOrientation(LinearLayout.VERTICAL);
// Preset size constants.
final int dip4 = dipToPixels(4);
final int dip8 = dipToPixels(8);
final int dip16 = dipToPixels(16);
final int dip24 = dipToPixels(24);
// Create main layout.
LinearLayout mainLayout = new LinearLayout(context);
mainLayout.setOrientation(LinearLayout.VERTICAL);
mainLayout.setPadding(dip24, dip16, dip24, dip24);
// Set rounded rectangle background.
ShapeDrawable mainBackground = new ShapeDrawable(new RoundRectShape(
@@ -802,55 +802,71 @@ public class Utils {
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
layoutParams.setMargins(0, 0, 0, dip8);
layoutParams.setMargins(0, 0, 0, dip16);
titleView.setLayoutParams(layoutParams);
mainLayout.addView(titleView);
}
// Message (if not replaced by EditText).
if (editText == null && message != null) {
TextView messageView = new TextView(context);
messageView.setText(message); // Supports Spanned (HTML).
messageView.setTextSize(16);
messageView.setTextColor(getAppForegroundColor());
// Enable HTML link clicking if the message contains links.
if (message instanceof Spanned) {
messageView.setMovementMethod(LinkMovementMethod.getInstance());
// Create content container (message/EditText) inside a ScrollView only if message or editText is provided.
ScrollView contentScrollView = null;
LinearLayout contentContainer = null;
if (message != null || editText != null) {
contentScrollView = new ScrollView(context);
contentScrollView.setVerticalScrollBarEnabled(false); // Disable the vertical scrollbar.
contentScrollView.setOverScrollMode(View.OVER_SCROLL_NEVER);
if (editText != null) {
ShapeDrawable scrollViewBackground = new ShapeDrawable(new RoundRectShape(
createCornerRadii(10), null, null));
scrollViewBackground.getPaint().setColor(getEditTextBackground());
contentScrollView.setPadding(dip8, dip8, dip8, dip8);
contentScrollView.setBackground(scrollViewBackground);
contentScrollView.setClipToOutline(true);
}
LinearLayout.LayoutParams messageParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams contentParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
0,
1.0f // Weight to take available space.
);
messageParams.setMargins(0, dip8, 0, dip16);
messageView.setLayoutParams(messageParams);
mainLayout.addView(messageView);
}
contentScrollView.setLayoutParams(contentParams);
contentContainer = new LinearLayout(context);
contentContainer.setOrientation(LinearLayout.VERTICAL);
contentScrollView.addView(contentContainer);
// EditText (if provided).
if (editText != null) {
// Remove EditText from its current parent, if any.
ViewGroup parent = (ViewGroup) editText.getParent();
if (parent != null) {
parent.removeView(editText);
// Message (if not replaced by EditText).
if (editText == null && message != null) {
TextView messageView = new TextView(context);
messageView.setText(message); // Supports Spanned (HTML).
messageView.setTextSize(16);
messageView.setTextColor(getAppForegroundColor());
// Enable HTML link clicking if the message contains links.
if (message instanceof Spanned) {
messageView.setMovementMethod(LinkMovementMethod.getInstance());
}
LinearLayout.LayoutParams messageParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);
messageView.setLayoutParams(messageParams);
contentContainer.addView(messageView);
}
// Style the EditText to match the dialog theme.
editText.setTextColor(getAppForegroundColor());
editText.setBackgroundColor(isDarkModeEnabled() ? Color.BLACK : Color.WHITE);
editText.setPadding(dip8, dip8, dip8, dip8);
ShapeDrawable editTextBackground = new ShapeDrawable(new RoundRectShape(
createCornerRadii(10), null, null));
editTextBackground.getPaint().setColor(getEditTextBackground()); // Background color for EditText.
editText.setBackground(editTextBackground);
LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
editTextParams.setMargins(0, dip8, 0, dip16);
// Prevent buttons from moving off the screen by fixing the height of the EditText.
final int maxHeight = (int) (context.getResources().getDisplayMetrics().heightPixels * 0.6);
editText.setMaxHeight(maxHeight);
mainLayout.addView(editText, 1, editTextParams);
// EditText (if provided).
if (editText != null) {
// Remove EditText from its current parent, if any.
ViewGroup parent = (ViewGroup) editText.getParent();
if (parent != null) {
parent.removeView(editText);
}
// Style the EditText to match the dialog theme.
editText.setTextColor(getAppForegroundColor());
editText.setBackgroundColor(Color.TRANSPARENT);
editText.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
contentContainer.addView(editText, editTextParams);
}
}
// Button container.
@@ -861,7 +877,7 @@ public class Utils {
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
buttonContainerParams.setMargins(0, dip8, 0, 0);
buttonContainerParams.setMargins(0, dip16, 0, 0);
buttonContainer.setLayoutParams(buttonContainerParams);
// Lists to track buttons.
@@ -1036,25 +1052,29 @@ public class Utils {
}
}
// Add ScrollView to main layout only if content exist.
if (contentScrollView != null) {
mainLayout.addView(contentScrollView);
}
mainLayout.addView(buttonContainer);
dialog.setContentView(mainLayout);
// Set dialog window attributes.
Window window = dialog.getWindow();
if (window != null) {
setDialogWindowParameters(context, window);
setDialogWindowParameters(window);
}
return new Pair<>(dialog, mainLayout);
}
public static void setDialogWindowParameters(Context context, Window window) {
public static void setDialogWindowParameters(Window window) {
WindowManager.LayoutParams params = window.getAttributes();
Resources resources = context.getResources();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
int portraitWidth = (int) (displayMetrics.widthPixels * 0.9);
if (resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
if (Resources.getSystem().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
portraitWidth = (int) Math.min(portraitWidth, displayMetrics.heightPixels * 0.9);
}
params.width = portraitWidth;
@@ -1199,7 +1219,7 @@ public class Utils {
return darkColor == Color.BLACK
// Lighten the background a little if using AMOLED dark theme
// as the dialogs are almost invisible.
? 0xFF0D0D0D
? 0xFF080808 // 3%
: darkColor;
}
return getThemeLightColor();

View File

@@ -129,8 +129,7 @@ abstract class Check {
ImageView iconView = new ImageView(activity);
iconView.setImageResource(Utils.getResourceIdentifier("revanced_ic_dialog_alert", "drawable"));
iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN);
final int dip8 = dipToPixels(8);
iconView.setPadding(0, dip8, 0, dip8);
iconView.setPadding(0, 0, 0, 0);
LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT

View File

@@ -24,10 +24,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.*;
import androidx.annotation.ColorInt;
@@ -298,7 +295,6 @@ public class ColorPickerPreference extends EditTextPreference {
// Horizontal layout for preview and EditText.
LinearLayout inputLayout = new LinearLayout(context);
inputLayout.setOrientation(LinearLayout.HORIZONTAL);
inputLayout.setPadding(0, 0, 0, dipToPixels(10));
dialogColorPreview = new TextView(context);
LinearLayout.LayoutParams previewParams = new LinearLayout.LayoutParams(
@@ -338,11 +334,23 @@ public class ColorPickerPreference extends EditTextPreference {
paddingView.setLayoutParams(params);
inputLayout.addView(paddingView);
// Create main container for color picker and input layout.
LinearLayout container = new LinearLayout(context);
container.setOrientation(LinearLayout.VERTICAL);
container.addView(colorPicker);
container.addView(inputLayout);
// Create content container for color picker and input layout.
LinearLayout contentContainer = new LinearLayout(context);
contentContainer.setOrientation(LinearLayout.VERTICAL);
contentContainer.addView(colorPicker);
contentContainer.addView(inputLayout);
// Create ScrollView to wrap the content container.
ScrollView contentScrollView = new ScrollView(context);
contentScrollView.setVerticalScrollBarEnabled(false); // Disable vertical scrollbar.
contentScrollView.setOverScrollMode(View.OVER_SCROLL_NEVER); // Disable overscroll effect.
LinearLayout.LayoutParams scrollViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
0,
1.0f
);
contentScrollView.setLayoutParams(scrollViewParams);
contentScrollView.addView(contentContainer);
// Create custom dialog.
final int originalColor = currentColor & 0x00FFFFFF;
@@ -391,9 +399,9 @@ public class ColorPickerPreference extends EditTextPreference {
false // Do not dismiss dialog when onNeutralClick.
);
// Add the custom container to the dialog's main layout.
// Add the ScrollView to the dialog's main layout.
LinearLayout dialogMainLayout = dialogPair.second;
dialogMainLayout.addView(container, 1);
dialogMainLayout.addView(contentScrollView, dialogMainLayout.getChildCount() - 1);
// Set up color picker listener with debouncing.
// Add listener last to prevent callbacks from set calls above.

View File

@@ -11,11 +11,7 @@ import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.*;
import androidx.annotation.NonNull;
@@ -107,14 +103,16 @@ public class CustomDialogListPreference extends ListPreference {
@Override
protected void showDialog(Bundle state) {
Context context = getContext();
// Create ListView.
ListView listView = new ListView(getContext());
ListView listView = new ListView(context);
listView.setId(android.R.id.list);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// Create custom adapter for the ListView.
ListPreferenceArrayAdapter adapter = new ListPreferenceArrayAdapter(
getContext(),
context,
Utils.getResourceIdentifier("revanced_custom_list_item_checked", "layout"),
getEntries(),
getEntryValues(),
@@ -137,7 +135,7 @@ public class CustomDialogListPreference extends ListPreference {
// Create the custom dialog without OK button.
Pair<Dialog, LinearLayout> dialogPair = Utils.createCustomDialog(
getContext(),
context,
getTitle() != null ? getTitle().toString() : "",
null,
null,
@@ -149,35 +147,13 @@ public class CustomDialogListPreference extends ListPreference {
true
);
Dialog dialog = dialogPair.first;
// Add the ListView to the main layout.
LinearLayout mainLayout = dialogPair.second;
// Measure content height before adding ListView to layout.
// Otherwise, the ListView will push the buttons off the screen.
int totalHeight = 0;
int widthSpec = View.MeasureSpec.makeMeasureSpec(
getContext().getResources().getDisplayMetrics().widthPixels,
View.MeasureSpec.AT_MOST
);
int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, listView);
listItem.measure(widthSpec, heightSpec);
totalHeight += listItem.getMeasuredHeight();
}
// Cap the height at maxHeight.
int maxHeight = (int) (getContext().getResources().getDisplayMetrics().heightPixels * 0.6);
int finalHeight = Math.min(totalHeight, maxHeight);
// Add ListView to the main layout with calculated height.
LinearLayout.LayoutParams listViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
finalHeight // Use calculated height directly.
0,
1.0f
);
final int marginHorizontal = dipToPixels(8);
listViewParams.setMargins(0, marginHorizontal, 0, marginHorizontal);
mainLayout.addView(listView, mainLayout.getChildCount() - 1, listViewParams);
// Handle item click to select value and dismiss dialog.
@@ -188,10 +164,10 @@ public class CustomDialogListPreference extends ListPreference {
adapter.setSelectedValue(selectedValue);
adapter.notifyDataSetChanged();
}
dialog.dismiss();
dialogPair.first.dismiss();
});
// Show the dialog.
dialog.show();
dialogPair.first.show();
}
}

View File

@@ -17,6 +17,7 @@ import android.os.Handler;
import android.os.Looper;
import android.preference.Preference;
import android.util.AttributeSet;
import android.view.View;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@@ -216,6 +217,8 @@ class WebViewDialog extends Dialog {
// Create WebView.
WebView webView = new WebView(getContext());
webView.setVerticalScrollBarEnabled(false); // Disable the vertical scrollbar.
webView.setOverScrollMode(View.OVER_SCROLL_NEVER);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new OpenLinksExternallyWebClient());
webView.loadDataWithBaseURL(null, htmlContent, "text/html", "utf-8", null);
@@ -228,7 +231,7 @@ class WebViewDialog extends Dialog {
// Set dialog window attributes
Window window = getWindow();
if (window != null) {
Utils.setDialogWindowParameters(getContext(), window);
Utils.setDialogWindowParameters(window);
}
}

View File

@@ -7,11 +7,17 @@ public class VersionCheckPatch {
return Utils.getAppVersionName().compareTo(version) >= 0;
}
@Deprecated
public static final boolean IS_19_17_OR_GREATER = isVersionOrGreater("19.17.00");
@Deprecated
public static final boolean IS_19_20_OR_GREATER = isVersionOrGreater("19.20.00");
@Deprecated
public static final boolean IS_19_21_OR_GREATER = isVersionOrGreater("19.21.00");
@Deprecated
public static final boolean IS_19_26_OR_GREATER = isVersionOrGreater("19.26.00");
@Deprecated
public static final boolean IS_19_29_OR_GREATER = isVersionOrGreater("19.29.00");
@Deprecated
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

@@ -121,12 +121,14 @@ public final class AdsFilter extends Filter {
playerShoppingShelf = new StringFilterGroup(
Settings.HIDE_PLAYER_STORE_SHELF,
"expandable_list.eml",
"horizontal_shelf.eml"
);
playerShoppingShelfBuffer = new ByteArrayFilterGroup(
null,
"shopping_item_card_list.eml"
"shopping_link_item",
"shopping_item_card_list"
);
channelProfile = new StringFilterGroup(

View File

@@ -74,6 +74,27 @@ public final class LithoFilterPatch {
}
}
/**
* Litho layout fixed thread pool size override.
* <p>
* Unpatched YouTube uses a layout fixed thread pool between 1 and 3 threads:
* <pre>
* 1 thread - > Device has less than 6 cores
* 2 threads -> Device has over 6 cores and less than 6GB of memory
* 3 threads -> Device has over 6 cores and more than 6GB of memory
* </pre>
*
* Using more than 1 thread causes layout issues such as the You tab watch/playlist shelf
* that is sometimes incorrectly hidden (ReVanced is not hiding it), and seems to
* fix a race issue if using the active navigation tab status with litho filtering.
*/
private static final int LITHO_LAYOUT_THREAD_POOL_SIZE = 1;
/**
* Placeholder for actual filters.
*/
private static final class DummyFilter extends Filter { }
private static final Filter[] filters = new Filter[] {
new DummyFilter() // Replaced by patch.
};
@@ -213,9 +234,28 @@ public final class LithoFilterPatch {
return false;
}
}
/**
* Placeholder for actual filters.
*/
final class DummyFilter extends Filter { }
/**
* Injection point.
*/
public static int getExecutorCorePoolSize(int originalCorePoolSize) {
if (originalCorePoolSize != LITHO_LAYOUT_THREAD_POOL_SIZE) {
Logger.printDebug(() -> "Overriding core thread pool size from: " + originalCorePoolSize
+ " to: " + LITHO_LAYOUT_THREAD_POOL_SIZE);
}
return LITHO_LAYOUT_THREAD_POOL_SIZE;
}
/**
* Injection point.
*/
public static int getExecutorMaxThreads(int originalMaxThreads) {
if (originalMaxThreads != LITHO_LAYOUT_THREAD_POOL_SIZE) {
Logger.printDebug(() -> "Overriding max thread pool size from: " + originalMaxThreads
+ " to: " + LITHO_LAYOUT_THREAD_POOL_SIZE);
}
return LITHO_LAYOUT_THREAD_POOL_SIZE;
}
}

View File

@@ -64,10 +64,11 @@ public class RememberVideoQualityPatch {
else videoQualityWifi.save(defaultQuality);
networkTypeMessage = str("revanced_remember_video_quality_wifi");
}
Utils.showToastShort(str(
useShortsPreference ? "revanced_remember_video_quality_toast_shorts" : "revanced_remember_video_quality_toast",
networkTypeMessage, (defaultQuality + "p")
));
if (Settings.REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST.get())
Utils.showToastShort(str(
useShortsPreference ? "revanced_remember_video_quality_toast_shorts" : "revanced_remember_video_quality_toast",
networkTypeMessage, (defaultQuality + "p")
));
}
/**

View File

@@ -617,9 +617,9 @@ public class CustomPlaybackSpeedPatch {
* @return The rounded speed, constrained to the specified bounds.
*/
private static float roundSpeedToNearestIncrement(float speed) {
// Round to nearest 0.05 speed.
final float roundedSpeed = Math.round(speed / 0.05f) * 0.05f;
return Utils.clamp(roundedSpeed, 0.05f, PLAYBACK_SPEED_MAXIMUM);
// Round to nearest 0.05 speed. Must use double precision otherwise rounding error can occur.
final double roundedSpeed = Math.round(speed / 0.05) * 0.05;
return Utils.clamp((float) roundedSpeed, 0.05f, PLAYBACK_SPEED_MAXIMUM);
}
/**

View File

@@ -57,7 +57,8 @@ public final class RememberPlaybackSpeedPatch {
}
Settings.PLAYBACK_SPEED_DEFAULT.save(finalPlaybackSpeed);
Utils.showToastShort(str("revanced_remember_playback_speed_toast", (finalPlaybackSpeed + "x")));
if (Settings.REMEMBER_PLAYBACK_SPEED_LAST_SELECTED_TOAST.get())
Utils.showToastShort(str("revanced_remember_playback_speed_toast", (finalPlaybackSpeed + "x")));
}, TOAST_DELAY_MILLISECONDS);
}
} catch (Exception ex) {

View File

@@ -19,6 +19,7 @@ import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toolbar;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import java.util.ArrayList;
@@ -58,11 +59,7 @@ public class SearchViewController {
GradientDrawable background = new GradientDrawable();
background.setShape(GradientDrawable.RECTANGLE);
background.setCornerRadius(28 * context.getResources().getDisplayMetrics().density); // 28dp corner radius.
int baseColor = Utils.getAppBackgroundColor();
int adjustedColor = Utils.isDarkModeEnabled()
? Utils.adjustColorBrightness(baseColor, 1.11f) // Lighten for dark theme.
: Utils.adjustColorBrightness(baseColor, 0.95f); // Darken for light theme.
background.setColor(adjustedColor);
background.setColor(getSearchViewBackground());
return background;
}
@@ -72,10 +69,17 @@ public class SearchViewController {
private static GradientDrawable createSuggestionBackgroundDrawable(Context context) {
GradientDrawable background = new GradientDrawable();
background.setShape(GradientDrawable.RECTANGLE);
background.setCornerRadius(8 * context.getResources().getDisplayMetrics().density); // 8dp corner radius.
background.setColor(getSearchViewBackground());
return background;
}
@ColorInt
public static int getSearchViewBackground() {
return Utils.isDarkModeEnabled()
? Utils.adjustColorBrightness(Utils.getDialogBackgroundColor(), 1.11f)
: Utils.adjustColorBrightness(Utils.getThemeLightColor(), 0.95f);
}
/**
* Adds search view components to the activity.
*/

View File

@@ -52,6 +52,8 @@ public class Settings extends BaseSettings {
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2);
public static final IntegerSetting VIDEO_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2);
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE);
public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_video_quality_last_selected_toast", TRUE, false,
parent(REMEMBER_VIDEO_QUALITY_LAST_SELECTED));
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_shorts_quality_default_wifi", -2, true);
public static final IntegerSetting SHORTS_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_shorts_quality_default_mobile", -2, true);
public static final BooleanSetting REMEMBER_SHORTS_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_shorts_quality_last_selected", FALSE);
@@ -60,6 +62,8 @@ public class Settings extends BaseSettings {
// Speed
public static final FloatSetting SPEED_TAP_AND_HOLD = new FloatSetting("revanced_speed_tap_and_hold", 2.0f, true);
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED = new BooleanSetting("revanced_remember_playback_speed_last_selected", FALSE);
public static final BooleanSetting REMEMBER_PLAYBACK_SPEED_LAST_SELECTED_TOAST = new BooleanSetting("revanced_remember_playback_speed_last_selected_toast", TRUE, false,
parent(REMEMBER_PLAYBACK_SPEED_LAST_SELECTED));
public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE);
public static final FloatSetting PLAYBACK_SPEED_DEFAULT = new FloatSetting("revanced_playback_speed_default", -2.0f);
public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds",

View File

@@ -18,12 +18,7 @@ import android.text.TextWatcher;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.*;
import androidx.annotation.ColorInt;
@@ -88,8 +83,6 @@ public class SegmentCategoryListPreference extends ListPreference {
// Create the main layout for the dialog content.
LinearLayout contentLayout = new LinearLayout(context);
contentLayout.setOrientation(LinearLayout.VERTICAL);
final int dip10 = dipToPixels(10);
contentLayout.setPadding(0, 0, 0, dip10);
// Add behavior selection radio buttons.
RadioGroup radioGroup = new RadioGroup(context);
@@ -103,7 +96,7 @@ public class SegmentCategoryListPreference extends ListPreference {
radioGroup.addView(radioButton);
}
radioGroup.setOnCheckedChangeListener((group, checkedId) -> selectedDialogEntryIndex = checkedId);
radioGroup.setPadding(dip10, 0, 0, 0);
radioGroup.setPadding(dipToPixels(10), 0, 0, 0);
contentLayout.addView(radioGroup);
// Inflate the color picker view.
@@ -131,7 +124,7 @@ public class SegmentCategoryListPreference extends ListPreference {
gridParams = new GridLayout.LayoutParams();
gridParams.rowSpec = GridLayout.spec(0); // First row.
gridParams.columnSpec = GridLayout.spec(1); // Second column.
gridParams.setMargins(0, 0, dip10, 0);
gridParams.setMargins(0, 0, dipToPixels(10), 0);
dialogColorDotView = new TextView(context);
dialogColorDotView.setLayoutParams(gridParams);
gridLayout.addView(dialogColorDotView);
@@ -250,20 +243,17 @@ public class SegmentCategoryListPreference extends ListPreference {
contentLayout.addView(gridLayout);
// Set up color picker listener.
// Do last to prevent listener callbacks while setting up view.
dialogColorPickerView.setOnColorChangedListener(color -> {
if (categoryColor == color) {
return;
}
categoryColor = color;
String hexColor = getColorString(color);
Logger.printDebug(() -> "onColorChanged: " + hexColor);
updateCategoryColorDot();
dialogColorEditText.setText(hexColor);
dialogColorEditText.setSelection(hexColor.length());
});
// Create ScrollView to wrap the content layout.
ScrollView contentScrollView = new ScrollView(context);
contentScrollView.setVerticalScrollBarEnabled(false); // Disable vertical scrollbar.
contentScrollView.setOverScrollMode(View.OVER_SCROLL_NEVER); // Disable overscroll effect.
LinearLayout.LayoutParams scrollViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
0,
1.0f
);
contentScrollView.setLayoutParams(scrollViewParams);
contentScrollView.addView(contentLayout);
// Create the custom dialog.
Pair<Dialog, LinearLayout> dialogPair = Utils.createCustomDialog(
@@ -309,13 +299,27 @@ public class SegmentCategoryListPreference extends ListPreference {
false // Do not dismiss dialog on Neutral button click.
);
dialog = dialogPair.first;
// Add the ScrollView to the dialog's main layout.
LinearLayout dialogMainLayout = dialogPair.second;
dialogMainLayout.addView(contentScrollView, dialogMainLayout.getChildCount() - 1);
// Add the custom content to the dialog's main layout.
dialogMainLayout.addView(contentLayout, 1); // Add after title, before buttons.
// Set up color picker listener.
// Do last to prevent listener callbacks while setting up view.
dialogColorPickerView.setOnColorChangedListener(color -> {
if (categoryColor == color) {
return;
}
categoryColor = color;
String hexColor = getColorString(color);
Logger.printDebug(() -> "onColorChanged: " + hexColor);
updateCategoryColorDot();
dialogColorEditText.setText(hexColor);
dialogColorEditText.setSelection(hexColor.length());
});
// Show the dialog.
dialog = dialogPair.first;
dialog.show();
} catch (Exception ex) {
Logger.printException(() -> "showDialog failure", ex);

View File

@@ -42,7 +42,6 @@ public class PlaybackSpeedDialogButton {
: Settings.PLAYBACK_SPEED_DEFAULT.get();
VideoInformation.overridePlaybackSpeed(speed);
showToastShort(str("revanced_custom_playback_speeds_reset_toast", (speed + "x")));
} catch (Exception ex) {
Logger.printException(() -> "speed button reset failure", ex);
}

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.28.0-dev.5
version = 5.29.0-dev.3

View File

@@ -160,6 +160,10 @@ public final class app/revanced/patches/cieid/restrictions/root/BypassRootChecks
public static final fun getBypassRootChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/crunchyroll/ads/HideAdsPatchKt {
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/duolingo/ad/DisableAdsPatchKt {
public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -958,6 +962,10 @@ public final class app/revanced/patches/swissid/integritycheck/RemoveGooglePlayI
public static final fun getRemoveGooglePlayIntegrityCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/threads/HideAdsPatchKt {
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatchKt {
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}

View File

@@ -0,0 +1,7 @@
package app.revanced.patches.crunchyroll.ads
import app.revanced.patcher.fingerprint
internal val videoUrlReadyToStringFingerprint = fingerprint {
strings("VideoUrlReady(url=", ", enableAds=")
}

View File

@@ -0,0 +1,46 @@
package app.revanced.patches.crunchyroll.ads
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.removeFlags
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide Ads"
) {
compatibleWith("com.crunchyroll.crunchyroid")
execute {
// Get obfuscated "enableAds" field from toString method.
val enableAdsField = videoUrlReadyToStringFingerprint.let {
val strIndex = videoUrlReadyToStringFingerprint.stringMatches!!.last().index
val fieldIndex = it.method.indexOfFirstInstruction(strIndex, Opcode.IGET_BOOLEAN)
it.method.getInstruction<ReferenceInstruction>(fieldIndex).getReference<FieldReference>()!!
}
// Remove final access flag on field.
videoUrlReadyToStringFingerprint.classDef.fields
.first { it.name == enableAdsField.name }
.removeFlags(AccessFlags.FINAL)
// Override enableAds field in non-default constructor.
val constructor = videoUrlReadyToStringFingerprint.classDef.methods.first {
AccessFlags.CONSTRUCTOR.isSet(it.accessFlags) && it.parameters.isNotEmpty()
}
constructor.addInstructions(
constructor.instructions.count() - 1,
"""
move-object/from16 v0, p0
const/4 v1, 0x0
iput-boolean v1, v0, $enableAdsField
""")
}
}

View File

@@ -1,9 +1,16 @@
package app.revanced.patches.instagram.ads
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.meta.ads.adInjectorFingerprint
import app.revanced.util.returnEarly
@Deprecated("Patch was moved to different package: app.revanced.patches.meta.ads.hideAdsPatch")
@Suppress("unused")
val hideAdsPatch = bytecodePatch {
dependsOn(app.revanced.patches.meta.ads.hideAdsPatch)
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
compatibleWith("com.instagram.android")
execute {
adInjectorFingerprint.method.returnEarly(false)
}
}

View File

@@ -11,3 +11,15 @@ internal val getMobileConfigBoolFingerprint = fingerprint {
classDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;")
}
}
internal val metaAIKillSwitchCheckFingerprint = fingerprint {
strings("SearchAiagentImplementationsKillSwitch")
opcodes(Opcode.CONST_WIDE)
}
internal val extensionMethodFingerprint = fingerprint {
strings("REPLACED_BY_PATCH")
custom { method, classDef ->
method.name == EXTENSION_METHOD_NAME && classDef.type == EXTENSION_CLASS_DESCRIPTOR
}
}

View File

@@ -2,11 +2,14 @@ package app.revanced.patches.messenger.metaai
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.messenger.misc.extension.sharedExtensionPatch
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/messenger/metaai/RemoveMetaAIPatch;"
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/messenger/metaai/RemoveMetaAIPatch;"
internal const val EXTENSION_METHOD_NAME = "overrideBooleanFlag"
@Suppress("unused")
val removeMetaAIPatch = bytecodePatch(
@@ -25,10 +28,25 @@ val removeMetaAIPatch = bytecodePatch(
addInstructions(
returnIndex,
"""
invoke-static { p1, p2, v$returnRegister }, $EXTENSION_CLASS_DESCRIPTOR->overrideBooleanFlag(JZ)Z
invoke-static { p1, p2, v$returnRegister }, $EXTENSION_CLASS_DESCRIPTOR->$EXTENSION_METHOD_NAME(JZ)Z
move-result v$returnRegister
"""
)
}
// Extract the common starting digits of Meta AI flag IDs from a flag found in code.
val relevantDigits = with(metaAIKillSwitchCheckFingerprint) {
method.getInstruction<WideLiteralInstruction>(patternMatch!!.startIndex).wideLiteral
}.toString().substring(0, 7)
// Replace placeholder in the extension method.
with(extensionMethodFingerprint) {
method.replaceInstruction(
stringMatches!!.first().index,
"""
const-string v1, "$relevantDigits"
"""
)
}
}
}

View File

@@ -2,4 +2,4 @@ package app.revanced.patches.messenger.misc.extension
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
val sharedExtensionPatch = sharedExtensionPatch("messenger", mainActivityOnCreateHook)
val sharedExtensionPatch = sharedExtensionPatch("messenger", messengerApplicationOnCreateHook)

View File

@@ -2,6 +2,8 @@ package app.revanced.patches.messenger.misc.extension
import app.revanced.patches.shared.misc.extension.extensionHook
internal val mainActivityOnCreateHook = extensionHook {
strings("MainActivity_onCreate_begin")
internal val messengerApplicationOnCreateHook = extensionHook {
custom { method, classDef ->
method.name == "onCreate" && classDef.endsWith("/MessengerApplication;")
}
}

View File

@@ -3,18 +3,9 @@ package app.revanced.patches.meta.ads
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Deprecated("Instead use the Instagram or Threads specific hide ads patch")
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
/**
* Patch is identical for both Instagram and Threads app.
*/
compatibleWith(
"com.instagram.android",
"com.instagram.barcelona",
)
val hideAdsPatch = bytecodePatch {
execute {
adInjectorFingerprint.method.returnEarly(false)
}

View File

@@ -0,0 +1,16 @@
package app.revanced.patches.threads
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.meta.ads.adInjectorFingerprint
import app.revanced.util.returnEarly
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide ads",
) {
compatibleWith("com.instagram.barcelona"("382.0.0.51.85"))
execute {
adInjectorFingerprint.method.returnEarly(false)
}
}

View File

@@ -77,8 +77,6 @@ val hideAdsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -25,8 +25,6 @@ val hideGetPremiumPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -23,8 +23,6 @@ val videoAdsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -53,8 +53,6 @@ val copyVideoUrlPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -24,8 +24,6 @@ val removeViewerDiscretionDialogPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -72,8 +72,6 @@ val downloadsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -20,8 +20,6 @@ val seekbarPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -18,8 +18,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/youtube/patches/SeekbarThumbnailsPatch;"
val seekbarThumbnailsPatch = bytecodePatch(
description = "Adds an option to use high quality fullscreen seekbar thumbnails. " +
"Patching 19.16.39 adds an option to restore old seekbar thumbnails.",
description = "Adds an option to use high quality fullscreen seekbar thumbnails."
) {
dependsOn(
sharedExtensionPatch,

View File

@@ -88,8 +88,6 @@ val swipeControlsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -24,8 +24,6 @@ val autoCaptionsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -43,8 +43,6 @@ val customBrandingPatch = resourcePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -41,8 +41,6 @@ val changeHeaderPatch = resourcePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -22,8 +22,6 @@ val hideButtonsPatch = resourcePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -40,8 +40,6 @@ val navigationButtonsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -58,8 +58,6 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -33,8 +33,6 @@ val changeFormFactorPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -59,8 +59,6 @@ val hideEndscreenCardsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -31,8 +31,6 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -29,8 +29,6 @@ val disableFullscreenAmbientModePatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -125,8 +125,6 @@ val hideLayoutComponentsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -57,8 +57,6 @@ val hideInfoCardsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -24,8 +24,6 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -48,8 +48,6 @@ val hideRelatedVideoOverlayPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -29,8 +29,6 @@ val disableRollingNumberAnimationPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -170,8 +170,6 @@ val hideShortsComponentsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -21,8 +21,6 @@ val hideTimestampPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -153,22 +153,6 @@ val miniplayerPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39", // First with modern miniplayers.
// 19.17.41 // Works without issues, but no reason to recommend over 19.16.
// 19.18.41 // Works without issues, but no reason to recommend over 19.16.
// 19.19.39 // Last bug free version with smaller Modern 1 miniplayer, but no reason to recommend over 19.16.
// 19.20.35 // Cannot swipe to expand.
// 19.21.40 // Cannot swipe to expand.
// 19.22.43 // Cannot swipe to expand.
// 19.23.40 // First with Modern 1 drag and drop, Cannot swipe to expand.
// 19.24.45 // First with larger Modern 1, Cannot swipe to expand.
"19.25.37", // First with double tap, last with skip forward/back buttons, last with swipe to expand/close, and last before double tap to expand seems to be required.
// 19.26.42 // Modern 1 Pause/play button are always hidden. Unusable.
// 19.28.42 // First with custom miniplayer size, screen flickers when swiping to maximize Modern 1. Swipe to close miniplayer is broken.
// 19.29.42 // All modern players are broken and ignore tapping the miniplayer video.
// 19.30.39 // Modern 3 is less broken when double tap expand is enabled, but cannot swipe to expand when double tap is off.
// 19.31.36 // All Modern 1 buttons are missing. Unusable.
// 19.32.36 // 19.32+ and beyond all work without issues.
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -21,8 +21,6 @@ val playerPopupPanelsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -21,8 +21,6 @@ internal val exitFullscreenPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -52,8 +52,6 @@ val customPlayerOverlayOpacityPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -61,8 +61,6 @@ val returnYouTubeDislikePatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -66,8 +66,6 @@ val wideSearchbarPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -44,8 +44,6 @@ val shortsAutoplayPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -64,8 +64,6 @@ val openShortsInRegularPlayerPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -126,8 +126,6 @@ val sponsorBlockPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -58,8 +58,6 @@ val spoofAppVersionPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -32,8 +32,6 @@ val changeStartPagePatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -34,8 +34,6 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -204,8 +204,6 @@ val themePatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -33,8 +33,6 @@ val alternativeThumbnailsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -27,8 +27,6 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -23,8 +23,6 @@ val announcementsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -24,8 +24,6 @@ val autoRepeatPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -51,8 +51,6 @@ val backgroundPlaybackPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -35,8 +35,6 @@ val enableDebuggingPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -24,8 +24,6 @@ val spoofDeviceDimensionsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -21,8 +21,6 @@ val checkWatchHistoryDomainNameResolutionPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -35,8 +35,6 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch(
compatibleWith(
YOUTUBE_PACKAGE_NAME(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -26,8 +26,6 @@ val disableHapticFeedbackPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -32,8 +32,6 @@ val bypassURLRedirectsPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -41,8 +41,6 @@ val openLinksExternallyPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -1,6 +1,7 @@
package app.revanced.patches.youtube.misc.litho.filter
import app.revanced.patcher.fingerprint
import app.revanced.util.containsLiteralInstruction
import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
@@ -52,6 +53,15 @@ internal val emptyComponentFingerprint = fingerprint {
}
}
internal val lithoThreadExecutorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("I", "I", "I")
custom { method, classDef ->
classDef.superclass == "Ljava/util/concurrent/ThreadPoolExecutor;" &&
method.containsLiteralInstruction(1L) // 1L = default thread timeout.
}
}
internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Z")

View File

@@ -209,6 +209,22 @@ val lithoFilterPatch = bytecodePatch(
// endregion
// region Change Litho thread executor to 1 thread to fix layout issue in unpatched YouTube.
lithoThreadExecutorFingerprint.method.addInstructions(
0,
"""
invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorCorePoolSize(I)I
move-result p1
invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorMaxThreads(I)I
move-result p2
"""
)
// endregion
// region A/B test of new Litho native code.
// Turn off native code that handles litho component names. If this feature is on then nearly

View File

@@ -5,29 +5,37 @@ package app.revanced.patches.youtube.misc.playservice
import app.revanced.patcher.patch.resourcePatch
import app.revanced.util.findElementByAttributeValueOrThrow
@Deprecated("19.16.39 is the lowest supported version")
@Deprecated("19.34.42 is the lowest supported version")
var is_19_03_or_greater = false
private set
@Deprecated("19.16.39 is the lowest supported version")
@Deprecated("19.34.42 is the lowest supported version")
var is_19_04_or_greater = false
private set
@Deprecated("19.16.39 is the lowest supported version")
@Deprecated("19.34.42 is the lowest supported version")
var is_19_16_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_17_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_18_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_23_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_25_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_26_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_29_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_32_or_greater = false
private set
@Deprecated("19.34.42 is the lowest supported version")
var is_19_33_or_greater = false
private set
var is_19_34_or_greater = false

View File

@@ -30,8 +30,6 @@ val removeTrackingQueryParameterPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -17,8 +17,6 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch
val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -41,8 +41,6 @@ val forceOriginalAudioPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -28,8 +28,6 @@ val disableHdrPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -57,7 +57,8 @@ val rememberVideoQualityPatch = bytecodePatch {
entriesKey = "revanced_shorts_quality_default_entries",
entryValuesKey = "revanced_shorts_quality_default_entry_values"
),
SwitchPreference("revanced_remember_shorts_quality_last_selected")
SwitchPreference("revanced_remember_shorts_quality_last_selected"),
SwitchPreference("revanced_remember_video_quality_last_selected_toast")
))
/*

View File

@@ -23,8 +23,6 @@ val videoQualityPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -28,8 +28,6 @@ val playbackSpeedPatch = bytecodePatch(
compatibleWith(
"com.google.android.youtube"(
"19.16.39",
"19.25.37",
"19.34.42",
"19.43.41",
"19.47.53",

View File

@@ -39,7 +39,8 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch {
entryValuesKey = null,
tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference"
),
SwitchPreference("revanced_remember_playback_speed_last_selected")
SwitchPreference("revanced_remember_playback_speed_last_selected"),
SwitchPreference("revanced_remember_playback_speed_last_selected_toast")
)
)

View File

@@ -10,6 +10,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.util.proxy.mutableTypes.MutableClass
import app.revanced.patcher.util.proxy.mutableTypes.MutableField
import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.smali.ExternalLabel
@@ -1011,8 +1012,8 @@ private fun MutableMethod.overrideReturnValue(value: String, returnLate: Boolean
}
if (returnLate) {
findInstructionIndicesReversed {
opcode == RETURN || opcode == RETURN_OBJECT
findInstructionIndicesReversedOrThrow {
opcode == RETURN || opcode == RETURN_WIDE || opcode == RETURN_OBJECT
}.forEach { index ->
addInstructionsAtControlFlowLabel(index, instructions)
}
@@ -1021,6 +1022,14 @@ private fun MutableMethod.overrideReturnValue(value: String, returnLate: Boolean
}
}
/**
* Remove the given AccessFlags from the field.
*/
internal fun MutableField.removeFlags(vararg flags: AccessFlags) {
val bitField = flags.map { it.value }.reduce { acc, flag -> acc and flag }
this.accessFlags = this.accessFlags and bitField.inv()
}
internal fun BytecodePatchContext.addStaticFieldToExtension(
className: String,
methodName: String,

View File

@@ -35,7 +35,7 @@ Second \"item\" text"</string>
<string name="revanced_settings_submenu_title">الإعدادات</string>
<string name="revanced_settings_confirm_user_dialog_title">هل أنت متأكد أنك تريد المتابعة؟</string>
<string name="revanced_settings_reset">إعادة التعيين</string>
<string name="revanced_settings_reset_color">Reset color</string>
<string name="revanced_settings_reset_color">إعادة تعيين اللون</string>
<string name="revanced_settings_color_invalid">لون غير صالح</string>
<string name="revanced_settings_restart_title">إعادة التشغيل مطلوبة</string>
<string name="revanced_settings_restart_dialog_message">أعد تشغيل التطبيق لكي يسري هذا التغيير.</string>
@@ -921,8 +921,6 @@ Second \"item\" text"</string>
<string name="revanced_seekbar_thumbnails_high_quality_title">تمكين المصغرات عالية الجودة</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">مصغرات شريط التقدم عالية الجودة</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">مصغرات شريط التقدم متوسطة الجودة</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">مصغرات شريط التقدم بملء الشاشة عالية الجودة</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">مصغرات شريط التقدم بملء الشاشة متوسطة الجودة</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"سيؤدي هذا أيضا إلى استعادة المصغرات على البث المباشر الذي لا يحتوي على مصغرات شريط التقدم.
مصغرات شريط التقدم سوف تستخدم نفس جودة الفيديو الحالي.
@@ -1009,7 +1007,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_highlight_sum">الجزء من الفيديو الذي يبحث عنه معظم الناس</string>
<string name="revanced_sb_segments_intro">المقدمة/فاصل</string>
<string name="revanced_sb_segments_intro_sum">فاصل زمني بدون محتوى فعلي. قد يكون توقفًا مؤقتًا، أو إطارًا ثابتًا، أو رسومًا متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات</string>
<string name="revanced_sb_segments_outro">الخاتمة/تترات النهاية</string>
<string name="revanced_sb_segments_outro">الخاتمة / تترات النهاية</string>
<string name="revanced_sb_segments_outro_sum">تتر النهاية أو عندما تظهر بطاقات نهاية YouTube، نهايات غير منطوقة. ليس للاستنتاجات مع المعلومات</string>
<string name="revanced_sb_segments_preview">معاينة/موجز/ربط</string>
<string name="revanced_sb_segments_preview_sum">مجموعة من المقاطع التي توضح ما هو قادم أو ما حدث في الفيديو أو في مقاطع فيديو أخرى من السلسلة، حيث تتكرر جميع المعلومات في مكان آخر</string>
@@ -1131,7 +1129,6 @@ Second \"item\" text"</string>
<string name="revanced_change_form_factor_entry_1">الافتراضي</string>
<string name="revanced_change_form_factor_entry_2">الجوّال</string>
<string name="revanced_change_form_factor_entry_3">الجهاز اللوحي</string>
<string name="revanced_change_form_factor_entry_4">Automotive</string>
<string name="revanced_change_form_factor_user_dialog_message">"التغييرات تشمل:
تصميم الجهاز اللوحي
@@ -1241,11 +1238,6 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_title">إخفاء أزرار الواجهة</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">تم إخفاء أزرار الواجهة</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">يتم عرض أزرار الواجهة</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">إخفاء زري التوسيع والإغلاق</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"تم إخفاء الأزرار
اسحب للتوسيع أو الإغلاق"</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_summary_on">تم إخفاء النصوص الفرعية</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">يتم عرض النصوص الفرعية</string>
@@ -1303,8 +1295,8 @@ Second \"item\" text"</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">عرض ملاحظة إذا كان API غير متاح</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">يتم عرض ملاحظة إذا كان DeArrow غير متوفر</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">لا يتم عرض ملاحظة إذا كان DeArrow غير متوفر</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_title">DeArrow API endpoint</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">The URL of the DeArrow thumbnail cache endpoint</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_title">نقطة نهاية واجهة برمجة تطبيقات DeArrow</string>
<string name="revanced_alt_thumbnail_dearrow_api_url_summary">عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت للصور المصغرة لـ DeArrow</string>
<string name="revanced_alt_thumbnail_stills_about_title">لقطات الفيديو الثابتة</string>
<string name="revanced_alt_thumbnail_stills_about_summary">يتم التقاط اللقطات الثابتة من بداية/وسط/نهاية كل فيديو. هذه الصور مدمجة في YouTube ولا يتم استخدام أي واجهة برمجة تطبيقات خارجية</string>
<string name="revanced_alt_thumbnail_stills_fast_title">استخدم اللقطات الثابتة السريعة</string>
@@ -1397,6 +1389,9 @@ Second \"item\" text"</string>
<string name="revanced_remember_video_quality_last_selected_title">تذكر تغييرات جودة الفيديو</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">تنطبق تغييرات الجودة على جميع الفيديوهات</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">تنطبق تغييرات الجودة على الفيديو الحالي فقط</string>
<string name="revanced_remember_video_quality_last_selected_toast_title">إظهار إشعار عند تغيير جودة الفيديو</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">يتم إظهار إشعار عند تغيير جودة الفيديو الافتراضية</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">لا يتم إظهار إشعار عند تغيير جودة الفيديو الافتراضية</string>
<string name="revanced_video_quality_default_wifi_title">جودة الفيديو الافتراضية على شبكة Wi-Fi</string>
<string name="revanced_video_quality_default_mobile_title">جودة الفيديو الافتراضية على شبكة الجوَّال</string>
<string name="revanced_remember_shorts_quality_last_selected_title">تذكر تغييرات جودة Shorts</string>
@@ -1423,7 +1418,6 @@ Second \"item\" text"</string>
<string name="revanced_custom_playback_speeds_invalid">يجب أن تكون سرعات التشغيل المخصصة أقل من %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">سرعة التشغيل المخصصة غير صالحة</string>
<string name="revanced_custom_playback_speeds_auto">تلقائي</string>
<string name="revanced_custom_playback_speeds_reset_toast">تمت إعادة ضبط سرعة التشغيل إلى: %s</string>
<string name="revanced_speed_tap_and_hold_title">سرعة النقر مع الاستمرار المخصصة</string>
<string name="revanced_speed_tap_and_hold_summary">سرعة التشغيل بين 0-8</string>
</patch>
@@ -1431,6 +1425,9 @@ Second \"item\" text"</string>
<string name="revanced_remember_playback_speed_last_selected_title">تذكر التغيرات في سرعة التشغيل</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">تطبيق تغييرات سرعة التشغيل على جميع الفيديوهات</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">تطبيق تغييرات سرعة التشغيل فقط على الفيديو الحالي</string>
<string name="revanced_remember_playback_speed_last_selected_toast_title">إظهار إشعار عند تغيير سرعة التشغيل</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">يتم إظهار إشعار عند تغيير سرعة التشغيل الافتراضية</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">لا يتم عرض إشعار عند تغيير سرعة التشغيل الافتراضية.</string>
<string name="revanced_playback_speed_default_title">سرعة التشغيل الافتراضية</string>
<string name="revanced_remember_playback_speed_toast">تغيير السرعة الافتراضية إلى: %s</string>
</patch>

View File

@@ -920,8 +920,6 @@ Məhdudiyyət: Bəyənməmələr gizli rejimdə görünməyə bilər"</string>
<string name="revanced_seekbar_thumbnails_high_quality_title">Yüksək keyfiyyətli miniatürləri aktivləşdir</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">İrəliləyiş cizgisi miniatürləri yüksək keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">İrəliləyiş cizgisi miniatürləri orta keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">Tam ekran irəliləyiş cizgisi miniatürü yüksək keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">Tam ekran irəliləyiş cizgisi miniatürləri orta keyfiyyətlidir</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"Bu, həmçinin irəliləyiş cizgisi miniatürləri olmayan canlı yayımlarda miniatürləri bərpa edəcək.
İrəliləyiş cizgisi miniatürləri cari video kimi eyni keyfiyyəti işlədəcək.
@@ -1008,7 +1006,7 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
<string name="revanced_sb_segments_highlight_sum">Əksər insanların axtardığı video bölümü</string>
<string name="revanced_sb_segments_intro">Fasilə/Giriş Animasiyası</string>
<string name="revanced_sb_segments_intro_sum">Həqiqi məzmunu olmayan aralıq. Fasilə, statik kadr və ya təkrarlanan animasiya ola bilər. Məlumat ehtiva edən keçidlər daxil deyil</string>
<string name="revanced_sb_segments_outro">Son kartlar/Zaminlər</string>
<string name="revanced_sb_segments_outro">Son kartlar / Zaminlər</string>
<string name="revanced_sb_segments_outro_sum">Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil</string>
<string name="revanced_sb_segments_preview">Önizləmə/Anons/Qısa</string>
<string name="revanced_sb_segments_preview_sum">Videoda və ya seriyanın digər videolarında nə gözlənildiyini və ya baş verdiyini göstərən, bütün məlumatların başqa yerdə təkrarlandığı bölüm toplusu</string>
@@ -1240,11 +1238,6 @@ Kiçik oynadıcı ekrandan sola və ya sağa sürüklənə bilər"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_title">Örtük düymələrini gizlət</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Örtük düymələri gizlidir</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Örtük düymələri görünür</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_overlay_buttons_legacy_summary_on">"Düymələr gizlidir
Genişləndirmək və ya bağlamaq üçün sürüşdür"</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_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>
@@ -1422,7 +1415,6 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər
<string name="revanced_custom_playback_speeds_invalid">Fərdi sürətlər %s dəyərindən az olmalıdır</string>
<string name="revanced_custom_playback_speeds_parse_exception">Fərdi oynatma sürətləri etibarsızdır</string>
<string name="revanced_custom_playback_speeds_auto">Avtomatik</string>
<string name="revanced_custom_playback_speeds_reset_toast">Oynatma sürəti sıfırlandı: %s</string>
<string name="revanced_speed_tap_and_hold_title">Xüsusi toxunma və saxlanılma sürəti</string>
<string name="revanced_speed_tap_and_hold_summary">0-8 arası oynatma sürəti</string>
</patch>
@@ -1491,7 +1483,6 @@ AVC maksimum 1080p görüntü imkanına malikdir, Opus audio kodlama olmur və v
<string name="revanced_embedded_ads_service_failed">%s xəta qaytardı, reklamlar görünə bilər. Tənzimləmədə reklam əngəlləmə xidmətin dəyişməyə çalışın.</string>
<string name="revanced_block_embedded_ads_title">Yerləşdirilən video reklamlarını əngəllə</string>
<string name="revanced_block_embedded_ads_entry_1">Qeyri-aktiv edildi</string>
<string name="revanced_block_embedded_ads_entry_2">Luminous proxy</string>
<string name="revanced_block_embedded_ads_entry_3">PurpleAdBlock proksi</string>
</patch>
<patch id="ad.video.videoAdsPatch">

View File

@@ -921,8 +921,6 @@ Second \"item\" text"</string>
<string name="revanced_seekbar_thumbnails_high_quality_title">Включить миниатюры высокого качества</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">Миниатюры ползунка прогресса — высокого качества</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">Миниатюры ползунка прогресса — среднего качества</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">Миниатюры ползунка прогресса в полноэкранном режиме — высокого качества</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">Миниатюры ползунка прогресса в полноэкранном режиме — среднего качества</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"Гэта таксама аднавіць мініатюры на трансляцыях у прамым эфіры, якія не маюць мініатюр з магчымасцю перамоткі.
Мініатюры з магчымасцю перамоткі будуць выкарыстоўваць тую ж якасць, што і бягучае відэа.
@@ -1010,7 +1008,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_highlight_sum">Частка відэа, якую шукае большасць людзей</string>
<string name="revanced_sb_segments_intro">Антракт/Уступная анімацыя</string>
<string name="revanced_sb_segments_intro_sum">Інтэрвал без фактычнага зместу. Гэта можа быць паўза, статычны кадр або паўтаральная анімацыя. Не ўключае пераходы, якія змяшчаюць інфармацыю</string>
<string name="revanced_sb_segments_outro">Канчатковыя карты/крэдыты</string>
<string name="revanced_sb_segments_outro">Канцоўкі / Цітры</string>
<string name="revanced_sb_segments_outro_sum">Крэдыты або калі з\"яўляюцца канцавыя карткі YouTube. Не для высноў з інфармацыяй</string>
<string name="revanced_sb_segments_preview">Папярэдні прагляд/Паўзвядзенне/Хук</string>
<string name="revanced_sb_segments_preview_sum">Калекцыя кліпаў, якія паказваюць, што адбываецца або што адбылося ў відэа ці ў іншых відэа серыі, дзе ўся інфармацыя паўтараецца ў іншым месцы</string>
@@ -1242,11 +1240,6 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_title">Схаваць кнопкі накладання</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Кнопкі накладання схаваныя</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Кнопкі накладання паказаны</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Схаваць кнопкі разгортвання і закрыцця</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Кнопкі схаваныя
Правядзіце пальцам, каб разгарнуць ці закрыць"</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_summary_on">Падтэксты схаваныя</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Паказваюцца падтэксты</string>
@@ -1398,6 +1391,9 @@ Second \"item\" text"</string>
<string name="revanced_remember_video_quality_last_selected_title">Запомніце змены якасці відэа</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">Змены якасці распаўсюджваюцца на ўсе відэа</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">Змены якасці прымяняюцца толькі да бягучага відэа</string>
<string name="revanced_remember_video_quality_last_selected_toast_title">Паказваць усплывальнае паведамленне пры змене якасці відэа</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">Усплывальнае паведамленне паказваецца пры змене якасці відэа па змаўчанні</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">Усплывальнае паведамленне не паказваецца пры змене якасці відэа па змаўчанні</string>
<string name="revanced_video_quality_default_wifi_title">Стандартная якасць відэа ў сетцы Wi-Fi</string>
<string name="revanced_video_quality_default_mobile_title">Стандартная якасць відэа ў мабільнай сетцы</string>
<string name="revanced_remember_shorts_quality_last_selected_title">Запомніць змены якасці Shorts</string>
@@ -1424,7 +1420,6 @@ Second \"item\" text"</string>
<string name="revanced_custom_playback_speeds_invalid">Нестандартныя хуткасці павінны быць менш за %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">Несапраўдныя нестандартныя хуткасці прайгравання</string>
<string name="revanced_custom_playback_speeds_auto">Аўто</string>
<string name="revanced_custom_playback_speeds_reset_toast">Хуткасць прайгравання скінута да: %s</string>
<string name="revanced_speed_tap_and_hold_title">Уласны хуткасць націску і ўтрымання</string>
<string name="revanced_speed_tap_and_hold_summary">Хуткасць прайгравання між 0-8</string>
</patch>
@@ -1432,6 +1427,9 @@ Second \"item\" text"</string>
<string name="revanced_remember_playback_speed_last_selected_title">Запомніце змены хуткасці прайгравання</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">Змяненні хуткасці прайгравання прымяняюцца да ўсіх відэа</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">Змены хуткасці прайгравання прымяняюцца толькі да бягучага відэа</string>
<string name="revanced_remember_playback_speed_last_selected_toast_title">Паказваць усплывальнае паведамленне пры змене хуткасці прайгравання</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">Усплывальнае паведамленне паказваецца пры змене хуткасці прайгравання па змаўчанні</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">Усплывальнае паведамленне не паказваецца, калі хуткасць прайгравання па змаўчанні зменена</string>
<string name="revanced_playback_speed_default_title">Стандартная хуткасць прайгравання</string>
<string name="revanced_remember_playback_speed_toast">Хуткасць па змаўчанні зменена на: %s</string>
</patch>

View File

@@ -921,8 +921,6 @@ Second \"item\" text"</string>
<string name="revanced_seekbar_thumbnails_high_quality_title">Активиране на висококачествени миниатюри</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">Миниатюри с високо качество в лентата на възпроизвеждане</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">Миниатюри с средно качество в лентата на възпроизвеждане</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">Миниатюри с високо качество в лентата на прогреса на цял екран</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">Миниатюри със средно качество в лентата на прогреса на цял екран</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"Това също ще възстанови миниатюрите на предавания на живо, които нямат миниатюри на плъзгача.
Миниатюрите на плъзгача ще използват същото качество като текущото видео.
@@ -1009,7 +1007,7 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_highlight_sum">Частта от видеото която повечето хора търсят</string>
<string name="revanced_sb_segments_intro">Пауза / Начална анимация</string>
<string name="revanced_sb_segments_intro_sum">Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация</string>
<string name="revanced_sb_segments_outro">Карти в края/Пояснения</string>
<string name="revanced_sb_segments_outro">Край на клипа / Надписи</string>
<string name="revanced_sb_segments_outro_sum">Информация или когато се показват крайните карти на YouTube. Не за заключения с информация</string>
<string name="revanced_sb_segments_preview">Кратък преглед/Обобщение</string>
<string name="revanced_sb_segments_preview_sum">Колекция от клипове, които показват какво предстои в този видеоклип или в други видеоклипове от поредицата, където цялата информация се повтаря по-късно във видеоклипа</string>
@@ -1241,11 +1239,6 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_title">Скриване на бутоните за наслагване</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Бутоните за наслагване са скрити</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Бутоните за наслагване са показани</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Скриване на бутоните за разгъване и затваряне</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Бутоните са скрити
Плъзнете, за да разгънете или затворите"</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_summary_on">Скрити</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Показват се</string>
@@ -1397,6 +1390,9 @@ Second \"item\" text"</string>
<string name="revanced_remember_video_quality_last_selected_title">Запомни промените в качеството на видеото</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">Промените в качеството се отнасят за всички видеоклипове</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">Промените в качеството се отнасят само за текущия видеоклип</string>
<string name="revanced_remember_video_quality_last_selected_toast_title">Показване на известие при промени в качеството на видеото</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">Показва се известие, когато се промени качеството на видеото по подразбиране</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">Не се показва известие, когато се промени качеството на видеото по подразбиране</string>
<string name="revanced_video_quality_default_wifi_title">Предпочитано качество при Wi-Fi</string>
<string name="revanced_video_quality_default_mobile_title">Предпочитано качество при мобилни данни</string>
<string name="revanced_remember_shorts_quality_last_selected_title">Запомняне на промените в качеството на Shorts</string>
@@ -1423,7 +1419,6 @@ Second \"item\" text"</string>
<string name="revanced_custom_playback_speeds_invalid">Персонализираните скорости трябва да са по-малки от %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">Невалидни персонализирани скорости на възпроизвеждане</string>
<string name="revanced_custom_playback_speeds_auto">Авто</string>
<string name="revanced_custom_playback_speeds_reset_toast">Скоростта на възпроизвеждане е нулирана на: %s</string>
<string name="revanced_speed_tap_and_hold_title">Персонализирана скорост при докосване и задържане</string>
<string name="revanced_speed_tap_and_hold_summary">Скорост на възпроизвеждане между 0-8</string>
</patch>
@@ -1431,6 +1426,9 @@ Second \"item\" text"</string>
<string name="revanced_remember_playback_speed_last_selected_title">Запомни промените в скоростта на възпроизвеждане</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">Промените в скоростта на възпроизвеждане се отнасят за всички видеоклипове</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">Промените в скоростта на възпроизвеждане се отнасят само за текущия видеоклип</string>
<string name="revanced_remember_playback_speed_last_selected_toast_title">Показване на известие при промени в скоростта на възпроизвеждане</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">Показва се известие, когато се промени скоростта на възпроизвеждане по подразбиране</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">Известие не се показва, когато скоростта на възпроизвеждане по подразбиране се промени</string>
<string name="revanced_playback_speed_default_title">Скорост на възпроизвеждане по подразбиране</string>
<string name="revanced_remember_playback_speed_toast">Скоростта по подразбиране е променена на: %s</string>
</patch>

View File

@@ -917,8 +917,6 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
<string name="revanced_seekbar_thumbnails_high_quality_title">উচ্চমানের থাম্বনেইল সক্ষম করুন</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">সিকবার থাম্বনেইল উচ্চমানের</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">সিকবার থাম্বনেইল মাঝারিমানের</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">পূর্ণ পর্দায় সিকবার থাম্বনেইল উচ্চমানের</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">পূর্ণ পর্দায় সিকবার থাম্বনেইল মাঝারিমানের</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"এটি সেই লাইভস্ট্রিমগুলিতে থাম্বনেইল পুনরুদ্ধার করবে যেখানে সিকবার থাম্বনেইল নেই।
সিকবার থাম্বনেইল বর্তমান ভিডিওর একই মান ব্যবহার করবে।
@@ -1004,7 +1002,7 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
<string name="revanced_sb_segments_highlight_sum">ভিডিওর অংশ যা বেশিরবাগ মানুষই দেখছে</string>
<string name="revanced_sb_segments_intro">অন্তর্বর্তীকরণ/পরিচয় বিভাগের অ্যানিমেশন</string>
<string name="revanced_sb_segments_intro_sum">প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয়</string>
<string name="revanced_sb_segments_outro">এন্ডকার্ডস/কৃতজ্ঞতা স্বীকার</string>
<string name="revanced_sb_segments_outro">এন্ডকার্ডস / কৃতজ্ঞতা স্বীকার</string>
<string name="revanced_sb_segments_outro_sum">ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয়</string>
<string name="revanced_sb_segments_preview">পূর্বরূপ/সংক্ষিপ্তবৃত্তি/হুক</string>
<string name="revanced_sb_segments_preview_sum">একটি সমষ্টি ক্লিপ সমূহ যা ভিডিওতে এসে যা হচ্ছে বা অন্য ভিডিও সিরিজে ঘটেছে সেগুলি দেখায় যেখানে সমস্ত তথ্য অন্যত্র পুনরাবৃত্তি করা হয়</string>
@@ -1237,11 +1235,6 @@ Miniplayer স্ক্রিন থেকে বামে বা ডানে
<string name="revanced_miniplayer_hide_overlay_buttons_title">ওভারলে বোতাম লুকান</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">ওভারলে বোতাম লুকানো আছে</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">ওভারলে বোতাম দেখানো হয়েছে</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">বিস্তৃত এবং বন্ধ বোতাম লুকান</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"বোতাম লুকানো আছে
বিস্তৃত করতে বা বন্ধ করতে সোয়াইপ করুন"</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_summary_on">উপপাঠ লুকিয়ে রয়েছে</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">উপপাঠ প্রদর্শিত হয়েছে</string>
@@ -1393,6 +1386,9 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট
<string name="revanced_remember_video_quality_last_selected_title">ভিডিও গুণমান পরিবর্তন মনে রাখুন</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">গুণমান পরিবর্তন সব ভিডিওতে প্রয়োগ করা হয়েছে</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">গুণমান পরিবর্তন বর্তমান ভিডিওতে প্রয়োগ করা হয়েছে</string>
<string name="revanced_remember_video_quality_last_selected_toast_title">ভিডিও গুণমান পরিবর্তনে টোস্ট দেখান</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">ডিফল্ট ভিডিও গুণমান পরিবর্তন হলে একটি টোস্ট দেখানো হয়</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">ডিফল্ট ভিডিও গুণমান পরিবর্তন হলে একটি টোস্ট দেখানো হয় না</string>
<string name="revanced_video_quality_default_wifi_title">ওয়াই-ফাই নেটওয়ার্কে ডিফল্ট ভিডিও গুণমান</string>
<string name="revanced_video_quality_default_mobile_title">মোবাইল নেটওয়ার্কে ডিফল্ট ভিডিও গুণমান</string>
<string name="revanced_remember_shorts_quality_last_selected_title">Shorts গুণমান পরিবর্তনের কথা মনে রাখুন</string>
@@ -1419,7 +1415,6 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট
<string name="revanced_custom_playback_speeds_invalid">কাস্টম গতি %s এর চেয়ে কম হতে হবে</string>
<string name="revanced_custom_playback_speeds_parse_exception">অবৈধ কাস্টম প্লেব্যাক গতি</string>
<string name="revanced_custom_playback_speeds_auto">স্বতস্ফূর্তভাবে</string>
<string name="revanced_custom_playback_speeds_reset_toast">প্লেব্যাক গতি রিসেট করা হয়েছে: %s</string>
<string name="revanced_speed_tap_and_hold_title">কাস্টম ট্যাপ এন্ড হোল্ড স্পিড</string>
<string name="revanced_speed_tap_and_hold_summary">-৮ এর মধ্যে প্লেব্যাক স্পিড</string>
</patch>
@@ -1427,6 +1422,9 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট
<string name="revanced_remember_playback_speed_last_selected_title">প্লেব্যাকের স্পিড পরিবর্তন মনে রাখুন</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">প্লেব্যাকের স্পিড পরিবর্তন সকল ভিডিওতে প্রয়োগ হবে</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">প্লেব্যাকের স্পিড পরিবর্তন এই ভিডিওতে প্রয়োগ হবে</string>
<string name="revanced_remember_playback_speed_last_selected_toast_title">প্লেব্যাক গতি পরিবর্তনে টোস্ট দেখান</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">ডিফল্ট প্লেব্যাক গতি পরিবর্তন হলে একটি টোস্ট দেখানো হয়</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">যখন ডিফল্ট প্লেব্যাক গতি পরিবর্তন করা হয় তখন কোনো টোস্ট দেখানো হয় না।</string>
<string name="revanced_playback_speed_default_title">প্লেব্যাকের মূল স্পিড</string>
<string name="revanced_remember_playback_speed_toast">মূল স্পিড পরিবর্তন হচ্ছে: %s</string>
</patch>
@@ -1470,7 +1468,7 @@ AVC-এর সর্বোচ্চ রেজোলিউশন হল 1080p, Op
• স্থির ভলিউম পাওয়া যায় না
• মূল অডিও জোর করে চালু করা যায় না"</string>
<string name="revanced_spoof_video_streams_about_no_av1">• কোনো AV1 ভিডিও কোডেক নেই</string>
<string name="revanced_spoof_video_streams_about_kids_videos">Kids videos may not play when logged out or in incognito mode</string>
<string name="revanced_spoof_video_streams_about_kids_videos">লগআউট করা হলে বা ছদ্মবেশী মোডে বাচ্চাদের ভিডিও চলতে নাও পারে</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">স্ট্যাটস ফর নার্ডসে দেখান</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">স্ট্যাটস ফর নার্ডসে ক্লায়েন্ট প্রকার দেখানো হবে</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">স্ট্যাটস ফর নার্ডসে ক্লায়েন্ট লুকানো হবে</string>

View File

@@ -922,7 +922,6 @@ Omezení: Počty „Nelíbí se mi“ se nemusí zobrazit v anonymním režimu"<
<string name="revanced_seekbar_thumbnails_high_quality_summary_on">Miniatury posuvníku jsou vysoké kvality</string>
<string name="revanced_seekbar_thumbnails_high_quality_summary_off">Miniatury posuvníku jsou střední kvality</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_on">Miniatury posuvníku na celou obrazovku jsou vysoké kvality</string>
<string name="revanced_seekbar_thumbnails_high_quality_legacy_summary_off">Miniatury posuvníku na celou obrazovku jsou střední kvality</string>
<string name="revanced_seekbar_thumbnails_high_quality_dialog_message">"Obnoví se také miniatury živých přenosů, které nemají miniatury s posuvníkem.
Miniatury s posuvníkem budou používat stejnou kvalitu jako aktuální video.
@@ -1008,7 +1007,7 @@ Vaše ID uživatele je jako heslo a nikdy by nemělo být sdíleno."</string>
<string name="revanced_sb_segments_highlight_sum">Část videa, po které většina lidí hledá</string>
<string name="revanced_sb_segments_intro">Přestávka/Animace úvodu</string>
<string name="revanced_sb_segments_intro_sum">Interval bez skutečného obsahu. Může to být pauza, statický snímek nebo opakující se animace. Neobsahuje přechody s informacemi</string>
<string name="revanced_sb_segments_outro">Závěrečné karty/Titulky</string>
<string name="revanced_sb_segments_outro">Outro / Závěrečné titulky</string>
<string name="revanced_sb_segments_outro_sum">Titulky nebo když se objeví závěrečné karty YouTube. Ne pro závěry s informacemi</string>
<string name="revanced_sb_segments_preview">Náhled/Shrnutí/Háček</string>
<string name="revanced_sb_segments_preview_sum">Sbírka klipů, které ukazují, co se chystá nebo co se stalo ve videu nebo v jiných videích série, kde jsou všechny informace opakované jinde</string>
@@ -1240,11 +1239,6 @@ Omezení: Použití tlačítka zpět na panelu nástrojů nemusí fungovat"</str
<string name="revanced_miniplayer_hide_overlay_buttons_title">Skrýt tlačítka překrytí</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Tlačítka překrytí jsou skrytá</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Tlačítka překrytí jsou zobrazena</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Skrýt tlačítka rozbalení a zavření</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Tlačítka jsou skrytá
Rozbalte nebo zavřete přejetím prstem"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Tlačítka rozbalení a zavření jsou zobrazena</string>
<string name="revanced_miniplayer_hide_subtext_title">Skrýt podtexty</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">Podtexty jsou skryty</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Podtexty jsou zobrazeny</string>
@@ -1396,6 +1390,9 @@ Povolením této funkce lze odemknout vyšší kvality videa"</string>
<string name="revanced_remember_video_quality_last_selected_title">Pamatovat si změny kvality videa</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">Změny kvality se vztahují na všechna videa</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">Změny kvality se vztahují pouze na aktuální video</string>
<string name="revanced_remember_video_quality_last_selected_toast_title">Zobrazit hlášku při změnách kvality videa</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">Zobrazí se hláška, když je změněna výchozí kvalita videa</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">Nezobrazí se hláška, když je změněna výchozí kvalita videa</string>
<string name="revanced_video_quality_default_wifi_title">Výchozí kvalita videa v síti Wi-Fi</string>
<string name="revanced_video_quality_default_mobile_title">Výchozí kvalita videa v mobilní síti</string>
<string name="revanced_remember_shorts_quality_last_selected_title">Zapamatovat si změny kvality u položky Shorts</string>
@@ -1422,7 +1419,6 @@ Povolením této funkce lze odemknout vyšší kvality videa"</string>
<string name="revanced_custom_playback_speeds_invalid">Vlastní rychlosti musí být menší než %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">Neplatné vlastní rychlosti přehrávání</string>
<string name="revanced_custom_playback_speeds_auto">Automaticky</string>
<string name="revanced_custom_playback_speeds_reset_toast">Rychlost přehrávání obnovena na: %s</string>
<string name="revanced_speed_tap_and_hold_title">Vlastní rychlost stisknutí a podržení</string>
<string name="revanced_speed_tap_and_hold_summary">Rychlost přehrávání 0 až 8</string>
</patch>
@@ -1430,6 +1426,9 @@ Povolením této funkce lze odemknout vyšší kvality videa"</string>
<string name="revanced_remember_playback_speed_last_selected_title">Pamatovat si změny rychlosti přehrávání</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">Změny rychlosti přehrávání se vztahují na všechna videa</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">Změny rychlosti přehrávání se vztahují pouze na aktuální video</string>
<string name="revanced_remember_playback_speed_last_selected_toast_title">Zobrazit hlášku při změnách rychlosti přehrávání</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">Zobrazí se hláška, když je změněna výchozí rychlost přehrávání</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">Oznámení se nezobrazí, když je změněna výchozí rychlost přehrávání</string>
<string name="revanced_playback_speed_default_title">Výchozí rychlost přehrávání</string>
<string name="revanced_remember_playback_speed_toast">Výchozí rychlost změněna na: %s</string>
</patch>

View File

@@ -24,7 +24,7 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_failed_title">Kontrol mislykkedes</string>
<string name="revanced_check_environment_dialog_open_official_source_button">Åbn officiel hjemmeside</string>
<string name="revanced_check_environment_dialog_ignore_button">Ignorer</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;Denne app ser ikke ud til at være blevet patcht af dig.&lt;/h5&gt;&lt;br&gt;Denne app fungerer muligvis ikke korrekt, og den &lt;b style=\"color: red;\">kan være skadelig eller endda farlig at bruge.&lt;/b&gt;&lt;br&gt;&lt;br&gt;Disse kontroller indikerer, at denne app er for-patched eller erhvervet fra en anden person:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;Det anbefales kraftigt at &lt;b style=\"color: blue;\">afinstallere denne app og patche den selv&lt;/b&gt; for at sikre, at du bruger en valideret og sikker app.&lt;p&gt;&lt;br&gt;Hvis det ignoreres, vises denne advarsel kun to gange.</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;Denne app ser ikke ud til at være blevet patcht af dig.&lt;/h5&gt;&lt;br&gt;Denne app fungerer muligvis ikke korrekt, og den &lt;b style=\"color: red;\"&gt;kan være skadelig eller endda farlig at bruge.&lt;/b&gt;&lt;br&gt;&lt;br&gt;Disse kontroller indikerer, at denne app er for-patched eller erhvervet fra en anden person:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;Det anbefales kraftigt at &lt;b style=\"color: blue;\"&gt;afinstallere denne app og patche den selv&lt;/b&gt; for at sikre, at du bruger en valideret og sikker app.&lt;p&gt;&lt;br&gt;Hvis det ignoreres, vises denne advarsel kun to gange.</string>
<string name="revanced_check_environment_not_same_patching_device">Rettet på en anden enhed</string>
<string name="revanced_check_environment_manager_not_expected_installer">Ikke installeret af ReVanced Manager</string>
<string name="revanced_check_environment_not_near_patch_time">Patched mere end 10 minutter siden</string>
@@ -1009,7 +1009,7 @@ Dit bruger-id er som en adgangskode, og det må aldrig deles.
<string name="revanced_sb_segments_highlight_sum">Den del af videoen, som de fleste mennesker er på udkig efter</string>
<string name="revanced_sb_segments_intro">Pause/Intro-animation</string>
<string name="revanced_sb_segments_intro_sum">Et interval uden reelt indhold. Kunne være en pause, statisk ramme eller gentagelse af animation. Omfatter ikke overgange indeholdende information</string>
<string name="revanced_sb_segments_outro">Slutkort/Kredit</string>
<string name="revanced_sb_segments_outro">Slutkort / Kredit</string>
<string name="revanced_sb_segments_outro_sum">Medvirkende eller når YouTube-endcards vises. Ikke for konklusioner med information</string>
<string name="revanced_sb_segments_preview">Forhåndsvisning/Genoptag/Krog</string>
<string name="revanced_sb_segments_preview_sum">Indsamling af klip, der viser, hvad der kommer op, eller hvad der skete i videoen eller i andre videoer af en serie, hvor alle oplysninger gentages andetsteds</string>
@@ -1241,11 +1241,6 @@ Miniafspiller kan trækkes ud over skærmen til venstre eller højre"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_title">Skjul overlay-knapper</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Overlay-knapper er skjult</string>
<string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Overlay-knapper vises</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Skjul udvid- og luk-knapper</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Knapper er skjult
Stryg for at udvide eller lukke"</string>
<string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Udvid- og luk-knapper vises</string>
<string name="revanced_miniplayer_hide_subtext_title">Skjul undertekster</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">Undertekster er skjult</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Undertekster er vist</string>
@@ -1397,6 +1392,9 @@ Aktivering af dette kan låse op for højere videokvalitet"</string>
<string name="revanced_remember_video_quality_last_selected_title">Husk ændringer i videokvalitet</string>
<string name="revanced_remember_video_quality_last_selected_summary_on">Kvalitetsændringer gælder for alle videoer</string>
<string name="revanced_remember_video_quality_last_selected_summary_off">Kvalitetsændringer gælder kun for den aktuelle video</string>
<string name="revanced_remember_video_quality_last_selected_toast_title">Vis notifikation ved ændring af videokvalitet</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">En notifikation vises, når standardvideokvaliteten ændres</string>
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">Der vises ikke en notifikation, når standardvideokvaliteten ændres</string>
<string name="revanced_video_quality_default_wifi_title">Standard videokvalitet på Wi-Fi-netværk</string>
<string name="revanced_video_quality_default_mobile_title">Standard videokvalitet på mobilnetværk</string>
<string name="revanced_remember_shorts_quality_last_selected_title">Husk kvalitetsændringer for Shorts</string>
@@ -1423,7 +1421,6 @@ Aktivering af dette kan låse op for højere videokvalitet"</string>
<string name="revanced_custom_playback_speeds_invalid">Brugerdefinerede hastigheder skal være mindre end %s</string>
<string name="revanced_custom_playback_speeds_parse_exception">Ugyldige brugerdefinerede afspilningshastigheder</string>
<string name="revanced_custom_playback_speeds_auto">Automatisk</string>
<string name="revanced_custom_playback_speeds_reset_toast">Afspilningshastighed nulstillet til: %s</string>
<string name="revanced_speed_tap_and_hold_title">Brugerdefineret hastighed, når du holder den nede</string>
<string name="revanced_speed_tap_and_hold_summary">Afspilningshastighed mellem 0-8</string>
</patch>
@@ -1431,6 +1428,9 @@ Aktivering af dette kan låse op for højere videokvalitet"</string>
<string name="revanced_remember_playback_speed_last_selected_title">Husk ændringer i afspilningshastighed</string>
<string name="revanced_remember_playback_speed_last_selected_summary_on">Ændring af afspilningshastighed gælder for alle videoer</string>
<string name="revanced_remember_playback_speed_last_selected_summary_off">Ændringerne i afspilningshastighed gælder kun for den aktuelle video</string>
<string name="revanced_remember_playback_speed_last_selected_toast_title">Vis notifikation ved ændring af afspilningshastighed</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">En notifikation vises, når standardafspilningshastigheden ændres</string>
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">Meddelelse vises ikke, når standardafspilningshastigheden ændres</string>
<string name="revanced_playback_speed_default_title">Standard afspilningshastighed</string>
<string name="revanced_remember_playback_speed_toast">Ændrede standardhastighed til: %s</string>
</patch>

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