diff --git a/CHANGELOG.md b/CHANGELOG.md index ed6e0304a6..47b6693720 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,64 @@ +# [5.42.0-dev.18](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.17...v5.42.0-dev.18) (2025-10-07) + + +### Features + +* **Custom branding:** Add in-app settings to change icon and name ([#6059](https://github.com/ReVanced/revanced-patches/issues/6059)) ([a50f3b5](https://github.com/ReVanced/revanced-patches/commit/a50f3b5177808f07d84041c946caccb5a08ad387)) + +# [5.42.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.16...v5.42.0-dev.17) (2025-10-07) + + +### Bug Fixes + +* **YouTube - Force original audio:** Change patch to default on ([#6070](https://github.com/ReVanced/revanced-patches/issues/6070)) ([bd4ba2d](https://github.com/ReVanced/revanced-patches/commit/bd4ba2dae85ee6fd8d7e6078c3de775ca336e0b6)) + +# [5.42.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.15...v5.42.0-dev.16) (2025-10-07) + + +### Bug Fixes + +* **YouTube - Spoof video streams:** Add "Allow Android VR AV1" setting ([#6071](https://github.com/ReVanced/revanced-patches/issues/6071)) ([f03256c](https://github.com/ReVanced/revanced-patches/commit/f03256c471e1ee6a12267c1b56b531ca8f89278c)) + +# [5.42.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.14...v5.42.0-dev.15) (2025-10-07) + + +### Features + +* **Instagram:** Add `Enable developer menu` patch ([#6043](https://github.com/ReVanced/revanced-patches/issues/6043)) ([2154d89](https://github.com/ReVanced/revanced-patches/commit/2154d89242fd8d7f7460145d5d35a4f1986944a3)) + +# [5.42.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.13...v5.42.0-dev.14) (2025-10-07) + + +### Features + +* **Instagram:** Add `Custom share domain` patch ([#5998](https://github.com/ReVanced/revanced-patches/issues/5998)) ([20c4131](https://github.com/ReVanced/revanced-patches/commit/20c413120bad97af6121718e76b22a1b5540aa44)) + +# [5.42.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.12...v5.42.0-dev.13) (2025-10-07) + + +### Bug Fixes + +* **Spotify:** Change `Hide Create button` patch to default off ([#6067](https://github.com/ReVanced/revanced-patches/issues/6067)) ([19949e1](https://github.com/ReVanced/revanced-patches/commit/19949e1695cc252ff0f94a33b6e3fb62e967d7fd)) + +# [5.42.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.11...v5.42.0-dev.12) (2025-10-03) + + +### Bug Fixes + +* **Custom branding:** Update ReVanced logo ([#6049](https://github.com/ReVanced/revanced-patches/issues/6049)) ([9441e7a](https://github.com/ReVanced/revanced-patches/commit/9441e7acb4817e12d1443d438ef6c448518bd614)) + + +### Features + +* **Instagram:** Add `Sanitize sharing links` patch ([#5986](https://github.com/ReVanced/revanced-patches/issues/5986)) ([963a4ef](https://github.com/ReVanced/revanced-patches/commit/963a4ef43fd513de7a2d7d019992f06b62fdcc10)) + +# [5.42.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.10...v5.42.0-dev.11) (2025-10-03) + + +### Bug Fixes + +* **YouTube:** Resolve UI components not hiding for some users ([#6054](https://github.com/ReVanced/revanced-patches/issues/6054)) ([6b26346](https://github.com/ReVanced/revanced-patches/commit/6b2634691423f5ce25a28b3f2fbc420977b81748)) + # [5.42.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.9...v5.42.0-dev.10) (2025-10-02) diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java new file mode 100644 index 0000000000..b7a017e77f --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java @@ -0,0 +1,15 @@ +package app.revanced.extension.instagram.misc.privacy; + +import app.revanced.extension.shared.privacy.LinkSanitizer; + +@SuppressWarnings("unused") +public final class SanitizeSharingLinksPatch { + private static final LinkSanitizer sanitizer = new LinkSanitizer("igsh"); + + /** + * Injection point. + */ + public static String sanitizeSharingLink(String url) { + return sanitizer.sanitizeUrlString(url); + } +} diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.java new file mode 100644 index 0000000000..77eea7e847 --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.java @@ -0,0 +1,33 @@ +package app.revanced.extension.instagram.misc.share.domain; + +import android.net.Uri; +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public final class ChangeLinkSharingDomainPatch { + + private static String getCustomShareDomain() { + // Method is modified during patching. + throw new IllegalStateException(); + } + + /** + * Injection point. + */ + public static String setCustomShareDomain(String url) { + try { + Uri uri = Uri.parse(url); + Uri.Builder builder = uri + .buildUpon() + .authority(getCustomShareDomain()) + .clearQuery(); + + String patchedUrl = builder.build().toString(); + Logger.printInfo(() -> "Domain change from : " + url + " to: " + patchedUrl); + return patchedUrl; + } catch (Exception ex) { + Logger.printException(() -> "setCustomShareDomain failure with " + url, ex); + return url; + } + } +} diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java new file mode 100644 index 0000000000..9b3aa6347a --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java @@ -0,0 +1,15 @@ +package app.revanced.extension.instagram.misc.share.privacy; + +import app.revanced.extension.shared.privacy.LinkSanitizer; + +@SuppressWarnings("unused") +public final class SanitizeSharingLinksPatch { + private static final LinkSanitizer sanitizer = new LinkSanitizer("igsh"); + + /** + * Injection point. + */ + public static String sanitizeSharingLink(String url) { + return sanitizer.sanitizeUrlString(url); + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java index 978ee7131a..993634eaba 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java @@ -31,9 +31,6 @@ import app.revanced.extension.shared.ui.CustomDialog; @SuppressWarnings("unused") public class GmsCoreSupport { - private static final String PACKAGE_NAME_YOUTUBE = "com.google.android.youtube"; - private static final String PACKAGE_NAME_YOUTUBE_MUSIC = "com.google.android.apps.youtube.music"; - private static final String GMS_CORE_PACKAGE_NAME = getGmsCoreVendorGroupId() + ".android.gms"; private static final Uri GMS_CORE_PROVIDER @@ -53,6 +50,20 @@ public class GmsCoreSupport { @Nullable private static volatile Boolean DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED; + private static String getOriginalPackageName() { + return null; // Modified during patching. + } + + /** + * @return If the current package name is the same as the original unpatched app. + * If `GmsCore support` was not included during patching, this returns true; + */ + public static boolean isPackageNameOriginal() { + String originalPackageName = getOriginalPackageName(); + return originalPackageName == null + || originalPackageName.equals(Utils.getContext().getPackageName()); + } + private static void open(String queryOrLink) { Logger.printInfo(() -> "Opening link: " + queryOrLink); @@ -113,11 +124,10 @@ public class GmsCoreSupport { // Verify the user has not included GmsCore for a root installation. // GmsCore Support changes the package name, but with a mounted installation // all manifest changes are ignored and the original package name is used. - String packageName = context.getPackageName(); - if (packageName.equals(PACKAGE_NAME_YOUTUBE) || packageName.equals(PACKAGE_NAME_YOUTUBE_MUSIC)) { + if (isPackageNameOriginal()) { Logger.printInfo(() -> "App is mounted with root, but GmsCore patch was included"); - // Cannot use localize text here, since the app will load - // resources from the unpatched app and all patch strings are missing. + // Cannot use localize text here, since the app will load resources + // from the unpatched app and all patch strings are missing. Utils.showToastLong("The 'GmsCore support' patch breaks mount installations"); // Do not exit. If the app exits before launch completes (and without @@ -250,8 +260,8 @@ public class GmsCoreSupport { }; } - // Modified by a patch. Do not touch. private static String getGmsCoreVendorGroupId() { - return "app.revanced"; + // Modified during patching. + throw new IllegalStateException(); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java new file mode 100644 index 0000000000..79a4d54849 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java @@ -0,0 +1,136 @@ +package app.revanced.extension.shared.patches; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; + +import java.util.ArrayList; +import java.util.List; + +import app.revanced.extension.shared.GmsCoreSupport; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; + +/** + * Patch shared by YouTube and YT Music. + */ +@SuppressWarnings("unused") +public class CustomBrandingPatch { + + // Important: In the future, additional branding themes can be added but all existing and prior + // themes cannot be removed or renamed. + // + // This is because if a user has a branding theme selected, then only that launch alias is enabled. + // If a future update removes or renames that alias, then after updating the app is effectively + // broken and it cannot be opened and not even clearing the app data will fix it. + // In that situation the only fix is to completely uninstall and reinstall again. + // + // The most that can be done is to hide a theme from the UI and keep the alias with dummy data. + public enum BrandingTheme { + /** + * Original unpatched icon. Must be first enum. + */ + ORIGINAL("revanced_original"), + ROUNDED("revanced_rounded"), + MINIMAL("revanced_minimal"), + SCALED("revanced_scaled"), + /** + * User provided custom icon. Must be the last enum. + */ + CUSTOM("revanced_custom"); + + public final String themeAlias; + + BrandingTheme(String themeAlias) { + this.themeAlias = themeAlias; + } + + private String packageAndNameIndexToClassAlias(String packageName, int appIndex) { + if (appIndex <= 0) { + throw new IllegalArgumentException("App index starts at index 1"); + } + return packageName + '.' + themeAlias + '_' + appIndex; + } + } + + /** + * Injection point. + * + * The total number of app name aliases, including dummy aliases. + */ + private static int numberOfPresetAppNames() { + // Modified during patching. + throw new IllegalStateException(); + } + + /** + * Injection point. + */ + @SuppressWarnings("ConstantConditions") + public static void setBranding() { + try { + if (GmsCoreSupport.isPackageNameOriginal()) { + Logger.printInfo(() -> "App is root mounted. Cannot dynamically change app icon"); + return; + } + + Context context = Utils.getContext(); + PackageManager pm = context.getPackageManager(); + String packageName = context.getPackageName(); + + BrandingTheme selectedBranding = BaseSettings.CUSTOM_BRANDING_ICON.get(); + final int selectedNameIndex = BaseSettings.CUSTOM_BRANDING_NAME.get(); + ComponentName componentToEnable = null; + ComponentName defaultComponent = null; + List componentsToDisable = new ArrayList<>(); + + for (BrandingTheme theme : BrandingTheme.values()) { + // Must always update all aliases including custom alias (last index). + final int numberOfPresetAppNames = numberOfPresetAppNames(); + + // App name indices starts at 1. + for (int index = 1; index <= numberOfPresetAppNames; index++) { + String aliasClass = theme.packageAndNameIndexToClassAlias(packageName, index); + ComponentName component = new ComponentName(packageName, aliasClass); + if (defaultComponent == null) { + // Default is always the first alias. + defaultComponent = component; + } + + if (index == selectedNameIndex && theme == selectedBranding) { + componentToEnable = component; + } else { + componentsToDisable.add(component); + } + } + } + + if (componentToEnable == null) { + // User imported a bad app name index value. Either the imported data + // was corrupted, or they previously had custom name enabled and the app + // no longer has a custom name specified. + Utils.showToastLong("Custom branding reset"); + BaseSettings.CUSTOM_BRANDING_ICON.resetToDefault(); + BaseSettings.CUSTOM_BRANDING_NAME.resetToDefault(); + + componentToEnable = defaultComponent; + componentsToDisable.remove(defaultComponent); + } + + for (ComponentName disable : componentsToDisable) { + // Use info logging because if the alias status become corrupt the app cannot launch. + Logger.printInfo(() -> "Disabling: " + disable.getClassName()); + pm.setComponentEnabledSetting(disable, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + } + + ComponentName componentToEnableFinal = componentToEnable; + Logger.printInfo(() -> "Enabling: " + componentToEnableFinal.getClassName()); + pm.setComponentEnabledSetting(componentToEnable, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); + } catch (Exception ex) { + Logger.printException(() -> "setBranding failure", ex); + } + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java index 6952bdcd1c..d028997276 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java @@ -1,5 +1,6 @@ package app.revanced.extension.shared.patches; +import app.revanced.extension.shared.privacy.LinkSanitizer; import app.revanced.extension.shared.settings.BaseSettings; /** @@ -7,17 +8,18 @@ import app.revanced.extension.shared.settings.BaseSettings; */ @SuppressWarnings("unused") public final class SanitizeSharingLinksPatch { - private static final String NEW_TRACKING_PARAMETER_REGEX = ".si=.+"; - private static final String OLD_TRACKING_PARAMETER_REGEX = ".feature=.+"; + + private static final LinkSanitizer sanitizer = new LinkSanitizer( + "si", + "feature" // Old tracking parameter name, and may be obsolete. + ); /** * Injection point. */ public static String sanitize(String url) { if (BaseSettings.SANITIZE_SHARED_LINKS.get()) { - url = url - .replaceAll(NEW_TRACKING_PARAMETER_REGEX, "") - .replaceAll(OLD_TRACKING_PARAMETER_REGEX, ""); + url = sanitizer.sanitizeUrlString(url); } if (BaseSettings.REPLACE_MUSIC_LINKS_WITH_YOUTUBE.get()) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java new file mode 100644 index 0000000000..9cfa05c1b9 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java @@ -0,0 +1,60 @@ +package app.revanced.extension.shared.privacy; + +import android.net.Uri; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import app.revanced.extension.shared.Logger; + +/** + * Strips away specific parameters from URLs. + */ +public class LinkSanitizer { + + private final Collection parametersToRemove; + + public LinkSanitizer(String ... parametersToRemove) { + final int parameterCount = parametersToRemove.length; + if (parameterCount == 0) { + throw new IllegalArgumentException("No parameters specified"); + } + + // List is faster if only checking a few parameters. + this.parametersToRemove = parameterCount > 4 + ? Set.of(parametersToRemove) + : List.of(parametersToRemove); + } + + public String sanitizeUrlString(String url) { + try { + return sanitizeUri(Uri.parse(url)).toString(); + } catch (Exception ex) { + Logger.printException(() -> "sanitizeUrlString failure: " + url, ex); + return url; + } + } + + public Uri sanitizeUri(Uri uri) { + try { + Uri.Builder builder = uri.buildUpon().clearQuery(); + + for (String paramName : uri.getQueryParameterNames()) { + if (!parametersToRemove.contains(paramName)) { + for (String value : uri.getQueryParameters(paramName)) { + builder.appendQueryParameter(paramName, value); + } + } + } + + Uri sanitizedUrl = builder.build(); + Logger.printInfo(() -> "Sanitized url: " + uri + " to: " + sanitizedUrl); + + return sanitizedUrl; + } catch (Exception ex) { + Logger.printException(() -> "sanitizeUri failure: " + uri, ex); + return uri; + } + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index 1eff30361d..3bc16e313c 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -2,6 +2,7 @@ package app.revanced.extension.shared.settings; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; +import static app.revanced.extension.shared.patches.CustomBrandingPatch.BrandingTheme; import static app.revanced.extension.shared.settings.Setting.parent; import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability; @@ -40,4 +41,7 @@ public class BaseSettings { public static final BooleanSetting REPLACE_MUSIC_LINKS_WITH_YOUTUBE = new BooleanSetting("revanced_replace_music_with_youtube", FALSE); public static final BooleanSetting CHECK_WATCH_HISTORY_DOMAIN_NAME = new BooleanSetting("revanced_check_watch_history_domain_name", TRUE, false, false); + + public static final EnumSetting CUSTOM_BRANDING_ICON = new EnumSetting<>("revanced_custom_branding_icon", BrandingTheme.ORIGINAL, true); + public static final IntegerSetting CUSTOM_BRANDING_NAME = new IntegerSetting("revanced_custom_branding_name", 1, true); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java index be14e4a635..4f4d3ef928 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java @@ -5,6 +5,7 @@ import static app.revanced.extension.shared.Utils.dipToPixels; import static app.revanced.extension.shared.requests.Route.Method.GET; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; @@ -125,6 +126,8 @@ public class ReVancedAboutPreference extends Preference { { setOnPreferenceClickListener(pref -> { + Context context = pref.getContext(); + // Show a progress spinner if the social links are not fetched yet. if (!AboutLinksRoutes.hasFetchedLinks() && Utils.isNetworkConnected()) { // Show a progress spinner, but only if the api fetch takes more than a half a second. @@ -137,17 +140,18 @@ public class ReVancedAboutPreference extends Preference { handler.postDelayed(showDialogRunnable, delayToShowProgressSpinner); Utils.runOnBackgroundThread(() -> - fetchLinksAndShowDialog(handler, showDialogRunnable, progress)); + fetchLinksAndShowDialog(context, handler, showDialogRunnable, progress)); } else { // No network call required and can run now. - fetchLinksAndShowDialog(null, null, null); + fetchLinksAndShowDialog(context, null, null, null); } return false; }); } - private void fetchLinksAndShowDialog(@Nullable Handler handler, + private void fetchLinksAndShowDialog(Context context, + @Nullable Handler handler, Runnable showDialogRunnable, @Nullable ProgressDialog progress) { WebLink[] links = AboutLinksRoutes.fetchAboutLinks(); @@ -164,7 +168,17 @@ public class ReVancedAboutPreference extends Preference { if (handler != null) { handler.removeCallbacks(showDialogRunnable); } - if (progress != null) { + + // Don't continue if the activity is done. To test this tap the + // about dialog and immediately press back before the dialog can show. + if (context instanceof Activity activity) { + if (activity.isFinishing() || activity.isDestroyed()) { + Logger.printDebug(() -> "Not showing about dialog, activity is closed"); + return; + } + } + + if (progress != null && progress.isShowing()) { progress.dismiss(); } new WebViewDialog(getContext(), htmlDialog).show(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java index a1de3d0bec..53664881b7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java @@ -19,6 +19,14 @@ import app.revanced.extension.shared.spoof.requests.StreamingDataRequest; @SuppressWarnings("unused") public class SpoofVideoStreamsPatch { + + public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability { + @Override + public boolean isAvailable() { + return BaseSettings.SPOOF_VIDEO_STREAMS.get() && !preferredClient.useAuth; + } + } + /** * Domain used for internet connectivity verification. * It has an empty response body and is only used to check for a 204 response code. @@ -321,11 +329,4 @@ public class SpoofVideoStreamsPatch { return videoFormat; } - - public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability { - @Override - public boolean isAvailable() { - return BaseSettings.SPOOF_VIDEO_STREAMS.get() && !preferredClient.useAuth; - } - } } diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java index 55b78933dc..61cb977a2f 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java @@ -1,18 +1,11 @@ package app.revanced.extension.spotify.misc.privacy; -import android.net.Uri; - -import java.util.List; - -import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.privacy.LinkSanitizer; @SuppressWarnings("unused") public final class SanitizeSharingLinksPatch { - /** - * Parameters that are considered undesirable and should be stripped away. - */ - private static final List SHARE_PARAMETERS_TO_REMOVE = List.of( + private static final LinkSanitizer sanitizer = new LinkSanitizer( "si", // Share tracking parameter. "utm_source" // Share source, such as "copy-link". ); @@ -20,25 +13,7 @@ public final class SanitizeSharingLinksPatch { /** * Injection point. */ - public static String sanitizeUrl(String url) { - try { - Uri uri = Uri.parse(url); - Uri.Builder builder = uri.buildUpon().clearQuery(); - - for (String paramName : uri.getQueryParameterNames()) { - if (!SHARE_PARAMETERS_TO_REMOVE.contains(paramName)) { - for (String value : uri.getQueryParameters(paramName)) { - builder.appendQueryParameter(paramName, value); - } - } - } - - String sanitizedUrl = builder.build().toString(); - Logger.printInfo(() -> "Sanitized url " + url + " to " + sanitizedUrl); - return sanitizedUrl; - } catch (Exception ex) { - Logger.printException(() -> "sanitizeUrl failure with " + url, ex); - return url; - } + public static String sanitizeSharingLink(String url) { + return sanitizer.sanitizeUrlString(url); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java index e9672d1fff..eaf2f3e14b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java @@ -8,29 +8,35 @@ import static app.revanced.extension.shared.spoof.ClientType.VISIONOS; import java.util.List; +import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.spoof.ClientType; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class SpoofVideoStreamsPatch { + public static final class SpoofClientAv1Availability implements Setting.Availability { + @Override + public boolean isAvailable() { + return Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.isAvailable() + && Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ANDROID_VR_1_43_32; + } + } + /** * Injection point. */ public static void setClientOrderToUse() { ClientType client = Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get(); - - if (Settings.FORCE_AVC_CODEC.get() && client == ANDROID_VR_1_61_48) { - // VR 1.61 uses VP9/AV1, and cannot force AVC. Use 1.43 instead. - client = ANDROID_VR_1_43_32; + if (client == ANDROID_VR_1_43_32 && Settings.SPOOF_VIDEO_STREAMS_AV1.get()) { + client = ANDROID_VR_1_61_48; } List availableClients = List.of( + ANDROID_CREATOR, ANDROID_VR_1_43_32, VISIONOS, - ANDROID_CREATOR, - ANDROID_VR_1_61_48, IPADOS); app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index caed1e4b30..c821dd45db 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -22,6 +22,7 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerT import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType; import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability; import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability; +import static app.revanced.extension.youtube.patches.spoof.SpoofVideoStreamsPatch.SpoofClientAv1Availability; import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle; import static app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController.SponsorBlockDuration; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.IGNORE; @@ -56,7 +57,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting ADVANCED_VIDEO_QUALITY_MENU = new BooleanSetting("revanced_advanced_video_quality_menu", TRUE); public static final BooleanSetting DISABLE_HDR_VIDEO = new BooleanSetting("revanced_disable_hdr_video", FALSE); public static final BooleanSetting FORCE_AVC_CODEC = new BooleanSetting("revanced_force_avc_codec", FALSE, true, "revanced_force_avc_codec_user_dialog_message"); - public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", FALSE, true); + public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", TRUE, true); 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); @@ -360,6 +361,8 @@ public class Settings extends BaseSettings { public static final BooleanSetting SPOOF_DEVICE_DIMENSIONS = new BooleanSetting("revanced_spoof_device_dimensions", FALSE, true, "revanced_spoof_device_dimensions_user_dialog_message"); public static final EnumSetting SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_43_32, true, parent(SPOOF_VIDEO_STREAMS)); + public static final BooleanSetting SPOOF_VIDEO_STREAMS_AV1 = new BooleanSetting("revanced_spoof_video_streams_av1", FALSE, true, + "revanced_spoof_video_streams_av1_user_dialog_message", new SpoofClientAv1Availability()); public static final BooleanSetting DEBUG_PROTOBUFFER = new BooleanSetting("revanced_debug_protobuffer", FALSE, false, "revanced_debug_protobuffer_user_dialog_message", parent(BaseSettings.DEBUG)); @@ -534,6 +537,11 @@ public class Settings extends BaseSettings { SPOOF_APP_VERSION.resetToDefault(); } + // VR 1.61 is not selectable in the settings, and it's selected by spoof stream patch if needed. + if (SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_1_61_48) { + SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault(); + } + // RYD requires manually migrating old settings since the lack of // a "revanced_" on the old setting causes duplicate key exceptions during export. SharedPrefCategory revancedPrefs = Setting.preferences; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java index 919aed6c61..bf66edbd4c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java @@ -87,13 +87,9 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference { summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume") + '\n' + str("revanced_spoof_video_streams_about_no_av1") + '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio"); - case ANDROID_VR_1_43_32 -> - summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume") - + '\n' + str("revanced_spoof_video_streams_about_no_av1"); - case ANDROID_VR_1_61_48 -> - summary = str("revanced_spoof_video_streams_about_dropped_frames") - + '\n' + summary - + '\n' + str("revanced_spoof_video_streams_about_no_stable_volume"); + // VR 1.61 is not exposed in the UI and should never be reached here. + case ANDROID_VR_1_43_32, ANDROID_VR_1_61_48 -> + summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume"); case IPADOS -> summary = str("revanced_spoof_video_streams_about_playback_failure") + '\n' + str("revanced_spoof_video_streams_about_no_av1"); diff --git a/gradle.properties b/gradle.properties index 836249d0a2..7608a77173 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.42.0-dev.10 +version = 5.42.0-dev.18 diff --git a/patches/api/patches.api b/patches/api/patches.api index 165c468614..a35cf12122 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -268,6 +268,10 @@ public final class app/revanced/patches/instagram/hide/stories/HideStoriesKt { public static final fun getHideStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatchKt { + public static final fun getEnableDeveloperMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/instagram/misc/extension/SharedExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -276,6 +280,14 @@ public final class app/revanced/patches/instagram/misc/links/OpenLinksExternally public static final fun getOpenLinksExternallyPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatchKt { + public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatchKt { + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt { public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -997,11 +1009,6 @@ public final class app/revanced/patches/shared/misc/settings/preference/TextPref public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatchKt { - public static final fun spoofVideoStreamsPatch (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun spoofVideoStreamsPatch$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatchKt { public static final fun userAgentClientSpoofPatch (Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1818,6 +1825,7 @@ public final class app/revanced/util/ResourceUtilsKt { public static final fun forEachChildElement (Lorg/w3c/dom/Node;Lkotlin/jvm/functions/Function1;)V public static final fun insertFirst (Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V public static final fun iterateXmlNodeChildren (Lapp/revanced/patcher/patch/ResourcePatchContext;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static final fun removeFromParent (Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node; } public final class app/revanced/util/resource/ArrayResource : app/revanced/util/resource/BaseResource { diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt index e2b7b06167..c5ce1efe11 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.finanzonline.detection.root import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION @Suppress("unused") val rootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION, ) { compatibleWith("at.gv.bmf.bmf2go") diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt index 6c79650d98..07874bac7c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt @@ -1,12 +1,14 @@ package app.revanced.patches.idaustria.detection.root import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION import app.revanced.util.returnEarly @Suppress("unused") val rootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions and unlocked bootloader.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION ) { compatibleWith("at.gv.oe.app") diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt new file mode 100644 index 0000000000..4f594478dd --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt @@ -0,0 +1,37 @@ +package app.revanced.patches.instagram.misc.devmenu + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +@Suppress("unused") +val enableDeveloperMenuPatch = bytecodePatch( + name = "Enable developer menu", + description = """ + Enables the developer menu, which can be found at the bottom of settings menu with name 'Internal Settings'. + + It is recommended to use this patch with an alpha/beta Instagram release. Patching a stable release works, but the developer menu shows the developer flags as numbers and does not show a human readable description. + """.trimIndentMultiline(), + use = false +) { + compatibleWith("com.instagram.android") + + execute { + with(clearNotificationReceiverFingerprint.method) { + indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverFingerprint.stringMatches!!.first().index) { + val reference = getReference() + Opcode.INVOKE_STATIC == opcode && + reference?.parameterTypes?.size == 1 && + reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && + reference.returnType == "Z" + }.let { index -> + navigate(this).to(index).stop().returnEarly(true) + } + } + } +} + diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt new file mode 100644 index 0000000000..2ae7ada3cf --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt @@ -0,0 +1,12 @@ + +package app.revanced.patches.instagram.misc.devmenu + +import app.revanced.patcher.fingerprint + +internal val clearNotificationReceiverFingerprint by fingerprint { + custom { method, classDef -> + method.name == "onReceive" && + classDef.type == "Lcom/instagram/notifications/push/ClearNotificationReceiver;" + } + strings("NOTIFICATION_DISMISSED") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt new file mode 100644 index 0000000000..b6d968c652 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.instagram.misc.share + +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction + +context(BytecodePatchContext) +internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { + val fingerprintsToPatch = arrayOf( + permalinkResponseJsonParserFingerprint, + storyUrlResponseJsonParserFingerprint, + profileUrlResponseJsonParserFingerprint, + liveUrlResponseJsonParserFingerprint + ) + + for (fingerprint in fingerprintsToPatch) { + fingerprint.method.apply { + val putSharingUrlIndex = indexOfFirstInstruction( + permalinkResponseJsonParserFingerprint.stringMatches!!.first().index, + Opcode.IPUT_OBJECT + ) + + val sharingUrlRegister = getInstruction(putSharingUrlIndex).registerA + + block(putSharingUrlIndex, sharingUrlRegister) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt new file mode 100644 index 0000000000..177dcf23fb --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt @@ -0,0 +1,24 @@ +package app.revanced.patches.instagram.misc.share + +import app.revanced.patcher.fingerprint +import com.google.common.util.concurrent.Striped.custom + +internal val permalinkResponseJsonParserFingerprint by fingerprint { + strings("permalink", "PermalinkResponse") + custom { method, _ -> method.name == "parseFromJson" } +} + +internal val storyUrlResponseJsonParserFingerprint by fingerprint { + strings("story_item_to_share_url", "StoryItemUrlResponse") + custom { method, _ -> method.name == "parseFromJson" } +} + +internal val profileUrlResponseJsonParserFingerprint by fingerprint { + strings("profile_to_share_url", "ProfileUrlResponse") + custom { method, _ -> method.name == "parseFromJson" } +} + +internal val liveUrlResponseJsonParserFingerprint by fingerprint { + strings("live_to_share_url", "LiveItemLinkUrlResponse") + custom { method, _ -> method.name == "parseFromJson" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt new file mode 100644 index 0000000000..5bd9a9fa73 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt @@ -0,0 +1,45 @@ +package app.revanced.patches.instagram.misc.share.domain + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.stringOption +import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch +import app.revanced.patches.instagram.misc.share.editShareLinksPatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN +import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN +import app.revanced.util.returnEarly + +internal const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch;" + +@Suppress("unused") +val changeLinkSharingDomainPatch = bytecodePatch( + name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, + description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN, + use = false +) { + compatibleWith("com.instagram.android") + + dependsOn(sharedExtensionPatch) + + execute { + val customDomainHost by stringOption( + key = "domainName", + default = "imginn.com", + title = "Domain name", + description = "The domain name to use when sharing links." + ) + + getCustomShareDomainFingerprint.method.returnEarly(customDomainHost!!) + + editShareLinksPatch { index, register -> + addInstructions( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setCustomShareDomain(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt new file mode 100644 index 0000000000..0c4e550fa2 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.instagram.misc.share.domain + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal val getCustomShareDomainFingerprint by fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { method, classDef -> + method.name == "getCustomShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt new file mode 100644 index 0000000000..a73099a225 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt @@ -0,0 +1,33 @@ +package app.revanced.patches.instagram.misc.share.privacy + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch +import app.revanced.patches.instagram.misc.share.editShareLinksPatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch;" + +@Suppress("unused") +val sanitizeSharingLinksPatch = bytecodePatch( + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, +) { + compatibleWith("com.instagram.android") + + dependsOn(sharedExtensionPatch) + + execute { + editShareLinksPatch { index, register -> + addInstructions( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt index 30ae49addb..2eac6a1ca4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -4,6 +4,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.music.misc.gms.Constants.MUSIC_MAIN_ACTIVITY_NAME +import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME +import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint +import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.getResourceId @@ -51,24 +55,18 @@ private val disableSplashAnimationPatch = bytecodePatch { } } -private const val APP_NAME = "YT Music ReVanced" - @Suppress("unused") val customBrandingPatch = baseCustomBrandingPatch( - defaultAppName = APP_NAME, - appNameValues = mapOf( - "YT Music ReVanced" to APP_NAME, - "Music ReVanced" to "Music ReVanced", - "Music" to "Music", - "YT Music" to "YT Music", - ), - resourceFolder = "custom-branding/music", - iconResourceFileNames = arrayOf( - "adaptiveproduct_youtube_music_2024_q4_background_color_108", - "adaptiveproduct_youtube_music_2024_q4_foreground_color_108", - "ic_launcher_release", - ), - monochromeIconFileNames = arrayOf("ic_app_icons_themed_youtube_music.xml"), + addResourcePatchName = "music", + originalLauncherIconName = "ic_launcher_release", + originalAppName = "@string/app_launcher_name", + originalAppPackageName = MUSIC_PACKAGE_NAME, + copyExistingIntentsToAliases = false, + numberOfPresetAppNames = 5, + mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + mainActivityName = MUSIC_MAIN_ACTIVITY_NAME, + activityAliasNameWithIntents = MUSIC_MAIN_ACTIVITY_NAME, + preferenceScreen = PreferenceScreen.GENERAL, block = { dependsOn(disableSplashAnimationPatch) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt index f4114a00b2..39dda22aa2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt @@ -1,6 +1,8 @@ package app.revanced.patches.music.misc.gms object Constants { + internal const val MUSIC_MAIN_ACTIVITY_NAME = "com.google.android.apps.youtube.music.activities.MusicActivity" + internal const val REVANCED_MUSIC_PACKAGE_NAME = "app.revanced.android.apps.youtube.music" internal const val MUSIC_PACKAGE_NAME = "com.google.android.apps.youtube.music" } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt index b01f74ccab..93c2944804 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.music.misc.spoof -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch @@ -16,12 +15,13 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;" - val spoofVideoStreamsPatch = spoofVideoStreamsPatch( - fixMediaFetchHotConfigChanges = { true }, - fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater }, + extensionClassDescriptor = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;", + mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + fixMediaFetchHotConfig = { true }, + fixMediaFetchHotConfigAlternative = { is_8_11_or_greater && !is_8_15_or_greater }, fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }, + block = { dependsOn( sharedExtensionPatch, @@ -38,6 +38,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) }, + executeBlock = { addResources("music", "misc.fix.playback.spoofVideoStreamsPatch") @@ -51,10 +52,5 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) ) - - musicActivityOnCreateFingerprint.method.addInstruction( - 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V" - ) } -) \ No newline at end of file +) diff --git a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt index 5940833372..8669f6132b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt @@ -1,12 +1,14 @@ package app.revanced.patches.orfon.detection.root import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION import app.revanced.util.returnEarly @Suppress("unused") val removeRootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION ) { compatibleWith("com.nousguide.android.orftvthek") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt index 26ed42660b..11bc79212b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.reddit.misc.tracking.url import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS @Suppress("unused") val sanitizeUrlQueryPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes (tracking) query parameters from the URLs when sharing links.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { compatibleWith("com.reddit.frontpage") diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt index 43ebaa19f1..0c9fd90400 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.serviceportalbund.detection.root import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION @Suppress("unused") val rootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions and unlocked bootloader.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION ) { compatibleWith("at.gv.bka.serviceportal") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt b/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt new file mode 100644 index 0000000000..39e3e8cf5d --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.shared + +// +// Names and descriptions used by different patches implementing the same feature. +// + +internal const val PATCH_NAME_REMOVE_ROOT_DETECTION = "Remove root detection" +internal const val PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION = "Removes the check for root permissions and unlocked bootloader." + +internal const val PATCH_NAME_SANITIZE_SHARING_LINKS = "Sanitize sharing links" +internal const val PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS = "Removes the tracking query parameters from shared links." + +internal const val PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN = "Change link sharing domain" +internal const val PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN = "Replaces the domain name of shared links." diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt index d865b2081c..d8356aee03 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt @@ -1,173 +1,387 @@ package app.revanced.patches.shared.layout.branding +import app.revanced.patcher.Fingerprint +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.ResourcePatchBuilder import app.revanced.patcher.patch.ResourcePatchContext +import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption +import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.util.ResourceGroup import app.revanced.util.Utils.trimIndentMultiline import app.revanced.util.copyResources +import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.removeFromParent +import app.revanced.util.returnEarly +import org.w3c.dom.Element +import org.w3c.dom.Node +import org.w3c.dom.NodeList import java.io.File -import java.nio.file.Files import java.util.logging.Logger -private const val REVANCED_ICON = "ReVanced*Logo" // Can never be a valid path. - -internal val mipmapDirectories = arrayOf( +private val mipmapDirectories = arrayOf( // Target app does not have ldpi icons. - "mdpi", - "hdpi", - "xhdpi", - "xxhdpi", - "xxxhdpi", -).map { "mipmap-$it" }.toTypedArray() + "mipmap-mdpi", + "mipmap-hdpi", + "mipmap-xhdpi", + "mipmap-xxhdpi", + "mipmap-xxxhdpi" +) -private fun formatResourceFileList(resourceNames: Array) = resourceNames.joinToString("\n") { "- $it" } +private val iconStyleNames = arrayOf( + "rounded", + "minimal", + "scaled" +) -/** - * Attempts to fix unescaped and invalid characters not allowed for an Android app name. - */ -private fun escapeAppName(name: String): String? { - // Remove ASCII control characters. - val cleanedName = name.filter { it.code >= 32 } +private const val ORIGINAL_USER_ICON_STYLE_NAME = "original" +private const val CUSTOM_USER_ICON_STYLE_NAME = "custom" - // Replace invalid XML characters with escaped equivalents. - val escapedName = cleanedName - .replace("&", "&") // Must be first to avoid double-escaping. - .replace("<", "<") - .replace(">", ">") - .replace(Regex("(?, - resourceFolder: String, - iconResourceFileNames: Array, - monochromeIconFileNames: Array, - block: ResourcePatchBuilder.() -> Unit = {}, + addResourcePatchName: String, + originalLauncherIconName: String, + originalAppName: String, + originalAppPackageName: String, + copyExistingIntentsToAliases: Boolean, + numberOfPresetAppNames: Int, + mainActivityOnCreateFingerprint: Fingerprint, + mainActivityName: String, + activityAliasNameWithIntents: String, + preferenceScreen: BasePreferenceScreen.Screen, + block: ResourcePatchBuilder.() -> Unit, executeBlock: ResourcePatchContext.() -> Unit = {} ): ResourcePatch = resourcePatch( name = "Custom branding", - description = "Applies a custom app name and icon. Defaults to \"$defaultAppName\" and the ReVanced logo.", - use = false, + description = "Adds options to change the app icon and app name. " + + "Branding cannot be changed for mounted (root) installations." ) { - val iconResourceFileNamesPng = iconResourceFileNames.map { "$it.png" }.toTypedArray() - - val appName by stringOption( - key = "appName", - default = defaultAppName, - values = appNameValues, + val customName by stringOption( + key = "customName", title = "App name", - description = "The name of the app.", + description = "Custom app name." ) - val iconPath by stringOption( - key = "iconPath", - default = REVANCED_ICON, - values = mapOf("ReVanced Logo" to REVANCED_ICON), - title = "App icon", + val customIcon by stringOption( + key = "customIcon", + title = "Custom icon", description = """ - The icon to apply to the app. + Folder with images to use as a custom icon. - If a path to a folder is provided, the folder must contain the following folders: - - ${formatResourceFileList(mipmapDirectories)} - - Each of these folders must contain the following files: - - ${formatResourceFileList(iconResourceFileNamesPng)} + The folder must contain one or more of the following folders, depending on the DPI of the device: + ${mipmapDirectories.joinToString("\n") { "- $it" }} - Optionally, a 'drawable' folder with the monochrome icon files: - - ${formatResourceFileList(monochromeIconFileNames)} - """.trimIndentMultiline(), + Each of the folders must contain all of the following files: + ${USER_CUSTOM_ADAPTIVE_FILE_NAMES.joinToString("\n")} + + Optionally, the path can contain a 'drawable' folder with the monochrome icon file: + $USER_CUSTOM_MONOCHROME_NAME + """.trimIndentMultiline() ) block() + dependsOn( + addResourcesPatch, + bytecodePatch { + execute { + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setBranding()V" + ) + + numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames) + } + } + ) + + finalize { + val useCustomName = customName != null + val useCustomIcon = customIcon != null + + if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) { + if (useCustomName || useCustomIcon) { + Logger.getLogger(this::class.java.name).warning( + "Custom branding does not work with root installation. No changes applied." + ) + } + return@finalize + } + + preferenceScreen.addPreferences( + if (useCustomName) { + ListPreference( + key = "revanced_custom_branding_name", + entriesKey = "revanced_custom_branding_name_custom_entries", + entryValuesKey = "revanced_custom_branding_name_custom_entry_values" + ) + } else { + ListPreference("revanced_custom_branding_name") + }, + if (useCustomIcon) { + ListPreference( + key = "revanced_custom_branding_icon", + entriesKey = "revanced_custom_branding_icon_custom_entries", + entryValuesKey = "revanced_custom_branding_icon_custom_entry_values" + ) + } else { + ListPreference("revanced_custom_branding_icon") + } + ) + } + execute { - val mipmapIconResourceGroups = mipmapDirectories.map { directory -> - ResourceGroup( - directory, - *iconResourceFileNamesPng, + addResources("shared", "layout.branding.baseCustomBrandingPatch") + addResources(addResourcePatchName, "layout.branding.customBrandingPatch") + + val useCustomName = customName != null + val useCustomIcon = customIcon != null + + iconStyleNames.forEach { style -> + copyResources( + "custom-branding", + ResourceGroup( + "drawable", + "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$style.xml", + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$style.xml", + "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$style.xml" + ), + ResourceGroup( + "mipmap-anydpi", + "$LAUNCHER_RESOURCE_NAME_PREFIX$style.xml" + ) ) } - val iconPathTrimmed = iconPath!!.trim() - if (iconPathTrimmed == REVANCED_ICON) { - // Replace mipmap icons with preset patch icons. - mipmapIconResourceGroups.forEach { groupResources -> - copyResources(resourceFolder, groupResources) - } + // Copy template user icon, because the aliases must be added even if no user icon is provided. + copyResources( + "custom-branding", + ResourceGroup( + "mipmap-anydpi", + "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + ), + ResourceGroup( + "drawable", + "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + ) + ) - // Replace monochrome icons. - monochromeIconFileNames.forEach { fileName -> - copyResources( - resourceFolder, - ResourceGroup("drawable", fileName) + // Copy template icon png files. + mipmapDirectories.forEach { dpi -> + copyResources( + "custom-branding", + ResourceGroup( + dpi, + "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", + ) + ) + } + + if (useCustomIcon) { + // Copy user provided files + val iconPathFile = File(customIcon!!.trim()) + + if (!iconPathFile.exists()) { + throw PatchException( + "The custom icon path cannot be found: " + iconPathFile.absolutePath ) } - } else { - val filePath = File(iconPathTrimmed) + + if (!iconPathFile.isDirectory) { + throw PatchException( + "The custom icon path must be a folder: " + iconPathFile.absolutePath + ) + } + + val sourceFolders = iconPathFile.listFiles { file -> file.isDirectory } + ?: throw PatchException("The custom icon path contains no subfolders: " + + iconPathFile.absolutePath) + val resourceDirectory = get("res") + var copiedFiles = false - // Replace - mipmapIconResourceGroups.forEach { groupResources -> - val groupResourceDirectoryName = groupResources.resourceDirectoryName - val fromDirectory = filePath.resolve(groupResourceDirectoryName) - val toDirectory = resourceDirectory.resolve(groupResourceDirectoryName) + // For each source folder, copy the files to the target resource directories. + sourceFolders.forEach { dpiSourceFolder -> + val targetDpiFolder = resourceDirectory.resolve(dpiSourceFolder.name) + if (!targetDpiFolder.exists()) return@forEach - groupResources.resources.forEach { iconFileName -> - Files.write( - toDirectory.resolve(iconFileName).toPath(), - fromDirectory.resolve(iconFileName).readBytes(), - ) + val customFiles = dpiSourceFolder.listFiles { file -> + file.isFile && file.name in USER_CUSTOM_ADAPTIVE_FILE_NAMES + }!! + + if (customFiles.size > 0 && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) { + throw PatchException("Must include all required icon files " + + "but only found " + customFiles.map { it.name }) + } + + customFiles.forEach { imgSourceFile -> + val imgTargetFile = targetDpiFolder.resolve(imgSourceFile.name) + imgSourceFile.copyTo(target = imgTargetFile, overwrite = true) + + copiedFiles = true } } - // Copy all monochrome icons if provided. - monochromeIconFileNames.forEach { fileName -> - val replacementMonochrome = filePath.resolve("drawable").resolve(fileName) - if (replacementMonochrome.exists()) { - Files.write( - resourceDirectory.resolve("drawable").resolve(fileName).toPath(), - replacementMonochrome.readBytes(), - ) - } + // Copy monochrome if it provided. + val monochromeRelativePath = "drawable/$USER_CUSTOM_MONOCHROME_NAME" + val monochromeFile = iconPathFile.resolve(monochromeRelativePath) + if (monochromeFile.exists()) { + monochromeFile.copyTo( + target = resourceDirectory.resolve(monochromeRelativePath), + overwrite = true + ) + copiedFiles = true + } + + if (!copiedFiles) { + throw PatchException("Could not find any replacement images in " + + "patch option path: " + iconPathFile.absolutePath) } } - // Change the app name. - escapeAppName(appName!!)?.let { escapedAppName -> - val newValue = "android:label=\"$escapedAppName\"" + document("AndroidManifest.xml").use { document -> + // Create launch aliases that can be programmatically selected in app. + fun createAlias( + aliasName: String, + iconMipmapName: String, + appNameIndex: Int, + useCustomName: Boolean, + enabled: Boolean, + intents: NodeList + ): Element { + val label = if (useCustomName) { + if (customName == null) { + "Custom" // Dummy text, and normally cannot be seen. + } else { + customName!! + } + } else if (appNameIndex == 1) { + // Indexing starts at 1. + originalAppName + } else { + "@string/revanced_custom_branding_name_entry_$appNameIndex" + } + val alias = document.createElement("activity-alias") + alias.setAttribute("android:name", aliasName) + alias.setAttribute("android:enabled", enabled.toString()) + alias.setAttribute("android:exported", "true") + alias.setAttribute("android:icon", "@mipmap/$iconMipmapName") + alias.setAttribute("android:label", label) + alias.setAttribute("android:targetActivity", mainActivityName) - val manifest = get("AndroidManifest.xml") - val original = manifest.readText() - val replacement = original - // YouTube - .replace("android:label=\"@string/application_name\"", newValue) - // YT Music - .replace("android:label=\"@string/app_launcher_name\"", newValue) + // Copy all intents from the original alias so long press actions still work. + if (copyExistingIntentsToAliases) { + for (i in 0 until intents.length) { + alias.appendChild( + intents.item(i).cloneNode(true) + ) + } + } else { + val intentFilter = document.createElement("intent-filter").apply { + val action = document.createElement("action") + action.setAttribute("android:name", "android.intent.action.MAIN") + appendChild(action) - if (original == replacement) { - Logger.getLogger(this::class.java.name).warning( - "Could not replace manifest app name" + val category = document.createElement("category") + category.setAttribute("android:name", "android.intent.category.LAUNCHER") + appendChild(category) + } + alias.appendChild(intentFilter) + } + + return alias + } + + val intentFilters = document.childNodes.findElementByAttributeValueOrThrow( + "android:name", + activityAliasNameWithIntents + ).childNodes + + val application = document.getElementsByTagName("application").item(0) as Element + + for (appNameIndex in 1 .. numberOfPresetAppNames) { + fun aliasName(name: String): String = ".revanced_" + name + '_' + appNameIndex + + val useCustomNameLabel = (useCustomName && appNameIndex == numberOfPresetAppNames) + + // Original icon. + application.appendChild( + createAlias( + aliasName = aliasName(ORIGINAL_USER_ICON_STYLE_NAME), + iconMipmapName = originalLauncherIconName, + appNameIndex = appNameIndex, + useCustomName = useCustomNameLabel, + enabled = (appNameIndex == 1), + intentFilters + ) + ) + + // Bundled icons. + iconStyleNames.forEachIndexed { index, style -> + application.appendChild( + createAlias( + aliasName = aliasName(style), + iconMipmapName = LAUNCHER_RESOURCE_NAME_PREFIX + style, + appNameIndex = appNameIndex, + useCustomName = useCustomNameLabel, + enabled = false, + intentFilters + ) + ) + } + + // User provided custom icon. + // + // Must add all aliases even if the user did not provide a custom icon of their own. + // This is because if the user installs with an option, then repatches without the option, + // the alias must still exist because if it was previously enabled and then it's removed + // the app will become broken and cannot launch. Even if the app data is cleared + // it still cannot be launched and the only fix is to uninstall the app. + // To prevent this, always include all aliases and use dummy data if needed. + application.appendChild( + createAlias( + aliasName = aliasName(CUSTOM_USER_ICON_STYLE_NAME), + iconMipmapName = LAUNCHER_RESOURCE_NAME_PREFIX + CUSTOM_USER_ICON_STYLE_NAME, + appNameIndex = appNameIndex, + useCustomName = useCustomNameLabel, + enabled = false, + intentFilters + ) ) } - manifest.writeText(replacement) + // Remove the main action from the original alias, otherwise two apps icons + // can be shown in the launcher. Can only be done after adding the new aliases. + intentFilters.findElementByAttributeValueOrThrow( + "android:name", + "android.intent.action.MAIN" + ).removeFromParent() } - executeBlock() // Must be after the main code to rename the new icons for YouTube 19.34+. + executeBlock() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt new file mode 100644 index 0000000000..b81f21bdbc --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.shared.layout.branding + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal val numberOfPresetAppNamesExtensionFingerprint by fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("I") + parameters() + custom { method, classDef -> + method.name == "numberOfPresetAppNames" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt index de070fb89f..40fb779806 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt @@ -79,7 +79,7 @@ internal val darkThemeBackgroundColorOption = stringOption( */ internal fun baseThemePatch( extensionClassDescriptor: String, - block: BytecodePatchBuilder.() -> Unit = {}, + block: BytecodePatchBuilder.() -> Unit, executeBlock: BytecodePatchContext.() -> Unit = {} ) = bytecodePatch( name = "Theme", diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index 355a07ba81..02ba6c0503 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -3,14 +3,6 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val gmsCoreSupportFingerprint by fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) - custom { method, classDef -> - method.name == "getGmsCoreVendorGroupId" - && classDef.endsWith("/GmsCoreSupport;") - } -} - internal val googlePlayUtilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("I") @@ -28,3 +20,21 @@ internal val serviceCheckFingerprint by fingerprint { parameters("L", "I") strings("Google Play Services not available") } + +internal val gmsCoreSupportFingerprint by fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { method, classDef -> + method.name == "getGmsCoreVendorGroupId" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} + +internal val originalPackageNameExtensionFingerprint by fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { methodDef, classDef -> + methodDef.name == "getOriginalPackageName" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index 4896e5163f..0c037fa6e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -1,10 +1,18 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.* +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.Option +import app.revanced.patcher.patch.Patch +import app.revanced.patcher.patch.ResourcePatchBuilder +import app.revanced.patcher.patch.ResourcePatchContext +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringOption import app.revanced.patches.all.misc.packagename.changePackageNamePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources @@ -12,7 +20,8 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.gms.Constants.ACTIONS import app.revanced.patches.shared.misc.gms.Constants.AUTHORITIES import app.revanced.patches.shared.misc.gms.Constants.PERMISSIONS -import app.revanced.util.* +import app.revanced.util.getReference +import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -23,6 +32,8 @@ import com.android.tools.smali.dexlib2.util.MethodUtil import org.w3c.dom.Element import org.w3c.dom.Node +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/GmsCoreSupport;" + private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$" /** @@ -209,17 +220,18 @@ fun gmsCoreSupportPatch( googlePlayUtilityFingerprint.method.returnEarly(0) } + // Set original and patched package names for extension to use. + originalPackageNameExtensionFingerprint.method.returnEarly(fromPackageName) + // Verify GmsCore is installed and whitelisted for power optimizations and background usage. - mainActivityOnCreateFingerprint.method.apply { - addInstructions( - 0, - "invoke-static/range { p0 .. p0 }, Lapp/revanced/extension/shared/GmsCoreSupport;->" + - "checkGmsCore(Landroid/app/Activity;)V", - ) - } + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + + "checkGmsCore(Landroid/app/Activity;)V" + ) // Change the vendor of GmsCore in the extension. - gmsCoreSupportFingerprint.method.replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"") + gmsCoreSupportFingerprint.method.returnEarly(gmsCoreVendorGroupId!!) executeBlock() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt index 616410687f..63f36037e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt @@ -8,6 +8,8 @@ import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting @@ -19,14 +21,17 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/SanitizeSharingLinksPatch;" +/** + * Patch shared by YouTube and YT Music. + */ internal fun sanitizeSharingLinksPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, preferenceScreen: BasePreferenceScreen.Screen, replaceMusicLinksWithYouTube: Boolean = false ) = bytecodePatch( - name = "Sanitize sharing links", - description = "Adds an option to remove the tracking query parameter from shared links.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { block() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 1a348c447f..d08282c677 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.shared.misc.spoof +import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -36,11 +37,13 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = private lateinit var buildRequestMethod: MutableMethod private var buildRequestMethodUrlRegister = -1 -fun spoofVideoStreamsPatch( - block: BytecodePatchBuilder.() -> Unit = {}, - fixMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false }, - fixMediaFetchHotConfigAlternativeChanges: BytecodePatchBuilder.() -> Boolean = { false }, +internal fun spoofVideoStreamsPatch( + extensionClassDescriptor: String, + mainActivityOnCreateFingerprint: Fingerprint, + fixMediaFetchHotConfig: BytecodePatchBuilder.() -> Boolean = { false }, + fixMediaFetchHotConfigAlternative: BytecodePatchBuilder.() -> Boolean = { false }, fixParsePlaybackResponseFeatureFlag: BytecodePatchBuilder.() -> Boolean = { false }, + block: BytecodePatchBuilder.() -> Unit, executeBlock: BytecodePatchContext.() -> Unit = {}, ) = bytecodePatch( name = "Spoof video streams", @@ -53,6 +56,11 @@ fun spoofVideoStreamsPatch( execute { addResources("shared", "misc.fix.playback.spoofVideoStreamsPatch") + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static { }, $extensionClassDescriptor->setClientOrderToUse()V" + ) + // region Enable extension helper method used by other patches patchIncludedExtensionMethodFingerprint.method.returnEarly(true) @@ -316,7 +324,7 @@ fun spoofVideoStreamsPatch( // region turn off stream config replacement feature flag. - if (fixMediaFetchHotConfigChanges()) { + if (fixMediaFetchHotConfig()) { mediaFetchHotConfigFingerprint.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, @@ -325,7 +333,7 @@ fun spoofVideoStreamsPatch( } } - if (fixMediaFetchHotConfigAlternativeChanges()) { + if (fixMediaFetchHotConfigAlternative()) { mediaFetchHotConfigAlternativeFingerprint.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt index 5149514791..4bb03fa068 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt @@ -17,7 +17,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused") val hideCreateButtonPatch = bytecodePatch( name = "Hide Create button", - description = "Hides the \"Create\" button in the navigation bar." + description = "Hides the \"Create\" button in the navigation bar. The latest app targets do not need this patch.", + use = false ) { compatibleWith("com.spotify.music") diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt index ff74565c64..4e4ad474cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt @@ -3,6 +3,8 @@ package app.revanced.patches.spotify.misc.privacy import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -15,8 +17,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes the tracking query parameters from links before they are shared.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { compatibleWith("com.spotify.music") @@ -24,7 +26,7 @@ val sanitizeSharingLinksPatch = bytecodePatch( execute { val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" + - "sanitizeUrl(Ljava/lang/String;)Ljava/lang/String;" + "sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;" val copyFingerprint = if (shareCopyUrlFingerprint.originalMethodOrNull != null) { shareCopyUrlFingerprint diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index f4d498eab2..b2006105a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -6,6 +6,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption +import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN +import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -29,8 +31,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/twitter/patches/li @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( - name = "Change link sharing domain", - description = "Replaces the domain name of Twitter links when sharing them.", + name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, + description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN ) { dependsOn( changeLinkSharingDomainResourcePatch, diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt index 24b4e127bc..7856bfe966 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.twitter.misc.links import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes the tracking query parameters from links before they are shared.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { compatibleWith( "com.twitter.android"( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index de6ca5a8ac..71527f4636 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -1,38 +1,28 @@ package app.revanced.patches.youtube.layout.branding import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch -import app.revanced.patches.shared.layout.branding.mipmapDirectories -import java.nio.file.Files - -private const val APP_NAME = "YouTube ReVanced" - -private val youtubeIconResourceFileNames_19_34 = mapOf( - "adaptiveproduct_youtube_foreground_color_108" to "adaptiveproduct_youtube_2024_q4_foreground_color_108", - "adaptiveproduct_youtube_background_color_108" to "adaptiveproduct_youtube_2024_q4_background_color_108", -) +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_MAIN_ACTIVITY_NAME +import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME +import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint @Suppress("unused") val customBrandingPatch = baseCustomBrandingPatch( - defaultAppName = APP_NAME, - appNameValues = mapOf( - "YouTube ReVanced" to APP_NAME, - "YT ReVanced" to "YT ReVanced", - "YT" to "YT", - "YouTube" to "YouTube", - ), - resourceFolder = "custom-branding/youtube", - iconResourceFileNames = arrayOf( - "adaptiveproduct_youtube_background_color_108", - "adaptiveproduct_youtube_foreground_color_108", - "ic_launcher", - "ic_launcher_round", - ), - monochromeIconFileNames = arrayOf( - "adaptive_monochrome_ic_youtube_launcher.xml", - "ringo2_adaptive_monochrome_ic_youtube_launcher.xml" - ), + addResourcePatchName = "youtube", + originalLauncherIconName = "ic_launcher", + originalAppName = "@string/application_name", + originalAppPackageName = YOUTUBE_PACKAGE_NAME, + copyExistingIntentsToAliases = true, + numberOfPresetAppNames = 5, + mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME, + activityAliasNameWithIntents = "com.google.android.youtube.app.honeycomb.Shell\$HomeActivity", + preferenceScreen = PreferenceScreen.GENERAL_LAYOUT, block = { + dependsOn(sharedExtensionPatch) + compatibleWith( "com.google.android.youtube"( "19.34.42", @@ -40,20 +30,5 @@ val customBrandingPatch = baseCustomBrandingPatch( "20.14.43", ) ) - }, - - executeBlock = { - val resourceDirectory = get("res") - - mipmapDirectories.forEach { directory -> - val targetDirectory = resourceDirectory.resolve(directory) - - youtubeIconResourceFileNames_19_34.forEach { (old, new) -> - val oldFile = targetDirectory.resolve("$old.png") - val newFile = targetDirectory.resolve("$new.png") - - Files.write(newFile.toPath(), oldFile.readBytes()) - } - } } ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index 9d26c1797a..a3b4dc2ce6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -135,8 +135,21 @@ val changeHeaderPatch = resourcePatch( ) if (custom != null) { - val sourceFolders = File(custom!!).listFiles { file -> file.isDirectory } - ?: throw PatchException("The provided path is not a directory: $custom") + val customFile = File(custom!!) + if (!customFile.exists()) { + throw PatchException("The custom icon path cannot be found: " + + customFile.absolutePath + ) + } + + if (!customFile.isDirectory) { + throw PatchException("The custom icon path must be a folder: " + + customFile.absolutePath) + } + + val sourceFolders = customFile.listFiles { file -> file.isDirectory } + ?: throw PatchException("The custom icon path contains no subfolders: " + + customFile.absolutePath) val customResourceFileNames = getLightDarkFileNames(CUSTOM_HEADER_RESOURCE_NAME) @@ -165,7 +178,8 @@ val changeHeaderPatch = resourcePatch( } if (!copiedFiles) { - throw PatchException("No custom header images found in the provided path: $custom") + throw PatchException("No custom header images found in " + + "the provided path: " + customFile.absolutePath) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 8d5559fbe4..85405aa75f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -27,6 +27,8 @@ import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.forEachLiteralValueInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstLiteralInstruction +import app.revanced.util.removeFromParent import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -136,7 +138,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch { ) if (hideShortsAppShortcut == true) { - shortsItem.parentNode.removeChild(shortsItem) + shortsItem.removeFromParent() } } @@ -147,7 +149,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch { ) if (hideShortsWidget == true) { - shortsItem.parentNode.removeChild(shortsItem) + shortsItem.removeFromParent() } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt index c532c57d4a..19f0454bad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt @@ -1,6 +1,8 @@ package app.revanced.patches.youtube.misc.gms internal object Constants { + internal const val YOUTUBE_MAIN_ACTIVITY_NAME = "com.google.android.apps.youtube.app.watchwhile.MainActivity" + const val YOUTUBE_PACKAGE_NAME = "com.google.android.youtube" const val REVANCED_YOUTUBE_PACKAGE_NAME = "app.revanced.android.youtube" } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index f5ebe2442a..df9e28aad1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.spoof -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference @@ -16,9 +15,20 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;" - val spoofVideoStreamsPatch = spoofVideoStreamsPatch( + extensionClassDescriptor = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;", + mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + fixMediaFetchHotConfig = { + is_19_34_or_greater + }, + fixMediaFetchHotConfigAlternative = { + // In 20.14 the flag was merged with 20.03 start playback flag. + is_20_10_or_greater && !is_20_14_or_greater + }, + fixParsePlaybackResponseFeatureFlag = { + is_20_03_or_greater + }, + block = { compatibleWith( "com.google.android.youtube"( @@ -34,16 +44,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( versionCheckPatch ) }, - fixMediaFetchHotConfigChanges = { - is_19_34_or_greater - }, - fixMediaFetchHotConfigAlternativeChanges = { - // In 20.14 the flag was merged with 20.03 start playback flag. - is_20_10_or_greater && !is_20_14_or_greater - }, - fixParsePlaybackResponseFeatureFlag = { - is_20_03_or_greater - }, + executeBlock = { addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") @@ -60,6 +61,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( summaryKey = null, tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference" ), + SwitchPreference("revanced_spoof_video_streams_av1"), ListPreference( key = "revanced_spoof_video_streams_language", // Language strings are declared in Setting patch. @@ -71,10 +73,5 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) ) - - mainActivityOnCreateFingerprint.method.addInstruction( - 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V" - ) } ) diff --git a/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt index 61d7be3502..b2d8ba287f 100644 --- a/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -14,6 +14,13 @@ import java.nio.file.StandardCopyOption private val classLoader = object {}.javaClass.classLoader +/** + * Removes a node from its parent. + * + * @return The node that was removed (object this method was called on). + */ +fun Node.removeFromParent() : Node = parentNode.removeChild(this) + /** * Returns a sequence for all child nodes. */ @@ -70,8 +77,13 @@ fun ResourcePatchContext.copyResources( for (resourceGroup in resources) { resourceGroup.resources.forEach { resource -> val resourceFile = "${resourceGroup.resourceDirectoryName}/$resource" + val stream = inputStreamFromBundledResource(sourceResourceDirectory, resourceFile) + if (stream == null) { + throw IllegalArgumentException("Could not find resource: $resourceFile " + + "in directory: $sourceResourceDirectory") + } Files.copy( - inputStreamFromBundledResource(sourceResourceDirectory, resourceFile)!!, + stream, targetResourceDirectory.resolve(resourceFile).toPath(), StandardCopyOption.REPLACE_EXISTING, ) diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index a3488d272e..e05f29d234 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -765,23 +765,23 @@ Second \"item\" text" يتم عرض قائمة المزيد من المعلومات إخفاء شاشة القفل - تم إخفاء قائمة قفل الشاشة - يتم عرض قائمة قفل الشاشة + تم إخفاء قائمة شاشة القفل + يتم عرض قائمة شاشة القفل إخفاء المقطع الصوتي تم إخفاء قائمة المقطع الصوتي يتم عرض قائمة المقطع الصوتي - "قائمة المسارات الصوتية مخفية + "تم إخفاء قائمة المقطع الصوتي -لعرض قائمة المسارات الصوتية، غيّر 'تزييف تدفقات الفيديو' إلى iPadOS" +لعرض قائمة المقطع الصوتي، غيّر 'Spoof video streams' إلى iPadOS" إخفاء المشاهدة في VR تم إخفاء قائمة المشاهدة في الوضع الافتراضي يتم عرض قائمة المشاهدة في الوضع الافتراضي إخفاء قائمة جودة الفيديو - قائمة جودة الفيديو مخفية - قائمة جودة الفيديو معروضة + تم إخفاء قائمة جودة الفيديو + يتم عرض قائمة جودة الفيديو إخفاء تذييل قائمة جودة الفيديو تم إخفاء تذييل قائمة جودة الفيديو يتم عرض تذييل قائمة جودة الفيديو @@ -791,18 +791,18 @@ Second \"item\" text" تم إخفاء زر التشغيل التلقائي يتم عرض زر التشغيل التلقائي - إخفاء زر التَرْجَمَة - تم إخفاء زر التَرْجَمَة - يتم عرض زر التَرْجَمَة + إخفاء زر الترجمة + تم إخفاء زر الترجمة + يتم عرض زر الترجمة إخفاء زر البث تم إخفاء زر البث يتم عرض زر البث إخفاء خلفية عناصر التحكم بالمشغل - خلفية عناصر تحكم المشغل مخفية - يتم عرض خلفية عناصر التحكم بالمشغل - إخفاء زري \"السابق\" و \"التالي\" - تم إخفاء الأزرار - يتم عرض الأزرار + تم إخفاء خلفية عناصر تحكم المشغل + يتم عرض خلفية عناصر تحكم المشغل + إخفاء أزرار السابق & التالي + تم إخفاء أزرار السابق & التالي + يتم عرض أزرار السابق & التالي إخفاء بطاقات شاشة النهاية @@ -829,37 +829,37 @@ Second \"item\" text" تم إخفاء شريط تقدم الفيديو يتم عرض شريط تقدم الفيديو - إخفاء شريط تقدم صور مصغرة للفيديو - شريط تقدم صور مصغرة للفيديو مخفي - شريط تقدم صور مصغرة للفيديو معروض + إخفاء شريط تقدم مصغرات الفيديو + تم إخفاء شريط تقدم مصغرات الفيديو + يتم عرض شريط تقدم مصغرات الفيديو مشغل Shorts - إخفاء أو إظهار مكونات مشغل Shorts + إخفاء أو عرض مكونات مشغل Shorts إخفاء Shorts في الصفحة الرئيسية - مخفية في الصفحة الرئيسية ومقاطع الفيديو ذات الصلة - معروضة في الصفحة الرئيسية ومقاطع الفيديو ذات الصلة + مخفي في موجز الصفحة الرئيسية والفيديوهات ذات الصلة + يُعرض في موجز الصفحة الرئيسية والفيديوهات ذات الصلة إخفاء Shorts في نتائج البحث - مخفية في نتائج البحث - تُعرض في نتائج البحث + مخفي في نتائج البحث + يُعرض في نتائج البحث - إخفاء Shorts في خلاصة الاشتراكات - مخفية في خلاصة الاشتراكات - معروضة في خلاصة الاشتراكات - إخفاء Shorts في سجل المشاهدة - مخفية في سجل المشاهدة - تُعرض في سجل المشاهدة - إخفاء زر Super Thanks - زر شراء Super Thanks مخفي - زر شراء Super Thanks معروض + إخفاء Shorts في موجز الاشتراكات + مخفي في موجز الاشتراكات + يُعرض في موجز الاشتراكات + إخفاء Shorts في السجلّ + مخفي في السجلّ + يُعرض في السجلّ + إخفاء زر شراء Super Thanks + تم إخفاء زر شراء Super Thanks + يتم عرض زر شراء Super Thanks إخفاء زر التأثير - زر التأثير مخفي - زر التأثير معروض + تم إخفاء زر التأثير + يتم عرض زر التأثير إخفاء زر الشاشة الخضراء تم إخفاء زر الشاشة الخضراء يتم عرض زر الشاشة الخضراء - إخفاء زر الهاشتاج + إخفاء زر هاشتاج تم إخفاء زر الهاشتاج يتم عرض زر الهاشتاج @@ -869,9 +869,9 @@ Second \"item\" text" إخفاء تسمية الموقع تم إخفاء تسمية الموقع يتم عرض تسمية الموقع - إخفاء زر \"مشاركات جديدة\" - تم إخفاء زر \"مشاركات جديدة\" - يتم عرض زر \"مشاركات جديدة\" + إخفاء زر المنشورات الجديدة + تم إخفاء زر المنشورات الجديدة + يتم عرض زر المنشورات الجديدة إخفاء أزرار واجهة التوقف تم إخفاء أزرار واجهة التوقف يتم عرض أزرار واجهة التوقف @@ -900,11 +900,11 @@ Second \"item\" text" تم إخفاء زر القادم يتم عرض زر القادم إخفاء زر استخدام هذا الصوت - زر استخدام هذا الصوت مخفي - زر استخدام هذا الصوت معروض - إخفاء زر استخدام هذا القالب - زر استخدام هذا القالب مخفي - زر استخدام هذا القالب ظاهر + تم إخفاء زر استخدام هذا الصوت + يتم عرض زر استخدام هذا الصوت + إخفاء زر استخدام النموذج + تم إخفاء زر استخدم هذا النموذج + يتم عرض زر استخدم هذا النموذج إخفاء التأثير الفوّار لـزر أعجبني تم إخفاء التأثير الفوّار لـزر أعجبني يتم عرض التأثير الفوّار لـزر أعجبني @@ -935,11 +935,11 @@ Second \"item\" text" تم إخفاء شريط القناة يتم عرض شريط القناة إخفاء عنوان الفيديو - عنوان الفيديو مخفي - عنوان الفيديو معروض + تم إخفاء عنوان الفيديو + يتم عرض عنوان الفيديو إخفاء تسمية بيانات التعريف الصوتية - تسمية بيانات تعريف الصوت مخفية - تسمية بيانات تعريف الصوت معروضة + تم إخفاء تسمية بيانات التعريف الصوتية + يتم عرض تسمية بيانات التعريف الصوتية إخفاء تسمية رابط الفيديو تم إخفاء تسمية رابط الفيديو يتم عرض تسمية رابط الفيديو @@ -956,9 +956,9 @@ Second \"item\" text" يتم عرض الفيديو المقترح في شاشة النهاية - إخفاء تراكب مقاطع الفيديو ذات الصلة - تراكب مقاطع الفيديو ذات الصلة في وضع ملء الشاشة مخفي - تراكب مقاطع الفيديو ذات الصلة في وضع ملء الشاشة معروض + إخفاء واجهة الفيديوهات ذات الصلة + تم إخفاء واجهة الفيديوهات ذات الصلة في ملء الشاشة + يتم عرض واجهة الفيديوهات ذات الصلة في ملء الشاشة إخفاء الطابع الزمني للفيديو @@ -991,7 +991,7 @@ Second \"item\" text" لم يعجبني غير متاح مؤقتًا (انتهت مهلة API) لم يعجبني غير متاح (الحالة %d) - مرات عدم الإعجاب غير متوفرة (حد واجهة برمجة تطبيقات العميل) + عدد مرات لم يعجبني غير متوفر (حد API للعميل) لم يعجبني غير متاح (%s) أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike @@ -1000,31 +1000,31 @@ Second \"item\" text" يتم عرض لم يعجبني لا يتم عرض لم يعجبني عرض لم يعجني في فيديوهات Shorts - "يتم عرض مرات عدم الإعجاب في فيديوهات Shorts + "يتم عرض عدد مرات لم يعجبني في فيديوهات Shorts -التقييد: قد لا تظهر مرات عدم الإعجاب في وضع التصفح المتخفي" - لا يتم عرض مرات عدم الإعجاب في فيديوهات Shorts +التقييد: قد لا تظهر مرات لم يعجبني في وضع التصفح المتخفي" + لا يتم عرض مرات لم يعجبني على فيديوهات Shorts لم يعجبني كــ نسبة مئوية - يتم عرض مرات عدم الإعجاب كنسبة مئوية - يتم عرض مرات عدم الإعجاب كرقم + يعرض عدد لم يعجبني كـ نسبة مئوية + يتم عرض عدد لم يعجبني كـ رَقَم مقاس زر أعجبني زر أعجبني مصمم لأدنى عرض زر أعجبني مصمم لأفضل مظهر عرض الإعجابات المقدرة - يتم عرض عدد تقديري للإعجابات في مقاطع الفيديو التي تم تعطيل الإعجابات فيها + يتم عرض عدد تقديري للإعجابات في الفيديوهات التي تم تعطيل الإعجابات فيها لا يتم عرض عدد الإعجابات المقدرة عرض ملاحظة إذا كان API غير متاح يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike يتم توفير البيانات بواسطة the Return YouTube Dislike API. اضغط هنا لمعرفة المزيد - ReturnYouTubeDislike API إحصائيات هذا الجهاز + إحصائيات واجهة برمجيات ReturnYouTubeDislike لهذا الجهاز وقت استجابة API، متوسط وقت استجابة API، الحد الأدنى وقت استجابة API، الحد الأقصى - وقت استجابة API، الفيديو الأخير - غير متوفر مؤقتًا - حد معدل API للعميل ساري المفعول + وقت استجابة API، آخر فيديو + لم يعجبني غير متوفر مؤقتًا - حد معدل API للعميل ساري المفعول API جلب الأصوات وعدد الاتصالات لم يتم إجراء اتصالات الشبكة %d اتصالات شبكية أجريت @@ -1056,7 +1056,7 @@ Second \"item\" text" تمكين SponsorBlock - SponsorBlock مانِع الرُعَاة هو نظام جماعي لتخطي الأجزاء المُمِلَّة في مقاطع YouTube + مانع الرُعَاة هو نظام جماعي لتخطي الأجزاء المزعجة من فيديوهات YouTube المظهر عرض زر التصويت يتم عرض زر التصويت على المقطع @@ -1072,12 +1072,12 @@ Second \"item\" text" إخفاء زر التخطي بعد بضع ثوانٍ يتم عرض زر التخطي للمقطع بأكمله مدة زر التخطي - كم المدة لعرض أزرار التخطي والتخطي إلى التمييز قبل الإخفاء التلقائي - إظهار إشعار التراجع عن التخطي - يظهر إشعار عند تخطي مقطع تلقائيًا. انقر على الإشعار للتراجع عن التخطي - لا يتم عرض التوست - مدة توست التخطي - كم المدة لعرض رسالة التراجع عن التخطي المنبثقة + كم من الوقت يجب إظهار أزرار التخطي والتخطي للأبرز قبل إخفائها تلقائيًا + عرض التراجع عن التخطي + تظهر ملاحظة عند تخطي مقطع تلقائيًا. انقر على الملاحظة للتراجع عن التخطي + لا يتم عرض الملاحظة + مدة ملاحظة التخطي + المدة اللازمة لإظهار التراجع عن التخطي ثانية واحدة ثانيتان 3 ثوانٍ @@ -1089,19 +1089,19 @@ Second \"item\" text" 9 ثوانٍ 10 ثوانٍ عرض مدة الفيديو بدون المقاطع - يتم عرض طول الفيديو مطروحًا منه جميع المقاطع على شريط التقدم + يعرض مدة الفيديو ناقصًا منه جميع المقاطع على شريط التقدم يتم عرض مدة الفيديو كاملةً إنشاء مقاطع جديدة عرض زر إنشاء مقطع جديد يتم عرض زر إنشاء مقطع جديد لا يتم عرض زر إنشاء مقطع جديد تعديل تقديم او تأخير المقطع الجديد - أجزاء الثانية التي تتحرك فيها أزرار ضبط الوقت عند إنشاء مقاطع جديدة + أجزاء الثانية في الوقت الذي تتحرك فيها أزرار ضبط الوقت عند إنشاء مقاطع جديدة يجب أن تكون القيمة رقمًا موجبًا عرض الإرشادات - الإرشادات تحتوي على نصائح حول تقديم المقاطع - توجد إرشادات - من المستحسن قراءة الإرشادات لمانع الرعاة قبل تقديم أي مقطع + الإرشادات تتضمن قواعد ونصائح لإنشاء مقاطع جديدة + اتبع الإرشادات + من المستحسن قراءة الإرشادات لـ SponsorBlock قبل تقديم أي مقطع تمت قراءتها اعرضها لي عام @@ -1110,11 +1110,11 @@ Second \"item\" text" لا يتم عرض ملاحظة في حالة عدم توفر SponsorBlock تمكين تتبع مرات التخطي يُتيح لـ SponsorBlock Leaderboard معرفة مقدار الوقت الذي وفره المشاهدين، يتم إعلام الخادم في كل مرة تتخطى فيها مقطعًا - تم تعطيل تتبع مرات التخطي + تتبع عدد مرات التخطي غير مفعل الحد الأدنى لمدة المقطع لن يتم عرض المقاطع الأقصر من هذه القيمة (بالثواني) أو تخطيها المدة الزمنية غير صالحة - معرف المستخدم الفريد الخاص بك + معرف المستخدم User ID الفريد الخاص بك يجب أن يبقى هذا خاصًا. انه مثل كلمة المرور ولا ينبغي مشاركته مع أي شخص. إذا كان شخص ما يملك هذا، فيمكنه انتحال شخصيتك يجب أن يكون معرف المستخدم الخاص 30 حرفًا على الأقل تغيير عنوان API @@ -1147,11 +1147,11 @@ Second \"item\" text" فاصل زمني بدون محتوى فعلي. قد يكون توقفًا مؤقتًا، أو إطارًا ثابتًا، أو رسومًا متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات الخاتمة / تترات النهاية تتر النهاية أو عندما تظهر بطاقات نهاية YouTube، نهايات غير منطوقة. ليس للاستنتاجات مع المعلومات - مقدمة / تحيات + تحية / وداع مقاطع دعائية مروية للفيديو القادم، تحيات ووداعات. لا تشمل الأقسام التي تضيف محتوى إضافيًا معاينة / ملخص مجموعة من المقاطع التي توضح ما هو قادم أو ما حدث في الفيديو أو في مقاطع فيديو أخرى من السلسلة، حيث تتكرر جميع المعلومات في مكان آخر - استطراد / نكات + خارج الموضوع / نكات مشاهد أو نكات جانبية غير ضرورية لفهم المحتوى الرئيسي للفيديو. لا تشمل الأقسام التي توفر سياقًا أو تفاصيل خلفية الموسيقى: مقطع غير موسيقي فقط للاستخدام في المقاطع الموسيقية. أقسام المقاطع الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى @@ -1169,7 +1169,7 @@ Second \"item\" text" تخطي النظرة العامة تخطي النظرة العامة تخطي الملخص - تخطي الجزء الجانبي + تخطي مقطع غير ذي صلة تخطي غير الموسيقى تخطي المقطع تم تخطي الراعي @@ -1184,13 +1184,13 @@ Second \"item\" text" تم تخطي النظرة العامة تم تخطي النظرة العامة تم تخطي الملخص - تم تخطي الجزء الجانبي + تم تخطي مقطع غير ذي صلة تم تخطي جزء غير موسيقي تم تخطي المقطع الغير المرسل تم تخطي عدة مقاطع التخطي تلقائيًا التخطي تلقائيًا مرة واحدة - عرض زر \"التخطي\" + عرض زر التخطي عرض في شريط تقدم الفيديو تعطيل غير قادر على إرسال المقطع: الحالة: %s @@ -1241,14 +1241,14 @@ Second \"item\" text" الوقت المحدد غير صحيح إحصائيات - الإحصائيات غير متوفرة مؤقتًا (الواجهة غير متوفرة) + الإحصائيات غير متوفرة مؤقتًا (API معطل) جارٍ التحميل... تم تعطيل SponsorBlock اسم المستخدم الخاص بك: <b>%s</b> اضغط هنا لتغيير اسم المستخدم الخاص بك غير قادر على تغيير اسم المستخدم: الحالة: %1$d %2$s تم تغيير اسم المستخدم بنجاح - سمعتك هي <b>%.2f</b> + سمعتك <b>%.2f</b> لقد أنشأت <b>%s</b> مقطع اضغط هنا لعرض المقاطع الخاصة بك متصدرين SponsorBlock @@ -1264,14 +1264,14 @@ Second \"item\" text" الشفافية: اللون: لمحة - يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد ومشاهدة التنزيلات لمنصات أخرى + يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد والتنزيل لمنصات أخرى شكل نموذج التخطيط الافتراضي الجوّال الجهاز اللوحي - السيارات + Automotive "التغييرات تشمل: تصميم الجهاز اللوحي @@ -1282,7 +1282,7 @@ Second \"item\" text" • يتم تنظيم الموجز حسب المواضيع والقنوات" - خِداع إصدار التطبيق + إصدار تطبيق وهمي تم تغيير اصدار التطبيق لم يتم تغيير اصدار التطبيق "سيتم تغيير إصدار التطبيق إلى إصدار قديم من YouTube. @@ -1305,7 +1305,7 @@ Second \"item\" text" استكشف الموضة & التجميل ألعاب - السّجل + السجلّ المكتبة الفيديوهات التي أعجبتني مباشر @@ -1325,7 +1325,7 @@ Second \"item\" text" تغيير صفحة البداية دائمًا "يتم تغيير صفحة البداية دائمًا -القيد: قد لا يعمل استخدام زر الرجوع على شريط الأدوات" +التقييد: قد لا يعمل استخدام زر الرجوع على شريط الأدوات" يتم تغيير صفحة البداية فقط عند بدء تشغيل التطبيق @@ -1387,8 +1387,8 @@ Second \"item\" text" إخفاء أزرار التخطي للأمام والخلف تم إخفاء تخطي للأمام والخلف يتم عرض تخطي للأمام والخلف - الحجم الأولي - الحجم الأولي على الشاشة، بالبكسل + تهيئة الحجم + تهيئة الحجم على الشاشة، بالبكسل حجم البكسل يجب أن يكون بين %1$s و %2$s شفافية الواجهة قيمة الشفافية بين 0-100، حيث يكون 0 شفاف @@ -1406,16 +1406,16 @@ Second \"item\" text" يتم عرض لون شريط تقدم الفيديو الاصلي لون شريط تقدم الفيديو المخصص لون شريط التقدم - لون مميز لشريط التقدم المخصص - اللون المميز لشريط التقدم + لون تمييز شريط التقدم المخصص + لون تمييز شريط التقدم لون شريط التقدم غير صالح - شعار الرأس - افتراضي - عادي + علامة الشعار + الافتراضي + القياسي - ريـفانسد بسيط + ReVanced minimal مخصص @@ -1434,8 +1434,8 @@ Second \"item\" text" علامة التبويب أنت قوائم تشغيل المشغل والتوصيات نتائج البحث - المصّغرات الأصلية - DeArrow & المصّغرات الأصلية + المصغرات الأصلية + DeArrow & المصغرات الأصلية DeArrow & اللقطات الثابتة اللقطات الثابتة "يوفر DeArrow مصغرات فيديو من مصادر جماعية لفيديوهات YouTube. هذه المصغرات غالبًا ما تكون أكثر صلة من تلك المقدمة من YouTube @@ -1444,14 +1444,14 @@ Second \"item\" text" اضغط هنا لمعرفة المزيد عن DeArrow" عرض ملاحظة إذا كان API غير متاح - يتم عرض ملاحظة إذا كان DeArrow غير متوفر - لا يتم عرض ملاحظة إذا كان DeArrow غير متوفر - نقطة نهاية واجهة برمجة تطبيقات DeArrow - عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت للصور المصغرة لـ DeArrow + يتم عرض ملاحظة إذا كان DeArrow غير متاح + لا يتم عرض ملاحظة إذا كان DeArrow غير متاح + DeArrow API Endpoint + عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت لمصغرات DeArrow لقطات الفيديو الثابتة يتم التقاط اللقطات الثابتة من بداية/وسط/نهاية كل فيديو. هذه الصور مدمجة في YouTube ولا يتم استخدام أي واجهة برمجة تطبيقات خارجية - استخدم اللقطات الثابتة السريعة - استخدام اللقطات متوسطة الجودة. سيتم تحميل المُصغَّرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مُصغَّرات فارغة + استخدام اللقطات الثابتة السريعة + استخدام اللقطات متوسطة الجودة. سيتم تحميل المصغرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مصغرات فارغة استخدام لقطات الفيديو الثابتة بجودة عالية وقت الفيديو لأخذ اللقطات الثابتة منه بداية الفيديو @@ -1470,25 +1470,25 @@ Second \"item\" text" تجاهل - تفعيل تكرار الفيديو + تمكين تكرار الفيديو سيتم تكرار الفيديو لن يتم تكرار الفيديو - إظهار زر تكرار الفيديو - الزر ظاهر - الزر غير ظاهر + عرض زر تكرار الفيديو + يتم عرض الزر + لا يتم عرض الزر تكرار الفيديو قيد التشغيل تكرار الفيديو متوقف - محاكاة أبعاد الجهاز - "تم محاكاة أبعاد الجهاز + تزوير أبعاد الجهاز + "تم تزييف أبعاد الجهاز قد يتم فتح قفل جودة الفيديو العالية ولكن قد تواجه تقطعًا في تشغيل الفيديو وعمر بطارية أسوأ وتأثيرات جانبية غير معروفة" - "أبعاد الجهاز غير محاكاة + "أبعاد الجهاز غير مزيفة -يمكن أن يؤدي تفعيل هذا إلى فتح جودة أعلى للفيديو" +تفعيل هذا يمكن أن يفتح جودات فيديو أعلى" قد يؤدي تمكين هذا إلى تباطؤ تشغيل الفيديو وتدهور عمر البطارية وآثار جانبية غير معروفة. @@ -1496,19 +1496,19 @@ Second \"item\" text" تغيير الاهتزاز عند الضغط تعطيل الاهتزاز للفصول تم تعطيل الاهتزاز للفصول - تم تفعيل الاهتزاز للفصول + تم تمكين الاهتزاز للفصول تعطيل الاهتزاز عند التمرير الدقيق - تم تعطيل الاهتزاز الدقيق عند البحث - تم تفعيل الاهتزاز عند التمرير الدقيق - تعطيل الاهتزاز عند التراجع عن البحث - تم تعطيل الاهتزاز عند التراجع عن البحث - تم تمكين الاهتزاز عند التراجع عن البحث + تم تعطيل الاهتزاز الدقيق عند التمرير + تم تمكين الاهتزاز عند التمرير الدقيق + تعطيل اهتزاز التراجع عن التمرير + تم تعطيل اهتزاز التراجع عن التمرير + تم تمكين اهتزاز التراجع عن التمرير تعطيل الاهتزاز عند التكبير تم تعطيل الاهتزاز عند التكبير تم تمكين الاهتزاز عند التكبير - إذا قمت مؤخرًا بتغيير تفاصيل تسجيل الدخول إلى حسابك، فأزل تثبيت MicroG ثم أعد تثبيته. + إذا قمت مؤخرًا بتغيير تفاصيل تسجيل الدخول إلى حسابك، فقم بإلغاء تثبيت MicroG وإعادة تثبيته. تجاوز إعادة توجيه URL @@ -1526,9 +1526,9 @@ Second \"item\" text" تذكر تغييرات جودة الفيديو تنطبق تغييرات الجودة على جميع الفيديوهات تنطبق تغييرات الجودة على الفيديو الحالي فقط - إظهار إشعار عند تغيير جودة الفيديو - يتم إظهار إشعار عند تغيير جودة الفيديو الافتراضية - لا يتم إظهار إشعار عند تغيير جودة الفيديو الافتراضية + عرض ملاحظة عند تغيير جودة الفيديو + يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية + لا يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية جودة الفيديو الافتراضية على شبكة Wi-Fi جودة الفيديو الافتراضية على شبكة الجوَّال تذكر تغييرات جودة Shorts @@ -1543,36 +1543,36 @@ Second \"item\" text" عرض زر مربع حوار السرعة - الزر معروض. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي + يتم عرض الزر. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي لا يتم عرض الزر عرض زر جودة الفيديو - الزر معروض. انقر مع الاستمرار لإعادة تعيين الجودة إلى الافتراضي - الزر غير معروض + يتم عرض الزر. انقر مع الاستمرار لإعادة تعيين الجودة إلى الوضع الافتراضي + لا يتم عرض الزر قائمة سرعة التشغيل المخصصة يتم عرض قائمة سرعة التشغيل المخصصة لا يتم عرض قائمة سرعة التشغيل المخصصة استعادة قائمة سرعة التشغيل القديمة - قائمة السرعة القديمة معروضة - قائمة السرعة الحديثة معروضة + يتم عرض قائمة سرعة التشغيل القديمة + يتم عرض قائمة سرعة التشغيل الحديثة سرعة التشغيل المخصصة - إضافة أو تغيير سرعة التشغيل المخصصة + إضافة أو تغيير سرعات التشغيل المخصصة يجب أن تكون سرعات التشغيل المخصصة أقل من %s - سرعة التشغيل المخصصة غير صالحة + سرعات التشغيل المخصصة غير صالحة تلقائي سرعة النقر مع الاستمرار المخصصة سرعة التشغيل بين 0-8 - تذكر التغيرات في سرعة التشغيل + تذكر تغييرات سرعة التشغيل تطبيق تغييرات سرعة التشغيل على جميع الفيديوهات تطبيق تغييرات سرعة التشغيل فقط على الفيديو الحالي - إظهار إشعار عند تغيير سرعة التشغيل - يتم إظهار إشعار عند تغيير سرعة التشغيل الافتراضية - لا يتم عرض إشعار عند تغيير سرعة التشغيل الافتراضية. + عرض ملاحظة عند تغيير سرعة التشغيل + يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية + لا يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية سرعة التشغيل الافتراضية تغيير السرعة الافتراضية إلى: %s @@ -1604,13 +1604,20 @@ Second \"item\" text" تم تعطيل التمرير للتقديم أو الترجيع - الآثار الجانبية للتزوير + السماح لـ Android VR AV1 + "برنامج ترميز الفيديو هو AVC (H.264) أو VP9 أو AV1 + +قد يحدث تقطيع أو فقدان للإطارات أثناء التشغيل" + برنامج ترميز الفيديو هو AVC (H.264) أو VP9 + "قد يؤدي تمكين هذا الإعداد إلى استخدام فك ترميز AV1 برمجيًا. + +قد يتلعثم تشغيل الفيديو بتقنية AV1 أو يفقد بعض الإطارات." + التأثيرات الجانبية للتزييف • عميل تجريبي وقد يتوقف عن العمل في أي وقت • قد يتوقف الفيديو عند 1:00، أو قد لا يكون متاحًا في بعض المناطق - • قائمة المسارات الصوتية مفقودة + • قائمة المقطع الصوتي مفقودة • لا يوجد ترميز الفيديو AV1 • مستوى الصوت الثابت غير متاح - • قد يتوقف التشغيل مؤقتًا أو تسقط الإطارات • قد لا يتم تشغيل الفيديوهات المخصصة للأطفال عند تسجيل الخروج أو عند استخدام وضع التصفح المتخفي • فرض الصوت الأصلي غير متاح @@ -1619,14 +1626,14 @@ Second \"item\" text" تم إخفاء نوع العميل في إحصاءات تقنية لغة بث الصوت - لتحديد لغة صوتية معينة، قم بإيقاف تشغيل \"فرض لغة الصوت الأصلية\" + لتحديد لغة صوتية معينة، قم بإيقاف تشغيل \'فرض لغة الصوت الأصلية\' اختيار لغة البث غير متاح مع Android Studio - حول - إعلانات + لمحة + الإعلانات عام المشغل متنوعة @@ -1634,7 +1641,7 @@ Second \"item\" text" إخفاء إعلانات الفيديو تم إخفاء إعلانات الفيديو - تم عرض إعلانات الفيديو + يتم عرض إعلانات الفيديو تمكين التكرار الدائم @@ -1642,22 +1649,22 @@ Second \"item\" text" تم تعطيل التكرار الدائم - إخفاء زر الإرسال - زر الإرسال مخفي - زر الإرسال ظاهر + إخفاء زر البث + تم إخفاء زر البث + يتم عرض زر البث إخفاء شريط الفئات - شريط الفئات مخفي - شريط الفئات معروض + تم إخفاء شريط الفئات + يتم عرض شريط الفئات شريط التنقل إخفاء أزرار شريط التنقل أو تغييرها - إخفاء الرئيسية - زر \"الرئيسية\" مخفي - زر \"الرئيسية\" ظاهر + إخفاء الصفحة الرئيسية + تم إخفاء زر الصفحة الرئيسية + يتم عرض زر الصفحة الرئيسية إخفاء المقاطع زر \"المقتطفات\" مخفي @@ -1694,22 +1701,22 @@ Second \"item\" text" - منع الإعلانات الصوتية - تم منع الإعلانات الصوتية - تم إلغاء منع الإعلانات الصوتية + حظر الإعلانات الصوتية + تم حظر الإعلانات الصوتية + تم إلغاء حظر الإعلانات الصوتية - %s غير متوفر. قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. - قام خادم %s بإرجاع خطأ. قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. - منع إعلانات الفيديو المضمنة + %s غير متوفر، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. + قام خادم %s بإرجاع خطأ، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. + حظر إعلانات الفيديو المضمنة معطّل Luminous Proxy PurpleAdBlock Proxy - منع إعلانات الفيديو - تم منع إعلانات الفيديو - تم إلغاء منع إعلانات الفيديو + حظر إعلانات الفيديو + تم حظر إعلانات الفيديو + يتم إلغاء حظر إعلانات الفيديو تم حذف الرسالة diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index ddb61efcc5..f5362e7e39 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -368,7 +368,7 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Sİ söhbət xülasəsini gizlət Sİ söhbət xülasəsi gizlidir Sİ söhbət xülasəsi görünür - AI Ṣərhlər Xülasəsini Gizlət + AI şərhlər xülasəsini gizlət Sİ şərhlər xülasəsi gizlidir Sİ şərhlər xülasəsi görünür Kanal təlimatlarını gizlət @@ -405,19 +405,19 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Yeni sətirlə ayrılmış filtr üçün element yol qurucusu sətirlərinin siyahısı Etibarsız fərdi filtr: %s Baxış sayını gizlət - Baxış sayı lentdə və axtarış nəticələrində gizlədilib - Baxış sayı lentdə və axtarış nəticələrində göstərilib + Baxış sayı axın və axtarış nəticələrində gizlidir + Baxış sayı axın və axtarış nəticələrində görünür "Məhdudiyyətlər: -• Shorts rəfləri, kanal səhifələri və axtarış nəticələri hələ də baxış saylarını göstərə bilər -• Bu funksiya avtomobil form faktoru ilə işləmir" - Yükləmə vaxtını gizlət - Yükləmə vaxtı lentdə və axtarış nəticələrində gizlədilib - Yükləmə vaxtı lentdə və axtarış nəticələrində göstərilir +• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yenə də baxış sayını göstərə bilər +• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" + Yüklənilmə vaxtını gizlət + Yüklənilmə vaxtı axın və axtarış nəticələrində gizlidir + Yüklənilmə vaxtı axın və axtarış nəticələrində göstərilir "Məhdudiyyətlər: -• Shorts rəflərində, kanal səhifələrində və axtarış nəticələrində yükləmə vaxtları hələ də göstərilə bilər -• Bu funksiya avtomobil form faktoru ilə işləmir" +• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yüklənilən vaxtı yenə də göstərə bilər +• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" Açar söz məzmununu gizlət Açar söz filtrləri ilə axtarış və axın videolarını gizlət Ev videolarını açar sözlərə görə gizlət @@ -869,7 +869,7 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"ı Məkan etiketini gizlət Məkan etiketi gizlidir Məkan etiketi göstərilir - Yeni elanları gizlət düyməsi + Yeni elanlar düyməsini gizlət Yeni elanlar düyməsi gizlidir Yeni elanlar düyməsi göstərilir Dayandırma örtük düymələrini gizlət @@ -1603,13 +1603,20 @@ Məhdudiyyətlər: Axtarmaq üçün sürüşdürmə aktiv deyil + Android VR AV1-ə icazə ver + "Video kodek AVC (H.264), VP9 və ya AV1-dir + +Oxutma kəsilə bilər və ya kadrlar atıla bilər" + Video kodek AVC (H.264) və ya VP9-dur + "Bu ayarı aktivləşdirmək proqram təminatı AV1 dekodlaşdırmasından istifadə edə bilər. + +AV1 ilə video oxutma kəsilə bilər və ya kadrlar atıla bilər." Saxtakarlıq yan təsirləri • Təcrübi qəbuledici və hər vaxt işləməyi dayandıra bilər • Video 01:00-da dayana bilər və ya bəzi bölgələrdə mövcud olmaya bilər • Səs treki menyusu çatışmır • AV1 video kodlayıcı yoxdur • Sabit səs yoxdur - • Oxutma kəsilə bilər və ya kadrlar düşə bilər • Giriş edilməyəndə və ya gizli rejimdə uşaq videoları oynadıla bilməz • \"Orijinal səsi zorla\" əlçatmazdır diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index 935ec76ca9..96a3e1206b 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -1605,13 +1605,20 @@ Second \"item\" text" Слайд для пошуку не ўключаны + Дазволіць Android VR AV1 + "Відэакодэк — AVC (H.264), VP9 або AV1 + +Праграмаванне можа заікацца або прапускаць кадры" + Відэакодэк — AVC (H.264) або VP9 + "Уключэнне гэтай налады можа выкарыстоўваць праграмнае дэкадаванне AV1. + +Прайграванне відэа з AV1 можа заікацца або прапускаць кадры." Пабочныя эфекты падробкі • Эксперыментальны кліент і можа спыніць працу ў любы час • Відэа можа спыніцца на 1:00, ці можа быць недаступным у некаторых рэгіёнах • Меню аўдыядарожкі адсутнічае • Няма відэакідавання AV1 • Стабільная гучнасць недаступная - • Прайграванне можа заікацца або прапускаць кадры • Дзіцячыя відэа могуць не прайгравацца ў стане выхаду з акаўнта або ў рэжыме інкогніта • Прымусовы арыгінальны аўдыё недаступны diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index 3ebb4c4536..074bc17b64 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -1604,13 +1604,20 @@ Second \"item\" text" Слайд за превъртане е деактивиран + Разрешаване на Android VR AV1 + "Видеокодекът е AVC (H.264), VP9 или AV1 + +Възпроизвеждането може да заеква или да пропуска кадри" + Видеокодекът е AVC (H.264) или VP9 + "Разрешаването на тази настройка може да използва софтуерно AV1 декодиране. + +Възпроизвеждането на видео с AV1 може да заеква или да пропуска кадри." Странични ефекти от подменянето • Експериментален клиент и може да спре да работи по всяко време • Видеото може да спре на 1:00 или може да не е налично в някои региони • Менюто за аудиозаписи липсва • Без AV1 видео кодек • Стабилният звук не е наличен - • Възпроизвеждането може да заеква или да пропуска кадри • Детските видеоклипове може да не се възпроизвеждат, когато сте излезли от профила си или в режим \"инкогнито\" • Принудителният оригинален звук не е наличен diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index 864d56a917..ed6a3d48e7 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -1600,13 +1600,20 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়নি + অ্যান্ড্রয়েড VR AV1 অনুমতি দিন + "ভিডিও কোডেক হল AVC (H.264), VP9, অথবা AV1 + +প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে" + ভিডিও কোডেক হল AVC (H.264) অথবা VP9 + "এই সেটিংটি চালু করলে সফটওয়্যার AV1 ডিকোডিং ব্যবহার হতে পারে। + +AV1 সহ ভিডিও প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে।" স্পুফিংয়ের পার্শ্বপ্রতিক্রিয়া • পরীক্ষামূলক ক্লায়েন্ট এবং যেকোনো সময় কাজ করা বন্ধ করতে পারে • ভিডিও ১:০০ মিনিটে বন্ধ হতে পারে, অথবা কিছু অঞ্চলে উপলব্ধ নাও হতে পারে • অডিও ট্র্যাক মেনু অনুপস্থিত • কোনো AV1 ভিডিও কোডেক নেই • স্থিতিশীল ভলিউম উপলব্ধ নেই - • প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে • লগআউট করা হলে বা ছদ্মবেশী মোডে বাচ্চাদের ভিডিও চলতে নাও পারে • মূল অডিও জোরপূর্বক উপলব্ধ নেই diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index c500e47c5e..c061911e47 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -1604,13 +1604,20 @@ Omezení: Posun pro hledání není povolen + Povolit Android VR AV1 + "Video kodek je AVC (H.264), VP9 nebo AV1 + +Přehrávání se může zasekávat nebo přeskakovat snímky" + Video kodek je AVC (H.264) nebo VP9 + "Povolení tohoto nastavení může využívat softwarové dekódování AV1. + +Přehrávání videa s AV1 se může sekat nebo vypadávat snímky." Vedlejší účinky maskování • Experimentální klient a může kdykoli přestat fungovat • Video se může zastavit v 1:00 nebo nemusí být dostupné v některých oblastech • Chybí nabídka zvukových stop • Žádný video kodek AV1 • Stabilní hlasitost není k dispozici - • Přehrávání se může sekat nebo ztrácet snímky • Dětská videa se nemusí přehrávat, když jste odhlášení nebo v anonymním režimu • Vynutit původní zvuk není k dispozici diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index 79182d6970..9ceec5b9cb 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -1606,13 +1606,20 @@ Begrænsninger: Dias til søgning er ikke aktiveret + Tillad Android VR AV1 + "Videocodec er AVC (H.264), VP9 eller AV1 + +Afspilning kan hakke eller miste billeder" + Videocodec er AVC (H.264) eller VP9 + "Aktivering af denne indstilling kan bruge software AV1-afkodning. + +Videoafspilning med AV1 kan hakke eller tabe billeder." Bivirkninger ved spoofing • Eksperimentel klient og kan stoppe med at fungere når som helst • Videoen kan stoppe ved 1:00, eller er muligvis ikke tilgængelig i visse regioner • Lydspormenu mangler • Intet AV1-videokodek • Stabil lydstyrke er ikke tilgængelig - • Afspilning kan hakke eller tabe billeder • Videoer til børn afspilles muligvis ikke, når du er logget ud eller i inkognitotilstand • Tving original lyd er ikke tilgængelig diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index b018f4faf2..a4e4f4dc1a 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -1601,13 +1601,20 @@ Einschränkungen: Slide zum Suchen ist nicht aktiviert + Android VR AV1 zulassen + "Video-Codec ist AVC (H.264), VP9 oder AV1 + +Die Wiedergabe kann stottern oder Frames verlieren" + Video-Codec ist AVC (H.264) oder VP9 + "Durch Aktivierung dieser Einstellung kann Software-AV1-Decodierung verwendet werden. + +Die Videowiedergabe mit AV1 kann stottern oder Bilder überspringen." Nebenwirkungen des Spoofings • Experimenteller Client und kann jederzeit aufhören zu funktionieren • Video kann um 1:00 Uhr stoppen oder ist möglicherweise in einigen Regionen nicht verfügbar • Audiotrack-Menü fehlt • Kein AV1-Videocodec • Stabile Lautstärke ist nicht verfügbar - • Die Wiedergabe kann stottern oder Bilder überspringen • Kinder-Videos werden möglicherweise nicht abgespielt, wenn du abgemeldet bist oder den Inkognito-Modus verwendest. • Originalton erzwingen ist nicht verfügbar diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index 88f27c5b2f..8c1f816470 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -1603,13 +1603,20 @@ Second \"item\" text" Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένη + Να επιτρέπεται το Android VR AV1 + "Ο κωδικοποιητής βίντεο είναι AVC (H.264), VP9 ή AV1 + +Η αναπαραγωγή ενδέχεται να κολλήσει ή να χάσει καρέ" + Ο κωδικοποιητής βίντεο είναι AVC (H.264) ή VP9 + "Η ενεργοποίηση αυτής της ρύθμισης ενδέχεται να χρησιμοποιήσει αποκωδικοποίηση AV1 λογισμικού. + +Η αναπαραγωγή βίντεο με AV1 ενδέχεται να έχει διακοπές ή να χάνει καρέ." Παρενέργειες παραποίησης • Πειραματικός πελάτης και μπορεί να σταματήσει να λειτουργεί ανά πάσα στιγμή • Το βίντεο μπορεί να σταματήσει στο 1:00 ή να μην είναι διαθέσιμο σε ορισμένες περιοχές • Το μενού «Κομμάτι ήχου» λείπει • Δεν υπάρχει ο κωδικοποιητής βίντεο AV1 • Η λειτουργία «Σταθερή ένταση» δεν είναι διαθέσιμη - • Η αναπαραγωγή μπορεί να κομπιάζει ή να χάνει καρέ • Τα βίντεο για παιδιά ενδέχεται να μην αναπαράγονται αν είστε αποσυνδεδεμένοι ή σε λειτουργία ανώνυμης περιήγησης • Ο εξαναγκασμός αρχικής γλώσσας ήχου δεν είναι διαθέσιμος diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index 05998beab7..e2808ffe4b 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -1595,13 +1595,18 @@ Limitaciones: Slide to seek no está activado + Permitir Android VR AV1 + "El códec de video es AVC (H.264), VP9 o AV1 + +La reproducción puede tartamudear o perder fotogramas" + El códec de video es AVC (H.264) o VP9 + "Habilitar esta configuración puede usar la decodificación de software AV1.\n\nLa reproducción de video con AV1 puede tartamudear o perder fotogramas." Efectos secundarios de la falsificación • El cliente es experimental y puede dejar de funcionar en cualquier momento • El video puede detenerse en 1:00, o puede no estar disponible en algunas regiones • Falta el menú de la pista de audio • Sin códec de vídeo AV1 • Volumen estable no disponible - • La reproducción podría tartamudear o perder fotogramas • Es posible que los vídeos infantiles no se reproduzcan cuando se cierra la sesión o se está en modo incógnito • Forzar audio original no está disponible diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index 3ceaec10d6..7072527635 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -1604,13 +1604,20 @@ Piirangud: Libistamine otsimiseks on keelatud + Luba Android VR AV1 + "Videokodek on AVC (H.264), VP9 või AV1 + +Taasesitus võib hakata kokutama või kaotada kaadreid" + Videokodek on AVC (H.264) või VP9 + "Selle seade lubamine võib kasutada tarkvara AV1 dekodeerimist. + +AV1-ga videotaasesitus võib hakitud olla või kaadreid vahele jätta." Võltsimise kõrvalmõjud • Eksperimentaalne klient ja võib igal ajal töötamast lakata • Video võib peatuda kell 1:00 või ei pruugi olla teatud piirkondades saadaval • Heliraja menüü puudub • Puuduv AV1 videokoodek • Stabiilne helitugevus pole saadaval - • Taasesitus võib katkendlik olla või kaadreid vahele jätta • Video lastele ei pruugi taasesitada, kui olete välja logitud või inkognito režiimis • Sunni algne heli pole saadaval diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index 4f9b72353a..04220491f1 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -1604,13 +1604,20 @@ Rajoitukset: Kelaus liu\'uttamalla ei ole käytössä + Salli Android VR AV1 + "Videokoodekki on AVC (H.264), VP9 tai AV1 + +Toisto voi nykiä tai pudottaa kehyksiä" + Videokoodekki on AVC (H.264) tai VP9 + "Tämän asetuksen ottaminen käyttöön saattaa käyttää ohjelmistopohjaista AV1-dekoodausta. + +AV1-videon toisto saattaa pätkiä tai pudottaa kuvia." Naamioimisen sivuvaikutukset • Kokeellinen asiakasohjelma, joka saattaa lakata toimimasta milloin tahansa • Video saattaa pysähtyä aikaan 1:00, tai ei välttämättä ole saatavilla joillakin alueilla • Ääniraitavalikko puuttuu • Ei AV1-videokoodekkia • Tasainen äänenvoimakkuus ei ole käytettävissä - • Toisto saattaa pätkiä tai pudottaa kuvia • Lasten videot eivät ehkä toistu, kun olet kirjautunut ulos tai incognito-tilassa • Pakota alkuperäinen ääni ei ole käytettävissä diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index cce1c246a0..13a99b5af4 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -1602,13 +1602,20 @@ Mga Limitasyon: Hindi pinagana ang slide to seek + Payagan ang Android VR AV1 + "Ang video codec ay AVC (H.264), VP9, o AV1 + +Maaaring mag-stutter o mag-drop ng frames ang playback" + Ang video codec ay AVC (H.264) o VP9 + "Ang pagpapagana sa setting na ito ay maaaring gumamit ng software AV1 decoding. + +Maaaring mag-stutter o mag-drop ng frames ang pag-playback ng video na may AV1." Mga epekto ng pagpapanggap • Pang-eksperimentong kliyente at maaaring huminto sa paggana anumang oras • Maaaring huminto ang video sa 1:00, o maaaring hindi available sa ilang rehiyon • Nawawala ang menu ng audio track • Walang AV1 video codec • Hindi available ang stable volume - • Maaaring mag-stutter ang pag-playback o bumaba ang mga frame • Mga video ng mga bata ay maaaring hindi ma-play kapag naka-log out o nasa incognito mode • Ang Pilitin ang orihinal na audio ay hindi magagamit diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index d4ea1ff123..88b85b6265 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -1605,13 +1605,20 @@ Limitations : Glisser pour rechercher est désactivé + Autoriser Android VR AV1 + "Le codec vidéo est AVC (H.264), VP9 ou AV1 + +La lecture peut saccader ou perdre des images" + Le codec vidéo est AVC (H.264) ou VP9 + "L'activation de ce paramètre peut utiliser le décodage AV1 logiciel. + +La lecture vidéo avec AV1 peut saccader ou perdre des images." Effets secondaires de la falsification • Client expérimental, peut cesser de fonctionner à tout moment • Les vidéos sont susceptibles de s\'arrêter à 1:00, ou de ne pas être disponibles dans certaines régions • Le menu Piste audio est absent • Codec vidéo AV1 indisponible • Le volume stable n\'est pas disponible - • La lecture peut saccader ou perdre des images • La lecture des vidéos pour enfants peut ne pas fonctionner lorsque vous êtes déconnecté ou en mode navigation privée • Forcer la langue audio d\'origine n\'est pas disponible diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index fdc8de9769..6141389a05 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -55,7 +55,7 @@ Second \"item\" text" Bain triail as eochairfhocal eile Cuardaigh le déanaí Bain as stair an chuardaigh? - Glan stair an chuardaigh + Glan stair chuardaigh An bhfuil tú cinnte gur mhaith leat stair chuardaigh go léir a ghlanadh? Leideanna Cuardaigh "• Tapáil cosán chun dul chuige @@ -106,14 +106,14 @@ Brúigh an cnaipe leanúnaí agus ligean athruithe optúimíochta." Lean ar aghaidh - Sruthanna físeán spoof - Spoof na sruthanna físeáin cliant chun saincheisteanna athsheinm a chosc - Sruthanna físeáin bréige - Déan bréagú ar shruthanna físeáin an chliaint chun saincheisteanna athsheinm a chosc - Sruthanna físeán spoof - "Tá sruthanna físeáin bréagaithe + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + "Déantar sruthanna físe a bhréagnú -Má tá tú i do úsáideoir YouTube Premium, seans nach mbeidh an socrú seo ag teastáil" +Mura bhfuil tú i d’úsáideoir YouTube Premium, b’fhéidir nach mbeidh an socrú seo ag teastáil" "Ní dhéantar sruthanna físeáin a bhréagnú Seans nach n-oibreoidh an t-athsheinm" @@ -230,8 +230,8 @@ Mar sin féin, logálfaidh sé seo roinnt sonraí úsáideora freisin, mar shamp Tá seilf íomhá i dtorthaí cuardaigh i bhfolach Taispeántar seilf íomhánna i dtorthaí cuardaigh Folaigh na poist is déanaí - Tá postanna is déanaí i bhfolach - Taispeántar na postálacha is déanaí + Tá na poist is déanaí i bhfolach + Taispeántar na poist is déanaí Folaigh seinmliostaí meascán Tá seinmliostaí measctha i bhfolach Taispeántar seinmliostaí measctha @@ -248,9 +248,9 @@ Mar sin féin, logálfaidh sé seo roinnt sonraí úsáideora freisin, mar shamp Taispeántar na heilimintí inseinnte - Folaigh cnaipe \'Taispeáin tuilleadh\' + Folaigh an cnaipe \'Taispeáin níos mó\' Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh i bhfolach - Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh taispeánta + Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh thaispeánta Folaigh suirbhéanna Tá suirbhéanna i bhfolach Tá suirbhéanna taispeánta @@ -1467,7 +1467,7 @@ Brúigh anseo chun tuilleadh eolais a fháil faoi DeArrow" Ní thaispeántar fógraí ar thosú Taispeáin fógraí ar thosú Theip ar nascadh le soláthraí fógraí - Díbhunaigh + Díbhe Cumasaigh físeán lúbtha @@ -1476,44 +1476,44 @@ Brúigh anseo chun tuilleadh eolais a fháil faoi DeArrow" Taispeáin an cnaipe físeáin lúbtha - Tá an cnaipe ar taispeáint + Taispeántar an cnaipe Níl an cnaipe ar taispeáint Tá físeán lúbtha ar siúl Tá físeán lúbtha as siúl - Toisí feiste spoof - "Toisí gléise spoofed + Toisí gléas a fhalsú + "Toisí na ngléasanna falsaithe -D'fhéadfadh go gcuirfí caighdeáin físeáin níos airde ar fáil ach d'fhéadfá stuttering athsheinm físeáin, saol ceallraí níos measa, agus fo-iarsmaí anaithnid a fháil" - "Níl toisí gléise spoofed +D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" + "Toisí na ngléasanna gan falsaithe -Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" - D\'fhéadfadh sé seo a bheith ina chúis le stuttering athsheinm físe, saol ceallraí níos measa, agus fo-iarmhairtí anaithnid. +D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" + Is féidir go mbeidh stad ar athsheinm físe, saolré na ceallraí níos measa, agus fo-iarsmaí anaithnide mar thoradh air seo. - Aiseolas haptach - Athraigh aiseolas haptach - Díchumasaigh haptics caibidlí - Tá haptics caibidlí díchumasaithe - Tá haptics caibidlí cumasaithe - Díchumasaigh haptics beacht cuardaigh - Tá haptics beachtais díchumasaithe - Tá haptics beacht cuardaigh cumasaithe - Díchumasaigh haptics díthurais - Tá haptics díthurais díchumasaithe - Tá haptics díthurais cumasaithe - Díchumasaigh súmáil haptics - Tá súmáil haptics díchumasaithe - Tá súmáil haptics cumasaithe + Aiseolas haiptice + Athraigh aiseolas haiptice + Díchumasaigh haiptice caibidlí + Tá haiptice caibidlí díchumasaithe + Tá haiptice caibidlí cumasaithe + Díchumasaigh haiptice beacht cuardaigh + Tá haiptice cuardaigh chruinne díchumasaithe + Tá haiptice cuardaigh chruinn cumasaithe + Díchumasaigh haiptice cuardaigh agus cealaithe + Tá haiptice cuardaigh cealaithe díchumasaithe + Tá haiptice cuardaigh cealaithe cumasaithe + Díchumasaigh haiptice súmála + Tá haiptice súmála díchumasaithe + Tá haiptice súmála cumasaithe Má d’athraigh tú sonraí logála isteach do chuntais le déanaí, ansin díshuiteáil agus athshuiteáil MicroG. - Atreoracha seachbhóthar URL - Seachnaítear atreoruithe URL - Ní chuirtear athsheoltaí URL + Seachain atreoruithe URL + Déantar atreoruithe URL a sheachaint + Ní dhéantar seachaint ar atreoruithe URL Oscail naisc sa bhrabhsála @@ -1523,14 +1523,14 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Uathoibríoch - Cuimhnigh athruithe ar cháilíocht + Cuimhnigh athruithe ar cháilíocht físe Baineann athruithe cáilíochta le gach físeán Ní bhaineann athruithe cáilíochta ach leis an bhfíseán reatha - Taispeáin fógra beag ar athruithe cáilíochta físe + Taispeáin tósta ar athruithe cáilíochta físe Taispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin Ní thaispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin - Cáilíocht físe réamhshocraithe ar líonra - Cáilíocht físe réamhshocraithe ar líonra + Cáilíocht físe réamhshocraithe ar líonra Wi-Fi + Cáilíocht físe réamhshocraithe ar líonra soghluaiste Cuimhnigh ar athruithe cáilíochta Shorts Baineann athruithe ar an gcáilíocht le gach Shorts Ní bhaineann athruithe ar an gcáilíocht ach leis an Short reatha @@ -1538,7 +1538,7 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Cáilíocht réamhshocraithe Shorts ar líonra soghluaiste soghluaiste Wi-Fi - Athraigh cáilíocht réamhshocraithe %1$s go dtí: %2$s + Athraíodh cáilíocht réamhshocraithe %1$s go: %2$s Athraíodh cáilíocht Shorts %1$s go: %2$s @@ -1548,22 +1548,22 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Taispeáin cnaipe cáilíochta físeáin - Tá cnaipe le feiceáil. Tapáil agus coinnigh chun cáilíocht a athshocrú mar réamhshocrú - Níl cnaipe le feiceáil + Taispeántar an cnaipe. Tapáil agus coinnigh síos chun an caighdeán a athshocrú go dtí an caighdeán réamhshocraithe + Ní thaispeántar an cnaipe Roghchlár luas athsheinm saincheaptha Taispeántar roghchlár luais saincheaptha Ní thaispeántar roghchlár luais saincheaptha - Athchóirigh an seanchalafort luais athsheinm - Tá an seanchalafort luais taispeánta - Tá an calafort luais nua-aimseartha taispeánta + Athchóirigh an sean-roghchlár luas athsheinm + Taispeántar an sean-roghchlár luais + Taispeántar roghchlár luais nua-aimseartha Luas athsheinm saincheaptha Cuir leis nó athraigh na luasanna athsheinm saincheaptha Ní mór luas saincheaptha a bheith níos lú ná %s Luasanna athsheinm saincheaptha neamhbhailí Uathoibríoch - Luas tap is agus greim + Luas saincheaptha tapála agus coinnigh Luas athsheinm eatarthu 0-8 @@ -1577,12 +1577,12 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Athraigh luas réamhshocraithe go: %s -

