Compare commits

...

29 Commits

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

### Features

* **YouTube - Hide video action buttons:** Add `Hide Stop ads` ([#5245](https://github.com/ReVanced/revanced-patches/issues/5245)) ([0e63f49](0e63f49e13))
2025-06-24 11:14:05 +00:00
ILoveOpenSourceApplications
0e63f49e13 feat(YouTube - Hide video action buttons): Add Hide Stop ads (#5245) 2025-06-24 15:10:23 +04:00
semantic-release-bot
674a5b8d29 chore: Release v5.29.0-dev.5 [skip ci]
# [5.29.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.4...v5.29.0-dev.5) (2025-06-23)

### Bug Fixes

* **Google Photos:** Resolve startup crash for Android 5.0 devices ([7be3741](7be374100b))
2025-06-23 12:28:49 +00:00
LisoUseInAIKyrios
7be374100b fix(Google Photos): Resolve startup crash for Android 5.0 devices 2025-06-23 16:24:42 +04:00
semantic-release-bot
e48c152b95 chore: Release v5.29.0-dev.4 [skip ci]
# [5.29.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.3...v5.29.0-dev.4) (2025-06-23)

### Bug Fixes

* **YouTube - Hide Shorts components:** Fix "Hide Use this sound button" ([#5233](https://github.com/ReVanced/revanced-patches/issues/5233)) ([a678f17](a678f178e1))
2025-06-23 09:33:13 +00:00
ILoveOpenSourceApplications
a678f178e1 fix(YouTube - Hide Shorts components): Fix "Hide Use this sound button" (#5233) 2025-06-23 13:29:53 +04:00
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
141 changed files with 1048 additions and 2166 deletions

View File

@@ -1,3 +1,103 @@
# [5.29.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.5...v5.29.0-dev.6) (2025-06-24)
### Features
* **YouTube - Hide video action buttons:** Add `Hide Stop ads` ([#5245](https://github.com/ReVanced/revanced-patches/issues/5245)) ([274dcc6](https://github.com/ReVanced/revanced-patches/commit/274dcc676e009be63eb6970de33abacd34dc6560))
# [5.29.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.4...v5.29.0-dev.5) (2025-06-23)
### Bug Fixes
* **Google Photos:** Resolve startup crash for Android 5.0 devices ([0294533](https://github.com/ReVanced/revanced-patches/commit/0294533c4d9a321aea086eedb4e46385ae9a026e))
# [5.29.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.29.0-dev.3...v5.29.0-dev.4) (2025-06-23)
### Bug Fixes
* **YouTube - Hide Shorts components:** Fix "Hide Use this sound button" ([#5233](https://github.com/ReVanced/revanced-patches/issues/5233)) ([5d6ec9e](https://github.com/ReVanced/revanced-patches/commit/5d6ec9e94a6221a0f32762d5bede893e9e7457fc))
# [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

@@ -19,7 +19,6 @@ import android.util.Pair;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
@@ -28,7 +27,6 @@ import java.util.Locale;
import app.revanced.extension.shared.requests.Requester;
import app.revanced.extension.shared.requests.Route;
import app.revanced.extension.shared.Utils;
@SuppressWarnings("unused")
public class GmsCoreSupport {
@@ -109,7 +107,6 @@ public class GmsCoreSupport {
/**
* Injection point.
*/
@RequiresApi(api = Build.VERSION_CODES.N)
public static void checkGmsCore(Activity context) {
try {
// Verify the user has not included GmsCore for a root installation.
@@ -226,6 +223,11 @@ public class GmsCoreSupport {
* @return If GmsCore is not whitelisted from battery optimizations.
*/
private static boolean batteryOptimizationsEnabled(Context context) {
//noinspection ObsoleteSdkInt
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// Android 5.0 does not have battery optimization settings.
return false;
}
var powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
return !powerManager.isIgnoringBatteryOptimizations(GMS_CORE_PACKAGE_NAME);
}

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

@@ -46,7 +46,7 @@ final class ButtonsFilter extends Filter {
"|download_button.eml"
),
new StringFilterGroup(
Settings.HIDE_PLAYLIST_BUTTON,
Settings.HIDE_SAVE_BUTTON,
"|save_to_playlist_button"
),
new StringFilterGroup(
@@ -76,6 +76,10 @@ final class ButtonsFilter extends Filter {
Settings.HIDE_ASK_BUTTON,
"yt_fill_spark"
),
new ByteArrayFilterGroup(
Settings.HIDE_STOP_ADS_BUTTON,
"yt_outline_slash_circle_left"
),
// Check for clip button both here and using a path filter,
// as there's a chance the path is a generic action button and won't contain 'clip_button'
new ByteArrayFilterGroup(

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

@@ -40,8 +40,10 @@ public final class ShortsFilter extends Filter {
private static WeakReference<PivotBar> pivotBarRef = new WeakReference<>(null);
private final StringFilterGroup shortsCompactFeedVideoPath;
private final StringFilterGroup shortsCompactFeedVideo;
private final ByteArrayFilterGroup shortsCompactFeedVideoBuffer;
private final StringFilterGroup useSoundButton;
private final ByteArrayFilterGroup useSoundButtonBuffer;
private final StringFilterGroup subscribeButton;
private final StringFilterGroup joinButton;
@@ -49,11 +51,11 @@ public final class ShortsFilter extends Filter {
private final StringFilterGroup shelfHeader;
private final StringFilterGroup suggestedAction;
private final ByteArrayFilterGroupList suggestedActionsGroupList = new ByteArrayFilterGroupList();
private final ByteArrayFilterGroupList suggestedActionsBuffer = new ByteArrayFilterGroupList();
private final StringFilterGroup shortsActionBar;
private final StringFilterGroup actionButton;
private final ByteArrayFilterGroupList videoActionButtonGroupList = new ByteArrayFilterGroupList();
private final StringFilterGroup videoActionButton;
private final ByteArrayFilterGroupList videoActionButtonBuffer = new ByteArrayFilterGroupList();
public ShortsFilter() {
//
@@ -82,7 +84,7 @@ public final class ShortsFilter extends Filter {
// Path components.
//
shortsCompactFeedVideoPath = new StringFilterGroup(null,
shortsCompactFeedVideo = new StringFilterGroup(null,
// Shorts that appear in the feed/search when the device is using tablet layout.
"compact_video.eml",
// 'video_lockup_with_attachment.eml' is shown instead of 'compact_video.eml' for some users
@@ -174,7 +176,18 @@ public final class ShortsFilter extends Filter {
"reel_action_bar.eml"
);
actionButton = new StringFilterGroup(
useSoundButton = new StringFilterGroup(
Settings.HIDE_SHORTS_USE_SOUND_BUTTON,
"floating_action_button.eml",
REEL_METAPANEL_PATH
);
useSoundButtonBuffer = new ByteArrayFilterGroup(
null,
"yt_outline_camera_"
);
videoActionButton = new StringFilterGroup(
null,
// Can be simply 'button.eml', 'shorts_video_action_button.eml' or 'reel_action_button.eml'
"button.eml"
@@ -186,16 +199,16 @@ public final class ShortsFilter extends Filter {
);
addPathCallbacks(
shortsCompactFeedVideoPath, joinButton, subscribeButton, paidPromotionButton,
shortsCompactFeedVideo, joinButton, subscribeButton, paidPromotionButton,
shortsActionBar, suggestedAction, pausedOverlayButtons, channelBar,
fullVideoLinkLabel, videoTitle, reelSoundMetadata, soundButton, infoPanel,
fullVideoLinkLabel, videoTitle, useSoundButton, reelSoundMetadata, soundButton, infoPanel,
stickers, likeFountain, likeButton, dislikeButton
);
//
// All other action buttons.
//
videoActionButtonGroupList.addAll(
videoActionButtonBuffer.addAll(
new ByteArrayFilterGroup(
Settings.HIDE_SHORTS_COMMENTS_BUTTON,
"reel_comment_button",
@@ -216,7 +229,7 @@ public final class ShortsFilter extends Filter {
//
// Suggested actions.
//
suggestedActionsGroupList.addAll(
suggestedActionsBuffer.addAll(
new ByteArrayFilterGroup(
Settings.HIDE_SHORTS_PREVIEW_COMMENT,
// Preview comment that can popup while a Short is playing.
@@ -242,10 +255,7 @@ public final class ShortsFilter extends Filter {
"yt_outline_bookmark_",
// 'Save sound' button. It seems this has been removed and only 'Save music' is used.
// Still hide this in case it's still present.
"yt_outline_list_add_",
// 'Use this sound' button. It seems this has been removed and only 'Save music' is used.
// Still hide this in case it's still present.
"yt_outline_camera_"
"yt_outline_list_add_"
),
new ByteArrayFilterGroup(
Settings.HIDE_SHORTS_SEARCH_SUGGESTIONS,
@@ -279,7 +289,7 @@ public final class ShortsFilter extends Filter {
}
private boolean isEverySuggestedActionFilterEnabled() {
for (ByteArrayFilterGroup group : suggestedActionsGroupList) {
for (ByteArrayFilterGroup group : suggestedActionsBuffer) {
if (!group.isEnabled()) {
return false;
}
@@ -297,15 +307,19 @@ public final class ShortsFilter extends Filter {
return path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH);
}
if (matchedGroup == shortsCompactFeedVideoPath) {
if (matchedGroup == useSoundButton) {
return useSoundButtonBuffer.check(protobufBufferArray).isFiltered();
}
if (matchedGroup == shortsCompactFeedVideo) {
return shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(protobufBufferArray).isFiltered();
}
// Video action buttons (comment, share, remix) have the same path.
// Like and dislike are separate path filters and don't require buffer searching.
if (matchedGroup == shortsActionBar) {
return actionButton.check(path).isFiltered()
&& videoActionButtonGroupList.check(protobufBufferArray).isFiltered();
return videoActionButton.check(path).isFiltered()
&& videoActionButtonBuffer.check(protobufBufferArray).isFiltered();
}
if (matchedGroup == suggestedAction) {
@@ -316,7 +330,7 @@ public final class ShortsFilter extends Filter {
return true;
}
return suggestedActionsGroupList.check(protobufBufferArray).isFiltered();
return suggestedActionsBuffer.check(protobufBufferArray).isFiltered();
}
return true;

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",
@@ -196,15 +200,16 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_TRANSCRIPT_SECTION = new BooleanSetting("revanced_hide_transcript_section", TRUE);
// Action buttons
public static final BooleanSetting DISABLE_LIKE_SUBSCRIBE_GLOW = new BooleanSetting("revanced_disable_like_subscribe_glow", FALSE);
public static final BooleanSetting HIDE_ASK_BUTTON = new BooleanSetting("revanced_hide_ask_button", FALSE);
public static final BooleanSetting HIDE_CLIP_BUTTON = new BooleanSetting("revanced_hide_clip_button", TRUE);
public static final BooleanSetting HIDE_DOWNLOAD_BUTTON = new BooleanSetting("revanced_hide_download_button", FALSE);
public static final BooleanSetting HIDE_LIKE_DISLIKE_BUTTON = new BooleanSetting("revanced_hide_like_dislike_button", FALSE);
public static final BooleanSetting HIDE_PLAYLIST_BUTTON = new BooleanSetting("revanced_hide_playlist_button", FALSE);
public static final BooleanSetting HIDE_REMIX_BUTTON = new BooleanSetting("revanced_hide_remix_button", TRUE);
public static final BooleanSetting HIDE_REPORT_BUTTON = new BooleanSetting("revanced_hide_report_button", FALSE);
public static final BooleanSetting HIDE_SAVE_BUTTON = new BooleanSetting("revanced_hide_save_button", FALSE);
public static final BooleanSetting HIDE_SHARE_BUTTON = new BooleanSetting("revanced_hide_share_button", FALSE);
public static final BooleanSetting HIDE_STOP_ADS_BUTTON = new BooleanSetting("revanced_hide_stop_ads_button", TRUE);
public static final BooleanSetting HIDE_THANKS_BUTTON = new BooleanSetting("revanced_hide_thanks_button", TRUE);
public static final BooleanSetting HIDE_ASK_BUTTON = new BooleanSetting("revanced_hide_ask_button", FALSE);
// Player flyout menu items
public static final BooleanSetting HIDE_PLAYER_FLYOUT_ADDITIONAL_SETTINGS = new BooleanSetting("revanced_hide_player_flyout_additional_settings", FALSE);
public static final BooleanSetting HIDE_PLAYER_FLYOUT_AMBIENT_MODE = new BooleanSetting("revanced_hide_player_flyout_ambient_mode", FALSE);
@@ -289,6 +294,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_SHORTS_SUPER_THANKS_BUTTON = new BooleanSetting("revanced_hide_shorts_super_thanks_button", TRUE);
public static final BooleanSetting HIDE_SHORTS_TAGGED_PRODUCTS = new BooleanSetting("revanced_hide_shorts_tagged_products", TRUE);
public static final BooleanSetting HIDE_SHORTS_UPCOMING_BUTTON = new BooleanSetting("revanced_hide_shorts_upcoming_button", TRUE);
public static final BooleanSetting HIDE_SHORTS_USE_SOUND_BUTTON = new BooleanSetting("revanced_hide_shorts_use_sound_button", TRUE);
public static final BooleanSetting HIDE_SHORTS_USE_TEMPLATE_BUTTON = new BooleanSetting("revanced_hide_shorts_use_template_button", TRUE);
public static final BooleanSetting HIDE_SHORTS_VIDEO_TITLE = new BooleanSetting("revanced_hide_shorts_video_title", FALSE);
public static final BooleanSetting SHORTS_AUTOPLAY = new BooleanSetting("revanced_shorts_autoplay", FALSE);

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.6

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",
@@ -40,15 +38,16 @@ val hideButtonsPatch = resourcePatch(
"revanced_hide_buttons_screen",
preferences = setOf(
SwitchPreference("revanced_disable_like_subscribe_glow"),
SwitchPreference("revanced_hide_like_dislike_button"),
SwitchPreference("revanced_hide_share_button"),
SwitchPreference("revanced_hide_report_button"),
SwitchPreference("revanced_hide_remix_button"),
SwitchPreference("revanced_hide_download_button"),
SwitchPreference("revanced_hide_thanks_button"),
SwitchPreference("revanced_hide_ask_button"),
SwitchPreference("revanced_hide_clip_button"),
SwitchPreference("revanced_hide_playlist_button"),
SwitchPreference("revanced_hide_download_button"),
SwitchPreference("revanced_hide_like_dislike_button"),
SwitchPreference("revanced_hide_remix_button"),
SwitchPreference("revanced_hide_report_button"),
SwitchPreference("revanced_hide_save_button"),
SwitchPreference("revanced_hide_share_button"),
SwitchPreference("revanced_hide_stop_ads_button"),
SwitchPreference("revanced_hide_thanks_button"),
)
)
)

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

@@ -94,6 +94,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch {
// Suggested actions.
SwitchPreference("revanced_hide_shorts_preview_comment"),
SwitchPreference("revanced_hide_shorts_save_sound_button"),
SwitchPreference("revanced_hide_shorts_use_sound_button"),
SwitchPreference("revanced_hide_shorts_use_template_button"),
SwitchPreference("revanced_hide_shorts_upcoming_button"),
SwitchPreference("revanced_hide_shorts_green_screen_button"),
@@ -170,8 +171,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>

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