mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-11 11:53:55 +01:00
Compare commits
23 Commits
v5.41.1-de
...
v5.42.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
526c7c05e2 | ||
|
|
d0d53d109e | ||
|
|
9d6731660b | ||
|
|
5a7e199162 | ||
|
|
0c662c8e3b | ||
|
|
08e8ead04f | ||
|
|
d238a42708 | ||
|
|
673609c2aa | ||
|
|
5f1a485e8f | ||
|
|
6961babee9 | ||
|
|
328c9b6bbe | ||
|
|
4c8b56f546 | ||
|
|
1754023dd6 | ||
|
|
328234f39a | ||
|
|
326953cfc3 | ||
|
|
725d5dc974 | ||
|
|
76b0364c5b | ||
|
|
1cbff799ad | ||
|
|
080a226614 | ||
|
|
2b71bd80c2 | ||
|
|
5cb46c4e91 | ||
|
|
52c369576d | ||
|
|
28799a548a |
4
.github/workflows/build_pull_request.yml
vendored
4
.github/workflows/build_pull_request.yml
vendored
@@ -12,10 +12,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
|
||||
2
.github/workflows/open_pull_request.yml
vendored
2
.github/workflows/open_pull_request.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Open pull request
|
||||
uses: repo-sync/pull-request@v2
|
||||
|
||||
2
.github/workflows/pull_strings.yml
vendored
2
.github/workflows/pull_strings.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
ref: dev
|
||||
clean: true
|
||||
|
||||
2
.github/workflows/push_strings.yml
vendored
2
.github/workflows/push_strings.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Preprocess strings
|
||||
env:
|
||||
|
||||
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
@@ -18,10 +18,10 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Java
|
||||
uses: actions/setup-java@v4
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: '17'
|
||||
@@ -51,14 +51,14 @@ jobs:
|
||||
fingerprint: ${{ vars.GPG_FINGERPRINT }}
|
||||
|
||||
- name: Release
|
||||
uses: cycjimmy/semantic-release-action@v4
|
||||
uses: cycjimmy/semantic-release-action@v5
|
||||
id: release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Attest
|
||||
if: steps.release.outputs.new_release_published == 'true'
|
||||
uses: actions/attest-build-provenance@v2
|
||||
uses: actions/attest-build-provenance@v3
|
||||
with:
|
||||
subject-name: 'ReVanced Patches ${{ steps.release.outputs.new_release_git_tag }}'
|
||||
subject-path: patches/build/libs/patches-*.rvp
|
||||
|
||||
2
.github/workflows/update-gradle-wrapper.yml
vendored
2
.github/workflows/update-gradle-wrapper.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Update Gradle Wrapper
|
||||
uses: gradle-update/update-gradle-wrapper-action@v1
|
||||
|
||||
68
CHANGELOG.md
68
CHANGELOG.md
@@ -1,3 +1,71 @@
|
||||
# [5.42.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.7...v5.42.0-dev.8) (2025-10-01)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Force original language:** Resolve some videos using Swedish audio track ([9d67316](https://github.com/ReVanced/revanced-patches/commit/9d6731660ba0e19b863d05d54aa04f74a879f69b))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube Music:** Add `Force original audio` patch ([#6036](https://github.com/ReVanced/revanced-patches/issues/6036)) ([d0d53d1](https://github.com/ReVanced/revanced-patches/commit/d0d53d109e451759a029326873adfa36fba12b23))
|
||||
|
||||
# [5.42.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.6...v5.42.0-dev.7) (2025-10-01)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Instagram:** Add `Open links externally` patch ([#6012](https://github.com/ReVanced/revanced-patches/issues/6012)) ([08e8ead](https://github.com/ReVanced/revanced-patches/commit/08e8ead04ffff47a4608a3db7aadc8d5feccd4ad))
|
||||
|
||||
# [5.42.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.5...v5.42.0-dev.6) (2025-09-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **X / Twitter:** Remove non functional and obsolete patch `Open links with app chooser` ([#6033](https://github.com/ReVanced/revanced-patches/issues/6033)) ([673609c](https://github.com/ReVanced/revanced-patches/commit/673609c2aa87988cdc138eab101b9750fe6a7b62))
|
||||
|
||||
# [5.42.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.4...v5.42.0-dev.5) (2025-09-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube Music:** Add `Custom branding` patch ([#6007](https://github.com/ReVanced/revanced-patches/issues/6007)) ([4c8b56f](https://github.com/ReVanced/revanced-patches/commit/4c8b56f5466b244737f501654eb7c5d34b6b2f88))
|
||||
|
||||
# [5.42.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.3...v5.42.0-dev.4) (2025-09-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube Music - GmsCore support:** Handle sharing links to certain apps such as Instagram ([#6026](https://github.com/ReVanced/revanced-patches/issues/6026)) ([328234f](https://github.com/ReVanced/revanced-patches/commit/328234f39ada81542e596f04e8ce410c787c15c8))
|
||||
|
||||
# [5.42.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.2...v5.42.0-dev.3) (2025-09-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide end screen cards:** Hide new type of end screen card ([#6027](https://github.com/ReVanced/revanced-patches/issues/6027)) ([76b0364](https://github.com/ReVanced/revanced-patches/commit/76b0364c5b5562c6a0d178d2bbe5b220f48aaca9))
|
||||
|
||||
# [5.42.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.1...v5.42.0-dev.2) (2025-09-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Instagram - Hide navigation buttons:** Resolve app startup crash ([080a226](https://github.com/ReVanced/revanced-patches/commit/080a2266146798be71789c939deef2f289697523))
|
||||
|
||||
# [5.42.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.41.1-dev.2...v5.42.0-dev.1) (2025-09-27)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Viber:** Add `Hide navigation buttons` patch ([#5991](https://github.com/ReVanced/revanced-patches/issues/5991)) ([5cb46c4](https://github.com/ReVanced/revanced-patches/commit/5cb46c4e9180ebc16eddb983dad73d137d8ec047))
|
||||
|
||||
## [5.41.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.41.1-dev.1...v5.41.1-dev.2) (2025-09-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube Music - Hide cast button:** Fix patching error ([28799a5](https://github.com/ReVanced/revanced-patches/commit/28799a548a73651134ef304cb6cb542cf8e55abe))
|
||||
|
||||
## [5.41.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.41.0...v5.41.1-dev.1) (2025-09-27)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package app.revanced.extension.instagram.misc.links;
|
||||
|
||||
import android.net.Uri;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.Utils;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class OpenLinksExternallyPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean openExternally(String url) {
|
||||
try {
|
||||
// The "url" parameter to this function will be of the form.
|
||||
// https://l.instagram.com/?u=<actual url>&e=<tracking id>
|
||||
String actualUrl = Uri.parse(url).getQueryParameter("u");
|
||||
if (actualUrl != null) {
|
||||
Utils.openLink(actualUrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "openExternally failure", ex);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package app.revanced.extension.music.patches;
|
||||
|
||||
import app.revanced.extension.music.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class ForceOriginalAudioPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void setPreferredLanguage() {
|
||||
app.revanced.extension.shared.patches.ForceOriginalAudioPatch.setEnabled(
|
||||
Settings.FORCE_ORIGINAL_AUDIO.get(),
|
||||
Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -32,4 +32,6 @@ public class Settings extends BaseSettings {
|
||||
// Miscellaneous
|
||||
public static final EnumSetting<ClientType> 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 FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", TRUE, true);
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
@@ -696,6 +697,18 @@ public class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void openLink(String url) {
|
||||
try {
|
||||
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(url));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
Logger.printInfo(() -> "Opening link with external browser: " + intent);
|
||||
getContext().startActivity(intent);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "openLink failure", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public enum NetworkType {
|
||||
NONE,
|
||||
MOBILE,
|
||||
|
||||
@@ -46,7 +46,7 @@ public class CheckWatchHistoryDomainNameResolutionPatch {
|
||||
/**
|
||||
* Injection point.
|
||||
*
|
||||
* Checks if s.youtube.com is blacklisted and playback history will fail to work.
|
||||
* Checks if YouTube watch history endpoint cannot be reached.
|
||||
*/
|
||||
public static void checkDnsResolver(Activity context) {
|
||||
if (!Utils.isNetworkConnected() || !BaseSettings.CHECK_WATCH_HISTORY_DOMAIN_NAME.get()) return;
|
||||
@@ -67,8 +67,6 @@ public class CheckWatchHistoryDomainNameResolutionPatch {
|
||||
}
|
||||
|
||||
Utils.runOnMainThread(() -> {
|
||||
try {
|
||||
// Create the custom dialog.
|
||||
Pair<Dialog, LinearLayout> dialogPair = CustomDialog.create(
|
||||
context,
|
||||
str("revanced_check_watch_history_domain_name_dialog_title"), // Title.
|
||||
@@ -76,19 +74,13 @@ public class CheckWatchHistoryDomainNameResolutionPatch {
|
||||
null, // No EditText.
|
||||
null, // OK button text.
|
||||
() -> {}, // OK button action (just dismiss).
|
||||
() -> {}, // Cancel button action (just dismiss).
|
||||
null, // No cancel button.
|
||||
str("revanced_check_watch_history_domain_name_dialog_ignore"), // Neutral button text.
|
||||
() -> BaseSettings.CHECK_WATCH_HISTORY_DOMAIN_NAME.save(false), // Neutral button action (Ignore).
|
||||
true // Dismiss dialog on Neutral button click.
|
||||
);
|
||||
|
||||
// Show the dialog.
|
||||
Dialog dialog = dialogPair.first;
|
||||
|
||||
Utils.showDialog(context, dialog, false, null);
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "checkDnsResolver dialog creation failure", ex);
|
||||
}
|
||||
Utils.showDialog(context, dialogPair.first, false, null);
|
||||
});
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "checkDnsResolver failure", ex);
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
package app.revanced.extension.shared.patches;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.settings.AppLanguage;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class ForceOriginalAudioPatch {
|
||||
|
||||
private static final String DEFAULT_AUDIO_TRACKS_SUFFIX = ".4";
|
||||
|
||||
private static volatile boolean enabled = false;
|
||||
|
||||
public static void setEnabled(boolean isEnabled, ClientType client) {
|
||||
enabled = isEnabled;
|
||||
|
||||
if (isEnabled
|
||||
&& SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams()
|
||||
&& !client.useAuth) {
|
||||
// If client spoofing does not use authentication and lacks multi-audio streams,
|
||||
// then can use any language code for the request and if that requested language is
|
||||
// not available YT uses the original audio language. Authenticated requests ignore
|
||||
// the language code and always use the account language. Use a language that is
|
||||
// not auto-dubbed by YouTube: https://support.google.com/youtube/answer/15569972
|
||||
// but the language is also supported natively by the Meta Quest device that
|
||||
// Android VR is spoofing.
|
||||
AppLanguage override = AppLanguage.NB; // Norwegian Bokmal.
|
||||
Logger.printDebug(() -> "Setting language override: " + override);
|
||||
SpoofVideoStreamsPatch.setLanguageOverride(override);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean ignoreDefaultAudioStream(boolean original) {
|
||||
if (enabled) {
|
||||
return false;
|
||||
}
|
||||
return original;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean isDefaultAudioStream(boolean isDefault, String audioTrackId, String audioTrackDisplayName) {
|
||||
try {
|
||||
if (!enabled) {
|
||||
return isDefault;
|
||||
}
|
||||
|
||||
if (audioTrackId.isEmpty()) {
|
||||
// Older app targets can have empty audio tracks and these might be placeholders.
|
||||
// The real audio tracks are called after these.
|
||||
return isDefault;
|
||||
}
|
||||
|
||||
Logger.printDebug(() -> "default: " + String.format("%-5s", isDefault) + " id: "
|
||||
+ String.format("%-8s", audioTrackId) + " name:" + audioTrackDisplayName);
|
||||
|
||||
final boolean isOriginal = audioTrackId.endsWith(DEFAULT_AUDIO_TRACKS_SUFFIX);
|
||||
if (isOriginal) {
|
||||
Logger.printDebug(() -> "Using audio: " + audioTrackId);
|
||||
}
|
||||
|
||||
return isOriginal;
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "isDefaultAudioStream failure", ex);
|
||||
return isDefault;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,8 +36,8 @@ public enum AppLanguage {
|
||||
FR,
|
||||
GL,
|
||||
GU,
|
||||
HI,
|
||||
HE, // App uses obsolete 'IW' and not the modern 'HE' ISO code.
|
||||
HI,
|
||||
HR,
|
||||
HU,
|
||||
HY,
|
||||
@@ -60,9 +60,9 @@ public enum AppLanguage {
|
||||
MR,
|
||||
MS,
|
||||
MY,
|
||||
NB,
|
||||
NE,
|
||||
NL,
|
||||
NB,
|
||||
OR,
|
||||
PA,
|
||||
PL,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.extension.youtube.settings.preference;
|
||||
package app.revanced.extension.shared.settings.preference;
|
||||
|
||||
import static app.revanced.extension.shared.StringRef.str;
|
||||
|
||||
@@ -6,17 +6,17 @@ import android.content.Context;
|
||||
import android.preference.SwitchPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import app.revanced.extension.shared.settings.BaseSettings;
|
||||
import app.revanced.extension.shared.spoof.ClientType;
|
||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings({"deprecation", "unused"})
|
||||
public class ForceOriginalAudioSwitchPreference extends SwitchPreference {
|
||||
|
||||
// Spoof stream patch is not included, or is not currently spoofing to Android Studio.
|
||||
private static final boolean available = !SpoofVideoStreamsPatch.isPatchIncluded()
|
||||
|| !(Settings.SPOOF_VIDEO_STREAMS.get()
|
||||
&& Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_CREATOR);
|
||||
|| !(BaseSettings.SPOOF_VIDEO_STREAMS.get()
|
||||
&& SpoofVideoStreamsPatch.getPreferredClient() == ClientType.ANDROID_CREATOR);
|
||||
|
||||
{
|
||||
if (!available) {
|
||||
@@ -66,6 +66,10 @@ public class SpoofVideoStreamsPatch {
|
||||
StreamingDataRequest.setClientOrderToUse(availableClients, client);
|
||||
}
|
||||
|
||||
public static ClientType getPreferredClient() {
|
||||
return preferredClient;
|
||||
}
|
||||
|
||||
public static boolean spoofingToClientWithNoMultiAudioStreams() {
|
||||
return isPatchIncluded()
|
||||
&& SPOOF_STREAMING_DATA
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
// Do not remove. Necessary for the extension plugin to be applied to the project.
|
||||
dependencies {
|
||||
compileOnly(project(":extensions:shared:library"))
|
||||
}
|
||||
|
||||
@@ -1,15 +1,22 @@
|
||||
package app.revanced.twitter.patches.links;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class ChangeLinkSharingDomainPatch {
|
||||
private static final String DOMAIN_NAME = "https://fxtwitter.com";
|
||||
private static final String LINK_FORMAT = "%s/%s/status/%s";
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static String formatResourceLink(Object... formatArgs) {
|
||||
String username = (String) formatArgs[0];
|
||||
String tweetId = (String) formatArgs[1];
|
||||
return String.format(LINK_FORMAT, DOMAIN_NAME, username, tweetId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static String formatLink(long tweetId, String username) {
|
||||
return String.format(LINK_FORMAT, DOMAIN_NAME, username, tweetId);
|
||||
}
|
||||
|
||||
@@ -2,11 +2,18 @@ package app.revanced.twitter.patches.links;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Deprecated(forRemoval = true)
|
||||
public final class OpenLinksWithAppChooserPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void openWithChooser(final Context context, final Intent intent) {
|
||||
Log.d("ReVanced", "Opening intent with chooser: " + intent);
|
||||
Logger.printInfo(() -> "Opening intent with chooser: " + intent);
|
||||
|
||||
intent.setAction("android.intent.action.VIEW");
|
||||
|
||||
|
||||
@@ -1,72 +1,17 @@
|
||||
package app.revanced.extension.youtube.patches;
|
||||
|
||||
import app.revanced.extension.shared.Logger;
|
||||
import app.revanced.extension.shared.settings.AppLanguage;
|
||||
import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class ForceOriginalAudioPatch {
|
||||
|
||||
private static final String DEFAULT_AUDIO_TRACKS_SUFFIX = ".4";
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void setPreferredLanguage() {
|
||||
if (Settings.FORCE_ORIGINAL_AUDIO.get()
|
||||
&& SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams()
|
||||
&& !Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get().useAuth) {
|
||||
// If client spoofing does not use authentication and lacks multi-audio streams,
|
||||
// then can use any language code for the request and if that requested language is
|
||||
// not available YT uses the original audio language. Authenticated requests ignore
|
||||
// the language code and always use the account language. Use a language that is
|
||||
// not auto-dubbed by YouTube: https://support.google.com/youtube/answer/15569972
|
||||
// but the language is also supported natively by the Meta Quest device that
|
||||
// Android VR is spoofing.
|
||||
AppLanguage override = AppLanguage.SV;
|
||||
Logger.printDebug(() -> "Setting language override: " + override);
|
||||
SpoofVideoStreamsPatch.setLanguageOverride(override);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean ignoreDefaultAudioStream(boolean original) {
|
||||
if (Settings.FORCE_ORIGINAL_AUDIO.get()) {
|
||||
return false;
|
||||
}
|
||||
return original;
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean isDefaultAudioStream(boolean isDefault, String audioTrackId, String audioTrackDisplayName) {
|
||||
try {
|
||||
if (!Settings.FORCE_ORIGINAL_AUDIO.get()) {
|
||||
return isDefault;
|
||||
}
|
||||
|
||||
if (audioTrackId.isEmpty()) {
|
||||
// Older app targets can have empty audio tracks and these might be placeholders.
|
||||
// The real audio tracks are called after these.
|
||||
return isDefault;
|
||||
}
|
||||
|
||||
Logger.printDebug(() -> "default: " + String.format("%-5s", isDefault) + " id: "
|
||||
+ String.format("%-8s", audioTrackId) + " name:" + audioTrackDisplayName);
|
||||
|
||||
final boolean isOriginal = audioTrackId.endsWith(DEFAULT_AUDIO_TRACKS_SUFFIX);
|
||||
if (isOriginal) {
|
||||
Logger.printDebug(() -> "Using audio: " + audioTrackId);
|
||||
}
|
||||
|
||||
return isOriginal;
|
||||
} catch (Exception ex) {
|
||||
Logger.printException(() -> "isDefaultAudioStream failure", ex);
|
||||
return isDefault;
|
||||
}
|
||||
app.revanced.extension.shared.patches.ForceOriginalAudioPatch.setEnabled(
|
||||
Settings.FORCE_ORIGINAL_AUDIO.get(),
|
||||
Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package app.revanced.extension.youtube.patches;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import app.revanced.extension.shared.Utils;
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class HideEndScreenCardsPatch {
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static void hideEndScreenCardView(View view) {
|
||||
Utils.hideViewUnderCondition(Settings.HIDE_ENDSCREEN_CARDS, view);
|
||||
}
|
||||
|
||||
/**
|
||||
* Injection point.
|
||||
*/
|
||||
public static boolean hideEndScreenCards() {
|
||||
return Settings.HIDE_ENDSCREEN_CARDS.get();
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package app.revanced.extension.youtube.patches;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import app.revanced.extension.youtube.settings.Settings;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class HideEndscreenCardsPatch {
|
||||
//Used by app.revanced.patches.youtube.layout.hideendscreencards.bytecode.patch.HideEndscreenCardsPatch
|
||||
public static void hideEndscreen(View view) {
|
||||
if (!Settings.HIDE_ENDSCREEN_CARDS.get()) return;
|
||||
view.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
@@ -55,6 +55,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 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);
|
||||
@@ -75,9 +76,6 @@ public class Settings extends BaseSettings {
|
||||
public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds",
|
||||
"0.25\n0.5\n0.75\n1.0\n1.25\n1.5\n1.75\n2.0\n2.5\n3.0\n4.0\n5.0\n6.0\n7.0\n8.0", true);
|
||||
|
||||
// Audio
|
||||
public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", FALSE, true);
|
||||
|
||||
// Ads
|
||||
public static final BooleanSetting HIDE_CREATOR_STORE_SHELF = new BooleanSetting("revanced_hide_creator_store_shelf", TRUE);
|
||||
public static final BooleanSetting HIDE_END_SCREEN_STORE_BANNER = new BooleanSetting("revanced_hide_end_screen_store_banner", TRUE, true);
|
||||
|
||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
||||
org.gradle.parallel = true
|
||||
android.useAndroidX = true
|
||||
kotlin.code.style = official
|
||||
version = 5.41.1-dev.1
|
||||
version = 5.42.0-dev.8
|
||||
|
||||
@@ -284,6 +284,10 @@ public final class app/revanced/patches/instagram/misc/extension/SharedExtension
|
||||
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatchKt {
|
||||
public static final fun getOpenLinksExternallyPatch ()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;
|
||||
}
|
||||
@@ -372,6 +376,10 @@ public final class app/revanced/patches/music/interaction/permanentshuffle/Perma
|
||||
public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/branding/CustomBrandingPatchKt {
|
||||
public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt {
|
||||
public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -451,9 +459,14 @@ public final class app/revanced/patches/music/misc/spoof/UserAgentClientSpoofPat
|
||||
public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatchKt {
|
||||
public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/music/playservice/VersionCheckPatchKt {
|
||||
public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||
public static final fun is_7_33_or_greater ()Z
|
||||
public static final fun is_8_10_or_greater ()Z
|
||||
public static final fun is_8_11_or_greater ()Z
|
||||
public static final fun is_8_15_or_greater ()Z
|
||||
}
|
||||
@@ -1306,6 +1319,10 @@ public final class app/revanced/patches/viber/ads/HideAdsPatchKt {
|
||||
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/viber/misc/navbar/HideNavigationButtonsKt {
|
||||
public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt {
|
||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
@@ -1407,8 +1424,8 @@ public final class app/revanced/patches/youtube/layout/formfactor/ChangeFormFact
|
||||
public static final fun getChangeFormFactorPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatchKt {
|
||||
public static final fun getHideEndscreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatchKt {
|
||||
public static final fun getHideEndScreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatchKt {
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.revanced.patches.instagram.hide.navigation
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.booleanOption
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.util.addInstructionsAtControlFlowLabel
|
||||
import app.revanced.util.findFreeRegister
|
||||
import app.revanced.util.getReference
|
||||
@@ -24,6 +25,8 @@ val hideNavigationButtonsPatch = bytecodePatch(
|
||||
) {
|
||||
compatibleWith("com.instagram.android")
|
||||
|
||||
dependsOn(sharedExtensionPatch)
|
||||
|
||||
val hideReels by booleanOption(
|
||||
key = "hideReels",
|
||||
default = true,
|
||||
@@ -72,13 +75,14 @@ val hideNavigationButtonsPatch = bytecodePatch(
|
||||
"""
|
||||
}
|
||||
|
||||
if (hideReels!!)
|
||||
if (hideReels!!) {
|
||||
addInstructionsAtControlFlowLabel(
|
||||
returnIndex,
|
||||
instructionsRemoveButtonByName("fragment_clips")
|
||||
)
|
||||
}
|
||||
|
||||
if (hideCreate!!)
|
||||
if (hideCreate!!) {
|
||||
addInstructionsAtControlFlowLabel(
|
||||
returnIndex,
|
||||
instructionsRemoveButtonByName("fragment_share")
|
||||
@@ -86,3 +90,4 @@ val hideNavigationButtonsPatch = bytecodePatch(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package app.revanced.patches.instagram.misc.links
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal const val TARGET_STRING = "Tracking.ARG_CLICK_SOURCE"
|
||||
|
||||
internal val inAppBrowserFunctionFingerprint = fingerprint {
|
||||
returns("Z")
|
||||
strings("TrackingInfo.ARG_MODULE_NAME", TARGET_STRING)
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package app.revanced.patches.instagram.misc.links
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/misc/links/OpenLinksExternallyPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val openLinksExternallyPatch = bytecodePatch(
|
||||
name = "Open links externally",
|
||||
description = "Changes links to always open in your external browser, instead of the in-app browser.",
|
||||
use = false,
|
||||
) {
|
||||
|
||||
dependsOn(sharedExtensionPatch)
|
||||
|
||||
compatibleWith("com.instagram.android")
|
||||
|
||||
execute {
|
||||
inAppBrowserFunctionFingerprint.let {
|
||||
val stringMatchIndex = it.stringMatches?.first { match -> match.string == TARGET_STRING }!!.index
|
||||
|
||||
it.method.apply {
|
||||
val urlResultObjIndex = indexOfFirstInstructionOrThrow(
|
||||
stringMatchIndex, Opcode.MOVE_OBJECT_FROM16
|
||||
)
|
||||
|
||||
// Register that contains the url after moving from a higher register.
|
||||
val urlRegister = getInstruction<TwoRegisterInstruction>(urlResultObjIndex).registerA
|
||||
|
||||
addInstructions(
|
||||
urlResultObjIndex + 1,
|
||||
"""
|
||||
invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->openExternally(Ljava/lang/String;)Z
|
||||
move-result v$urlRegister
|
||||
return v$urlRegister
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package app.revanced.patches.music.layout.branding
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.util.smali.ExternalLabel
|
||||
import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch
|
||||
import app.revanced.patches.shared.misc.mapping.get
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappings
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstInstructionReversed
|
||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
private val disableSplashAnimationPatch = bytecodePatch {
|
||||
|
||||
dependsOn(resourceMappingPatch)
|
||||
|
||||
execute {
|
||||
// The existing YT animation usually only shows for a fraction of a second,
|
||||
// and the existing animation does not match the new splash screen
|
||||
// causing the original YT Music logo to momentarily flash on screen as the animation starts.
|
||||
//
|
||||
// Could replace the lottie animation file with our own custom animation (app_launch.json),
|
||||
// but the animation is not always the same size as the launch screen and it's still
|
||||
// barely shown. Instead turn off the animation entirely (app will also launch a little faster).
|
||||
cairoSplashAnimationConfigFingerprint.method.apply {
|
||||
val mainActivityLaunchAnimation = resourceMappings["layout", "main_activity_launch_animation"]
|
||||
val literalIndex = indexOfFirstLiteralInstructionOrThrow(
|
||||
mainActivityLaunchAnimation
|
||||
)
|
||||
val insertIndex = indexOfFirstInstructionReversed(literalIndex) {
|
||||
this.opcode == Opcode.INVOKE_VIRTUAL &&
|
||||
getReference<MethodReference>()?.name == "setContentView"
|
||||
} + 1
|
||||
val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) {
|
||||
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||
getReference<MethodReference>()?.parameterTypes?.firstOrNull() == "Ljava/lang/Runnable;"
|
||||
} + 1
|
||||
|
||||
addInstructionsWithLabels(
|
||||
insertIndex,
|
||||
"goto :skip_animation",
|
||||
ExternalLabel("skip_animation", getInstruction(jumpIndex))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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",
|
||||
),
|
||||
|
||||
block = {
|
||||
dependsOn(disableSplashAnimationPatch)
|
||||
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.29.52",
|
||||
"8.10.52"
|
||||
)
|
||||
)
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
package app.revanced.patches.music.layout.branding
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE
|
||||
|
||||
internal val cairoSplashAnimationConfigFingerprint = fingerprint {
|
||||
returns("V")
|
||||
parameters("Landroid/os/Bundle;")
|
||||
custom { method, classDef ->
|
||||
method.name == "onCreate" && method.definingClass == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE
|
||||
}
|
||||
}
|
||||
@@ -65,7 +65,7 @@ val hideCastButton = bytecodePatch(
|
||||
|
||||
playerOverlayChipFingerprint.method.apply {
|
||||
val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerOverlayChip)
|
||||
val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT)
|
||||
val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT_OBJECT)
|
||||
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
|
||||
|
||||
addInstruction(
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
package app.revanced.patches.music.misc.fileprovider
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName
|
||||
import app.revanced.patches.music.utils.fix.fileprovider.fileProviderResolverFingerprint
|
||||
|
||||
internal fun fileProviderPatch(
|
||||
youtubePackageName: String,
|
||||
musicPackageName: String
|
||||
) = bytecodePatch(
|
||||
description = "Fixes broken YouTube Music file provider that prevents sharing with specific apps such as Instagram."
|
||||
) {
|
||||
finalize {
|
||||
// Must do modification last, so change package name value is correctly set.
|
||||
val musicChangedPackageName = setOrGetFallbackPackageName(musicPackageName)
|
||||
|
||||
// For some reason, if the app gets "android.support.FILE_PROVIDER_PATHS",
|
||||
// the package name of YouTube is used, not the package name of the YT Music.
|
||||
//
|
||||
// There is no issue in the stock YT Music, but this is an issue in the GmsCore Build.
|
||||
// https://github.com/ReVanced/revanced-patches/issues/55
|
||||
//
|
||||
// To solve this issue, replace the package name of YouTube with YT Music's package name.
|
||||
fileProviderResolverFingerprint.method.addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
const-string v0, "com.google.android.youtube.fileprovider"
|
||||
invoke-static { p1, v0 }, Ljava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
move-result v0
|
||||
if-nez v0, :fix
|
||||
const-string v0, "$youtubePackageName.fileprovider"
|
||||
invoke-static { p1, v0 }, Ljava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||
move-result v0
|
||||
if-nez v0, :fix
|
||||
goto :ignore
|
||||
:fix
|
||||
const-string p1, "$musicChangedPackageName.fileprovider"
|
||||
:ignore
|
||||
nop
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package app.revanced.patches.music.utils.fix.fileprovider
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
|
||||
internal val fileProviderResolverFingerprint = fingerprint {
|
||||
returns("L")
|
||||
strings(
|
||||
"android.support.FILE_PROVIDER_PATHS",
|
||||
"Name must not be empty"
|
||||
)
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
|
||||
import app.revanced.patches.music.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.music.misc.settings.settingsPatch
|
||||
import app.revanced.patches.music.misc.spoof.spoofVideoStreamsPatch
|
||||
import app.revanced.patches.music.misc.fileprovider.fileProviderPatch
|
||||
import app.revanced.patches.shared.castContextFetchFingerprint
|
||||
import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
|
||||
@@ -60,6 +61,10 @@ private fun gmsCoreSupportResourcePatch(
|
||||
) {
|
||||
dependsOn(
|
||||
addResourcesPatch,
|
||||
settingsPatch
|
||||
settingsPatch,
|
||||
fileProviderPatch(
|
||||
MUSIC_PACKAGE_NAME,
|
||||
REVANCED_MUSIC_PACKAGE_NAME
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ 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.music.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.BasePreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen
|
||||
@@ -126,7 +127,7 @@ fun newIntent(settingsName: String) = IntentPreference.Intent(
|
||||
targetClass = "com.google.android.gms.common.api.GoogleApiActivity"
|
||||
) {
|
||||
// The package name change has to be reflected in the intent.
|
||||
setOrGetFallbackPackageName("com.google.android.apps.youtube.music")
|
||||
setOrGetFallbackPackageName(MUSIC_PACKAGE_NAME)
|
||||
}
|
||||
|
||||
object PreferenceScreen : BasePreferenceScreen() {
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package app.revanced.patches.music.misc.tracks
|
||||
|
||||
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.music.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.music.misc.settings.settingsPatch
|
||||
import app.revanced.patches.music.playservice.is_8_10_or_greater
|
||||
import app.revanced.patches.music.playservice.versionCheckPatch
|
||||
import app.revanced.patches.music.shared.mainActivityOnCreateFingerprint
|
||||
import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val forceOriginalAudioPatch = forceOriginalAudioPatch(
|
||||
block = {
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
settingsPatch,
|
||||
versionCheckPatch
|
||||
)
|
||||
|
||||
compatibleWith(
|
||||
"com.google.android.apps.youtube.music"(
|
||||
"7.29.52",
|
||||
"8.10.52"
|
||||
)
|
||||
)
|
||||
},
|
||||
fixUseLocalizedAudioTrackFlag = is_8_10_or_greater,
|
||||
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
|
||||
subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR,
|
||||
preferenceScreen = PreferenceScreen.MISC,
|
||||
)
|
||||
@@ -7,6 +7,8 @@ import app.revanced.util.findPlayStoreServicesVersion
|
||||
|
||||
var is_7_33_or_greater = false
|
||||
private set
|
||||
var is_8_10_or_greater = false
|
||||
private set
|
||||
var is_8_11_or_greater = false
|
||||
private set
|
||||
var is_8_15_or_greater = false
|
||||
@@ -22,6 +24,7 @@ val versionCheckPatch = resourcePatch(
|
||||
|
||||
// All bug fix releases always seem to use the same play store version as the minor version.
|
||||
is_7_33_or_greater = 245199000 <= playStoreServicesVersion
|
||||
is_8_10_or_greater = 244799000 <= playStoreServicesVersion
|
||||
is_8_11_or_greater = 251199000 <= playStoreServicesVersion
|
||||
is_8_15_or_greater = 251530000 <= playStoreServicesVersion
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.instructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patches.reddit.customclients.CREATE_NEW_CLIENT_METHOD
|
||||
import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch
|
||||
@@ -27,9 +26,7 @@ val fixRedgifsApi = fixRedgifsApiPatch(
|
||||
}
|
||||
replaceInstruction(
|
||||
index,
|
||||
"""
|
||||
invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->$CREATE_NEW_CLIENT_METHOD
|
||||
"""
|
||||
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->$CREATE_NEW_CLIENT_METHOD"
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
package app.revanced.patches.shared.layout.branding
|
||||
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.ResourcePatchBuilder
|
||||
import app.revanced.patcher.patch.ResourcePatchContext
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
import app.revanced.patcher.patch.stringOption
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.Utils.trimIndentMultiline
|
||||
import app.revanced.util.copyResources
|
||||
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(
|
||||
"xxxhdpi",
|
||||
"xxhdpi",
|
||||
"xhdpi",
|
||||
"hdpi",
|
||||
"mdpi",
|
||||
).map { "mipmap-$it" }.toTypedArray()
|
||||
|
||||
private fun formatResourceFileList(resourceNames: Array<String>) = resourceNames.joinToString("\n") { "- $it" }
|
||||
|
||||
/**
|
||||
* 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 }
|
||||
|
||||
// Replace invalid XML characters with escaped equivalents.
|
||||
val escapedName = cleanedName
|
||||
.replace("&", "&") // Must be first to avoid double-escaping.
|
||||
.replace("<", "<")
|
||||
.replace(">", ">")
|
||||
.replace(Regex("(?<!&)\""), """)
|
||||
|
||||
// Trim empty spacing.
|
||||
val trimmed = escapedName.trim()
|
||||
|
||||
return trimmed.ifBlank { null }
|
||||
}
|
||||
|
||||
/**
|
||||
* Shared custom branding patch for YouTube and YT Music.
|
||||
*/
|
||||
internal fun baseCustomBrandingPatch(
|
||||
defaultAppName: String,
|
||||
appNameValues: Map<String, String>,
|
||||
resourceFolder: String,
|
||||
iconResourceFileNames: Array<String>,
|
||||
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,
|
||||
) {
|
||||
val iconResourceFileNamesPng = iconResourceFileNames.map { "$it.png" }.toTypedArray<String>()
|
||||
|
||||
val appName by stringOption(
|
||||
key = "appName",
|
||||
default = defaultAppName,
|
||||
values = appNameValues,
|
||||
title = "App name",
|
||||
description = "The name of the app.",
|
||||
)
|
||||
|
||||
val iconPath by stringOption(
|
||||
key = "iconPath",
|
||||
default = REVANCED_ICON,
|
||||
values = mapOf("ReVanced Logo" to REVANCED_ICON),
|
||||
title = "App icon",
|
||||
description = """
|
||||
The icon to apply to the app.
|
||||
|
||||
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)}
|
||||
""".trimIndentMultiline(),
|
||||
)
|
||||
|
||||
block()
|
||||
|
||||
execute {
|
||||
// Change the app icon and launch screen.
|
||||
val iconResourceGroups = mipmapDirectories.map { directory ->
|
||||
ResourceGroup(
|
||||
directory,
|
||||
*iconResourceFileNamesPng,
|
||||
)
|
||||
}
|
||||
|
||||
val iconPathTrimmed = iconPath!!.trim()
|
||||
if (iconPathTrimmed == REVANCED_ICON) {
|
||||
iconResourceGroups.forEach {
|
||||
copyResources(resourceFolder, it)
|
||||
}
|
||||
} else {
|
||||
val filePath = File(iconPathTrimmed)
|
||||
val resourceDirectory = get("res")
|
||||
|
||||
iconResourceGroups.forEach { group ->
|
||||
val fromDirectory = filePath.resolve(group.resourceDirectoryName)
|
||||
val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName)
|
||||
|
||||
group.resources.forEach { iconFileName ->
|
||||
Files.write(
|
||||
toDirectory.resolve(iconFileName).toPath(),
|
||||
fromDirectory.resolve(iconFileName).readBytes(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Change the app name.
|
||||
escapeAppName(appName!!)?.let { escapedAppName ->
|
||||
val newValue = "android:label=\"$escapedAppName\""
|
||||
|
||||
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)
|
||||
|
||||
if (original == replacement) {
|
||||
Logger.getLogger(this::class.java.name).warning(
|
||||
"Could not replace manifest app name"
|
||||
)
|
||||
}
|
||||
|
||||
manifest.writeText(replacement)
|
||||
}
|
||||
|
||||
executeBlock() // Must be after the main code to rename the new icons for YouTube 19.34+.
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package app.revanced.patches.youtube.video.audio
|
||||
package app.revanced.patches.shared.misc.audio
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.containsLiteralInstruction
|
||||
@@ -7,10 +7,14 @@ import com.android.tools.smali.dexlib2.AccessFlags
|
||||
internal val formatStreamModelToStringFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("Ljava/lang/String;")
|
||||
custom { method, classDef ->
|
||||
method.name == "toString" && classDef.type ==
|
||||
"Lcom/google/android/libraries/youtube/innertube/model/media/FormatStreamModel;"
|
||||
custom { method, _ ->
|
||||
method.name == "toString"
|
||||
}
|
||||
strings(
|
||||
// Strings are partial matches.
|
||||
"isDefaultAudioTrack=",
|
||||
"audioTrackId="
|
||||
)
|
||||
}
|
||||
|
||||
internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L
|
||||
@@ -20,7 +24,6 @@ internal val selectAudioStreamFingerprint = fingerprint {
|
||||
returns("L")
|
||||
custom { method, _ ->
|
||||
method.parameters.size > 2 // Method has a large number of parameters and may change.
|
||||
&& method.parameters[1].type == "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;"
|
||||
&& method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
package app.revanced.patches.shared.misc.audio
|
||||
|
||||
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
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatchBuilder
|
||||
import app.revanced.patcher.patch.BytecodePatchContext
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
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.SwitchPreference
|
||||
import app.revanced.util.findMethodFromToString
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.insertLiteralOverride
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableField
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/shared/patches/ForceOriginalAudioPatch;"
|
||||
|
||||
/**
|
||||
* Patch shared with YouTube and YT Music.
|
||||
*/
|
||||
internal fun forceOriginalAudioPatch(
|
||||
block: BytecodePatchBuilder.() -> Unit = {},
|
||||
executeBlock: BytecodePatchContext.() -> Unit = {},
|
||||
fixUseLocalizedAudioTrackFlag: Boolean,
|
||||
mainActivityOnCreateFingerprint: Fingerprint,
|
||||
subclassExtensionClassDescriptor: String,
|
||||
preferenceScreen: BasePreferenceScreen.Screen
|
||||
) = bytecodePatch(
|
||||
name = "Force original audio",
|
||||
description = "Adds an option to always use the original audio track.",
|
||||
) {
|
||||
|
||||
block()
|
||||
|
||||
dependsOn(addResourcesPatch)
|
||||
|
||||
execute {
|
||||
addResources("shared", "misc.audio.forceOriginalAudioPatch")
|
||||
|
||||
preferenceScreen.addPreferences(
|
||||
SwitchPreference(
|
||||
key = "revanced_force_original_audio",
|
||||
tag = "app.revanced.extension.shared.settings.preference.ForceOriginalAudioSwitchPreference"
|
||||
)
|
||||
)
|
||||
|
||||
mainActivityOnCreateFingerprint.method.addInstruction(
|
||||
0,
|
||||
"invoke-static { }, $subclassExtensionClassDescriptor->setPreferredLanguage()V"
|
||||
)
|
||||
|
||||
// Disable feature flag that ignores the default track flag
|
||||
// and instead overrides to the user region language.
|
||||
if (fixUseLocalizedAudioTrackFlag) {
|
||||
selectAudioStreamFingerprint.method.insertLiteralOverride(
|
||||
AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG,
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z"
|
||||
)
|
||||
}
|
||||
|
||||
formatStreamModelToStringFingerprint.let {
|
||||
val isDefaultAudioTrackMethod = it.originalMethod.findMethodFromToString("isDefaultAudioTrack=")
|
||||
val audioTrackDisplayNameMethod = it.originalMethod.findMethodFromToString("audioTrackDisplayName=")
|
||||
val audioTrackIdMethod = it.originalMethod.findMethodFromToString("audioTrackId=")
|
||||
|
||||
it.classDef.apply {
|
||||
// Add a new field to store the override.
|
||||
val helperFieldName = "patch_isDefaultAudioTrackOverride"
|
||||
fields.add(
|
||||
ImmutableField(
|
||||
type,
|
||||
helperFieldName,
|
||||
"Ljava/lang/Boolean;",
|
||||
// Boolean is a 100% immutable class (all fields are final)
|
||||
// and safe to write to a shared field without volatile/synchronization,
|
||||
// but without volatile the field can show stale data
|
||||
// and the same field is calculated more than once by different threads.
|
||||
AccessFlags.PRIVATE.value or AccessFlags.VOLATILE.value,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
).toMutable()
|
||||
)
|
||||
|
||||
// Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed.
|
||||
val helperMethodClass = type
|
||||
val helperMethodName = "patch_isDefaultAudioTrack"
|
||||
val helperMethod = ImmutableMethod(
|
||||
helperMethodClass,
|
||||
helperMethodName,
|
||||
listOf(ImmutableMethodParameter("Z", null, null)),
|
||||
"Z",
|
||||
AccessFlags.PRIVATE.value,
|
||||
null,
|
||||
null,
|
||||
MutableMethodImplementation(6),
|
||||
).toMutable().apply {
|
||||
addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean;
|
||||
if-eqz v0, :call_extension
|
||||
invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z
|
||||
move-result v3
|
||||
return v3
|
||||
|
||||
:call_extension
|
||||
invoke-virtual { p0 }, $audioTrackIdMethod
|
||||
move-result-object v1
|
||||
|
||||
invoke-virtual { p0 }, $audioTrackDisplayNameMethod
|
||||
move-result-object v2
|
||||
|
||||
invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z
|
||||
move-result v3
|
||||
|
||||
invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
|
||||
move-result-object v0
|
||||
iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean;
|
||||
return v3
|
||||
"""
|
||||
)
|
||||
}
|
||||
methods.add(helperMethod)
|
||||
|
||||
// Modify isDefaultAudioTrack() to call extension helper method.
|
||||
isDefaultAudioTrackMethod.apply {
|
||||
val index = indexOfFirstInstructionOrThrow(Opcode.RETURN)
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
|
||||
addInstructions(
|
||||
index,
|
||||
"""
|
||||
invoke-direct { p0, v$register }, $helperMethodClass->$helperMethodName(Z)Z
|
||||
move-result v$register
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
executeBlock()
|
||||
}
|
||||
}
|
||||
@@ -12,9 +12,8 @@ val dynamicColorPatch = resourcePatch(
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.twitter.android"(
|
||||
"10.86.0-release.0",
|
||||
"10.60.0-release.0",
|
||||
"10.48.0-release.0"
|
||||
"10.86.0-release.0",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package app.revanced.patches.twitter.misc.extension
|
||||
|
||||
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.twitter.misc.extension.hooks.applicationInitHook
|
||||
|
||||
val sharedExtensionPatch = sharedExtensionPatch("twitter")
|
||||
val sharedExtensionPatch = sharedExtensionPatch("twitter", applicationInitHook)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package app.revanced.patches.twitter.misc.extension.hooks
|
||||
|
||||
import app.revanced.patches.shared.misc.extension.extensionHook
|
||||
|
||||
internal val applicationInitHook =
|
||||
extensionHook {
|
||||
custom { method, classDef ->
|
||||
classDef.type == "Lcom/twitter/app/TwitterApplication;" && method.name == "onCreate"
|
||||
}
|
||||
}
|
||||
@@ -13,11 +13,8 @@ fun hookPatch(
|
||||
|
||||
compatibleWith(
|
||||
"com.twitter.android"(
|
||||
// Only v10.85 uses Pairip and requires additional changes to work.
|
||||
"10.86.0-release.0",
|
||||
// Confirmed to not show reply ads. Slightly newer versions may also work.
|
||||
"10.60.0-release.0",
|
||||
"10.48.0-release.0"
|
||||
"10.86.0-release.0",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -39,9 +39,8 @@ val changeLinkSharingDomainPatch = bytecodePatch(
|
||||
|
||||
compatibleWith(
|
||||
"com.twitter.android"(
|
||||
"10.86.0-release.0",
|
||||
"10.60.0-release.0",
|
||||
"10.48.0-release.0"
|
||||
"10.86.0-release.0",
|
||||
)
|
||||
)
|
||||
|
||||
@@ -54,27 +53,27 @@ val changeLinkSharingDomainPatch = bytecodePatch(
|
||||
)
|
||||
|
||||
execute {
|
||||
val replacementIndex =
|
||||
linkSharingDomainFingerprint.stringMatches!!.first().index
|
||||
val domainRegister =
|
||||
linkSharingDomainFingerprint.method.getInstruction<OneRegisterInstruction>(replacementIndex).registerA
|
||||
linkSharingDomainFingerprint.let {
|
||||
val replacementIndex = it.stringMatches!!.first().index
|
||||
val domainRegister = it.method.getInstruction<OneRegisterInstruction>(
|
||||
replacementIndex
|
||||
).registerA
|
||||
|
||||
linkSharingDomainFingerprint.method.replaceInstruction(
|
||||
it.method.replaceInstruction(
|
||||
replacementIndex,
|
||||
"const-string v$domainRegister, \"https://$domainName\"",
|
||||
)
|
||||
}
|
||||
|
||||
// Replace the domain name when copying a link with "Copy link" button.
|
||||
linkBuilderFingerprint.method.apply {
|
||||
addInstructions(
|
||||
linkBuilderFingerprint.method.addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static { p0, p1, p2 }, $EXTENSION_CLASS_DESCRIPTOR->formatLink(JLjava/lang/String;)Ljava/lang/String;
|
||||
move-result-object p0
|
||||
return-object p0
|
||||
""",
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
// Used in the Share via... dialog.
|
||||
linkResourceGetterFingerprint.method.apply {
|
||||
|
||||
@@ -4,12 +4,12 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch
|
||||
|
||||
@Deprecated("Patch is obsolete and no longer needed with the highest supported app target. " +
|
||||
"This patch will soon be deleted.")
|
||||
@Suppress("unused")
|
||||
val openLinksWithAppChooserPatch = bytecodePatch(
|
||||
name = "Open links with app chooser",
|
||||
description = "Instead of opening links directly, open them with an app chooser. " +
|
||||
"As a result you can select a browser to open the link with.",
|
||||
use = false,
|
||||
) {
|
||||
dependsOn(sharedExtensionPatch)
|
||||
|
||||
|
||||
@@ -10,9 +10,8 @@ val sanitizeSharingLinksPatch = bytecodePatch(
|
||||
) {
|
||||
compatibleWith(
|
||||
"com.twitter.android"(
|
||||
"10.86.0-release.0",
|
||||
"10.60.0-release.0",
|
||||
"10.48.0-release.0"
|
||||
"10.86.0-release.0",
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package app.revanced.patches.viber.misc.navbar
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.patcher.patch.BytecodePatchContext
|
||||
|
||||
internal val tabIdClassFingerprint = fingerprint {
|
||||
strings("shouldShowTabId")
|
||||
}
|
||||
|
||||
context(BytecodePatchContext)
|
||||
internal val shouldShowTabIdMethodFingerprint get() = fingerprint {
|
||||
parameters("I", "I")
|
||||
returns("Z")
|
||||
custom { methodDef, classDef ->
|
||||
classDef == tabIdClassFingerprint.classDef
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package app.revanced.patches.viber.misc.navbar
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.patch.booleanOption
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import java.util.logging.Logger
|
||||
import kotlin.collections.joinToString
|
||||
|
||||
|
||||
private const val instructionsFooter = """
|
||||
# If we reach this, it means that this tab has been disabled by user
|
||||
const/4 v0, 0
|
||||
return v0 # return false as "This tab is not enabled"
|
||||
|
||||
# Proceed with default execution
|
||||
:continue
|
||||
nop
|
||||
"""
|
||||
|
||||
@Suppress("unused")
|
||||
val hideNavigationButtonsPatch = bytecodePatch(
|
||||
name = "Hide navigation buttons",
|
||||
description = "Permanently hides navigation bar buttons, such as Explore and Marketplace.",
|
||||
use = false
|
||||
) {
|
||||
compatibleWith("com.viber.voip")
|
||||
|
||||
val hideOptions = AllowedNavigationItems.entries.associateWith {
|
||||
booleanOption(
|
||||
key = it.key,
|
||||
default = it.defaultHideOption,
|
||||
title = it.title,
|
||||
description = it.description,
|
||||
)
|
||||
}
|
||||
|
||||
execute {
|
||||
// Items that won't be forcefully hidden.
|
||||
val allowedItems = hideOptions.filter { (option, enabled) -> enabled.value != true }
|
||||
|
||||
if (allowedItems.size == AllowedNavigationItems.entries.size) {
|
||||
return@execute Logger.getLogger(this::class.java.name).warning(
|
||||
"No hide navigation buttons options are enabled. No changes made."
|
||||
)
|
||||
}
|
||||
|
||||
val injectionInstructions = allowedItems
|
||||
.map { it.key.buildAllowInstruction() }
|
||||
.joinToString("\n") + instructionsFooter
|
||||
|
||||
shouldShowTabIdMethodFingerprint
|
||||
.method
|
||||
.addInstructionsWithLabels(0, injectionInstructions)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation items taken from source code.
|
||||
* They appear in code like new NavigationItem(0, R.string.bottom_tab_chats, R.drawable.ic_tab_chats).
|
||||
*/
|
||||
private enum class AllowedNavigationItems(
|
||||
val defaultHideOption: Boolean,
|
||||
private val itemName: String,
|
||||
private vararg val ids: Int
|
||||
) {
|
||||
CHATS(false, "Chats", 0),
|
||||
CALLS(false, "Calls", 1, 7),
|
||||
EXPLORE(true, "Explore", 2),
|
||||
MORE(false, "More", 3),
|
||||
PAY(true, "Pay", 5),
|
||||
CAMERA(true, "Camera", 6),
|
||||
MARKETPLACE(true, "Marketplace", 8);
|
||||
|
||||
val key = "hide$itemName"
|
||||
val title = "Hide $itemName"
|
||||
val description = "Permanently hides the $itemName button."
|
||||
|
||||
fun buildAllowInstruction(): String =
|
||||
ids.joinToString("\n") { id ->
|
||||
"""
|
||||
const/4 v0, $id # If tabId == $id ($itemName), don't hide it
|
||||
if-eq p1, v0, :continue
|
||||
"""
|
||||
}
|
||||
}
|
||||
@@ -1,46 +1,34 @@
|
||||
package app.revanced.patches.youtube.layout.branding
|
||||
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
import app.revanced.patcher.patch.stringOption
|
||||
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.Utils.trimIndentMultiline
|
||||
import app.revanced.util.copyResources
|
||||
import java.io.File
|
||||
import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch
|
||||
import app.revanced.patches.shared.layout.branding.mipmapDirectories
|
||||
import java.nio.file.Files
|
||||
|
||||
private const val REVANCED_ICON = "ReVanced*Logo" // Can never be a valid path.
|
||||
private const val APP_NAME = "YouTube ReVanced"
|
||||
|
||||
private val iconResourceFileNames = arrayOf(
|
||||
"adaptiveproduct_youtube_background_color_108",
|
||||
"adaptiveproduct_youtube_foreground_color_108",
|
||||
"ic_launcher",
|
||||
"ic_launcher_round",
|
||||
).map { "$it.png" }.toTypedArray()
|
||||
|
||||
private val iconResourceFileNamesNew = mapOf(
|
||||
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",
|
||||
)
|
||||
|
||||
private val mipmapDirectories = arrayOf(
|
||||
"xxxhdpi",
|
||||
"xxhdpi",
|
||||
"xhdpi",
|
||||
"hdpi",
|
||||
"mdpi",
|
||||
).map { "mipmap-$it" }
|
||||
|
||||
@Suppress("unused")
|
||||
val customBrandingPatch = resourcePatch(
|
||||
name = "Custom branding",
|
||||
description = "Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.",
|
||||
use = false,
|
||||
) {
|
||||
dependsOn(versionCheckPatch)
|
||||
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",
|
||||
),
|
||||
|
||||
block = {
|
||||
compatibleWith(
|
||||
"com.google.android.youtube"(
|
||||
"19.34.42",
|
||||
@@ -49,74 +37,15 @@ val customBrandingPatch = resourcePatch(
|
||||
"20.14.43",
|
||||
)
|
||||
)
|
||||
},
|
||||
|
||||
val appName by stringOption(
|
||||
key = "appName",
|
||||
default = APP_NAME,
|
||||
values = mapOf(
|
||||
"YouTube ReVanced" to APP_NAME,
|
||||
"YT ReVanced" to "YT ReVanced",
|
||||
"YT" to "YT",
|
||||
"YouTube" to "YouTube",
|
||||
),
|
||||
title = "App name",
|
||||
description = "The name of the app.",
|
||||
)
|
||||
|
||||
val icon by stringOption(
|
||||
key = "iconPath",
|
||||
default = REVANCED_ICON,
|
||||
values = mapOf("ReVanced Logo" to REVANCED_ICON),
|
||||
title = "App icon",
|
||||
description = """
|
||||
The icon to apply to the app.
|
||||
|
||||
If a path to a folder is provided, the folder must contain the following folders:
|
||||
|
||||
${mipmapDirectories.joinToString("\n") { "- $it" }}
|
||||
|
||||
Each of these folders must contain the following files:
|
||||
|
||||
${iconResourceFileNames.joinToString("\n") { "- $it" }}
|
||||
""".trimIndentMultiline(),
|
||||
)
|
||||
|
||||
execute {
|
||||
icon?.let { icon ->
|
||||
// Change the app icon.
|
||||
mipmapDirectories.map { directory ->
|
||||
ResourceGroup(
|
||||
directory,
|
||||
*iconResourceFileNames,
|
||||
)
|
||||
}.let { resourceGroups ->
|
||||
if (icon != REVANCED_ICON) {
|
||||
val path = File(icon)
|
||||
val resourceDirectory = get("res")
|
||||
|
||||
resourceGroups.forEach { group ->
|
||||
val fromDirectory = path.resolve(group.resourceDirectoryName)
|
||||
val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName)
|
||||
|
||||
group.resources.forEach { iconFileName ->
|
||||
Files.write(
|
||||
toDirectory.resolve(iconFileName).toPath(),
|
||||
fromDirectory.resolve(iconFileName).readBytes(),
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
resourceGroups.forEach { copyResources("custom-branding", it) }
|
||||
}
|
||||
}
|
||||
|
||||
if (is_19_34_or_greater) {
|
||||
executeBlock = {
|
||||
val resourceDirectory = get("res")
|
||||
|
||||
mipmapDirectories.forEach { directory ->
|
||||
val targetDirectory = resourceDirectory.resolve(directory)
|
||||
|
||||
iconResourceFileNamesNew.forEach { (old, new) ->
|
||||
youtubeIconResourceFileNames_19_34.forEach { (old, new) ->
|
||||
val oldFile = targetDirectory.resolve("$old.png")
|
||||
val newFile = targetDirectory.resolve("$new.png")
|
||||
|
||||
@@ -124,18 +53,4 @@ val customBrandingPatch = resourcePatch(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
appName?.let { name ->
|
||||
// Change the app name.
|
||||
val manifest = get("AndroidManifest.xml")
|
||||
manifest.writeText(
|
||||
manifest.readText()
|
||||
.replace(
|
||||
"android:label=\"@string/application_name",
|
||||
"android:label=\"$name",
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
package app.revanced.patches.youtube.layout.hide.endscreencards
|
||||
|
||||
import app.revanced.patcher.fingerprint
|
||||
import app.revanced.util.containsLiteralInstruction
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
import app.revanced.util.literal
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
|
||||
internal val layoutCircleFingerprint = fingerprint {
|
||||
returns("Landroid/view/View;")
|
||||
@@ -38,3 +43,19 @@ internal val layoutVideoFingerprint = fingerprint {
|
||||
)
|
||||
literal { layoutVideo }
|
||||
}
|
||||
|
||||
internal val showEndscreenCardsFingerprint = fingerprint {
|
||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||
returns("V")
|
||||
parameters("L")
|
||||
custom { method, classDef ->
|
||||
classDef.methods.count() == 5
|
||||
&& method.containsLiteralInstruction(0)
|
||||
&& method.containsLiteralInstruction(5)
|
||||
&& method.containsLiteralInstruction(8)
|
||||
&& method.indexOfFirstInstruction {
|
||||
val reference = getReference<FieldReference>()
|
||||
reference?.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"
|
||||
} >= 0
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package app.revanced.patches.youtube.layout.hide.endscreencards
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.patch.resourcePatch
|
||||
@@ -11,6 +12,8 @@ import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.mapping.resourceMappings
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
@@ -22,7 +25,7 @@ internal var layoutIcon = -1L
|
||||
internal var layoutVideo = -1L
|
||||
private set
|
||||
|
||||
private val hideEndscreenCardsResourcePatch = resourcePatch {
|
||||
private val hideEndScreenCardsResourcePatch = resourcePatch {
|
||||
dependsOn(
|
||||
settingsPatch,
|
||||
resourceMappingPatch,
|
||||
@@ -30,7 +33,7 @@ private val hideEndscreenCardsResourcePatch = resourcePatch {
|
||||
)
|
||||
|
||||
execute {
|
||||
addResources("youtube", "layout.hide.endscreencards.hideEndscreenCardsResourcePatch")
|
||||
addResources("youtube", "layout.hide.endscreencards.hideEndScreenCardsResourcePatch")
|
||||
|
||||
PreferenceScreen.PLAYER.addPreferences(
|
||||
SwitchPreference("revanced_hide_endscreen_cards"),
|
||||
@@ -45,16 +48,17 @@ private val hideEndscreenCardsResourcePatch = resourcePatch {
|
||||
}
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/youtube/patches/HideEndscreenCardsPatch;"
|
||||
"Lapp/revanced/extension/youtube/patches/HideEndScreenCardsPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val hideEndscreenCardsPatch = bytecodePatch(
|
||||
val hideEndScreenCardsPatch = bytecodePatch(
|
||||
name = "Hide end screen cards",
|
||||
description = "Adds an option to hide suggested video cards at the end of videos.",
|
||||
) {
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
hideEndscreenCardsResourcePatch,
|
||||
hideEndScreenCardsResourcePatch,
|
||||
versionCheckPatch
|
||||
)
|
||||
|
||||
compatibleWith(
|
||||
@@ -78,9 +82,24 @@ val hideEndscreenCardsPatch = bytecodePatch(
|
||||
|
||||
addInstruction(
|
||||
insertIndex,
|
||||
"invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideEndscreen(Landroid/view/View;)V",
|
||||
"invoke-static { v$viewRegister }, " +
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (is_19_43_or_greater) {
|
||||
showEndscreenCardsFingerprint.method.addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCards()Z
|
||||
move-result v0
|
||||
if-eqz v0, :show
|
||||
return-void
|
||||
:show
|
||||
nop
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -161,7 +161,7 @@ val openShortsInRegularPlayerPatch = bytecodePatch(
|
||||
addInstructions(
|
||||
index + 1,
|
||||
"""
|
||||
invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->overrideBackPressToExit(Z)Z
|
||||
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->overrideBackPressToExit(Z)Z
|
||||
move-result v$register
|
||||
"""
|
||||
)
|
||||
|
||||
@@ -164,7 +164,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig
|
||||
|
||||
addInstruction(
|
||||
index + 1,
|
||||
"invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->setToolbar(Landroid/widget/FrameLayout;)V"
|
||||
"invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setToolbar(Landroid/widget/FrameLayout;)V"
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ var is_19_32_or_greater = false
|
||||
@Deprecated("19.34.42 is the lowest supported version")
|
||||
var is_19_33_or_greater = false
|
||||
private set
|
||||
@Deprecated("19.34.42 is the lowest supported version")
|
||||
var is_19_34_or_greater = false
|
||||
private set
|
||||
var is_19_35_or_greater = false
|
||||
|
||||
@@ -1,44 +1,22 @@
|
||||
package app.revanced.patches.youtube.video.audio
|
||||
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.bytecodePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.all.misc.resources.addResources
|
||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch
|
||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||
import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater
|
||||
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
|
||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
||||
import app.revanced.util.findMethodFromToString
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.insertLiteralOverride
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableField
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;"
|
||||
|
||||
@Suppress("unused")
|
||||
val forceOriginalAudioPatch = bytecodePatch(
|
||||
name = "Force original audio",
|
||||
description = "Adds an option to always use the original audio track.",
|
||||
) {
|
||||
val forceOriginalAudioPatch = forceOriginalAudioPatch(
|
||||
block = {
|
||||
dependsOn(
|
||||
sharedExtensionPatch,
|
||||
settingsPatch,
|
||||
addResourcesPatch,
|
||||
versionCheckPatch
|
||||
)
|
||||
|
||||
@@ -50,110 +28,9 @@ val forceOriginalAudioPatch = bytecodePatch(
|
||||
"20.14.43",
|
||||
)
|
||||
)
|
||||
|
||||
execute {
|
||||
addResources("youtube", "video.audio.forceOriginalAudioPatch")
|
||||
|
||||
PreferenceScreen.VIDEO.addPreferences(
|
||||
SwitchPreference(
|
||||
key = "revanced_force_original_audio",
|
||||
tag = "app.revanced.extension.youtube.settings.preference.ForceOriginalAudioSwitchPreference"
|
||||
},
|
||||
fixUseLocalizedAudioTrackFlag = is_20_07_or_greater,
|
||||
mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint,
|
||||
subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR,
|
||||
preferenceScreen = PreferenceScreen.VIDEO,
|
||||
)
|
||||
)
|
||||
|
||||
mainActivityOnCreateFingerprint.method.addInstruction(
|
||||
0,
|
||||
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setPreferredLanguage()V"
|
||||
)
|
||||
|
||||
// Disable feature flag that ignores the default track flag
|
||||
// and instead overrides to the user region language.
|
||||
if (is_20_07_or_greater) {
|
||||
selectAudioStreamFingerprint.method.insertLiteralOverride(
|
||||
AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG,
|
||||
"$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z"
|
||||
)
|
||||
}
|
||||
|
||||
formatStreamModelToStringFingerprint.let {
|
||||
val isDefaultAudioTrackMethod = it.originalMethod.findMethodFromToString("isDefaultAudioTrack=")
|
||||
val audioTrackDisplayNameMethod = it.originalMethod.findMethodFromToString("audioTrackDisplayName=")
|
||||
val audioTrackIdMethod = it.originalMethod.findMethodFromToString("audioTrackId=")
|
||||
|
||||
it.classDef.apply {
|
||||
// Add a new field to store the override.
|
||||
val helperFieldName = "patch_isDefaultAudioTrackOverride"
|
||||
fields.add(
|
||||
ImmutableField(
|
||||
type,
|
||||
helperFieldName,
|
||||
"Ljava/lang/Boolean;",
|
||||
// Boolean is a 100% immutable class (all fields are final)
|
||||
// and safe to write to a shared field without volatile/synchronization,
|
||||
// but without volatile the field can show stale data
|
||||
// and the same field is calculated more than once by different threads.
|
||||
AccessFlags.PRIVATE.value or AccessFlags.VOLATILE.value,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
).toMutable()
|
||||
)
|
||||
|
||||
// Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed.
|
||||
val helperMethodClass = type
|
||||
val helperMethodName = "patch_isDefaultAudioTrack"
|
||||
val helperMethod = ImmutableMethod(
|
||||
helperMethodClass,
|
||||
helperMethodName,
|
||||
listOf(ImmutableMethodParameter("Z", null, null)),
|
||||
"Z",
|
||||
AccessFlags.PRIVATE.value,
|
||||
null,
|
||||
null,
|
||||
MutableMethodImplementation(6),
|
||||
).toMutable().apply {
|
||||
addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean;
|
||||
if-eqz v0, :call_extension
|
||||
invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z
|
||||
move-result v3
|
||||
return v3
|
||||
|
||||
:call_extension
|
||||
invoke-virtual { p0 }, $audioTrackIdMethod
|
||||
move-result-object v1
|
||||
|
||||
invoke-virtual { p0 }, $audioTrackDisplayNameMethod
|
||||
move-result-object v2
|
||||
|
||||
invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z
|
||||
move-result v3
|
||||
|
||||
invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
|
||||
move-result-object v0
|
||||
iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean;
|
||||
return v3
|
||||
"""
|
||||
)
|
||||
}
|
||||
methods.add(helperMethod)
|
||||
|
||||
// Modify isDefaultAudioTrack() to call extension helper method.
|
||||
isDefaultAudioTrackMethod.apply {
|
||||
val index = indexOfFirstInstructionOrThrow(Opcode.RETURN)
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
|
||||
addInstructions(
|
||||
index,
|
||||
"""
|
||||
invoke-direct { p0, v$register }, $helperMethodClass->$helperMethodName(Z)Z
|
||||
move-result v$register
|
||||
"""
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -797,7 +797,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">تم إخفاء الأزرار</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">يتم عرض الأزرار</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">إخفاء بطاقات شاشة النهاية</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">تم إخفاء بطاقات شاشة النهاية</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">يتم عرض بطاقات شاشة النهاية</string>
|
||||
|
||||
@@ -136,7 +136,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -65,9 +65,9 @@ Second \"item\" text"</string>
|
||||
• Valideyn tənzimləmələri qapadılan uşaq tənzimləmələrin üstündə görünür"</string>
|
||||
<string name="revanced_settings_search_empty_history_title">Axtarış tarixçəsi boşdur</string>
|
||||
<string name="revanced_settings_search_empty_history_summary">Axtarış tarixçəsini saxlamaq üçün axtarış sorğusu yazın və Daxil Et basın</string>
|
||||
<string name="revanced_settings_search_history_title">Axtarış tarixçəsi tənzimləməsin göstər</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Axtarış tarixçəsi tənzimləməsi göstərilir</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Axtarış tarixçəsi tənzimləməsi göstərilmir</string>
|
||||
<string name="revanced_settings_search_history_title">Tənzimləmə axtarış tarixçəsin göstər</string>
|
||||
<string name="revanced_settings_search_history_summary_on">Tənzimləmə axtarış tarixçəsi göstərilir</string>
|
||||
<string name="revanced_settings_search_history_summary_off">Tənzimləmə axtarış tarixçəsi görünmür</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced tənzimləmə nişanların göstər</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">Tənzimləmə nişanları göstərilir</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">Tənzimləmə nişanları göstərilmir</string>
|
||||
@@ -797,7 +797,7 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"ı
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Düymələr gizlidir</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Düymələr göstərilir</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Son ekran kartlarını gizlət</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Son ekran kartları gizlidir</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Son ekran kartları göstərilir</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Кнопкі схаваныя</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Паказваюцца кнопкі</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Схаваць карткі канцавога экрана</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Карткі канцавога экрана схаваны</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Паказваюцца карткі канцавога экрана</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Бутоните са скрити</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Бутоните се показват</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Скриване на препоръките в края</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Препоръките в края са скрити</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Препоръките в края се показват</string>
|
||||
|
||||
@@ -793,7 +793,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">বোতাম লুকানো হয়</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">বোতাম দেখানো হয়</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">শেষ স্ক্রীন কার্ড লুকান</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">শেষ স্ক্রীন কার্ড লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">শেষ স্ক্রীন কার্ড প্রদর্শিত হয়েছে</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -797,7 +797,7 @@ Chcete-li zobrazit nabídku zvukové stopy, změňte 'Zfalšovat streamy videa'
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Tlačítka jsou skryta</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Tlačítka jsou zobrazena</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Skrýt karty s informacemi o videu</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Karty s informacemi o videu jsou skryty</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Karty s informacemi o videu jsou zobrazeny</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ For at vise lydsporsmenuen, skift 'Spoof videostreams' til iPadOS"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Knapper er skjult</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Knapper vises</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Skjul slutskærmkort</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Slutskærmskortene er skjult</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Kort til slutskærm vises</string>
|
||||
|
||||
@@ -560,7 +560,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver
|
||||
<string name="revanced_swipe_volume_summary_off">Die Vollbild-Lautstärkegeste ist deaktiviert</string>
|
||||
<string name="revanced_swipe_press_to_engage_title">Wischen durch Drücken aktivieren</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_on">Wischen durch Drücken ist aktiviert</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_off">Wischen durch Drücken ist deaktiviert</string>
|
||||
<string name="revanced_swipe_press_to_engage_summary_off">Wischgeste durch Drücken ist deaktiviert</string>
|
||||
<string name="revanced_swipe_haptic_feedback_title">Haptisches Feedback aktivieren</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_on">Haptisches Feedback ist aktiviert</string>
|
||||
<string name="revanced_swipe_haptic_feedback_summary_off">Haptisches Feedback ist deaktiviert</string>
|
||||
@@ -794,7 +794,7 @@ Um das Audiotrack-Menü anzuzeigen, ändern Sie \"Video-Streams fälschen\" zu i
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Buttons sind ausgeblendet</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Tasten werden angezeigt</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Endkarte ausblenden</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Endbildschirmkarten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Endbildschirmkarten werden angezeigt</string>
|
||||
|
||||
@@ -799,7 +799,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Εμφανίζονται</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Κάρτες τελικής οθόνης</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Εμφανίζονται</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Los botones están ocultos</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Los botones se muestran</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Ocultar tarjetas de pantalla final</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Las tarjetas de pantalla de fin están ocultas</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Se muestran las tarjetas de la pantalla final</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Heliraja menüü nägemiseks muutke \"Video voogude võltsimine\" iPadOS-iks"</s
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Nupud on peidetud</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Nupud on nähtavad</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Peida lõpukujunduse kaardid</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Lõpukujunduse kaardid on peidetud</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Lõpukujunduse kaardid on nähtavad</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -182,7 +182,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -797,7 +797,7 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" iPadOS
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Edellinen- ja Seuraava-painikkeet piilotetaan</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Painikkeet näytetään</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Piilota loppunäytön kortit</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Loppunäytön kortit piilotetaan</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Loppunäytön kortit näytetään</string>
|
||||
|
||||
@@ -795,7 +795,7 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa iPad
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Nakatago ang mga pindutan</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Ang mga pindutan ay ipinapakita</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Itago ang mga end screen card</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Nakatago ang mga end screen card</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Ipinapakita ang mga end screen card</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Les boutons sont masqués</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Les boutons sont affichés</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Masquer les écrans de fin au format fiche</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Les écrans de fin au format fiche sont masqués</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Les écrans de fin au format fiche sont affichés</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Tá cnaipí i bhfolach</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Taispeántar cnaipí</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Folaigh cártaí scáileáin deireadh</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Tá cártaí scáileáin deiridh i bhfolach</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Taispeántar cártaí scáileáin deireadh</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -137,7 +137,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -136,7 +136,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -797,7 +797,7 @@ Az hangsáv menü megjelenítéséhez állítsa a 'Videó stream-ek meghamisít
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">A gombok elrejtve</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">A gombok megjelennek</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Záróképernyő kártyák elrejtése</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">A záróképernyő kártyák el vannak rejtve</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">A záróképernyő kártyák megjelennek</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Կոճակները թաքցված են</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Կոճակները երևում են</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Էկրանի վերջում քարտերը թաքցնել</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Էկրանի վերջում քարտերը թաքցված են</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Էկրանի վերջում քարտերը երևում են</string>
|
||||
|
||||
@@ -402,14 +402,14 @@ Jika Doodle saat ini ditampilkan di wilayah Anda dan pengaturan penyembunyi ini
|
||||
<string name="revanced_hide_view_count_summary_off">Jumlah penayangan ditampilkan di umpan dan hasil pencarian</string>
|
||||
<!-- Translations should lanaguge similar to revanced_hide_upload_time_user_dialog_message -->
|
||||
<string name="revanced_hide_view_count_user_dialog_message">"Keterbatasan:
|
||||
• Rak Shorts, halaman channel, dan hasil pencarian mungkin masih menampilkan jumlah penayangan
|
||||
• Rak Shorts, halaman saluran, dan hasil pencarian mungkin masih menampilkan jumlah penayangan
|
||||
• Fitur ini tidak berfungsi dengan faktor bentuk otomotif"</string>
|
||||
<string name="revanced_hide_upload_time_title">Sembunyikan waktu unggah</string>
|
||||
<string name="revanced_hide_upload_time_summary_on">Waktu unggah disembunyikan di umpan dan hasil penelusuran</string>
|
||||
<string name="revanced_hide_upload_time_summary_off">Waktu unggah ditampilkan di umpan dan hasil penelusuran</string>
|
||||
<!-- Translations should lanaguge similar to revanced_hide_view_count_user_dialog_message -->
|
||||
<string name="revanced_hide_upload_time_user_dialog_message">"Keterbatasan:
|
||||
• Rak Shorts, halaman channel, dan hasil penelusuran mungkin masih menampilkan waktu unggah
|
||||
• Rak Shorts, halaman saluran, dan hasil penelusuran mungkin masih menampilkan waktu unggah
|
||||
• Fitur ini tidak berfungsi dengan faktor bentuk otomotif"</string>
|
||||
<string name="revanced_hide_keyword_content_screen_title">Sembunyikan kata kunci konten</string>
|
||||
<string name="revanced_hide_keyword_content_screen_summary">Sembunyikan pencarian dan feed video menggunakan penyaring kata kunci</string>
|
||||
@@ -797,7 +797,7 @@ Untuk menampilkan menu trek audio, ubah 'Palsukan aliran video' ke iPadOS"</stri
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Tombol disembunyikan</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Tombol ditampilkan</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Sembunyikan kartu layar akhir</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Kartu layar akhir disembunyikan</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Kartu layar akhir ditampilkan</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -797,7 +797,7 @@ Per mostrare il menu della traccia audio, cambia \"Falsifica flussi video\" su i
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">I pulsanti sono nascosti</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">I pulsanti sono visibili</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Nascondi le schede della schermata finale</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Le schede della schermata finale sono nascoste</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Le schede della schermata finale sono visibili</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">הלחצנים מוסתרים</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">הלחצנים מוצגים</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">הסתר כרטיסי מסך סיום</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">כרטיסי מסך מסיום מוסתרים</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">כרטיסי מסך מסיום מוצגים</string>
|
||||
|
||||
@@ -69,8 +69,8 @@ Second \"item\" text"</string>
|
||||
<string name="revanced_settings_search_history_summary_on">設定の検索履歴は表示されます</string>
|
||||
<string name="revanced_settings_search_history_summary_off">設定の検索履歴は表示されません</string>
|
||||
<string name="revanced_show_menu_icons_title">ReVanced の設定にアイコンを表示</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">ReVanced の設定にアイコンが表示されます</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">ReVanced の設定にアイコンは表示されません</string>
|
||||
<string name="revanced_show_menu_icons_summary_on">ReVanced の設定メニューにはアイコンが表示されます</string>
|
||||
<string name="revanced_show_menu_icons_summary_off">ReVanced の設定メニューにはアイコンは表示されません</string>
|
||||
<string name="revanced_language_title">ReVanced 設定の言語</string>
|
||||
<string name="revanced_language_user_dialog_message">"一部の言語の翻訳が欠落しているまたは不完全である可能性があります。
|
||||
|
||||
@@ -94,7 +94,7 @@ Second \"item\" text"</string>
|
||||
<string name="gms_core_dialog_title">操作が必要です</string>
|
||||
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">"GmsCore はバックグラウンドで実行する権限がありません。
|
||||
|
||||
お使いのデバイスの「Don't kill my app!」ガイドに従い、GmsCore のインストール手順を適用してください。
|
||||
お使いのデバイスの「Don't kill my app!」ガイドに従い、GmsCore に対するデバイスの設定を変更してください。
|
||||
|
||||
これはアプリが正常に動作するために必要です。"</string>
|
||||
<string name="gms_core_dialog_open_website_text">ウェブサイトを開く</string>
|
||||
@@ -107,7 +107,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.spoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">動画ストリームを偽装</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">動画の再生に失敗しないために、クライアントの動画ストリームを偽装します</string>
|
||||
<string name="revanced_spoof_video_streams_screen_title">動画ストリームを偽装</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します</string>
|
||||
<string name="revanced_spoof_video_streams_title">動画ストリームを偽装</string>
|
||||
@@ -126,29 +126,29 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_debug_title">デバッグログを有効化</string>
|
||||
<string name="revanced_debug_summary_on">デバッグログは有効です</string>
|
||||
<string name="revanced_debug_summary_off">デバッグログは無効です</string>
|
||||
<string name="revanced_debug_stacktrace_title">スタック トレースをログに記録</string>
|
||||
<string name="revanced_debug_stacktrace_summary_on">デバッグログにスタック トレースが含まれます</string>
|
||||
<string name="revanced_debug_stacktrace_summary_off">デバッグログにスタック トレースは含まれません</string>
|
||||
<string name="revanced_debug_stacktrace_title">スタック トレースをログに保存</string>
|
||||
<string name="revanced_debug_stacktrace_summary_on">デバッグログにはスタック トレースが含まれます</string>
|
||||
<string name="revanced_debug_stacktrace_summary_off">デバッグログにはスタック トレースは含まれません</string>
|
||||
<string name="revanced_debug_toast_on_error_title">ReVanced のエラー時にトーストを表示</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_on">エラーが発生した場合にトーストが表示されます</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">エラーが発生してもトーストは表示されません</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">"エラートーストをオフにすると、ReVanced のすべてのエラー通知が非表示になります。
|
||||
<string name="revanced_debug_toast_on_error_summary_on">エラーが発生した場合にトースト通知が表示されます</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">エラーが発生した場合にトースト通知は表示されません</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">"エラーのトースト通知をオフにすると、ReVanced のすべてのエラー通知が表示されなくなります。
|
||||
|
||||
予期しないイベントが発生した場合でも通知されなくなります。"</string>
|
||||
<string name="revanced_debug_export_logs_to_clipboard_title">デバッグログのエクスポート</string>
|
||||
<string name="revanced_debug_export_logs_to_clipboard_summary">ReVanced のデバッグログをクリップボードにコピーします</string>
|
||||
<string name="revanced_debug_logs_disabled">デバッグログは無効です</string>
|
||||
<string name="revanced_debug_logs_disabled">デバッグログが無効になっています</string>
|
||||
<string name="revanced_debug_logs_none_found">ログが見つかりませんでした</string>
|
||||
<string name="revanced_debug_logs_copied_to_clipboard">ログをコピーしました</string>
|
||||
<string name="revanced_debug_logs_failed_to_export">ログのエクスポートに失敗しました: %s</string>
|
||||
<string name="revanced_debug_logs_clear_buffer_title">デバッグログを消去</string>
|
||||
<string name="revanced_debug_logs_clear_buffer_summary">保存されているすべての ReVanced デバッグログを消去します</string>
|
||||
<string name="revanced_debug_logs_clear_buffer_summary">保存されている ReVanced のすべてのデバッグログを消去します</string>
|
||||
<string name="revanced_debug_logs_clear_toast">ログを消去しました</string>
|
||||
</patch>
|
||||
<patch id="misc.privacy.sanitizeSharingLinksPatch">
|
||||
<string name="revanced_sanitize_sharing_links_title">共有リンクを無害化</string>
|
||||
<string name="revanced_sanitize_sharing_links_summary_on">トラッキング クエリ パラメータが共有リンクから削除されます</string>
|
||||
<string name="revanced_sanitize_sharing_links_summary_off">トラッキング クエリ パラメータは共有リンクから削除されません</string>
|
||||
<string name="revanced_sanitize_sharing_links_summary_on">共有リンクから追跡パラメータが削除されます</string>
|
||||
<string name="revanced_sanitize_sharing_links_summary_off">共有リンクから追跡パラメータは削除されません</string>
|
||||
<string name="revanced_replace_music_with_youtube_title">共有リンクを youtube.com に変更</string>
|
||||
<string name="revanced_replace_music_with_youtube_summary_on">共有リンクには youtube.com が使用されます</string>
|
||||
<string name="revanced_replace_music_with_youtube_summary_off">共有リンクには music.youtube.com が使用されます</string>
|
||||
@@ -168,8 +168,8 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_settings_screen_11_misc_title">その他</string>
|
||||
<string name="revanced_settings_screen_12_video_title">動画</string>
|
||||
<string name="revanced_restore_old_settings_menus_title">古い設定メニューを復元</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">旧バージョンの設定メニューが表示されます</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">旧バージョンの設定メニューは表示されません</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_on">古いスタイルの設定メニューが表示されます</string>
|
||||
<string name="revanced_restore_old_settings_menus_summary_off">新しいスタイルの設定メニューが表示されます</string>
|
||||
</patch>
|
||||
<patch id="misc.backgroundplayback.backgroundPlaybackPatch">
|
||||
<string name="revanced_shorts_disable_background_playback_title">ショートのバックグラウンド再生を無効化</string>
|
||||
@@ -177,9 +177,9 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_shorts_disable_background_playback_summary_off">ショート動画のバックグラウンド再生は有効です</string>
|
||||
</patch>
|
||||
<patch id="misc.debugging.enableDebuggingPatch">
|
||||
<string name="revanced_debug_protobuffer_title">プロトコルバッファを記録</string>
|
||||
<string name="revanced_debug_protobuffer_summary_on">デバッグログに protocol buffer が含まれます</string>
|
||||
<string name="revanced_debug_protobuffer_summary_off">デバッグログに protocol buffer は含まれません</string>
|
||||
<string name="revanced_debug_protobuffer_title">protocol buffer をログに保存</string>
|
||||
<string name="revanced_debug_protobuffer_summary_on">デバッグログには protocol buffer が含まれます</string>
|
||||
<string name="revanced_debug_protobuffer_summary_off">デバッグログには protocol buffer は含まれません</string>
|
||||
<string name="revanced_debug_protobuffer_user_dialog_message">"この設定を有効にすると、一部の UI コンポーネントの画面上のテキストを含む、追加のレイアウトデータがログに記録されます。
|
||||
|
||||
これは、カスタムフィルターを作成する際にコンポーネントを識別するのに役立ちます。
|
||||
@@ -670,7 +670,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_hide_shop_button_summary_on">購入ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shop_button_summary_off">購入ボタンは表示されます</string>
|
||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||
<string name="revanced_hide_save_button_title">「保存」を非表示にする</string>
|
||||
<string name="revanced_hide_save_button_title">保存ボタンを非表示</string>
|
||||
<string name="revanced_hide_save_button_summary_on">「保存」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_save_button_summary_off">「保存」ボタンは表示されます</string>
|
||||
</patch>
|
||||
@@ -708,16 +708,16 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_hide_navigation_button_labels_title">ボタンをアイコンのみで表示</string>
|
||||
<string name="revanced_hide_navigation_button_labels_summary_on">ナビゲーション ボタンはアイコンのみで表示されます</string>
|
||||
<string name="revanced_hide_navigation_button_labels_summary_off">ナビゲーション ボタンはアイコンと文字で表示されます</string>
|
||||
<string name="revanced_disable_translucent_status_bar_title">ステータスバーの半透明化を無効化</string>
|
||||
<string name="revanced_disable_translucent_status_bar_title">半透明ステータスバーを無効化</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_on">ステータスバーは常に透けません</string>
|
||||
<string name="revanced_disable_translucent_status_bar_summary_off">ステータスバーは状況に応じて透けます</string>
|
||||
<string name="revanced_disable_translucent_status_bar_user_dialog_message">一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内のコンポーネントに重なってしまう可能性があります。</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_title">ライトモード時のナビゲーション バーの半透明化を無効にする</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ライトモード時にナビゲーション バーは透けません</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ライトモード時にナビゲーション バーが状況に応じて透けます</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_title">ダークモード時のナビゲーション バーの半透明化を無効にする</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_on">ダークモード時にナビゲーション バーは透けません</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_off">ダークモード時にナビゲーション バーは状況に応じて透けます</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_title">ライトモード時の半透明バーを無効化</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ライトモード時にはナビゲーション バーは透けません</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ライトモード時にはナビゲーション バーが状況に応じて透けます</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_title">ダークモード時の半透明バーを無効化</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_on">ダークモード時にはナビゲーション バーは透けません</string>
|
||||
<string name="revanced_disable_translucent_navigation_bar_dark_summary_off">ダークモード時にはナビゲーション バーが状況に応じて透けます</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.player.flyoutmenupanel.hidePlayerFlyoutMenuPatch">
|
||||
<string name="revanced_hide_player_flyout_title">フライアウト メニュー</string>
|
||||
@@ -799,7 +799,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">前の動画ボタンと次の動画ボタンは表示されません</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">前の動画ボタンと次の動画ボタンは表示されます</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">終了画面カードを非表示</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">終了画面カードは表示されません</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">終了画面カードは表示されます</string>
|
||||
@@ -833,18 +833,18 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
<string name="revanced_shorts_player_screen_summary">ショート プレーヤーのコンポーネントを表示または非表示にします</string>
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
|
||||
<string name="revanced_hide_shorts_home_title">ホームフィードでショートを非表示</string>
|
||||
<string name="revanced_hide_shorts_home_summary_on">ショート動画はホームフィードおよび関連動画に表示されません</string>
|
||||
<string name="revanced_hide_shorts_home_summary_off">ショート動画はホームフィードおよび関連動画に表示されます</string>
|
||||
<string name="revanced_hide_shorts_home_summary_on">ホームフィードおよび関連動画にはショート動画は表示されません</string>
|
||||
<string name="revanced_hide_shorts_home_summary_off">ホームフィードおよび関連動画にはショート動画が表示されます</string>
|
||||
<string name="revanced_hide_shorts_search_title">検索結果でショートを非表示</string>
|
||||
<string name="revanced_hide_shorts_search_summary_on">ショート動画は検索結果に表示されません</string>
|
||||
<string name="revanced_hide_shorts_search_summary_off">ショート動画は検索結果に表示されます</string>
|
||||
<string name="revanced_hide_shorts_search_summary_on">検索結果にはショート動画は表示されません</string>
|
||||
<string name="revanced_hide_shorts_search_summary_off">検索結果にはショート動画が表示されます</string>
|
||||
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
|
||||
<string name="revanced_hide_shorts_subscriptions_title">登録チャンネル フィードでショートを非表示</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_on">ショート動画は登録チャンネル フィードに表示されません</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_off">ショート動画は登録チャンネル フィードに表示されます</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_on">登録チャンネル フィードにはショート動画は表示されません</string>
|
||||
<string name="revanced_hide_shorts_subscriptions_summary_off">登録チャンネル フィードにはショート動画が表示されます</string>
|
||||
<string name="revanced_hide_shorts_history_title">再生履歴でショートを非表示</string>
|
||||
<string name="revanced_hide_shorts_history_summary_on">ショート動画は再生履歴に表示されません</string>
|
||||
<string name="revanced_hide_shorts_history_summary_off">ショート動画は再生履歴に表示されます</string>
|
||||
<string name="revanced_hide_shorts_history_summary_on">再生履歴にはショート動画は表示されません</string>
|
||||
<string name="revanced_hide_shorts_history_summary_off">再生履歴にはショート動画が表示されます</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_title">「Super Thanks を購入する」ボタンを非表示</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_on">「Super Thanks を購入する」ボタンは表示されません</string>
|
||||
<string name="revanced_hide_shorts_super_thanks_button_summary_off">「Super Thanks を購入する」ボタンは表示されます</string>
|
||||
@@ -1047,7 +1047,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が
|
||||
シークバー サムネイルは、再生中の動画と同じ画質になります。
|
||||
|
||||
この機能は、非常に高速なインターネット接続を使用して 720P 以下の画質で動画を視聴する場合に最適です。"</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_title">古いスタイルのシークバー サムネイルを復元</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_title">古いシークバー サムネイルを復元</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">シーク中のサムネイルはシークバーの上に表示されます</string>
|
||||
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">シーク中のサムネイルはプレーヤー画面全体に表示されます</string>
|
||||
</patch>
|
||||
@@ -1287,7 +1287,7 @@ Automotive レイアウト
|
||||
|
||||
再び偽装を無効にする場合には、UI のバグを防ぐためにアプリデータを消去することをお勧めします。"</string>
|
||||
<string name="revanced_spoof_app_version_target_title">アプリバージョンの偽装先</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_1">20.13.41 - アクション ボタンの文字表示を復元</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_1">20.13.41 - アクション ボタンの文字の常時表示を復元</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_2">20.05.46 - 文字起こし機能を復元</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_3">19.35.36 - 古いショート プレーヤーのアイコンを復元</string>
|
||||
<string name="revanced_spoof_app_version_target_entry_4">19.01.34 - 古いナビゲーション アイコンを復元</string>
|
||||
@@ -1415,11 +1415,11 @@ Automotive レイアウト
|
||||
<string name="revanced_header_logo_entry_6">カスタム</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.bypassImageRegionRestrictionsPatch">
|
||||
<string name="revanced_bypass_image_region_restrictions_title">画像表示の地域制限を回避する</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_title">画像表示の地域制限を回避</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_on">yt4.ggpht.com から画像を取得します</string>
|
||||
<string name="revanced_bypass_image_region_restrictions_summary_off">"オリジナルの画像ホストから画像を取得します
|
||||
|
||||
この機能を有効にすると、一部の地域でブロックされている画像が表示される可能性があります"</string>
|
||||
この機能を有効にすると、一部の地域でブロックされている画像が表示されるようになる可能性があります"</string>
|
||||
</patch>
|
||||
<patch id="layout.thumbnails.alternativeThumbnailsPatch">
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the Home tab. -->
|
||||
@@ -1456,10 +1456,10 @@ Automotive レイアウト
|
||||
<string name="revanced_alt_thumbnail_dearrow_error_generic">DeArrow は一時的に利用できません</string>
|
||||
</patch>
|
||||
<patch id="misc.announcements.announcementsPatch">
|
||||
<string name="revanced_announcements_title">ReVanced のお知らせを表示する</string>
|
||||
<string name="revanced_announcements_summary_on">お知らせは、アプリ起動時に表示されます</string>
|
||||
<string name="revanced_announcements_summary_off">お知らせは、アプリ起動時に表示されません</string>
|
||||
<string name="revanced_announcements_enabled_summary">アプリ起動時にお知らせを表示する</string>
|
||||
<string name="revanced_announcements_title">ReVanced のお知らせを表示</string>
|
||||
<string name="revanced_announcements_summary_on">アプリの起動時にお知らせが表示されます</string>
|
||||
<string name="revanced_announcements_summary_off">アプリの起動時にお知らせは表示されません</string>
|
||||
<string name="revanced_announcements_enabled_summary">アプリの起動時にお知らせを表示します</string>
|
||||
<string name="revanced_announcements_connection_failed">お知らせの取得に失敗しました</string>
|
||||
<string name="revanced_announcements_dialog_dismiss">閉じる</string>
|
||||
</patch>
|
||||
@@ -1489,16 +1489,16 @@ Automotive レイアウト
|
||||
<patch id="misc.hapticfeedback.disableHapticFeedbackPatch">
|
||||
<string name="revanced_disable_haptic_feedback_title">触覚フィードバック</string>
|
||||
<string name="revanced_disable_haptic_feedback_summary">触覚フィードバックの設定を変更します</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_title">チャプターの触覚フィードバックを無効にする</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_title">チャプターの触覚フィードバックを無効化</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_summary_on">チャプターの触覚フィードバックは無効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_chapters_summary_off">チャプターの触覚フィードバックは有効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_title">精密シークの触覚フィードバックを無効化</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_on">精密シークの触覚フィードバックは無効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_precise_seeking_summary_off">精密シークの触覚フィードバックは有効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_title">シーク取り消しの触覚フィードバックを無効にする</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_title">シーク取り消しの触覚フィードバックを無効化</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_summary_on">シーク取り消しの触覚フィードバックは無効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_seek_undo_summary_off">シーク取り消しの触覚フィードバックは有効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_zoom_title">ズームの触覚フィードバックを無効にする</string>
|
||||
<string name="revanced_disable_haptic_feedback_zoom_title">ズームの触覚フィードバックを無効化</string>
|
||||
<string name="revanced_disable_haptic_feedback_zoom_summary_on">ズームの触覚フィードバックは無効です</string>
|
||||
<string name="revanced_disable_haptic_feedback_zoom_summary_off">ズームの触覚フィードバックは有効です</string>
|
||||
</patch>
|
||||
@@ -1506,8 +1506,8 @@ Automotive レイアウト
|
||||
<string name="microg_offline_account_login_error">最近アカウントのログイン情報を変更した場合は、MicroG をアンインストールして再インストールしてください。</string>
|
||||
</patch>
|
||||
<patch id="misc.links.bypassURLRedirectsPatch">
|
||||
<string name="revanced_bypass_url_redirects_title">URL リダイレクトを回避する</string>
|
||||
<string name="revanced_bypass_url_redirects_summary_on">YouTube の URL リダイレクトを経由せずにリンクへ移動します</string>
|
||||
<string name="revanced_bypass_url_redirects_title">URL リダイレクトを回避</string>
|
||||
<string name="revanced_bypass_url_redirects_summary_on">YouTube の URL リダイレクトを経由せずにリンク先へ移動します</string>
|
||||
<string name="revanced_bypass_url_redirects_summary_off">YouTube の URL リダイレクトを経由してリンク先へ移動します</string>
|
||||
</patch>
|
||||
<patch id="misc.links.openLinksExternallyPatch">
|
||||
@@ -1525,23 +1525,23 @@ Automotive レイアウト
|
||||
<patch id="video.quality.rememberVideoQualityPatch">
|
||||
<!-- Translations should use the same text as 'revanced_custom_playback_speeds_auto'. -->
|
||||
<string name="revanced_video_quality_default_entry_1">自動</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_title">画質の変更を保存する</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_title">画質の変更を保存</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_on">画質の変更はすべての動画に適用されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_summary_off">画質の変更は現在の動画にのみ適用されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_title">画質の変更時にトーストを表示</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">デフォルトの画質が変更されたとき、トーストが表示されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">デフォルトの画質が変更されたとき、トーストは表示されません</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_on">デフォルトの画質が変更された場合にトースト通知が表示されます</string>
|
||||
<string name="revanced_remember_video_quality_last_selected_toast_summary_off">デフォルトの画質が変更された場合にトースト通知は表示されません</string>
|
||||
<string name="revanced_video_quality_default_wifi_title">デフォルトの画質(Wi-Fi)</string>
|
||||
<string name="revanced_video_quality_default_mobile_title">デフォルトの画質(携帯回線)</string>
|
||||
<string name="revanced_remember_shorts_quality_last_selected_title">ショートの画質の変更を保存する</string>
|
||||
<string name="revanced_remember_shorts_quality_last_selected_title">ショートの画質の変更を保存</string>
|
||||
<string name="revanced_remember_shorts_quality_last_selected_summary_on">画質の変更はすべてのショート動画に適用されます</string>
|
||||
<string name="revanced_remember_shorts_quality_last_selected_summary_off">画質の変更は現在のショート動画にのみ適用されます</string>
|
||||
<string name="revanced_shorts_quality_default_wifi_title">デフォルトのショートの画質(Wi-Fi)</string>
|
||||
<string name="revanced_shorts_quality_default_mobile_title">デフォルトのショートの画質(携帯回線)</string>
|
||||
<string name="revanced_remember_video_quality_mobile">携帯回線</string>
|
||||
<string name="revanced_remember_video_quality_wifi">Wi-Fi</string>
|
||||
<string name="revanced_remember_video_quality_toast">デフォルトの画質 (%1$s): %2$s</string>
|
||||
<string name="revanced_remember_video_quality_toast_shorts">ショートの画質 (%1$s): %2$s</string>
|
||||
<string name="revanced_remember_video_quality_toast">デフォルトの画質の変更 (%1$s): %2$s</string>
|
||||
<string name="revanced_remember_video_quality_toast_shorts">ショートの画質の変更 (%1$s): %2$s</string>
|
||||
</patch>
|
||||
<patch id="video.speed.button.playbackSpeedButtonPatch">
|
||||
<string name="revanced_playback_speed_dialog_button_title">再生速度設定ボタンを表示</string>
|
||||
@@ -1561,25 +1561,25 @@ Automotive レイアウト
|
||||
<string name="revanced_restore_old_speed_menu_summary_on">古いスタイルの再生速度メニューが表示されます</string>
|
||||
<string name="revanced_restore_old_speed_menu_summary_off">新しいスタイルの再生速度メニューが表示されます</string>
|
||||
<string name="revanced_custom_playback_speeds_title">カスタム再生速度リスト</string>
|
||||
<string name="revanced_custom_playback_speeds_summary">カスタム再生速度を追加または変更します</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">再生速度は %s 未満である必要があります</string>
|
||||
<string name="revanced_custom_playback_speeds_parse_exception">カスタム再生速度が無効です</string>
|
||||
<string name="revanced_custom_playback_speeds_summary">カスタム再生速度リストを編集します</string>
|
||||
<string name="revanced_custom_playback_speeds_invalid">再生速度は %s 未満でなければなりません</string>
|
||||
<string name="revanced_custom_playback_speeds_parse_exception">カスタム再生速度リストの値が無効です</string>
|
||||
<string name="revanced_custom_playback_speeds_auto">自動</string>
|
||||
<string name="revanced_speed_tap_and_hold_title">長押し倍速再生の速度</string>
|
||||
<string name="revanced_speed_tap_and_hold_summary">再生速度の範囲は 0-8 で、0 および 8 は含まれません</string>
|
||||
</patch>
|
||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">再生速度の変更を保存する</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_title">再生速度の変更を保存</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_summary_on">再生速度の変更はすべての動画に適用されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_summary_off">再生速度の変更は現在の動画にのみ適用されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_title">再生速度の変更時にトーストを表示</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">デフォルトの再生速度が変更されたとき、トーストが表示されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">デフォルトの再生速度が変更されたとき、トーストは表示されません</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">デフォルトの再生速度が変更されたときにトースト通知が表示されます</string>
|
||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">デフォルトの再生速度が変更されたときにトースト通知は表示されません</string>
|
||||
<string name="revanced_playback_speed_default_title">デフォルトの再生速度</string>
|
||||
<string name="revanced_remember_playback_speed_toast">デフォルトの再生速度: %s</string>
|
||||
<string name="revanced_remember_playback_speed_toast">デフォルトの再生速度の変更: %s</string>
|
||||
</patch>
|
||||
<patch id="video.codecs.disableVideoCodecsPatch">
|
||||
<string name="revanced_disable_hdr_video_title">HDR 動画を無効にする</string>
|
||||
<string name="revanced_disable_hdr_video_title">HDR 動画を無効化</string>
|
||||
<string name="revanced_disable_hdr_video_summary_on">HDR 動画は無効です</string>
|
||||
<string name="revanced_disable_hdr_video_summary_off">HDR 動画は有効です</string>
|
||||
<string name="revanced_force_avc_codec_title">AVC (H.264) を強制的に使用</string>
|
||||
@@ -1615,9 +1615,9 @@ Automotive レイアウト
|
||||
<string name="revanced_spoof_video_streams_about_kids_videos">• ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある</string>
|
||||
<!-- "Force original audio" should use the same text as revanced_force_original_audio_title -->
|
||||
<string name="revanced_spoof_video_streams_about_no_force_original_audio">•「オリジナルの音声を強制的に使用」が利用できない</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">統計情報に表示する</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">統計情報に現在のクライアントが表示されます</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">統計情報に現在のクライアントは表示されません</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">統計情報にクライアントを表示</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">統計情報には現在のクライアントが表示されます</string>
|
||||
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">統計情報には現在のクライアントは表示されません</string>
|
||||
<string name="revanced_spoof_video_streams_language_title">音声ストリームの言語</string>
|
||||
<!-- 'Force original audio language' should use the same text as revanced_force_original_audio_title -->
|
||||
<string name="revanced_spoof_video_streams_language_not_available">特定の音声言語を選択するには、「オリジナルの音声を強制的に使用」を無効にしてください</string>
|
||||
@@ -1640,7 +1640,7 @@ Automotive レイアウト
|
||||
<patch id="interaction.permanentrepeat.permanentRepeatPatch">
|
||||
<string name="revanced_music_play_permanent_repeat_title">常時リピートを有効化</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_on">常時リピートは有効です\n\nリピート設定が保存され常時適用されます</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_off">常時リピートは無効です\n\nリピート設定は保存されずリセットされます</string>
|
||||
<string name="revanced_music_play_permanent_repeat_summary_off">常時リピートは無効です\n\nリピート設定は保存されず毎回リセットされます</string>
|
||||
</patch>
|
||||
<patch id="layout.castbutton.hideCastButton">
|
||||
<string name="revanced_music_hide_cast_button_title">キャストボタンを非表示</string>
|
||||
@@ -1714,10 +1714,10 @@ Automotive レイアウト
|
||||
</patch>
|
||||
<patch id="chat.antidelete.showDeletedMessagesPatch">
|
||||
<string name="revanced_deleted_msg">メッセージを削除しました</string>
|
||||
<string name="revanced_show_deleted_messages_title">削除されたメッセージを表示</string>
|
||||
<string name="revanced_show_deleted_messages_title">削除されたメッセージの表示方法</string>
|
||||
<string name="revanced_show_deleted_messages_entry_1">削除されたメッセージを表示しない</string>
|
||||
<string name="revanced_show_deleted_messages_entry_2">スポイラーの後ろに削除されたメッセージを非表示にする</string>
|
||||
<string name="revanced_show_deleted_messages_entry_3">クロスアウトテキストとして削除されたメッセージを表示</string>
|
||||
<string name="revanced_show_deleted_messages_entry_2">削除されたメッセージをスポイラー表示で隠して表示する</string>
|
||||
<string name="revanced_show_deleted_messages_entry_3">削除されたメッセージを取り消し線つきで表示する</string>
|
||||
</patch>
|
||||
<patch id="chat.autoclaim.autoClaimChannelPointsPatch">
|
||||
<string name="revanced_auto_claim_channel_points_title">チャンネルポイントを自動的に獲得する</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -150,7 +150,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -796,7 +796,7 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">이전 & 다음 동영상 버튼이 숨겨집니다</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">이전 & 다음 동영상 버튼이 표시됩니다</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">최종 화면 카드 숨기기</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">최종 화면 카드가 숨겨집니다</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">최종 화면 카드가 표시됩니다</string>
|
||||
@@ -1067,12 +1067,12 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">건너뛰기 버튼이 몇 초 후에 숨겨집니다</string>
|
||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration">건너뛰기 버튼 표시 시간</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 설정할 수 있습니다</string>
|
||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 지정할 수 있습니다</string>
|
||||
<string name="revanced_sb_general_skiptoast">건너뛰기 취소 메시지 표시하기</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_on">구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 탭하여 건너뛰기를 취소할 수 있습니다</string>
|
||||
<string name="revanced_sb_general_skiptoast_sum_off">팝업 메시지를 표시하지 않습니다</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration">건너뛰기 취소 메시지 표시 시간</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">건너뛰기 취소 팝업 메시지가 표시되는 시간을 설정할 수 있습니다</string>
|
||||
<string name="revanced_sb_toast_on_skip_duration_sum">건너뛰기 취소 팝업 메시지가 표시되는 시간을 지정할 수 있습니다</string>
|
||||
<string name="revanced_sb_duration_1s">1 초</string>
|
||||
<string name="revanced_sb_duration_2s">2 초</string>
|
||||
<string name="revanced_sb_duration_3s">3 초</string>
|
||||
@@ -1108,7 +1108,7 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니
|
||||
<string name="revanced_sb_general_skipcount_sum_off">건너뛴 횟수 기록을 비활성화합니다</string>
|
||||
<string name="revanced_sb_general_min_duration">건너뛸 최소 구간 길이</string>
|
||||
<string name="revanced_sb_general_min_duration_sum">설정한 값(초)보다 작은 구간은 건너뛰지 않으며, 재생바에도 표시되지 않습니다</string>
|
||||
<string name="revanced_sb_general_min_duration_invalid">잘못된 지속 시간입니다</string>
|
||||
<string name="revanced_sb_general_min_duration_invalid">잘못된 표시 시간입니다</string>
|
||||
<string name="revanced_sb_general_uuid">비공개 사용자 아이디</string>
|
||||
<string name="revanced_sb_general_uuid_sum">비공개 사용자 아이디는 SponsorBlock 서버에서 구간을 제출하거나 건너뛴 구간 정보를 기록하는데 사용되는 고유 아이디 입니다. 절대 다른 이에게 공개하지 마세요</string>
|
||||
<string name="revanced_sb_general_uuid_invalid">비공개 사용자 아이디는 30자 이상이어야 합니다</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
@@ -797,7 +797,7 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Klastoti vaizdo srautus“
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Mygtukai yra paslėpti</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Mygtukai yra rodomi</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Slėpti ekrano pabaigos korteles</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Ekrano pabaigos kortelės yra paslėptos</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Ekrano pabaigos kortelės yra rodomos</string>
|
||||
|
||||
@@ -797,7 +797,7 @@ Lai parādītu audio celiņa izvēlni, mainiet \"Atdarināt video straumes\" uz
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_on">Pogas ir paslēptas</string>
|
||||
<string name="revanced_hide_player_previous_next_buttons_summary_off">Pogas ir redzamas</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
<string name="revanced_hide_endscreen_cards_title">Paslēpt ekrāna beigās esošās kartītes</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_on">Ekrāna beigās esošās kartītes ir paslēptas</string>
|
||||
<string name="revanced_hide_endscreen_cards_summary_off">Ekrāna beigās esošās kartītes ir redzamas</string>
|
||||
|
||||
@@ -135,7 +135,7 @@ Second \"item\" text"</string>
|
||||
<patch id="layout.buttons.overlay.hidePlayerOverlayButtonsPatch">
|
||||
<!-- This button does not display any text, but 'Captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title'. -->
|
||||
</patch>
|
||||
<patch id="layout.hide.endscreencards.hideEndscreenCardsResourcePatch">
|
||||
<patch id="layout.hide.endscreencards.hideEndScreenCardsResourcePatch">
|
||||
</patch>
|
||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||
</patch>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user