Díchumasú físeán HDR

-

Tá físeán HDR díchumasaithe

-

Tá físeán HDR arna chumhachtú

+ Díchumasaigh físeán HDR + Tá físeán HDR díchumasaithe + Tá físeán HDR cumasaithe Fórsa AVC (H.264) Éigeantar an códóir físeáin go AVC (H.264) - Cinntear an códóir físeáin go huathoibríoch + Cinntear an cóideac físe go huathoibríoch "Sochair: • Féadfaidh sé saolré na ceallraí a fheabhsú • Féadfaidh sé réitigh físeáin atá in easnamh a chur ar ais ar ghléasanna níos sine @@ -1604,22 +1604,29 @@ Teorainneacha: Níl sleamhnán le lorg cumasaithe
- Fo-iarsmaí bréagaíochta + Ceadaigh Android VR AV1 + "Is é an códac físeáin AVC (H.264), VP9, nó AV1 + +D'fhéadfadh go mbeadh fadhbanna le hathsheinm nó go gcaillfí frámaí" + Is é an códac físeáin AVC (H.264) nó VP9 + "Má chumasaítear an socrú seo, d'fhéadfadh sé díchódú bogearraí AV1 a úsáid. + +D'fhéadfadh athsheinm físe AV1 leacadh nó frámaí a scaoileadh." + Fo-éifeachtaí a fhalsúa • Cliant turgnamhach é seo agus féadfaidh sé stop a chur ag obair ag am ar bith • Is féidir go stopfaidh an físeán ag 1:00, nó b\'fhéidir nach mbeidh sé ar fáil i réigiúin áirithe • Tá an roghchlár rian fuaime in easnamh - • Níl aon chóidéir físe AV1 + • Níl aon cóideac físe AV1 • Níl toirt chobhsaí ar fáil - • D\'fhéadfadh an athsheinm bacadh nó frámaí a chailleadh - • Videos faoi phaistí uaireanta nach imreoidh nuair a bhíonn tú logáilte amach nó i mod incognito + • Seans nach seinnfear físeáin do pháistí nuair a bhíonn siad logáilte amach nó i mód go hanaithnid - • Níl Éigean fuaime bunaidh ar fáil + • Níl an fuaim bhunaidh iallach ar fáil Taispeáin i Staitisticí do nerds Taispeántar cineál an chliaint i Staitisticí do nerds Tá an cliant curtha i bhfolach i Staitisticí do nerds Teanga an tsrutha fuaime - Chun teanga fuaime shonrach a roghnú, múch \'Cuir iallach ar bhunteanga fuaime\' + Chun teanga fuaime ar leith a roghnú, múch \'Fórsaigh teanga fuaime bhunaidh\' Níl roghnú theanga an tsrutha ar fáil le Android Studio
@@ -1638,13 +1645,13 @@ Teorainneacha: Cumasaigh athdhéanamh buan - Tá athdhéanamh buan cumasaithe - Tá athdhéanamh buan díchumasaithe + Tá athrá buan cumasaithe + Tá athrá buan díchumasaithe Folaigh an cnaipe teilgthe Tá an cnaipe teilgthe i bhfolach - Tá an cnaipe teilgthe ar taispeáint + Taispeántar an cnaipe teilgthe Folaigh an barra catagóirí @@ -1657,29 +1664,29 @@ Teorainneacha: Folaigh Baile Tá cnaipe Baile folaithe - Tá cnaipe Baile taispeánta + Taispeántar an cnaipe baile Folaigh Samplaí - Tá cnaipe Samplaí folaithe - Tá cnaipe Samplaí taispeánta + Tá cnaipe na samplaí i bhfolach + Taispeántar cnaipe na samplaí - Folaigh Scrúdaigh - Tá cnaipe Fionnachtana folaithe - Tá cnaipe Fionnachtana taispeánta + Folaigh Iniúchadh + Tá an cnaipe iniúchadh i bhfolach + Taispeántar an cnaipe iniúchadh Folaigh Leabharlann - Tá cnaipe Leabharlann folaithe - Tá cnaipe Leabharlann taispeánta + Tá cnaipe na leabharlainne i bhfolach + Taispeántar cnaipe na leabharlainne - Folaigh Uasghrádaigh - Tá cnaipe Uasghrádú folaithe - Tá cnaipe Uasghrádú taispeánta + Folaigh an tUasghrádú + Tá an cnaipe uasghrádaithe i bhfolach + Taispeántar an cnaipe uasghrádaithe Folaigh barra nascleanúna - Tá barra nascleanúna folaithe - Tá barra nascleanúna taispeánta + Tá an barra nascleanúna i bhfolach + Taispeántar barra nascleanúna Folaigh lipéid cnaipí nascleanúna - Tá lipéid folaithe - Tá lipéid taispeánta + Tá lipéid i bhfolach + Taispeántar lipéid Folaigh an lipéad \'Faigh Music Premium\' @@ -1696,7 +1703,7 @@ Teorainneacha: Cuir bac ar fógraí fuaime Cuirtear bac ar fhógraí fuaime - Déantar fógraí fuaime díbhocáilte + Tá fógraí fuaime díbhlocáilte %s neamh-infheidhme, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. @@ -1715,11 +1722,11 @@ Teorainneacha: Teachtaireacht scriosta Taispeáin teachtaireachtaí scriosta Ná taispeáin teachtaireachtaí scriosta - Folaigh teachtaireachtaí scriosta taobh thiar de spoiler - Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe + Folaigh teachtaireachtaí scriosta taobh thiar a fhalsúa + Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe amach - Tóg Pointí Cainte go huathoibríoch + Éiligh Pointí Cainéil go huathoibríoch Éilítear Pointí Cainéal go huathoibríoch Ní éilítear Pointí Cainéal go huathoibríoch diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 058a2f9f85..bc71281b59 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -1601,13 +1601,20 @@ Korlátozások: A csúsztatás a kereséshez nincs engedélyezve + Android VR AV1 engedélyezése + "A videó kodek AVC (H.264), VP9 vagy AV1 + +A lejátszás akadozhat vagy képkockákat ejthet" + A videokodek AVC (H.264) vagy VP9 + "Ennek a beállításnak az engedélyezése szoftveres AV1 dekódolást használhat. + +Az AV1-es videólejátszás akadozhat vagy képkockákat ejthet." Hamisítás mellékhatásai • Kísérleti kliens, és bármikor leállhat • A videó megállhat 1:00-nál, vagy előfordulhat, hogy egyes régiókban nem elérhető • Hiányzik az hangsáv menü • Nincs AV1 videokodek • Stabil hangerő nem elérhető - • A lejátszás akadozhat vagy képkockákat dobhat. • A gyermekeknek szóló videók nem játszódnak le, ha a felhasználó kijelentkezett, vagy inkognitómódban van. • Eredeti hang kényszerítése nem érhető el diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index bb723e17cf..d4e4b4c862 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -1605,13 +1605,20 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Սահելը համար ընտրելը անջատված է + Թույլատրել Android VR AV1 + "Տեսակոդեկը AVC (H.264), VP9 կամ AV1 է + +Նվագարկումը կարող է կանգ առնել կամ կորցնել կադրեր" + Տեսակոդեկը AVC (H.264) կամ VP9 է + "Այս կարգավորումը միացնելը կարող է օգտագործել AV1 ծրագրային ապակոդավորում: + +AV1-ով տեսանյութի նվագարկումը կարող է ընդհատվել կամ կորցնել կադրեր:" Կեղծելու կողմնակի ազդեցություններ • Փորձնական հաճախորդ է և կարող է ցանկացած պահի դադարել աշխատել • Տեսանյութը կարող է դադարել 1:00-ին կամ հասանելի չլինել որոշ տարածաշրջաններում • Ձայնային ուղու մենյուն բացակայում է • Հեռացված բոլոր AV1 վիդեո կոդեկները • Կայուն ձայնի մակարդակը հասանելի չէ - • Նվագարկումը հնարավոր է ընդհատվի կամ բաց թողնի կադրեր Երեխաների տեսանյութերը կարող են չհամապատասխանել հետևյալ պահանջներին՝ եթե արտոնագրման խախտումներ կան։ • Բնօրինակ ձայնի պարտադրումը հասանելի չէ diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 088a6b07d9..db621a6735 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -22,18 +22,18 @@ Second \"item\" text" Pemeriksaan gagal - Buka situs resminya + Buka situs resmi Abaikan - <h5>Aplikasi ini tampaknya tidak dipatch oleh Anda.</h5><br>Aplikasi ini mungkin tidak berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah dipatch sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan mempatchnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. - Dipatch pada perangkat yang berbeda - Tidak dipasang oleh ReVanced Manager - Dipatch lebih dari 10 menit yang lalu - Dipatch %s hari yang lalu + <h5>Aplikasi ini tampaknya tidak ditambal oleh Anda.</h5><br>Aplikasi ini mungkin tidak bisa berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah ditambal sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan menambalnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. + Ditambal pada perangkat yang berbeda + Tidak terpasang oleh ReVanced Manager + Ditambal lebih dari 10 menit yang lalu + Ditambal %s hari yang lalu Tanggal pembuatan APK rusak Peringatan - Riwayat tontonan Anda tidak disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. + Riwayat tontonan Anda tidak sedanh disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan ke daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir iklan DNS dan proksi. Jangan tampilkan lagi @@ -48,7 +48,7 @@ Second \"item\" text" Impor Salin Pengaturan ReVanced diatur ke bawaan - Mengimpor setelan %d + Setelan %d terimpor Impor gagal: %s Pengaturan pencarian Tidak ada hasil yang ditemukan untuk \'%s\' @@ -62,12 +62,12 @@ Second \"item\" text" • Tekan lama pada pengaturan untuk menelusuri ke jalur tersebut • Tekan Enter untuk menyimpan kueri pencarian ke riwayat • Pencarian mengabaikan huruf besar/kecil dan tanda baca -• Pengaturan orang tua muncul di atas pengaturan anak yang dinonaktifkan" +• Pengaturan utama muncul di atas pengaturan sampingan yang dinonaktifkan" Riwayat pencarian kosong Untuk menyimpan riwayat pencarian, ketik kueri pencarian dan tekan Enter - Tampilkan pengaturan riwayat pencarian - Pengaturan riwayat pencarian ditampilkan - Pengaturan riwayat pencarian tidak ditampilkan + Tampilkan riwayat pencarian setelan + Riwayat pencarian setelan ditampilkan + Riwayat pencarian setelan tidak ditampilkan Tampilkan ikon pengaturan ReVanced Ikon pengaturan ditampilkan Ikon pengaturan tidak ditampilkan @@ -1603,13 +1603,20 @@ Batasan: Geser untuk mencari tidak diaktifkan + Izinkan Android VR AV1 + "Codec video adalah AVC (H.264), VP9, atau AV1 + +Pemutaran mungkin tersendat atau kehilangan bingkai" + Codec video adalah AVC (H.264) atau VP9 + "Mengaktifkan pengaturan ini mungkin menggunakan decoding AV1 perangkat lunak. + +Pemutaran video dengan AV1 mungkin tersendat atau kehilangan bingkai." Efek samping pemalsuan • Klien eksperimental dan dapat berhenti berfungsi kapan saja • Video mungkin berhenti pada 1:00, atau mungkin tidak tersedia di beberapa wilayah • Menu trek audio tidak ada • Tidak ada codec video AV1 • Volume stabil tidak tersedia - • Pemutaran mungkin tersendat atau melewatkan bingkai • Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran • Paksa audio asli tidak tersedia @@ -1658,9 +1665,9 @@ Batasan: Tombol Beranda disembunyikan Tombol Beranda ditampilkan - Sembunyikan Cuplikan - Tombol Cuplikan disembunyikan - Tombol Cuplikan ditampilkan + Sembunyikan Sampel + Tombol Sampel disembunyikan + Tombol Sampel ditampilkan Sembunyikan Jelajahi Tombol Jelajahi disembunyikan diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index 65f0b05511..509208cec0 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -1603,13 +1603,20 @@ Limitazioni: Scorri per avanzare non è abilitato + Consenti Android VR AV1 + "Il codec video è AVC (H.264), VP9 o AV1 + +La riproduzione potrebbe subire interruzioni o perdere fotogrammi" + Il codec video è AVC (H.264) o VP9 + "Abilitando questa impostazione potrebbe essere utilizzata la decodifica AV1 via software. + +La riproduzione video con AV1 potrebbe rallentare o perdere fotogrammi." Effetti collaterali della falsificazione • Client sperimentale e potrebbe smettere di funzionare in qualsiasi momento • Il video potrebbe interrompersi all\'1:00, o potrebbe non essere disponibile in alcune regioni • Manca il menu delle tracce audio • Nessun codec video AV1 • Il volume stabile non è disponibile - • La riproduzione potrebbe scattare o perdere fotogrammi • I video dei bambini potrebbero non essere riprodotti quando si è disconnessi o in modalità di navigazione in incognito • L\'audio originale forzato non è disponibile diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index 14b253e798..5bc713abba 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -1606,13 +1606,20 @@ Second \"item\" text" החלק כדי לדלג אינו מופעל + אפשר Android VR AV1 + "מקודד וידאו הוא AVC (H.264), VP9, או AV1 + +ההפעלה עשויה לגמגם או לדלג על פריימים" + מקודד וידאו הוא AVC (H.264) או VP9 + "הפעלת הגדרה זו עשויה להשתמש בפענוח תוכנה של AV1. + +הפעלת וידאו עם AV1 עלולה לגרום לגמגום או לדלוג על פריימים." תופעות לוואי של התחזות • לקוח ניסיוני ועשוי להפסיק לפעול בכל עת • הווידאו עשוי להיעצר בדקה 1:00, או ייתכן שלא יהיה זמין באזורים מסוימים • תפריט ערוץ השמע חסר • אין קודק וידאו מסוג AV1 • עוצמת קול יציבה אינה זמינה - • ההפעלה עלולה לגמגם או להפיל פריימים • ייתכן שסרטוני Kids לא יופעלו כשאתה מנותק או במצב פרטי • כפיית שמע מקורי אינה זמינה diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index aac14f5d8b..6bfffc2bc3 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -508,7 +508,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 「動画の URL をコピー」ボタンを表示 ボタンがプレーヤー オーバーレイに表示されます。タップすると動画の URL が、長押しするとタイムスタンプ付きの URL がそれぞれコピーされます ボタンはプレーヤー オーバーレイに表示されません - 「動画のタイムスタンプ付き URL をコピー」ボタンを表示 + 「タイムスタンプ付き URL をコピー」ボタンを表示 ボタンがプレーヤー オーバーレイに表示されます。タップするとタイムスタンプ付きの URL が、長押しするとタイムスタンプなしの URL がそれぞれコピーされます ボタンはプレーヤー オーバーレイに表示されません @@ -1483,7 +1483,7 @@ Automotive レイアウト 動画のループ再生がオフになっています - デバイスの画面サイズを偽装する + デバイスの画面サイズを偽装 "デバイスの画面サイズは偽装されています より高画質な映像がアンロックされる可能性がありますが、動画のカクつき、バッテリー寿命の悪化、予期せぬ副作用が @@ -1586,8 +1586,8 @@ Automotive レイアウト ビデオ コーデックは強制的に AVC (H.264) になります ビデオ コーデックは自動的に決定されます "利点: -• バッテリー寿命を延ばすことができる -• 古いデバイスで失われた動画解像度を復元できる +• バッテリー寿命が延びる可能性がある +• 古いデバイスで失われた動画解像度を復元できる可能性がある 制限事項: • 最大解像度が 1080p @@ -1606,13 +1606,20 @@ Automotive レイアウト スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません + Android VR AV1 を許可する + "ビデオコーデックはAVC (H.264)、VP9、またはAV1です + +再生中に途切れたり、フレームがドロップすることがあります" + ビデオコーデックはAVC (H.264) またはVP9です + "この設定を有効にすると、ソフトウェアAV1デコードが使用される可能性があります。 + +AV1での動画再生は、途切れたりフレームが落ちたりする場合があります。" 偽装による副作用 • 実験的なクライアントであり、いつでも動作しなくなる可能性がある • 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある •「音声トラック」がフライアウト メニューに表示されない • AV1 コーデックが利用できない •「一定音量」が利用できない - • 再生が途切れたり、フレームがスキップされたりする場合があります。 • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある •「オリジナルの音声を強制的に使用」が利用できない diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 040d5e4cb9..cc83dbb368 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -1611,13 +1611,20 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" 슬라이드하여 탐색을 비활성화합니다 + Android VR AV1 허용 + "비디오 코덱은 AVC (H.264), VP9 또는 AV1입니다 + +재생이 끊기거나 프레임이 떨어질 수 있습니다" + 비디오 코덱은 AVC (H.264) 또는 VP9입니다 + "이 설정을 활성화하면 소프트웨어 AV1 디코딩을 사용할 수 있습니다. + +AV1을 사용한 비디오 재생 시 끊김 또는 프레임 드롭이 발생할 수 있습니다." 변경에 따른 부작용 • 실험용 클라이언트이며 언제든지 작동이 중단될 수 있습니다 • 동영상이 1:00에 멈출 수 있으며, 일부 지역에서는 이용이 불가능할 수 있습니다 • 오디오 트랙 메뉴가 표시되지 않습니다 • AV1 코덱이 지원되지 않습니다 • 안정적인 볼륨을 사용할 수 없습니다 - • 재생이 끊기거나 프레임이 손실될 수 있습니다 • Kids 동영상은 로그인을 하지 않았거나 시크릿 모드에서는 재생되지 않을 수 있습니다 • 원본 오디오를 강제로 활성화할 수 없습니다 diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 0655defd0a..f9ec6a0321 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -1605,13 +1605,20 @@ Apribojimai: Slinkimas, kad ieškotumėte, neišjungtas + Leisti Android VR AV1 + "Vaizdo kodekas yra AVC (H.264), VP9 arba AV1 + +Gali strigti arba praleisti kadrus" + Vaizdo kodekas yra AVC (H.264) arba VP9 + "Įjungus šį nustatymą, gali būti naudojamas programinės įrangos AV1 dekodavimas. + +Vaizdo įrašo atkūrimas su AV1 gali strigti arba praleisti kadrus." Klastojimo šalutiniai efektai • Eksperimentinis klientas ir bet kada gali nustoti veikti • Vaizdo įrašas gali sustoti ties 1:00 arba gali būti nepasiekiamas kai kuriuose regionuose • Trūksta garso takelio meniu • Nėra AV1 vaizdo kodeko • Stabili garso apimtis nepasiekiama - • Atkūrimas gali strigti arba praleisti kadrus • Vaikų vaizdo įrašai gali būti neatkuriami, kai atsijungiama arba naudojamas inkognito režimas • Priverstinai naudoti originalų garsą nepasiekiama diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index c3d85901e0..3c7c46ff66 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -1605,13 +1605,20 @@ Ierobežojumi: Slīdēšana, lai meklētu, nav iespējota + Atļaut Android VR AV1 + "Video kodeks ir AVC (H.264), VP9 vai AV1 + +Atskaņošana var raustīties vai izlaist kadrus" + Video kodeks ir AVC (H.264) vai VP9 + "Šī iestatījuma iespējošana var izmantot programmatūras AV1 dekodēšanu. + +AV1 video atskaņošana var raustīties vai izlaist kadrus." Viltotu straumju blakusparādības • Eksperimentāls klients un jebkurā brīdī var pārtraukt darbu • Video var apstāties pulksten 1:00 vai nebūt pieejams dažos reģionos • Trūkst audio celiņa izvēlnes • Nav pieejams AV1 video kodeks • Nav pieejams stabils skaļums - • Atskaņošana var raustīties vai izlaist kadrus • Bērnu videoklipi var netikt atskaņoti, kad esat izrakstījies vai inkognito režīmā. • Piespiest oriģinālo skaņu nav pieejams diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index f8310b78a3..e04887afff 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -1602,13 +1602,20 @@ Beperkingen: Schuiven om te zoeken is niet ingeschakeld + Sta Android VR AV1 toe + "Videocodec is AVC (H.264), VP9 of AV1 + +Afspelen kan haperen of frames overslaan" + Videocodec is AVC (H.264) of VP9 + "Het inschakelen van deze instelling kan gebruikmaken van softwarematige AV1-decodering. + +Het afspelen van video met AV1 kan haperen of frames overslaan." Spoofing-neveneffecten • Experimentele client en kan elk moment stoppen met werken • Video kan stoppen om 1:00, of is mogelijk niet beschikbaar in sommige regio\'s • Audiotrack-menu ontbreekt • Geen AV1-videocodec • Stabiel volume is niet beschikbaar - • Het afspelen kan haperen of frames overslaan • \"Kinder\"​-Video’s worden mogelijk niet afgespeeld wanneer u bent uitgelogd of de incognitomodus gebruikt • Oorspronkelijke audio forceren is niet beschikbaar diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 6faa4a5450..9a08c81d02 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -1600,13 +1600,20 @@ Ograniczenia: Przesuń, aby przeszukiwać nie jest włączony + Zezwól na Android VR AV1 + "Kodek wideo to AVC (H.264), VP9 lub AV1 + +Odtwarzanie może się zacinać lub gubić klatki" + Kodek wideo to AVC (H.264) lub VP9 + "Włączenie tego ustawienia może używać programowego dekodowania AV1. + +Odtwarzanie wideo z AV1 może powodować zacinanie się lub gubienie klatek." Skutki uboczne fałszowania • Eksperymentalny klient i może przestać działać w każdej chwili • Wideo może zatrzymać się o 1:00 lub może być niedostępne w niektórych regionach • Brakuje menu ścieżek audio • Žádný video kodek AV1 • Stabilna głośność nie jest dostępna - • Odtwarzanie może się zacinać lub gubić klatki • Filmy dla dzieci mogą nie być odtwarzane po wylogowaniu lub w trybie incognito • Wymuś oryginalny dźwięk jest niedostępny diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index dab1f26cca..3b07fe7001 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -1601,13 +1601,20 @@ Limitações: Gesto na barra de busca está desativado + Permitir Android VR AV1 + "O codec de vídeo é AVC (H.264), VP9 ou AV1 + +A reprodução pode engasgar ou perder quadros" + O codec de vídeo é AVC (H.264) ou VP9 + "Ativar esta configuração pode usar decodificação de software AV1. + +A reprodução de vídeo com AV1 pode gaguejar ou perder quadros." Efeitos colaterais da falsificação • Cliente experimental e pode parar de funcionar a qualquer momento • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões • O menu da faixa de áudio está faltando • Sem codec de vídeo AV1 • Volume estável não está disponível - • A reprodução pode gaguejar ou perder quadros • Vídeos infantis podem não ser reproduzidos quando estiver desconectado ou no modo de navegação anônima • Forçar áudio original não está disponível diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index 51259330af..f974231f3e 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -1604,13 +1604,20 @@ Limitações: Deslize para procurar não está habilitado + Permitir Android VR AV1 + "O codec de vídeo é AVC (H.264), VP9 ou AV1 + +A reprodução pode gaguejar ou perder quadros" + O codec de vídeo é AVC (H.264) ou VP9 + "Ativar esta configuração pode usar descodificação AV1 por software. + +A reprodução de vídeo com AV1 pode apresentar soluços ou perder quadros." Efeitos colaterais da falsificação • Cliente experimental e pode parar de funcionar a qualquer momento • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões • O menu da faixa de áudio está faltando • Nenhum codec de vídeo AV1 • O volume estável não está disponível - • A reprodução pode gaguejar ou perder quadros • Vídeos infantis podem não ser reproduzidos quando desconectado ou no modo anônimo • Forçar áudio original não está disponível diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index 4d6570aadd..48bfb037e7 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -1601,13 +1601,20 @@ Limitări: Slide pentru a căuta nu este activat + Permite Android VR AV1 + "Codecul video este AVC (H.264), VP9 sau AV1 + +Redarea poate sacada sau pierde cadre" + Codecul video este AVC (H.264) sau VP9 + "Activarea acestei setări poate folosi decodarea software AV1. + +Redarea video cu AV1 poate sacada sau pierde cadre." Efecte secundare ale simulării • Client experimental și se poate opri din funcționare oricând • Videoclipul se poate opri la 1:00, sau poate să nu fie disponibil în unele regiuni • Meniul pistei audio lipsește • Fara codec video AV1 • Volumul stabil nu este disponibil - • Redarea poate sacada sau pierde cadre • Copiii nu pot urmări videoclipuri atunci când sunt deconectați sau în modul incognito • Forțarea sunetului original nu este disponibilă diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index 76362f907d..7f2ba6f8ce 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -1611,13 +1611,20 @@ Second \"item\" text" Перемотка видео слайдом отключена (ускорение видео \"2x\" при нажатии и удержании включено) + Разрешить Android VR AV1 + "Видеокодек: AVC (H.264), VP9 или AV1 + +Воспроизведение может зависать или пропускать кадры" + Видеокодек: AVC (H.264) или VP9 + "Включение этой настройки может использовать программное декодирование AV1. + +Воспроизведение видео с AV1 может прерываться или пропускать кадры." Побочные эффекты подмены • Клиент экспериментальный и может перестать работать в любое время • Видео может остановиться на 1:00 или может быть недоступно в некоторых регионах • Пункт \"Звуковая дорожка\" отсутствует • Отсутствует видеокодек AV1 • Постоянный уровень громкости недоступен - • Воспроизведение может зависать или пропускать кадры • Видео для детей могут не воспроизводиться при выходе из системы или в режиме инкогнито • Принудительная оригинальная звуковая дорожка недоступна diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index a48be437db..15dd6f3a8b 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -1597,13 +1597,20 @@ Obmedzenia: Nie je povolené posúvanie + Povoliť Android VR AV1 + "Videokodek je AVC (H.264), VP9 alebo AV1 + +Prehrávanie sa môže sekať alebo môžu vypadávať snímky" + Videokodek je AVC (H.264) alebo VP9 + "Povolenie tohto nastavenia môže použiť softvérové AV1 dekódovanie. + +Prehrávanie videa s AV1 môže sekať alebo vynechávať snímky." Vedľajšie účinky podvrhnutia • Experimentálny klient a môže kedykoľvek prestať fungovať • Video sa môže zastaviť o 1:00, alebo nemusí byť dostupné v niektorých regiónoch • Chýba ponuka zvukovej stopy • Žiadny video kodek AV1 • Stabilná hlasitosť nie je dostupná - • Prehrávanie môže sekať alebo vynechávať snímky • Videá pre deti sa nemusia prehrávať, keď ste odhlásení alebo v režime inkognito • Vynútenie pôvodného zvuku nie je k dispozícii diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index f85bab4b27..c0b902a88a 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -1604,13 +1604,20 @@ Omejitve: Drsno iskanje ni omogočeno + Dovoli Android VR AV1 + "Video kodek je AVC (H.264), VP9 ali AV1 + +Predvajanje se lahko zatika ali izpušča sličice" + Video kodek je AVC (H.264) ali VP9 + "Omogočanje te nastavitve lahko uporablja programsko dekodiranje AV1. + +Predvajanje videa z AV1 se lahko zatika ali izpušča sličice." Stranski učinki ponarejanja • Eksperimentalni odjemalec in lahko kadar koli preneha delovati • Video se lahko ustavi ob 1:00, ali pa morda ne bo na voljo v nekaterih regijah • Meni z zvočnimi posnetki manjka • Brez kodeka videa AV1 • Stabilna glasnost ni na voljo - • Predvajanje se lahko zatika ali izpušča sličice • Posnetki za otroke se mogoče ne bodo predvajali, ko ste odjavljeni ali v načinu brez beleženja zgodovine • Vsili izvirni zvok ni na voljo diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index a7df4ef550..541bd7c657 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -1602,13 +1602,20 @@ Kufizimet: Rrëshqitja për kërkim nuk është e aktivizuar + Lejo Android VR AV1 + "Kodeku i videos është AVC (H.264), VP9, ose AV1 + +Luajtja mund të bllokojë ose të humbasë korniza" + Kodeku i videos është AVC (H.264) ose VP9 + "Aktivizimi i këtij cilësimi mund të përdorë dekodimin softuerik AV1. + +Luajtja e videos me AV1 mund të ngecë ose të humbasë korniza." Efektet anësore të falsifikimit • Klient eksperimental dhe mund të ndalojë së funksionuari në çdo kohë • Videoja mund të ndalojë në 1:00, ose mund të mos jetë e disponueshme në disa rajone • Menuja e gjurmës audio mungon • Nuk ka codec video AV1 • Volumi i qëndrueshëm nuk është i disponueshëm - • Riprodhimi mund të ndërpritet ose të humbasë kornizat • Video për fëmijë mund të mos luajnë kur jeni jashtë llogarisë ose në modalitetin incognito • Detyro audio origjinale nuk është i disponueshëm diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index 7f531a7756..2a67499e80 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -1603,13 +1603,20 @@ Ograničenja: Prevlaćenje za premotavanje nije omogućeno + Dozvoli Android VR AV1 + "Video kodek je AVC (H.264), VP9 ili AV1 + +Reprodukcija može da secka ili gubi okvire" + Video kodek je AVC (H.264) ili VP9 + "Omogućavanje ovog podešavanja može koristiti softversko AV1 dekodiranje. + +Reprodukcija video zapisa sa AV1 može seckati ili ispuštati frejmove." Neželjeni efekti lažiranja • Eksperimentalni klijent i može prestati da radi bilo kada • Video se može zaustaviti u 1:00 ili možda neće biti dostupan u nekim regionima • Meni „Audio snimak” nedostaje • Nema video kodeka AV1 • Opcija „Ujednačena jačina zvuka” nije dostupna - • Reprodukcija može zastajkivati ili ispuštati kadrove • Videi za decu se možda neće puštati kada ste odjavljeni ili u režimu bez arhiviranja • Prisiljavanje originalnog zvuka nije dostupno diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 62bc59052d..76d8678fe1 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -1606,13 +1606,20 @@ Second \"item\" text" Превлачење за премотавање није омогућено + Дозволи Андроид VR AV1 + "Видео кодек је AVC (H.264), VP9 или AV1 + +Репродукција може сецкати или испуштати кадрове" + Видео кодек је AVC (H.264) или VP9 + "Омогућавање ове поставке може користити софтверско AV1 декодирање. + +Репродукција видеа са AV1 може успорити или испуштати кадрове." Нежељени ефекти лажирања • Експериментални клијент и може престати да ради било када • Видео се може зауставити на 1:00 или можда неће бити доступан у неким регионима • Мени „Аудио снимак” недостаје • Нема видео кодека AV1 • Опција „Уједначена јачина звука” није доступна - • Репродукција може да сецка или да испушта кадрове • Видеи за децу се можда неће пуштати када сте одјављени или у режиму без архивирања • Присиљавање оригиналног звука није доступно diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 662f075c1a..e5dbeb6714 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -1603,13 +1603,20 @@ Begränsningar: Dra för att söka är inaktiverat + Tillåt Android VR AV1 + "Videokodeken är AVC (H.264), VP9 eller AV1 + +Uppspelningen kan hacka eller tappa bildrutor" + Videokodeken är AVC (H.264) eller VP9 + "Aktivering av denna inställning kan använda programvarubaserad AV1-avkodning. + +Videouppspelning med AV1 kan hacka eller tappa bildrutor." Bieffekter av förfalskning • Experimentell klient och kan sluta fungera när som helst • Videor kan stanna vid 1:00 eller kanske inte är tillgängliga i vissa regioner • Menyn Ljudspår saknas • Ingen AV1-videokodek • Stabil volym är inte tillgängligt - • Uppspelningen kan hacka eller tappa bildrutor • Videor för barn kanske inte spelas upp när du är utloggad eller i inkognitoläge • Tvinga ursprungligt ljud är inte tillgängligt diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index 9cb06ce49b..e67f747f5e 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -1606,13 +1606,20 @@ User id ของคุณเหมือนกับรหัสผ่าน เลื่อนเพื่อค้นหาไม่ได้เปิดใช้งาน + อนุญาต Android VR AV1 + "ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264), VP9 หรือ AV1 + +การเล่นอาจกระตุกหรือเฟรมตก" + ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264) หรือ VP9 + "การเปิดใช้งานการตั้งค่านี้อาจใช้ซอฟต์แวร์ถอดรหัส AV1 + +การเล่นวิดีโอด้วย AV1 อาจกระตุกหรือเฟรมตก" ผลข้างเคียงของการปลอมแปลง • ไคลเอนต์ทดลองและอาจหยุดทำงานได้ตลอดเวลา • วิดีโออาจหยุดที่ 1:00 หรืออาจไม่สามารถรับชมได้ในบางภูมิภาค • เมนูแทร็กเสียงหายไป • ไม่มีตัวแปลงสัญญาณวิดีโอ AV1 • ระดับเสียงคงที่ไม่พร้อมใช้งาน - • การเล่นอาจสะดุดหรือเฟรมตก • วิดีโอเด็กอาจไม่เล่นเมื่อลงชื่อออกหรืออยู่ในโหมดไม่ระบุตัวตน • บังคับใช้เสียงต้นฉบับไม่พร้อมใช้งาน diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index 54dc3841b9..c5c12c3c0e 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -1611,13 +1611,20 @@ Sınırlamalar: Kaydırarak sardırma etkin değil + Android VR AV1\'e İzin Ver + "Video kodeği AVC (H.264), VP9 veya AV1'dir + +Oynatma takılabilir veya kare atlayabilir" + Video kodeği AVC (H.264) veya VP9\'dur + "Bu ayarı etkinleştirmek yazılım tabanlı AV1 kod çözmeyi kullanabilir. + +AV1 ile video oynatma takılabilir veya kare atlayabilir." Taklit yan etkileri • Deneysel istemci ve her an çalışmayı durdurabilir • Video 1:00\'da durabilir veya bazı bölgelerde kullanılamayabilir • Ses parçası menüsü eksik • AV1 video kodeği yok • Sabit ses mevcut değil - • Oynatma takılabilir veya kare atlayabilir • Çocuk videoları oturum açılmadığında veya gizli modda oynatılamayabilir • Orijinal sesi zorlama mevcut değil diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index 44ecb133ff..1c7e081216 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -1603,13 +1603,20 @@ Second \"item\" text" Перемотку пересуванням вимкнено\n\nУвімкнено поведінку нового інтерфейсу прискорення \"2х >>\" при утриманні на екрані + Дозволити Android VR AV1 + "Відеокодек: AVC (H.264), VP9 або AV1 + +Відтворення може затинатися або пропускати кадри" + Відеокодек: AVC (H.264) або VP9 + "Увімкнення цього параметра може використовувати програмне декодування AV1. + +Відтворення відео з AV1 може заїкатися або пропускати кадри." Побічні ефекти підміни • Експериментальний клієнт, який може припинити працювати будь-якої миті • Відео може зупинитися на 1:00, або може бути недоступним у деяких регіонах • Пункт меню \"Звукова доріжка\" відсутній • Відеокодек AV1 відсутній • Пункт меню \"Стабілізувати гучність\" недоступний - • Відтворення може заїкатися або пропускати кадри • Відео для дітей можуть не відтворюватися, якщо вийти з облікового запису або перейти в анонімний режим • Примусово оригінальна мова звукової доріжки\" недоступна diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index ade1fb052e..419cf71025 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -58,13 +58,13 @@ Second \"item\" text" Xóa lịch sử tìm kiếm Bạn có chắc chắn muốn xóa tất cả lịch sử tìm kiếm không? Mẹo tìm kiếm - "• Nhấn vào một đường dẫn để điều hướng đến đó -• Nhấn giữ một cài đặt để điều hướng đến đó -• Nhấn Enter để lưu truy vấn tìm kiếm vào lịch sử + "• Nhấn vào một đường dẫn để đi đến đó +• Nhấn giữ một cài đặt để đi đến đó +• Nhấn Enter để lưu từ khoá tìm kiếm vào lịch sử • Tìm kiếm bỏ qua chữ hoa/thường và dấu câu -• Cài đặt cha xuất hiện phía trên cài đặt con bị vô hiệu hóa" - Lịch sử tìm kiếm trống - Để lưu lịch sử tìm kiếm, nhập truy vấn tìm kiếm và nhấn Enter +• Cài đặt lớn nằm phía trên cài đặt nhỏ bị vô hiệu hóa" + Lịch sử tìm kiếm đang trống + Để lưu lịch sử tìm kiếm, nhập từ khoá tìm kiếm và nhấn Enter Hiện lịch sử tìm kiếm cài đặt Lịch sử tìm kiếm cài đặt đã được hiển thị Lịch sử tìm kiếm cài đặt không được hiển thị @@ -157,8 +157,8 @@ Bạn sẽ không được thông báo khi xẩy ra lỗi bất ngờ." Tham số truy vấn theo dõi bị loại bỏ khỏi các liên kết được chia sẻ Tham số truy vấn theo dõi không bị loại bỏ khỏi các liên kết được chia sẻ Thay đổi liên kết chia sẻ thành youtube.com - Liên kết được chia sẻ sử dụng youtube.com - Liên kết được chia sẻ sử dụng music.youtube.com + Liên kết chia sẻ bắt đầu bằng youtube.com + Liên kết chia sẻ bắt đầu bằng music.youtube.com @@ -1481,11 +1481,11 @@ Nhấn vào đây để tìm hiểu thêm về DeArrow" Video sẽ không lặp lại - Hiện nút video lặp lại + Hiện nút lặp lại video Nút được hiển thị Nút không được hiển thị - Video lặp lại đang bật - Video lặp lại đang tắt + Lặp lại video đang bật + Lặp lại video đang tắt Giả mạo kích thước thiết bị @@ -1610,13 +1610,20 @@ Hạn chế: Vuốt để tua không được bật + Cho phép Android VR AV1 + "Bộ giải mã video là AVC (H.264), VP9 hoặc AV1 + +Quá trình phát có thể bị giật hoặc bỏ khung hình" + Bộ giải mã video là AVC (H.264) hoặc VP9 + "Bật cài đặt này có thể sử dụng giải mã AV1 bằng phần mềm. + +Phát lại video bằng AV1 có thể bị giật hoặc bỏ khung hình." Hạn chế khi giả mạo • Ứng dụng khách đang trong giai đoạn thử nghiệm và có thể ngừng hoạt động bất cứ lúc nào • Video có thể dừng ở 1:00, hoặc có thể không khả dụng ở một số khu vực • Trình đơn bản âm thanh bị thiếu • Không có codec video AV1 • Âm lượng ổn định không khả dụng - • Có thể gặp hiện tượng giật lag hoặc tụt fps khi phát video • Video dành cho trẻ em có thể không phát được khi đăng xuất hoặc ở chế độ ẩn danh • Buộc âm thanh gốc không khả dụng diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index ca23c4f56b..1f3c17fd65 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -1609,13 +1609,20 @@ Second \"item\" text" 滑动拖动进度条未启用 + 允许 Android VR AV1 + "视频编解码器为 AVC (H.264)、VP9 或 AV1 + +播放可能会卡顿或掉帧" + 视频编解码器为 AVC (H.264) 或 VP9 + "启用此设置可能会使用软件 AV1 解码。 + +使用 AV1 播放视频可能会卡顿或丢帧。" 欺骗的副作用 • 实验性客户端,可能随时停止工作 • 视频可能会在 1:00 停止,或者在某些地区可能无法播放 • 音轨菜单缺失 • 不支持 AV1 视频编解码器 • 稳定音量不可用 - • 播放可能会卡顿或掉帧 • 注销或使用无痕模式时,儿童视频可能无法播放 • 强制原始音频不可用 diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index 0622ca1897..ac8c7ea915 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -1614,13 +1614,20 @@ Second \"item\" text" 未啟用滑動預覽 + 允許 Android VR AV1 + "視訊轉碼器為 AVC (H.264)、VP9 或 AV1 + +播放可能會卡頓或掉幀" + 視訊轉碼器為 AVC (H.264) 或 VP9 + "啟用此設定可能會使用軟體 AV1 解碼。 + +AV1 視訊播放可能會卡頓或掉幀。" 欺騙的副作用 • 實驗性用戶端,隨時可能停止運作 • 影片可能會在 1:00 停止,或在某些地區無法播放 • 音軌選單遺失 • 沒有 AV1 影片解碼器 • 穩定音量無法使用 - • 播放可能會卡頓或掉幀 • 在登出或無痕模式下,兒童影片可能無法播放 • 強制原始音訊不可用 diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 5a44c15ab1..6c98ae9bc9 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -1,5 +1,33 @@ + + + @string/revanced_custom_branding_icon_entry_1 + @string/revanced_custom_branding_icon_entry_2 + @string/revanced_custom_branding_icon_entry_3 + @string/revanced_custom_branding_icon_entry_4 + + + ORIGINAL + ROUNDED + MINIMAL + SCALED + + + @string/revanced_custom_branding_icon_entry_1 + @string/revanced_custom_branding_icon_entry_2 + @string/revanced_custom_branding_icon_entry_3 + @string/revanced_custom_branding_icon_entry_4 + @string/revanced_custom_branding_icon_entry_5 + + + ORIGINAL + ROUNDED + MINIMAL + SCALED + CUSTOM + + @string/revanced_language_DEFAULT @@ -123,6 +151,36 @@ + + + + @string/app_launcher_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + + + 1 + 2 + 3 + 4 + + + + @string/app_launcher_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + @string/revanced_custom_branding_name_entry_5 + + + 1 + 2 + 3 + 4 + 5 + + Android VR @@ -135,17 +193,45 @@ + + + + @string/application_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + + + 1 + 2 + 3 + 4 + + + + @string/application_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + @string/revanced_custom_branding_name_entry_5 + + + 1 + 2 + 3 + 4 + 5 + + - Android VR 1.43 - Android VR 1.61 + Android VR Android Studio visionOS iPadOS ANDROID_VR_1_43_32 - ANDROID_VR_1_61_48 ANDROID_CREATOR VISIONOS IPADOS diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 4be7f1723c..a28df96238 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -19,6 +19,19 @@ Second \"item\" text" --> + + App name + + Custom + App icon + Original + ReVanced + + ReVanced minimal + ReVanced scaled + + Custom + Checks failed Open official website @@ -1490,13 +1503,18 @@ Swipe to expand or close" The accent color of the seekbar Invalid seekbar color value + + YouTube ReVanced + YT ReVanced + YT + Header logo Default Regular Premium ReVanced - + ReVanced minimal Custom @@ -1687,13 +1705,20 @@ Limitations: Slide to seek is not enabled + Allow Android VR AV1 + "Video codec is AVC (H.264), VP9, or AV1 + +Playback may stutter or drop frames" + Video codec is AVC (H.264) or VP9 + "Enabling this setting may use software AV1 decoding. + +Video playback with AV1 may stutter or drop frames." Spoofing side effects • Experimental client and may stop working anytime • Video may stop at 1:00, or may not be available in some regions • Audio track menu is missing • No AV1 video codec • Stable volume is not available - • Playback may stutter or drop frames • Kids videos may not play when logged out or in incognito mode • Force original audio is not available @@ -1707,6 +1732,11 @@ Limitations: + + YT Music ReVanced + Music ReVanced + Music + About Ads diff --git a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png index 1e53efb50c..bf0c300aab 100644 Binary files a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png index 0a1208b436..7434d79a54 100644 Binary files a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png index f0100a34dd..9206e9f3d5 100644 Binary files a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png index fa4221c54c..0e52e1a247 100644 Binary files a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png index fe5b3f21c7..b33a7c41fe 100644 Binary files a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png index ce0f1f9c78..d1d98ed2dd 100644 Binary files a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png index 26b48fad13..f189bbd385 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png index bb7f1f34c9..725e73c23e 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png index acbabeaf97..beecb30b53 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png index 33dc2d2938..590b0b63e5 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_minimal.xml new file mode 100644 index 0000000000..ab5fb737ef --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_minimal.xml @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_rounded.xml new file mode 100644 index 0000000000..ab5fb737ef --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_rounded.xml @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_scaled.xml new file mode 100644 index 0000000000..6098eed222 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_scaled.xml @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml new file mode 100644 index 0000000000..41345de3a6 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml new file mode 100644 index 0000000000..2864f3769e --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml new file mode 100644 index 0000000000..0e81a1d359 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml new file mode 100644 index 0000000000..7a65401447 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml new file mode 100644 index 0000000000..7a65401447 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml new file mode 100644 index 0000000000..bcb70d260c --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml new file mode 100644 index 0000000000..72cd56f5a7 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_custom.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_custom.xml new file mode 100644 index 0000000000..3746c061df --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_custom.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_minimal.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_minimal.xml new file mode 100644 index 0000000000..f21fbb1f3b --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_minimal.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_rounded.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_rounded.xml new file mode 100644 index 0000000000..a5b8aef86b --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_rounded.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_scaled.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_scaled.xml new file mode 100644 index 0000000000..f5126df718 --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_scaled.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_background_custom.png new file mode 100644 index 0000000000..1bc5dbe712 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 0000000000..c639a3d561 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_background_custom.png new file mode 100644 index 0000000000..ff3c7a4c0d Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 0000000000..9e0ebb944a Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_background_custom.png new file mode 100644 index 0000000000..82c15e2b9d Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 0000000000..2119d70cf3 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_background_custom.png new file mode 100644 index 0000000000..be663ad727 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 0000000000..b0254084a5 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_background_custom.png new file mode 100644 index 0000000000..addcbda14f Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 0000000000..88f8ebc40b Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/music/drawable/ic_app_icons_themed_youtube_music.xml b/patches/src/main/resources/custom-branding/music/drawable/ic_app_icons_themed_youtube_music.xml deleted file mode 100644 index 084c876623..0000000000 --- a/patches/src/main/resources/custom-branding/music/drawable/ic_app_icons_themed_youtube_music.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png deleted file mode 100644 index 80c1e2c2bd..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png deleted file mode 100644 index 5c2cb369ce..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-hdpi/ic_launcher_release.png deleted file mode 100644 index 4ca060e249..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-hdpi/ic_launcher_release.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png deleted file mode 100644 index f7c252a26f..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png deleted file mode 100644 index 54b9cc9d70..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-mdpi/ic_launcher_release.png deleted file mode 100644 index 84db2bae4a..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-mdpi/ic_launcher_release.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png deleted file mode 100644 index f4e6e1294b..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png deleted file mode 100644 index 046bdd17f0..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/ic_launcher_release.png deleted file mode 100644 index 31c9d1c36a..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xhdpi/ic_launcher_release.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png deleted file mode 100644 index 200224bed5..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png deleted file mode 100644 index edbcdf57c5..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/ic_launcher_release.png deleted file mode 100644 index 3bbb99d4a1..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xxhdpi/ic_launcher_release.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png deleted file mode 100644 index 20ea7bdffa..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png deleted file mode 100644 index 37e6ddc39c..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/adaptiveproduct_youtube_music_2024_q4_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/ic_launcher_release.png b/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/ic_launcher_release.png deleted file mode 100644 index 5857ff6fd2..0000000000 Binary files a/patches/src/main/resources/custom-branding/music/mipmap-xxxhdpi/ic_launcher_release.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/drawable/adaptive_monochrome_ic_youtube_launcher.xml b/patches/src/main/resources/custom-branding/youtube/drawable/adaptive_monochrome_ic_youtube_launcher.xml deleted file mode 100644 index 084c876623..0000000000 --- a/patches/src/main/resources/custom-branding/youtube/drawable/adaptive_monochrome_ic_youtube_launcher.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/patches/src/main/resources/custom-branding/youtube/drawable/ringo2_adaptive_monochrome_ic_youtube_launcher.xml b/patches/src/main/resources/custom-branding/youtube/drawable/ringo2_adaptive_monochrome_ic_youtube_launcher.xml deleted file mode 100644 index 084c876623..0000000000 --- a/patches/src/main/resources/custom-branding/youtube/drawable/ringo2_adaptive_monochrome_ic_youtube_launcher.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 80c1e2c2bd..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 5c2cb369ce..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 4ca060e249..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 4ca060e249..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index f7c252a26f..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 54b9cc9d70..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 84db2bae4a..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 84db2bae4a..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index f4e6e1294b..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 046bdd17f0..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 31c9d1c36a..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 31c9d1c36a..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 200224bed5..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index edbcdf57c5..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 3bbb99d4a1..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 3bbb99d4a1..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 20ea7bdffa..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 37e6ddc39c..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 5857ff6fd2..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 5857ff6fd2..0000000000 Binary files a/patches/src/main/resources/custom-branding/youtube/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