mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-14 13:21:02 +01:00
Compare commits
9 Commits
v5.0.0-dev
...
v5.0.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e75ffd5f1 | ||
|
|
75d661fcdc | ||
|
|
4d1de6bc50 | ||
|
|
327ebd3649 | ||
|
|
34e98a54e0 | ||
|
|
bc3c61a6a0 | ||
|
|
a0c227f1a0 | ||
|
|
87fcf3135d | ||
|
|
4b4670cd4f |
21
CHANGELOG.md
21
CHANGELOG.md
@@ -1,3 +1,24 @@
|
|||||||
|
# [5.0.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.0.0-dev.3...v5.0.0-dev.4) (2024-11-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Remember video quality:** Correctly set default quality when changing from a low quality video ([#3879](https://github.com/ReVanced/revanced-patches/issues/3879)) ([ddb73e8](https://github.com/ReVanced/revanced-patches/commit/ddb73e857d7c26fd27ea995a27f53f5660d3f71c))
|
||||||
|
|
||||||
|
# [5.0.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.0.0-dev.2...v5.0.0-dev.3) (2024-11-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Add missing dependency to patch ([97f5240](https://github.com/ReVanced/revanced-patches/commit/97f5240d53b9978fb3745170fe03619c7c90274a))
|
||||||
|
|
||||||
|
# [5.0.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.0.0-dev.1...v5.0.0-dev.2) (2024-11-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Return YouTube Dislike:** Show Shorts dislikes with new A/B button icons ([084e0a5](https://github.com/ReVanced/revanced-patches/commit/084e0a527b1c75d1ef15dc706c429aa48d0ffe6b))
|
||||||
|
|
||||||
# [5.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.18.0-dev.6...v5.0.0-dev.1) (2024-11-06)
|
# [5.0.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.18.0-dev.6...v5.0.0-dev.1) (2024-11-06)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,10 @@ import android.widget.TextView;
|
|||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
import app.revanced.extension.shared.Utils;
|
import app.revanced.extension.shared.Utils;
|
||||||
@@ -84,8 +81,8 @@ public final class AnnouncementsPatch {
|
|||||||
try {
|
try {
|
||||||
if (isLatestAlready()) return;
|
if (isLatestAlready()) return;
|
||||||
|
|
||||||
HttpURLConnection connection = AnnouncementsRoutes.getAnnouncementsConnectionFromRoute(
|
HttpURLConnection connection = AnnouncementsRoutes
|
||||||
GET_LATEST_ANNOUNCEMENTS, Locale.getDefault().toLanguageTag());
|
.getAnnouncementsConnectionFromRoute(GET_LATEST_ANNOUNCEMENTS);
|
||||||
|
|
||||||
Logger.printDebug(() -> "Get latest announcements route connection url: " + connection.getURL());
|
Logger.printDebug(() -> "Get latest announcements route connection url: " + connection.getURL());
|
||||||
|
|
||||||
@@ -98,11 +95,11 @@ public final class AnnouncementsPatch {
|
|||||||
LocalDateTime archivedAt = LocalDateTime.MAX;
|
LocalDateTime archivedAt = LocalDateTime.MAX;
|
||||||
Level level = Level.INFO;
|
Level level = Level.INFO;
|
||||||
try {
|
try {
|
||||||
final var announcement = new JSONObject(jsonString);
|
final var announcement = new JSONArray(jsonString).getJSONObject(0);
|
||||||
|
|
||||||
id = announcement.getInt("id");
|
id = announcement.getInt("id");
|
||||||
title = announcement.getString("title");
|
title = announcement.getString("title");
|
||||||
message = announcement.getJSONObject("content").getString("message");
|
message = announcement.getString("content");
|
||||||
if (!announcement.isNull("archived_at")) {
|
if (!announcement.isNull("archived_at")) {
|
||||||
archivedAt = LocalDateTime.parse(announcement.getString("archived_at"));
|
archivedAt = LocalDateTime.parse(announcement.getString("archived_at"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import java.net.HttpURLConnection;
|
|||||||
import static app.revanced.extension.youtube.requests.Route.Method.GET;
|
import static app.revanced.extension.youtube.requests.Route.Method.GET;
|
||||||
|
|
||||||
public class AnnouncementsRoutes {
|
public class AnnouncementsRoutes {
|
||||||
public static final Route GET_LATEST_ANNOUNCEMENTS = new Route(GET, "/announcements/latest?tag=youtube");
|
|
||||||
public static final Route GET_LATEST_ANNOUNCEMENT_IDS = new Route(GET, "/announcements/latest/id?tag=youtube");
|
|
||||||
private static final String ANNOUNCEMENTS_PROVIDER = "https://api.revanced.app/v4";
|
private static final String ANNOUNCEMENTS_PROVIDER = "https://api.revanced.app/v4";
|
||||||
|
public static final Route GET_LATEST_ANNOUNCEMENT_IDS = new Route(GET, "/announcements/latest/id?tag=youtube");
|
||||||
|
public static final Route GET_LATEST_ANNOUNCEMENTS = new Route(GET, "/announcements/latest?tag=youtube");
|
||||||
|
|
||||||
private AnnouncementsRoutes() {
|
private AnnouncementsRoutes() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,15 +76,10 @@ public final class ReturnYouTubeDislikeFilterPatch extends Filter {
|
|||||||
new StringFilterGroup(null, "|shorts_dislike_button.eml")
|
new StringFilterGroup(null, "|shorts_dislike_button.eml")
|
||||||
);
|
);
|
||||||
|
|
||||||
// After the likes icon name is some binary data and then the video id for that specific short.
|
// After the button identifiers is binary data and then the video id for that specific short.
|
||||||
videoIdFilterGroup.addAll(
|
videoIdFilterGroup.addAll(
|
||||||
// on_shadowed = Video was previously like/disliked before opening.
|
new ByteArrayFilterGroup(null, "id.reel_like_button"),
|
||||||
// off_shadowed = Video was not previously liked/disliked before opening.
|
new ByteArrayFilterGroup(null, "id.reel_dislike_button")
|
||||||
new ByteArrayFilterGroup(null, "ic_right_like_on_shadowed"),
|
|
||||||
new ByteArrayFilterGroup(null, "ic_right_like_off_shadowed"),
|
|
||||||
|
|
||||||
new ByteArrayFilterGroup(null, "ic_right_dislike_on_shadowed"),
|
|
||||||
new ByteArrayFilterGroup(null, "ic_right_dislike_off_shadowed")
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -416,7 +416,6 @@ public final class ShortsFilter extends Filter {
|
|||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
public static void setNavigationBar(PivotBar view) {
|
public static void setNavigationBar(PivotBar view) {
|
||||||
Logger.printDebug(() -> "Setting navigation bar");
|
|
||||||
pivotBarRef = new WeakReference<>(view);
|
pivotBarRef = new WeakReference<>(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,19 +62,12 @@ public class RememberVideoQualityPatch {
|
|||||||
*/
|
*/
|
||||||
public static int setVideoQuality(Object[] qualities, final int originalQualityIndex, Object qInterface, String qIndexMethod) {
|
public static int setVideoQuality(Object[] qualities, final int originalQualityIndex, Object qInterface, String qIndexMethod) {
|
||||||
try {
|
try {
|
||||||
if (!(qualityNeedsUpdating || userChangedDefaultQuality) || qInterface == null) {
|
final int preferredQuality = Utils.getNetworkType() == NetworkType.MOBILE
|
||||||
return originalQualityIndex;
|
? mobileQualitySetting.get()
|
||||||
}
|
: wifiQualitySetting.get();
|
||||||
qualityNeedsUpdating = false;
|
|
||||||
|
|
||||||
final int preferredQuality;
|
|
||||||
if (Utils.getNetworkType() == NetworkType.MOBILE) {
|
|
||||||
preferredQuality = mobileQualitySetting.get();
|
|
||||||
} else {
|
|
||||||
preferredQuality = wifiQualitySetting.get();
|
|
||||||
}
|
|
||||||
if (!userChangedDefaultQuality && preferredQuality == AUTOMATIC_VIDEO_QUALITY_VALUE) {
|
if (!userChangedDefaultQuality && preferredQuality == AUTOMATIC_VIDEO_QUALITY_VALUE) {
|
||||||
return originalQualityIndex; // nothing to do
|
return originalQualityIndex; // Nothing to do.
|
||||||
}
|
}
|
||||||
|
|
||||||
if (videoQualities == null || videoQualities.size() != qualities.length) {
|
if (videoQualities == null || videoQualities.size() != qualities.length) {
|
||||||
@@ -87,7 +80,11 @@ public class RememberVideoQualityPatch {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Logger.printDebug(() -> "videoQualities: " + videoQualities);
|
|
||||||
|
// After changing videos the qualities can initially be for the prior video.
|
||||||
|
// So if the qualities have changed an update is needed.
|
||||||
|
qualityNeedsUpdating = true;
|
||||||
|
Logger.printDebug(() -> "VideoQualities: " + videoQualities);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userChangedDefaultQuality) {
|
if (userChangedDefaultQuality) {
|
||||||
@@ -98,7 +95,12 @@ public class RememberVideoQualityPatch {
|
|||||||
return userSelectedQualityIndex;
|
return userSelectedQualityIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// find the highest quality that is equal to or less than the preferred
|
if (!qualityNeedsUpdating) {
|
||||||
|
return originalQualityIndex;
|
||||||
|
}
|
||||||
|
qualityNeedsUpdating = false;
|
||||||
|
|
||||||
|
// Find the highest quality that is equal to or less than the preferred.
|
||||||
int qualityToUse = videoQualities.get(0); // first element is automatic mode
|
int qualityToUse = videoQualities.get(0); // first element is automatic mode
|
||||||
int qualityIndexToUse = 0;
|
int qualityIndexToUse = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -112,20 +114,18 @@ public class RememberVideoQualityPatch {
|
|||||||
|
|
||||||
// If the desired quality index is equal to the original index,
|
// If the desired quality index is equal to the original index,
|
||||||
// then the video is already set to the desired default quality.
|
// then the video is already set to the desired default quality.
|
||||||
//
|
final int qualityToUseFinal = qualityToUse;
|
||||||
// The method could return here, but the UI video quality flyout will still
|
|
||||||
// show 'Auto' (ie: Auto (480p))
|
|
||||||
// It appears that "Auto" picks the resolution on video load,
|
|
||||||
// and it does not appear to change the resolution during playback.
|
|
||||||
//
|
|
||||||
// To prevent confusion, set the video index anyways (even if it matches the existing index)
|
|
||||||
// As that will force the UI picker to not display "Auto" which may confuse the user.
|
|
||||||
if (qualityIndexToUse == originalQualityIndex) {
|
if (qualityIndexToUse == originalQualityIndex) {
|
||||||
Logger.printDebug(() -> "Video is already preferred quality: " + preferredQuality);
|
// On first load of a new video, if the UI video quality flyout menu
|
||||||
|
// is not updated then it will still show 'Auto' (ie: Auto (480p)),
|
||||||
|
// even though it's already set to the desired resolution.
|
||||||
|
//
|
||||||
|
// To prevent confusion, set the video index anyways (even if it matches the existing index)
|
||||||
|
// as that will force the UI picker to not display "Auto".
|
||||||
|
Logger.printDebug(() -> "Video is already preferred quality: " + qualityToUseFinal);
|
||||||
} else {
|
} else {
|
||||||
final int qualityToUseLog = qualityToUse;
|
Logger.printDebug(() -> "Changing video quality from: "
|
||||||
Logger.printDebug(() -> "Quality changed from: "
|
+ videoQualities.get(originalQualityIndex) + " to: " + qualityToUseFinal);
|
||||||
+ videoQualities.get(originalQualityIndex) + " to: " + qualityToUseLog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Method m = qInterface.getClass().getMethod(qIndexMethod, Integer.TYPE);
|
Method m = qInterface.getClass().getMethod(qIndexMethod, Integer.TYPE);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package app.revanced.extension.youtube.patches.theme;
|
package app.revanced.extension.youtube.patches.theme;
|
||||||
|
|
||||||
import app.revanced.extension.youtube.settings.Settings;
|
|
||||||
import app.revanced.extension.shared.Utils;
|
import app.revanced.extension.shared.Utils;
|
||||||
import app.revanced.extension.youtube.ThemeHelper;
|
import app.revanced.extension.youtube.ThemeHelper;
|
||||||
|
import app.revanced.extension.youtube.settings.Settings;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class ThemePatch {
|
public class ThemePatch {
|
||||||
@@ -21,12 +21,15 @@ public class ThemePatch {
|
|||||||
-98492127 // video chapters list background
|
-98492127 // video chapters list background
|
||||||
};
|
};
|
||||||
|
|
||||||
// background colors
|
// Background colors.
|
||||||
private static int whiteColor = 0;
|
private static final int WHITE_COLOR = Utils.getResourceColor("yt_white1");
|
||||||
private static int blackColor = 0;
|
private static final int BLACK_COLOR = Utils.getResourceColor("yt_black1");
|
||||||
|
|
||||||
|
private static final boolean GRADIENT_LOADING_SCREEN_ENABLED = Settings.GRADIENT_LOADING_SCREEN.get();
|
||||||
|
|
||||||
// Used by app.revanced.patches.youtube.layout.theme.patch.LithoThemePatch
|
|
||||||
/**
|
/**
|
||||||
|
* Injection point.
|
||||||
|
*
|
||||||
* Change the color of Litho components.
|
* Change the color of Litho components.
|
||||||
* If the color of the component matches one of the values, return the background color .
|
* If the color of the component matches one of the values, return the background color .
|
||||||
*
|
*
|
||||||
@@ -35,29 +38,24 @@ public class ThemePatch {
|
|||||||
*/
|
*/
|
||||||
public static int getValue(int originalValue) {
|
public static int getValue(int originalValue) {
|
||||||
if (ThemeHelper.isDarkTheme()) {
|
if (ThemeHelper.isDarkTheme()) {
|
||||||
if (anyEquals(originalValue, DARK_VALUES)) return getBlackColor();
|
if (anyEquals(originalValue, DARK_VALUES)) return BLACK_COLOR;
|
||||||
} else {
|
} else {
|
||||||
if (anyEquals(originalValue, WHITE_VALUES)) return getWhiteColor();
|
if (anyEquals(originalValue, WHITE_VALUES)) return WHITE_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return originalValue;
|
return originalValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean gradientLoadingScreenEnabled() {
|
|
||||||
return Settings.GRADIENT_LOADING_SCREEN.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getBlackColor() {
|
|
||||||
if (blackColor == 0) blackColor = Utils.getResourceColor("yt_black1");
|
|
||||||
return blackColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getWhiteColor() {
|
|
||||||
if (whiteColor == 0) whiteColor = Utils.getResourceColor("yt_white1");
|
|
||||||
return whiteColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean anyEquals(int value, int... of) {
|
private static boolean anyEquals(int value, int... of) {
|
||||||
for (int v : of) if (value == v) return true;
|
for (int v : of) if (value == v) return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injection point.
|
||||||
|
*/
|
||||||
|
public static boolean gradientLoadingScreenEnabled() {
|
||||||
|
return GRADIENT_LOADING_SCREEN_ENABLED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class Settings extends BaseSettings {
|
|||||||
|
|
||||||
// Uncategorized layout related settings. Do not add to this section, and instead move these out and categorize them.
|
// Uncategorized layout related settings. Do not add to this section, and instead move these out and categorize them.
|
||||||
public static final BooleanSetting DISABLE_SUGGESTED_VIDEO_END_SCREEN = new BooleanSetting("revanced_disable_suggested_video_end_screen", FALSE, true);
|
public static final BooleanSetting DISABLE_SUGGESTED_VIDEO_END_SCREEN = new BooleanSetting("revanced_disable_suggested_video_end_screen", FALSE, true);
|
||||||
public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE);
|
public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE, true);
|
||||||
public static final BooleanSetting HIDE_HORIZONTAL_SHELVES = new BooleanSetting("revanced_hide_horizontal_shelves", TRUE);
|
public static final BooleanSetting HIDE_HORIZONTAL_SHELVES = new BooleanSetting("revanced_hide_horizontal_shelves", TRUE);
|
||||||
public static final BooleanSetting HIDE_CAPTIONS_BUTTON = new BooleanSetting("revanced_hide_captions_button", FALSE);
|
public static final BooleanSetting HIDE_CAPTIONS_BUTTON = new BooleanSetting("revanced_hide_captions_button", FALSE);
|
||||||
public static final BooleanSetting HIDE_CHANNEL_BAR = new BooleanSetting("revanced_hide_channel_bar", FALSE);
|
public static final BooleanSetting HIDE_CHANNEL_BAR = new BooleanSetting("revanced_hide_channel_bar", FALSE);
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
android.useAndroidX = true
|
android.useAndroidX = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 5.0.0-dev.1
|
version = 5.0.0-dev.4
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
|||||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
import app.revanced.util.forEachChildElement
|
import app.revanced.util.forEachChildElement
|
||||||
|
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||||
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import org.w3c.dom.Element
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
@@ -210,18 +212,19 @@ val themePatch = bytecodePatch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
useGradientLoadingScreenFingerprint.method.apply {
|
useGradientLoadingScreenFingerprint.method.apply {
|
||||||
|
val literalIndex = indexOfFirstLiteralInstructionOrThrow(GRADIENT_LOADING_SCREEN_AB_CONSTANT)
|
||||||
val isEnabledIndex = indexOfFirstLiteralInstructionOrThrow(GRADIENT_LOADING_SCREEN_AB_CONSTANT) + 3
|
val isEnabledIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT)
|
||||||
val isEnabledRegister = getInstruction<OneRegisterInstruction>(isEnabledIndex - 1).registerA
|
val isEnabledRegister = getInstruction<OneRegisterInstruction>(isEnabledIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
isEnabledIndex,
|
isEnabledIndex + 1,
|
||||||
"""
|
"""
|
||||||
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled()Z
|
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled()Z
|
||||||
move-result v$isEnabledRegister
|
move-result v$isEnabledRegister
|
||||||
""",
|
""",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
mapOf(
|
mapOf(
|
||||||
themeHelperLightColorFingerprint to lightThemeBackgroundColor,
|
themeHelperLightColorFingerprint to lightThemeBackgroundColor,
|
||||||
themeHelperDarkColorFingerprint to darkThemeBackgroundColor,
|
themeHelperDarkColorFingerprint to darkThemeBackgroundColor,
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package app.revanced.patches.youtube.misc.dns
|
|||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.revanced.patcher.patch.bytecodePatch
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
import app.revanced.patches.all.misc.resources.addResources
|
import app.revanced.patches.all.misc.resources.addResources
|
||||||
|
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
||||||
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
||||||
|
|
||||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||||
@@ -13,6 +14,8 @@ val checkWatchHistoryDomainNameResolutionPatch = bytecodePatch(
|
|||||||
name = "Check watch history domain name resolution",
|
name = "Check watch history domain name resolution",
|
||||||
description = "Checks if the device DNS server is preventing user watch history from being saved.",
|
description = "Checks if the device DNS server is preventing user watch history from being saved.",
|
||||||
) {
|
) {
|
||||||
|
dependsOn(addResourcesPatch)
|
||||||
|
|
||||||
compatibleWith(
|
compatibleWith(
|
||||||
"com.google.android.youtube"(
|
"com.google.android.youtube"(
|
||||||
"18.38.44",
|
"18.38.44",
|
||||||
|
|||||||
Reference in New Issue
Block a user