feat(YouTube - Hide ads): Add Hide end screen store banner setting (#131)

* add patch option to clean related video overlay

* feat(YouTube - Hide ads): Add `Hide end screen store banner` setting

* feat: Revert edit xml

* chore: Lint code

---------

Co-authored-by: inotia00 <108592928+inotia00@users.noreply.github.com>
This commit is contained in:
MondayNitro 2025-01-28 09:13:33 +05:30 committed by GitHub
parent 5255c7eca8
commit 18a854de19
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 90 additions and 7 deletions

View File

@ -4,13 +4,25 @@ import static app.revanced.extension.shared.utils.Utils.hideViewBy0dpUnderCondit
import android.view.View; import android.view.View;
import java.util.List;
import app.revanced.extension.shared.utils.Logger;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class AdsPatch { public class AdsPatch {
private static final boolean hideGeneralAdsEnabled = Settings.HIDE_GENERAL_ADS.get(); private static final boolean HIDE_END_SCREEN_STORE_BANNER =
private static final boolean hideGetPremiumAdsEnabled = Settings.HIDE_GET_PREMIUM.get(); Settings.HIDE_END_SCREEN_STORE_BANNER.get();
private static final boolean hideVideoAdsEnabled = Settings.HIDE_VIDEO_ADS.get(); private static final boolean HIDE_GENERAL_ADS =
Settings.HIDE_GENERAL_ADS.get();
private static final boolean HIDE_GET_PREMIUM =
Settings.HIDE_GET_PREMIUM.get();
private static final boolean HIDE_VIDEO_ADS =
Settings.HIDE_VIDEO_ADS.get();
// https://encrypted-tbn0.gstatic.com/shopping?q=tbn
private static final String STORE_BANNER_DOMAIN =
"gstatic.com/shopping";
/** /**
* Injection point. * Injection point.
@ -19,18 +31,37 @@ public class AdsPatch {
* @param view The view, which shows ads. * @param view The view, which shows ads.
*/ */
public static void hideAdAttributionView(View view) { public static void hideAdAttributionView(View view) {
hideViewBy0dpUnderCondition(hideGeneralAdsEnabled, view); hideViewBy0dpUnderCondition(HIDE_GENERAL_ADS, view);
} }
/**
* Injection point.
*
* @param elementsList List of components of the end screen container.
* @param protobufList Component (ProtobufList).
*/
public static void hideEndScreenStoreBanner(List<Object> elementsList, Object protobufList) {
if (HIDE_END_SCREEN_STORE_BANNER &&
protobufList.toString().contains(STORE_BANNER_DOMAIN)) {
Logger.printDebug(() -> "Hiding store banner");
return;
}
elementsList.add(protobufList);
}
/**
* Injection point.
*/
public static boolean hideGetPremium() { public static boolean hideGetPremium() {
return hideGetPremiumAdsEnabled; return HIDE_GET_PREMIUM;
} }
/** /**
* Injection point. * Injection point.
*/ */
public static boolean hideVideoAds() { public static boolean hideVideoAds() {
return !hideVideoAdsEnabled; return !HIDE_VIDEO_ADS;
} }
/** /**
@ -40,7 +71,7 @@ public class AdsPatch {
* It is presumed to have been deprecated, and if it is confirmed that it is no longer used, remove it. * It is presumed to have been deprecated, and if it is confirmed that it is no longer used, remove it.
*/ */
public static boolean hideVideoAds(boolean original) { public static boolean hideVideoAds(boolean original) {
return !hideVideoAdsEnabled && original; return !HIDE_VIDEO_ADS && original;
} }
} }

View File

@ -48,6 +48,7 @@ import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class Settings extends BaseSettings { public class Settings extends BaseSettings {
// PreferenceScreen: Ads // PreferenceScreen: Ads
public static final BooleanSetting HIDE_END_SCREEN_STORE_BANNER = new BooleanSetting("revanced_hide_end_screen_store_banner", TRUE, true);
public static final BooleanSetting HIDE_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE); public static final BooleanSetting HIDE_GENERAL_ADS = new BooleanSetting("revanced_hide_general_ads", TRUE);
public static final BooleanSetting HIDE_GET_PREMIUM = new BooleanSetting("revanced_hide_get_premium", TRUE, true); public static final BooleanSetting HIDE_GET_PREMIUM = new BooleanSetting("revanced_hide_get_premium", TRUE, true);
public static final BooleanSetting HIDE_MERCHANDISE_SHELF = new BooleanSetting("revanced_hide_merchandise_shelf", TRUE); public static final BooleanSetting HIDE_MERCHANDISE_SHELF = new BooleanSetting("revanced_hide_merchandise_shelf", TRUE);

View File

@ -28,6 +28,7 @@ import app.revanced.util.fingerprint.matchOrThrow
import app.revanced.util.fingerprint.methodOrThrow import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.injectHideViewCall import app.revanced.util.injectHideViewCall
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
@ -132,6 +133,24 @@ val adsPatch = bytecodePatch(
// endregion // endregion
// region patch for hide end screen store banner
fullScreenEngagementAdContainerFingerprint.methodOrThrow().apply {
val addListIndex = indexOfAddListInstruction(this)
val addListInstruction =
getInstruction<FiveRegisterInstruction>(addListIndex)
val listRegister = addListInstruction.registerC
val objectRegister = addListInstruction.registerD
replaceInstruction(
addListIndex,
"invoke-static { v$listRegister, v$objectRegister }, " +
"$ADS_CLASS_DESCRIPTOR->hideEndScreenStoreBanner(Ljava/util/List;Ljava/lang/Object;)V"
)
}
// endregion
findMethodOrThrow("$PATCHES_PATH/PatchStatus;") { findMethodOrThrow("$PATCHES_PATH/PatchStatus;") {
name == "HideFullscreenAdsDefaultBoolean" name == "HideFullscreenAdsDefaultBoolean"
}.replaceInstruction( }.replaceInstruction(

View File

@ -1,11 +1,16 @@
package app.revanced.patches.youtube.ads.general package app.revanced.patches.youtube.ads.general
import app.revanced.patches.youtube.utils.resourceid.fullScreenEngagementAdContainer
import app.revanced.patches.youtube.utils.resourceid.interstitialsContainer import app.revanced.patches.youtube.utils.resourceid.interstitialsContainer
import app.revanced.patches.youtube.utils.resourceid.slidingDialogAnimation import app.revanced.patches.youtube.utils.resourceid.slidingDialogAnimation
import app.revanced.util.fingerprint.legacyFingerprint import app.revanced.util.fingerprint.legacyFingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionReversed
import app.revanced.util.or import app.revanced.util.or
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val compactYpcOfferModuleViewFingerprint = legacyFingerprint( internal val compactYpcOfferModuleViewFingerprint = legacyFingerprint(
name = "compactYpcOfferModuleViewFingerprint", name = "compactYpcOfferModuleViewFingerprint",
@ -24,6 +29,23 @@ internal val compactYpcOfferModuleViewFingerprint = legacyFingerprint(
} }
) )
internal val fullScreenEngagementAdContainerFingerprint = legacyFingerprint(
name = "fullScreenEngagementAdContainerFingerprint",
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = emptyList(),
literals = listOf(fullScreenEngagementAdContainer),
customFingerprint = { method, _ ->
indexOfAddListInstruction(method) >= 0
}
)
internal fun indexOfAddListInstruction(method: Method) =
method.indexOfFirstInstructionReversed {
opcode == Opcode.INVOKE_VIRTUAL &&
getReference<MethodReference>()?.name == "add"
}
internal val interstitialsContainerFingerprint = legacyFingerprint( internal val interstitialsContainerFingerprint = legacyFingerprint(
name = "interstitialsContainerFingerprint", name = "interstitialsContainerFingerprint",
returnType = "V", returnType = "V",

View File

@ -105,6 +105,8 @@ var floatyBarTopMargin = -1L
private set private set
var fullScreenButton = -1L var fullScreenButton = -1L
private set private set
var fullScreenEngagementAdContainer = -1L
private set
var fullScreenEngagementOverlay = -1L var fullScreenEngagementOverlay = -1L
private set private set
var fullScreenEngagementPanel = -1L var fullScreenEngagementPanel = -1L
@ -432,6 +434,10 @@ internal val sharedResourceIdPatch = resourcePatch(
ID, ID,
"fullscreen_button" "fullscreen_button"
] ]
fullScreenEngagementAdContainer = resourceMappings[
ID,
"fullscreen_engagement_ad_container"
]
fullScreenEngagementOverlay = resourceMappings[ fullScreenEngagementOverlay = resourceMappings[
LAYOUT, LAYOUT,
"fullscreen_engagement_overlay" "fullscreen_engagement_overlay"

View File

@ -80,6 +80,9 @@ Please download %2$s from the website."</string>
<!-- PreferenceScreen: Ads --> <!-- PreferenceScreen: Ads -->
<string name="revanced_preference_screen_ads_title">Ads</string> <string name="revanced_preference_screen_ads_title">Ads</string>
<string name="revanced_hide_end_screen_store_banner_title">Hide end screen store banner</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">Store banner is hidden.</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">Store banner is shown.</string>
<string name="revanced_hide_fullscreen_ads_title">Hide fullscreen ads</string> <string name="revanced_hide_fullscreen_ads_title">Hide fullscreen ads</string>
<string name="revanced_hide_fullscreen_ads_summary_on">Fullscreen ads are hidden.</string> <string name="revanced_hide_fullscreen_ads_summary_on">Fullscreen ads are hidden.</string>
<string name="revanced_hide_fullscreen_ads_summary_off">Fullscreen ads are shown.</string> <string name="revanced_hide_fullscreen_ads_summary_off">Fullscreen ads are shown.</string>

View File

@ -4,6 +4,7 @@
<!-- PREFERENCE_SCREEN: ADS <!-- PREFERENCE_SCREEN: ADS
<PreferenceScreen android:title="@string/revanced_preference_screen_ads_title" android:key="revanced_preference_screen_ads"> <PreferenceScreen android:title="@string/revanced_preference_screen_ads_title" android:key="revanced_preference_screen_ads">
<SwitchPreference android:title="@string/revanced_hide_end_screen_store_banner_title" android:key="revanced_hide_end_screen_store_banner" android:summaryOn="@string/revanced_hide_end_screen_store_banner_summary_on" android:summaryOff="@string/revanced_hide_end_screen_store_banner_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_fullscreen_ads_title" android:key="revanced_hide_fullscreen_ads" android:summaryOn="@string/revanced_hide_fullscreen_ads_summary_on" android:summaryOff="@string/revanced_hide_fullscreen_ads_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_fullscreen_ads_title" android:key="revanced_hide_fullscreen_ads" android:summaryOn="@string/revanced_hide_fullscreen_ads_summary_on" android:summaryOff="@string/revanced_hide_fullscreen_ads_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_general_ads_title" android:key="revanced_hide_general_ads" android:summaryOn="@string/revanced_hide_general_ads_summary_on" android:summaryOff="@string/revanced_hide_general_ads_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_general_ads_title" android:key="revanced_hide_general_ads" android:summaryOn="@string/revanced_hide_general_ads_summary_on" android:summaryOff="@string/revanced_hide_general_ads_summary_off" />
<SwitchPreference android:title="@string/revanced_hide_merchandise_shelf_title" android:key="revanced_hide_merchandise_shelf" android:summaryOn="@string/revanced_hide_merchandise_shelf_summary_on" android:summaryOff="@string/revanced_hide_merchandise_shelf_summary_off" /> <SwitchPreference android:title="@string/revanced_hide_merchandise_shelf_title" android:key="revanced_hide_merchandise_shelf" android:summaryOn="@string/revanced_hide_merchandise_shelf_summary_on" android:summaryOff="@string/revanced_hide_merchandise_shelf_summary_off" />