mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2024-11-13 02:14:28 +01:00
feat(YouTube): Support version 19.09.38
, 19.10.39
and 19.11.43
(#2971)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
This commit is contained in:
parent
da12508a46
commit
730f3e3a7e
77 changed files with 402 additions and 288 deletions
|
@ -724,6 +724,7 @@ public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch
|
||||||
public static final field INSTANCE Lapp/revanced/patches/shared/misc/mapping/ResourceMappingPatch;
|
public static final field INSTANCE Lapp/revanced/patches/shared/misc/mapping/ResourceMappingPatch;
|
||||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
|
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
|
||||||
|
public final fun get (Ljava/lang/String;Ljava/lang/String;)J
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch$ResourceElement {
|
public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatch$ResourceElement {
|
||||||
|
@ -1846,11 +1847,12 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat
|
||||||
|
|
||||||
public final class app/revanced/util/BytecodeUtilsKt {
|
public final class app/revanced/util/BytecodeUtilsKt {
|
||||||
public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z
|
public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z
|
||||||
public static final fun findIndexForIdResource (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
|
||||||
public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;
|
public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;
|
||||||
public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException;
|
public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException;
|
||||||
public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I
|
public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I
|
||||||
public static final fun indexOfFirstWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
|
public static final fun indexOfFirstWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
|
||||||
|
public static final fun indexOfIdResource (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
||||||
|
public static final fun indexOfIdResourceOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
||||||
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V
|
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V
|
||||||
public static final fun resultOrThrow (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
|
public static final fun resultOrThrow (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
|
||||||
public static final fun returnEarly (Ljava/util/List;Z)V
|
public static final fun returnEarly (Ljava/util/List;Z)V
|
||||||
|
|
|
@ -8,19 +8,15 @@ import java.util.concurrent.Executors
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
object ResourceMappingPatch : ResourcePatch() {
|
object ResourceMappingPatch : ResourcePatch() {
|
||||||
internal lateinit var resourceMappings: List<ResourceElement>
|
private val resourceMappings = Collections.synchronizedList(mutableListOf<ResourceElement>())
|
||||||
private set
|
|
||||||
|
|
||||||
private val THREAD_COUNT = Runtime.getRuntime().availableProcessors()
|
private val THREAD_COUNT = Runtime.getRuntime().availableProcessors()
|
||||||
private val threadPoolExecutor = Executors.newFixedThreadPool(THREAD_COUNT)
|
private val threadPoolExecutor = Executors.newFixedThreadPool(THREAD_COUNT)
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
// save the file in memory to concurrently read from
|
// sSve the file in memory to concurrently read from it.
|
||||||
val resourceXmlFile = context.get("res/values/public.xml").readBytes()
|
val resourceXmlFile = context.get("res/values/public.xml").readBytes()
|
||||||
|
|
||||||
// create a synchronized list to store the resource mappings
|
|
||||||
val mappings = Collections.synchronizedList(mutableListOf<ResourceElement>())
|
|
||||||
|
|
||||||
for (threadIndex in 0 until THREAD_COUNT) {
|
for (threadIndex in 0 until THREAD_COUNT) {
|
||||||
threadPoolExecutor.execute thread@{
|
threadPoolExecutor.execute thread@{
|
||||||
context.xmlEditor[resourceXmlFile.inputStream()].use { editor ->
|
context.xmlEditor[resourceXmlFile.inputStream()].use { editor ->
|
||||||
|
@ -33,7 +29,7 @@ object ResourceMappingPatch : ResourcePatch() {
|
||||||
val batchStart = jobSize * threadIndex
|
val batchStart = jobSize * threadIndex
|
||||||
val batchEnd = jobSize * (threadIndex + 1)
|
val batchEnd = jobSize * (threadIndex + 1)
|
||||||
element@ for (i in batchStart until batchEnd) {
|
element@ for (i in batchStart until batchEnd) {
|
||||||
// make sure to not go out of bounds when rounding errors occur at calculating the jobSize
|
// Prevent out of bounds.
|
||||||
if (i >= resourcesLength) return@thread
|
if (i >= resourcesLength) return@thread
|
||||||
|
|
||||||
val node = resources.item(i)
|
val node = resources.item(i)
|
||||||
|
@ -46,18 +42,18 @@ object ResourceMappingPatch : ResourcePatch() {
|
||||||
|
|
||||||
val id = node.getAttribute("id").substring(2).toLong(16)
|
val id = node.getAttribute("id").substring(2).toLong(16)
|
||||||
|
|
||||||
mappings.add(ResourceElement(typeAttribute, nameAttribute, id))
|
resourceMappings.add(ResourceElement(typeAttribute, nameAttribute, id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
threadPoolExecutor
|
threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)
|
||||||
.also { it.shutdown() }
|
|
||||||
.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)
|
|
||||||
|
|
||||||
resourceMappings = mappings
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator fun get(type: String, name: String) = resourceMappings.first {
|
||||||
|
it.type == type && it.name == name
|
||||||
|
}.id
|
||||||
|
|
||||||
data class ResourceElement(val type: String, val name: String, val id: Long)
|
data class ResourceElement(val type: String, val name: String, val id: Long)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,12 +11,11 @@ object PremiumNavbarTabResourcePatch : ResourcePatch() {
|
||||||
internal var premiumTabId = -1L
|
internal var premiumTabId = -1L
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
premiumTabId = ResourceMappingPatch.resourceMappings.single {
|
premiumTabId = ResourceMappingPatch["id", "premium_tab"]
|
||||||
it.type == "id" && it.name == "premium_tab"
|
|
||||||
}.id
|
|
||||||
|
|
||||||
showBottomNavigationItemsTextId = ResourceMappingPatch.resourceMappings.single {
|
showBottomNavigationItemsTextId = ResourceMappingPatch[
|
||||||
it.type == "bool" && it.name == "show_bottom_navigation_items_text"
|
"bool",
|
||||||
}.id
|
"show_bottom_navigation_items_text",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -14,8 +14,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
LithoFilterPatch::class,
|
LithoFilterPatch::class,
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
]
|
],
|
||||||
)
|
)
|
||||||
object HideAdsResourcePatch : ResourcePatch() {
|
object HideAdsResourcePatch : ResourcePatch() {
|
||||||
private const val FILTER_CLASS_DESCRIPTOR =
|
private const val FILTER_CLASS_DESCRIPTOR =
|
||||||
|
@ -35,11 +35,11 @@ object HideAdsResourcePatch : ResourcePatch() {
|
||||||
SwitchPreference("revanced_hide_products_banner"),
|
SwitchPreference("revanced_hide_products_banner"),
|
||||||
SwitchPreference("revanced_hide_shopping_links"),
|
SwitchPreference("revanced_hide_shopping_links"),
|
||||||
SwitchPreference("revanced_hide_web_search_results"),
|
SwitchPreference("revanced_hide_web_search_results"),
|
||||||
SwitchPreference("revanced_hide_merchandise_banners")
|
SwitchPreference("revanced_hide_merchandise_banners"),
|
||||||
)
|
)
|
||||||
|
|
||||||
LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR)
|
LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR)
|
||||||
|
|
||||||
adAttributionId = ResourceMappingPatch.resourceMappings.single { it.name == "ad_attribution" }.id
|
adAttributionId = ResourceMappingPatch["id", "ad_attribution"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -41,7 +41,9 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -29,7 +29,9 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -35,7 +35,9 @@ import app.revanced.util.resultOrThrow
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
|
@ -20,7 +20,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||||
dependencies = [
|
dependencies = [
|
||||||
IntegrationsPatch::class,
|
IntegrationsPatch::class,
|
||||||
PlayerTypeHookPatch::class,
|
PlayerTypeHookPatch::class,
|
||||||
SwipeControlsResourcePatch::class
|
SwipeControlsResourcePatch::class,
|
||||||
],
|
],
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
|
@ -42,17 +42,22 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
]
|
"19.10.39",
|
||||||
)
|
"19.11.43", // 19.12.x has an issue with opening YT using external links,
|
||||||
]
|
// and the app then crashes if double tap to skip forward/back is immediately used.
|
||||||
|
// The stack trace shows a call coming from integrations SwipeController,
|
||||||
|
// but it may be a bug in YT itself as other target versions do not have this issue.
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object SwipeControlsBytecodePatch : BytecodePatch(
|
object SwipeControlsBytecodePatch : BytecodePatch(
|
||||||
setOf(
|
setOf(
|
||||||
MainActivityFingerprint,
|
MainActivityFingerprint,
|
||||||
SwipeControlsHostActivityFingerprint
|
SwipeControlsHostActivityFingerprint,
|
||||||
)
|
),
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
val wrapperClass = SwipeControlsHostActivityFingerprint.result!!.mutableClass
|
val wrapperClass = SwipeControlsHostActivityFingerprint.result!!.mutableClass
|
||||||
|
@ -74,9 +79,9 @@ object SwipeControlsBytecodePatch : BytecodePatch(
|
||||||
accessFlags and AccessFlags.FINAL.value.inv(),
|
accessFlags and AccessFlags.FINAL.value.inv(),
|
||||||
annotations,
|
annotations,
|
||||||
hiddenApiRestrictions,
|
hiddenApiRestrictions,
|
||||||
implementation
|
implementation,
|
||||||
).toMutable()
|
).toMutable()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,9 @@ import app.revanced.util.exception
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|
|
@ -39,7 +39,9 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -14,7 +14,7 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
import app.revanced.patches.youtube.shared.fingerprints.LayoutConstructorFingerprint
|
import app.revanced.patches.youtube.shared.fingerprints.LayoutConstructorFingerprint
|
||||||
import app.revanced.util.exception
|
import app.revanced.util.exception
|
||||||
import app.revanced.util.findIndexForIdResource
|
import app.revanced.util.indexOfIdResourceOrThrow
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
|
@ -27,7 +27,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
IntegrationsPatch::class,
|
IntegrationsPatch::class,
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
],
|
],
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
|
@ -49,27 +49,29 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
]
|
"19.10.39",
|
||||||
)
|
"19.11.43",
|
||||||
]
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object HideAutoplayButtonPatch : BytecodePatch(
|
object HideAutoplayButtonPatch : BytecodePatch(
|
||||||
setOf(LayoutConstructorFingerprint)
|
setOf(LayoutConstructorFingerprint),
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
||||||
SwitchPreference("revanced_hide_autoplay_button")
|
SwitchPreference("revanced_hide_autoplay_button"),
|
||||||
)
|
)
|
||||||
|
|
||||||
LayoutConstructorFingerprint.result?.mutableMethod?.apply {
|
LayoutConstructorFingerprint.result?.mutableMethod?.apply {
|
||||||
val layoutGenMethodInstructions = implementation!!.instructions
|
val layoutGenMethodInstructions = implementation!!.instructions
|
||||||
|
|
||||||
// resolve the offsets of where to insert the branch instructions and ...
|
// resolve the offsets of where to insert the branch instructions and ...
|
||||||
val insertIndex = findIndexForIdResource("autonav_preview_stub")
|
val insertIndex = indexOfIdResourceOrThrow("autonav_preview_stub")
|
||||||
|
|
||||||
// where to branch away
|
// where to branch away
|
||||||
val branchIndex =
|
val branchIndex =
|
||||||
|
@ -90,8 +92,8 @@ object HideAutoplayButtonPatch : BytecodePatch(
|
||||||
move-result v$clobberRegister
|
move-result v$clobberRegister
|
||||||
if-eqz v$clobberRegister, :hidden
|
if-eqz v$clobberRegister, :hidden
|
||||||
""",
|
""",
|
||||||
ExternalLabel("hidden", jumpInstruction)
|
ExternalLabel("hidden", jumpInstruction),
|
||||||
)
|
)
|
||||||
} ?: throw LayoutConstructorFingerprint.exception
|
} ?: throw LayoutConstructorFingerprint.exception
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -47,7 +47,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37",
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -44,7 +44,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
internal object AlbumCardsResourcePatch : ResourcePatch() {
|
internal object AlbumCardsResourcePatch : ResourcePatch() {
|
||||||
|
@ -22,11 +22,9 @@ internal object AlbumCardsResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
||||||
SwitchPreference("revanced_hide_album_cards")
|
SwitchPreference("revanced_hide_album_cards"),
|
||||||
)
|
)
|
||||||
|
|
||||||
albumCardId = ResourceMappingPatch.resourceMappings.single {
|
albumCardId = ResourceMappingPatch["layout", "album_card"]
|
||||||
it.type == "layout" && it.name == "album_card"
|
|
||||||
}.id
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,9 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
internal object CrowdfundingBoxResourcePatch : ResourcePatch() {
|
internal object CrowdfundingBoxResourcePatch : ResourcePatch() {
|
||||||
|
@ -22,11 +22,12 @@ internal object CrowdfundingBoxResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
||||||
SwitchPreference("revanced_hide_crowdfunding_box")
|
SwitchPreference("revanced_hide_crowdfunding_box"),
|
||||||
)
|
)
|
||||||
|
|
||||||
crowdfundingBoxId = ResourceMappingPatch.resourceMappings.single {
|
crowdfundingBoxId = ResourceMappingPatch[
|
||||||
it.type == "layout" && it.name == "donation_companion"
|
"layout",
|
||||||
}.id
|
"donation_companion",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
internal object HideEndscreenCardsResourcePatch : ResourcePatch() {
|
internal object HideEndscreenCardsResourcePatch : ResourcePatch() {
|
||||||
|
@ -24,15 +24,13 @@ internal object HideEndscreenCardsResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
||||||
SwitchPreference("revanced_hide_endscreen_cards")
|
SwitchPreference("revanced_hide_endscreen_cards"),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun findEndscreenResourceId(name: String) = ResourceMappingPatch.resourceMappings.single {
|
fun idOf(name: String) = ResourceMappingPatch["layout", "endscreen_element_layout_$name"]
|
||||||
it.type == "layout" && it.name == "endscreen_element_layout_$name"
|
|
||||||
}.id
|
|
||||||
|
|
||||||
layoutCircle = findEndscreenResourceId("circle")
|
layoutCircle = idOf("circle")
|
||||||
layoutIcon = findEndscreenResourceId("icon")
|
layoutIcon = idOf("icon")
|
||||||
layoutVideo = findEndscreenResourceId("video")
|
layoutVideo = idOf("video")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -25,15 +25,12 @@ internal object HideFilterBarResourcePatch : ResourcePatch() {
|
||||||
SwitchPreference("revanced_hide_filter_bar_feed_in_feed"),
|
SwitchPreference("revanced_hide_filter_bar_feed_in_feed"),
|
||||||
SwitchPreference("revanced_hide_filter_bar_feed_in_search"),
|
SwitchPreference("revanced_hide_filter_bar_feed_in_search"),
|
||||||
SwitchPreference("revanced_hide_filter_bar_feed_in_related_videos"),
|
SwitchPreference("revanced_hide_filter_bar_feed_in_related_videos"),
|
||||||
)
|
),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
relatedChipCloudMarginId = "related_chip_cloud_reduced_margins".layoutResourceId("layout")
|
relatedChipCloudMarginId = ResourceMappingPatch["layout", "related_chip_cloud_reduced_margins"]
|
||||||
filterBarHeightId = "filter_bar_height".layoutResourceId()
|
filterBarHeightId = ResourceMappingPatch["dimen", "filter_bar_height"]
|
||||||
barContainerHeightId = "bar_container_height".layoutResourceId()
|
barContainerHeightId = ResourceMappingPatch["dimen", "bar_container_height"]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private fun String.layoutResourceId(type: String = "dimen") =
|
|
||||||
ResourceMappingPatch.resourceMappings.single { it.type == type && it.name == this }.id
|
|
||||||
}
|
|
||||||
|
|
|
@ -34,7 +34,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.floatingmicrophone
|
package app.revanced.patches.youtube.layout.hide.floatingmicrophone
|
||||||
|
|
||||||
import app.revanced.patcher.data.ResourceContext
|
import app.revanced.patcher.data.ResourceContext
|
||||||
import app.revanced.patcher.patch.PatchException
|
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||||
|
@ -13,8 +12,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
]
|
],
|
||||||
)
|
)
|
||||||
internal object HideFloatingMicrophoneButtonResourcePatch : ResourcePatch() {
|
internal object HideFloatingMicrophoneButtonResourcePatch : ResourcePatch() {
|
||||||
internal var fabButtonId: Long = -1
|
internal var fabButtonId: Long = -1
|
||||||
|
@ -23,10 +22,9 @@ internal object HideFloatingMicrophoneButtonResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||||
SwitchPreference("revanced_hide_floating_microphone_button")
|
SwitchPreference("revanced_hide_floating_microphone_button"),
|
||||||
)
|
)
|
||||||
|
|
||||||
fabButtonId = ResourceMappingPatch.resourceMappings.find { it.type == "id" && it.name == "fab" }?.id
|
fabButtonId = ResourceMappingPatch["id", "fab"]
|
||||||
?: throw PatchException("Can not find required fab button resource id")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,9 @@ import app.revanced.util.exception
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -57,7 +57,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37",
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -5,22 +5,22 @@ import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
]
|
],
|
||||||
)
|
)
|
||||||
internal object HideLayoutComponentsResourcePatch : ResourcePatch() {
|
internal object HideLayoutComponentsResourcePatch : ResourcePatch() {
|
||||||
internal var expandButtonDownId: Long = -1
|
internal var expandButtonDownId: Long = -1
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
expandButtonDownId = ResourceMappingPatch.resourceMappings.single {
|
expandButtonDownId = ResourceMappingPatch[
|
||||||
it.type == "layout" && it.name == "expand_button_down"
|
"layout",
|
||||||
}.id
|
"expand_button_down",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
object HideInfocardsResourcePatch : ResourcePatch() {
|
object HideInfocardsResourcePatch : ResourcePatch() {
|
||||||
|
@ -22,11 +22,12 @@ object HideInfocardsResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
||||||
SwitchPreference("revanced_hide_info_cards")
|
SwitchPreference("revanced_hide_info_cards"),
|
||||||
)
|
)
|
||||||
|
|
||||||
drawerResourceId = ResourceMappingPatch.resourceMappings.single {
|
drawerResourceId = ResourceMappingPatch[
|
||||||
it.type == "id" && it.name == "info_cards_drawer_header"
|
"id",
|
||||||
}.id
|
"info_cards_drawer_header",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,9 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -41,7 +41,9 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.shorts
|
package app.revanced.patches.youtube.layout.hide.shorts
|
||||||
|
|
||||||
import app.revanced.util.exception
|
|
||||||
import app.revanced.util.findIndexForIdResource
|
|
||||||
import app.revanced.util.injectHideViewCall
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
|
@ -15,6 +12,9 @@ import app.revanced.patches.youtube.layout.hide.shorts.fingerprints.*
|
||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
||||||
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
||||||
|
import app.revanced.util.exception
|
||||||
|
import app.revanced.util.indexOfIdResourceOrThrow
|
||||||
|
import app.revanced.util.injectHideViewCall
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
|
@ -27,11 +27,12 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
LithoFilterPatch::class,
|
LithoFilterPatch::class,
|
||||||
HideShortsComponentsResourcePatch::class,
|
HideShortsComponentsResourcePatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
NavigationBarHookPatch::class
|
NavigationBarHookPatch::class,
|
||||||
],
|
],
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
"com.google.android.youtube", [
|
"com.google.android.youtube",
|
||||||
|
[
|
||||||
"18.32.39",
|
"18.32.39",
|
||||||
"18.37.36",
|
"18.37.36",
|
||||||
"18.38.44",
|
"18.38.44",
|
||||||
|
@ -48,10 +49,12 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
]
|
"19.10.39",
|
||||||
)
|
"19.11.43",
|
||||||
]
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object HideShortsComponentsPatch : BytecodePatch(
|
object HideShortsComponentsPatch : BytecodePatch(
|
||||||
|
@ -60,8 +63,8 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
ReelConstructorFingerprint,
|
ReelConstructorFingerprint,
|
||||||
BottomNavigationBarFingerprint,
|
BottomNavigationBarFingerprint,
|
||||||
RenderBottomNavigationBarParentFingerprint,
|
RenderBottomNavigationBarParentFingerprint,
|
||||||
SetPivotBarVisibilityParentFingerprint
|
SetPivotBarVisibilityParentFingerprint,
|
||||||
)
|
),
|
||||||
) {
|
) {
|
||||||
private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/components/ShortsFilter;"
|
private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/components/ShortsFilter;"
|
||||||
|
|
||||||
|
@ -79,7 +82,7 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
viewRegister,
|
viewRegister,
|
||||||
FILTER_CLASS_DESCRIPTOR,
|
FILTER_CLASS_DESCRIPTOR,
|
||||||
"hideShortsShelf"
|
"hideShortsShelf",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} // Do not throw an exception if not resolved.
|
} // Do not throw an exception if not resolved.
|
||||||
|
@ -93,7 +96,6 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
ShortsButtons.entries.forEach { button -> button.injectHideCall(it.mutableMethod) }
|
ShortsButtons.entries.forEach { button -> button.injectHideCall(it.mutableMethod) }
|
||||||
} ?: throw CreateShortsButtonsFingerprint.exception
|
} ?: throw CreateShortsButtonsFingerprint.exception
|
||||||
|
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Hide the Shorts buttons in newer versions of YouTube.
|
// region Hide the Shorts buttons in newer versions of YouTube.
|
||||||
|
@ -106,8 +108,9 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
|
|
||||||
// Hook to get the pivotBar view.
|
// Hook to get the pivotBar view.
|
||||||
SetPivotBarVisibilityParentFingerprint.result?.let {
|
SetPivotBarVisibilityParentFingerprint.result?.let {
|
||||||
if (!SetPivotBarVisibilityFingerprint.resolve(context, it.classDef))
|
if (!SetPivotBarVisibilityFingerprint.resolve(context, it.classDef)) {
|
||||||
throw SetPivotBarVisibilityFingerprint.exception
|
throw SetPivotBarVisibilityFingerprint.exception
|
||||||
|
}
|
||||||
|
|
||||||
SetPivotBarVisibilityFingerprint.result!!.let { result ->
|
SetPivotBarVisibilityFingerprint.result!!.let { result ->
|
||||||
result.mutableMethod.apply {
|
result.mutableMethod.apply {
|
||||||
|
@ -116,7 +119,7 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
addInstruction(
|
addInstruction(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"sput-object v$viewRegister, $FILTER_CLASS_DESCRIPTOR->pivotBar:" +
|
"sput-object v$viewRegister, $FILTER_CLASS_DESCRIPTOR->pivotBar:" +
|
||||||
"Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;"
|
"Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,8 +127,9 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
|
|
||||||
// Hook to hide the navigation bar when Shorts are being played.
|
// Hook to hide the navigation bar when Shorts are being played.
|
||||||
RenderBottomNavigationBarParentFingerprint.result?.let {
|
RenderBottomNavigationBarParentFingerprint.result?.let {
|
||||||
if (!RenderBottomNavigationBarFingerprint.resolve(context, it.classDef))
|
if (!RenderBottomNavigationBarFingerprint.resolve(context, it.classDef)) {
|
||||||
throw RenderBottomNavigationBarFingerprint.exception
|
throw RenderBottomNavigationBarFingerprint.exception
|
||||||
|
}
|
||||||
|
|
||||||
RenderBottomNavigationBarFingerprint.result!!.mutableMethod.apply {
|
RenderBottomNavigationBarFingerprint.result!!.mutableMethod.apply {
|
||||||
addInstruction(0, "invoke-static { }, $FILTER_CLASS_DESCRIPTOR->hideNavigationBar()V")
|
addInstruction(0, "invoke-static { }, $FILTER_CLASS_DESCRIPTOR->hideNavigationBar()V")
|
||||||
|
@ -142,7 +146,7 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
addInstruction(
|
addInstruction(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"invoke-static { v$viewRegister }, $FILTER_CLASS_DESCRIPTOR->" +
|
"invoke-static { v$viewRegister }, $FILTER_CLASS_DESCRIPTOR->" +
|
||||||
"hideNavigationBar(Landroid/view/View;)Landroid/view/View;"
|
"hideNavigationBar(Landroid/view/View;)Landroid/view/View;",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} ?: throw BottomNavigationBarFingerprint.exception
|
} ?: throw BottomNavigationBarFingerprint.exception
|
||||||
|
@ -150,14 +154,14 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||||
// endregion
|
// endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private enum class ShortsButtons(private val resourceName: String, private val methodName: String) {
|
private enum class ShortsButtons(private val resourceName: String, private val methodName: String) {
|
||||||
COMMENTS("reel_dyn_comment", "hideShortsCommentsButton"),
|
COMMENTS("reel_dyn_comment", "hideShortsCommentsButton"),
|
||||||
REMIX("reel_dyn_remix", "hideShortsRemixButton"),
|
REMIX("reel_dyn_remix", "hideShortsRemixButton"),
|
||||||
SHARE("reel_dyn_share", "hideShortsShareButton");
|
SHARE("reel_dyn_share", "hideShortsShareButton"),
|
||||||
|
;
|
||||||
|
|
||||||
fun injectHideCall(method: MutableMethod) {
|
fun injectHideCall(method: MutableMethod) {
|
||||||
val referencedIndex = method.findIndexForIdResource(resourceName)
|
val referencedIndex = method.indexOfIdResourceOrThrow(resourceName)
|
||||||
|
|
||||||
val setIdIndex = referencedIndex + 1
|
val setIdIndex = referencedIndex + 1
|
||||||
val viewRegister = method.getInstruction<FiveRegisterInstruction>(setIdIndex).registerC
|
val viewRegister = method.getInstruction<FiveRegisterInstruction>(setIdIndex).registerC
|
||||||
|
|
|
@ -50,15 +50,19 @@ object HideShortsComponentsResourcePatch : ResourcePatch() {
|
||||||
SwitchPreference("revanced_hide_shorts_navigation_bar"),
|
SwitchPreference("revanced_hide_shorts_navigation_bar"),
|
||||||
)
|
)
|
||||||
|
|
||||||
ResourceMappingPatch.resourceMappings.find {
|
reelPlayerRightCellButtonHeight = ResourceMappingPatch[
|
||||||
it.type == "layout" && it.name == "reel_multiple_items_shelf"
|
"dimen",
|
||||||
}?.also {
|
"reel_player_right_cell_button_height",
|
||||||
reelMultipleItemShelfId = it.id
|
]
|
||||||
}
|
|
||||||
|
|
||||||
reelPlayerRightCellButtonHeight =
|
// Resource not present in new versions of the app.
|
||||||
ResourceMappingPatch.resourceMappings.single {
|
try {
|
||||||
it.type == "dimen" && it.name == "reel_player_right_cell_button_height"
|
ResourceMappingPatch[
|
||||||
}.id
|
"dimen",
|
||||||
|
"reel_player_right_cell_button_height",
|
||||||
|
]
|
||||||
|
} catch (e: NoSuchElementException) {
|
||||||
|
return
|
||||||
|
}.also { reelPlayerRightCellButtonHeight = it }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
package app.revanced.patches.youtube.layout.hide.shorts.fingerprints
|
package app.revanced.patches.youtube.layout.hide.shorts.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patches.youtube.layout.hide.shorts.HideShortsComponentsResourcePatch
|
import app.revanced.patches.youtube.layout.hide.shorts.HideShortsComponentsResourcePatch
|
||||||
import app.revanced.util.patch.LiteralValueFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
|
||||||
|
|
||||||
internal object CreateShortsButtonsFingerprint : LiteralValueFingerprint(
|
internal object CreateShortsButtonsFingerprint : LiteralValueFingerprint(
|
||||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
// YT 19.12.x moved this code inside another method, and each method has different parameters.
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
parameters = listOf("Z", "Z", "L"),
|
|
||||||
literalSupplier = { HideShortsComponentsResourcePatch.reelPlayerRightCellButtonHeight }
|
literalSupplier = { HideShortsComponentsResourcePatch.reelPlayerRightCellButtonHeight }
|
||||||
)
|
)
|
|
@ -33,7 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
internal object DisableSuggestedVideoEndScreenResourcePatch : ResourcePatch() {
|
internal object DisableSuggestedVideoEndScreenResourcePatch : ResourcePatch() {
|
||||||
|
@ -22,11 +22,12 @@ internal object DisableSuggestedVideoEndScreenResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
||||||
SwitchPreference("revanced_disable_suggested_video_end_screen")
|
SwitchPreference("revanced_disable_suggested_video_end_screen"),
|
||||||
)
|
)
|
||||||
|
|
||||||
sizeAdjustableLiteAutoNavOverlay = ResourceMappingPatch.resourceMappings.single {
|
sizeAdjustableLiteAutoNavOverlay = ResourceMappingPatch[
|
||||||
it.type == "layout" && it.name == "size_adjustable_lite_autonav_overlay"
|
"layout",
|
||||||
}.id
|
"size_adjustable_lite_autonav_overlay",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,9 @@ import app.revanced.util.exception
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -35,7 +35,9 @@ import app.revanced.util.exception
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -30,7 +30,9 @@ import org.w3c.dom.Element
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -10,7 +10,7 @@ import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class]
|
dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class],
|
||||||
)
|
)
|
||||||
internal object CustomPlayerOverlayOpacityResourcePatch : ResourcePatch() {
|
internal object CustomPlayerOverlayOpacityResourcePatch : ResourcePatch() {
|
||||||
internal var scrimOverlayId = -1L
|
internal var scrimOverlayId = -1L
|
||||||
|
@ -19,11 +19,12 @@ internal object CustomPlayerOverlayOpacityResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
||||||
TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER)
|
TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER),
|
||||||
)
|
)
|
||||||
|
|
||||||
scrimOverlayId = ResourceMappingPatch.resourceMappings.single {
|
scrimOverlayId = ResourceMappingPatch[
|
||||||
it.type == "id" && it.name == "scrim_overlay"
|
"id",
|
||||||
}.id
|
"scrim_overlay",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,9 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,8 +12,8 @@ import app.revanced.patches.youtube.misc.settings.SettingsResourcePatch
|
||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [
|
dependencies = [
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
AddResourcesPatch::class
|
AddResourcesPatch::class,
|
||||||
]
|
],
|
||||||
)
|
)
|
||||||
internal object ReturnYouTubeDislikeResourcePatch : ResourcePatch() {
|
internal object ReturnYouTubeDislikeResourcePatch : ResourcePatch() {
|
||||||
internal var oldUIDislikeId: Long = -1
|
internal var oldUIDislikeId: Long = -1
|
||||||
|
@ -25,11 +25,12 @@ internal object ReturnYouTubeDislikeResourcePatch : ResourcePatch() {
|
||||||
key = "revanced_settings_screen_09",
|
key = "revanced_settings_screen_09",
|
||||||
titleKey = "revanced_ryd_settings_title",
|
titleKey = "revanced_ryd_settings_title",
|
||||||
summaryKey = null,
|
summaryKey = null,
|
||||||
intent = SettingsPatch.newIntent("revanced_ryd_settings_intent")
|
intent = SettingsPatch.newIntent("revanced_ryd_settings_intent"),
|
||||||
)
|
)
|
||||||
|
|
||||||
oldUIDislikeId = ResourceMappingPatch.resourceMappings.single {
|
oldUIDislikeId = ResourceMappingPatch[
|
||||||
it.type == "id" && it.name == "dislike_button"
|
"id",
|
||||||
}.id
|
"dislike_button",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -35,7 +35,9 @@ import app.revanced.util.exception
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -15,18 +15,18 @@ internal object SeekbarColorResourcePatch : ResourcePatch() {
|
||||||
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
|
internal var inlineTimeBarPlayedNotHighlightedColorId = -1L
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
fun findColorResource(resourceName: String): Long {
|
reelTimeBarPlayedColorId = ResourceMappingPatch[
|
||||||
return ResourceMappingPatch.resourceMappings
|
"color",
|
||||||
.find { it.type == "color" && it.name == resourceName }?.id
|
"reel_time_bar_played_color",
|
||||||
?: throw PatchException("Could not find color resource: $resourceName")
|
]
|
||||||
}
|
inlineTimeBarColorizedBarPlayedColorDarkId = ResourceMappingPatch[
|
||||||
|
"color",
|
||||||
reelTimeBarPlayedColorId =
|
"inline_time_bar_colorized_bar_played_color_dark",
|
||||||
findColorResource("reel_time_bar_played_color")
|
]
|
||||||
inlineTimeBarColorizedBarPlayedColorDarkId =
|
inlineTimeBarPlayedNotHighlightedColorId = ResourceMappingPatch[
|
||||||
findColorResource("inline_time_bar_colorized_bar_played_color_dark")
|
"color",
|
||||||
inlineTimeBarPlayedNotHighlightedColorId =
|
"inline_time_bar_played_not_highlighted_color",
|
||||||
findColorResource("inline_time_bar_played_not_highlighted_color")
|
]
|
||||||
|
|
||||||
// Edit the resume playback drawable and replace the progress bar with a custom drawable
|
// Edit the resume playback drawable and replace the progress bar with a custom drawable
|
||||||
context.xmlEditor["res/drawable/resume_playback_progressbar_drawable.xml"].use { editor ->
|
context.xmlEditor["res/drawable/resume_playback_progressbar_drawable.xml"].use { editor ->
|
||||||
|
@ -39,10 +39,9 @@ internal object SeekbarColorResourcePatch : ResourcePatch() {
|
||||||
}
|
}
|
||||||
val scaleNode = progressNode.getElementsByTagName("scale").item(0) as Element
|
val scaleNode = progressNode.getElementsByTagName("scale").item(0) as Element
|
||||||
val shapeNode = scaleNode.getElementsByTagName("shape").item(0) as Element
|
val shapeNode = scaleNode.getElementsByTagName("shape").item(0) as Element
|
||||||
val replacementNode =
|
val replacementNode = document.createElement(
|
||||||
document.createElement(
|
"app.revanced.integrations.youtube.patches.theme.ProgressBarDrawable",
|
||||||
"app.revanced.integrations.youtube.patches.theme.ProgressBarDrawable",
|
)
|
||||||
)
|
|
||||||
scaleNode.replaceChild(replacementNode, shapeNode)
|
scaleNode.replaceChild(replacementNode, shapeNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package app.revanced.patches.youtube.layout.sponsorblock
|
package app.revanced.patches.youtube.layout.sponsorblock
|
||||||
|
|
||||||
import app.revanced.util.exception
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
|
@ -25,6 +24,7 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarFingerprint
|
||||||
import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint
|
import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint
|
||||||
import app.revanced.patches.youtube.video.information.VideoInformationPatch
|
import app.revanced.patches.youtube.video.information.VideoInformationPatch
|
||||||
import app.revanced.patches.youtube.video.videoid.VideoIdPatch
|
import app.revanced.patches.youtube.video.videoid.VideoIdPatch
|
||||||
|
import app.revanced.util.exception
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.*
|
import com.android.tools.smali.dexlib2.iface.instruction.*
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
||||||
|
@ -37,7 +37,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||||
description = "Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.",
|
description = "Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as sponsored content.",
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
"com.google.android.youtube", [
|
"com.google.android.youtube",
|
||||||
|
[
|
||||||
"18.48.39",
|
"18.48.39",
|
||||||
"18.49.37",
|
"18.49.37",
|
||||||
"19.01.34",
|
"19.01.34",
|
||||||
|
@ -48,9 +49,11 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
]
|
"19.10.39",
|
||||||
)
|
"19.11.43",
|
||||||
|
],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
dependencies = [
|
dependencies = [
|
||||||
IntegrationsPatch::class,
|
IntegrationsPatch::class,
|
||||||
|
@ -60,8 +63,8 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||||
// Used to prevent SponsorBlock from running on Shorts because SponsorBlock does not yet support Shorts.
|
// Used to prevent SponsorBlock from running on Shorts because SponsorBlock does not yet support Shorts.
|
||||||
PlayerTypeHookPatch::class,
|
PlayerTypeHookPatch::class,
|
||||||
PlayerControlsBytecodePatch::class,
|
PlayerControlsBytecodePatch::class,
|
||||||
SponsorBlockResourcePatch::class
|
SponsorBlockResourcePatch::class,
|
||||||
]
|
],
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object SponsorBlockBytecodePatch : BytecodePatch(
|
object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
|
@ -69,8 +72,8 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
SeekbarFingerprint,
|
SeekbarFingerprint,
|
||||||
AppendTimeFingerprint,
|
AppendTimeFingerprint,
|
||||||
LayoutConstructorFingerprint,
|
LayoutConstructorFingerprint,
|
||||||
AutoRepeatParentFingerprint
|
AutoRepeatParentFingerprint,
|
||||||
)
|
),
|
||||||
) {
|
) {
|
||||||
private const val INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR =
|
private const val INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR =
|
||||||
"Lapp/revanced/integrations/youtube/sponsorblock/SegmentPlaybackController;"
|
"Lapp/revanced/integrations/youtube/sponsorblock/SegmentPlaybackController;"
|
||||||
|
@ -83,8 +86,9 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
LayoutConstructorFingerprint.result?.let {
|
LayoutConstructorFingerprint.result?.let {
|
||||||
if (!ControlsOverlayFingerprint.resolve(context, it.classDef))
|
if (!ControlsOverlayFingerprint.resolve(context, it.classDef)) {
|
||||||
throw ControlsOverlayFingerprint.exception
|
throw ControlsOverlayFingerprint.exception
|
||||||
|
}
|
||||||
} ?: throw LayoutConstructorFingerprint.exception
|
} ?: throw LayoutConstructorFingerprint.exception
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -93,7 +97,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
with(VideoInformationPatch) {
|
with(VideoInformationPatch) {
|
||||||
videoTimeHook(
|
videoTimeHook(
|
||||||
INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR,
|
INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR,
|
||||||
"setVideoTime"
|
"setVideoTime",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +125,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
seekbarMethod.addInstruction(
|
seekbarMethod.addInstruction(
|
||||||
moveRectangleToRegisterIndex + 1,
|
moveRectangleToRegisterIndex + 1,
|
||||||
"invoke-static/range {p0 .. p0}, " +
|
"invoke-static/range {p0 .. p0}, " +
|
||||||
"$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V"
|
"$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V",
|
||||||
)
|
)
|
||||||
|
|
||||||
for ((index, instruction) in seekbarMethodInstructions.withIndex()) {
|
for ((index, instruction) in seekbarMethodInstructions.withIndex()) {
|
||||||
|
@ -136,7 +140,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
seekbarMethod.addInstruction(
|
seekbarMethod.addInstruction(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"invoke-static {v${invokeInstruction.registerC}}, " +
|
"invoke-static {v${invokeInstruction.registerC}}, " +
|
||||||
"$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V"
|
"$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V",
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -154,7 +158,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
}
|
}
|
||||||
seekbarMethod.addInstruction(
|
seekbarMethod.addInstruction(
|
||||||
i,
|
i,
|
||||||
"invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V"
|
"invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V",
|
||||||
)
|
)
|
||||||
|
|
||||||
break
|
break
|
||||||
|
@ -166,9 +170,9 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
val controlsMethodResult = PlayerControlsBytecodePatch.showPlayerControlsFingerprintResult
|
val controlsMethodResult = PlayerControlsBytecodePatch.showPlayerControlsFingerprintResult
|
||||||
|
|
||||||
val controlsLayoutStubResourceId =
|
val controlsLayoutStubResourceId =
|
||||||
ResourceMappingPatch.resourceMappings.single { it.type == "id" && it.name == "controls_layout_stub" }.id
|
ResourceMappingPatch["id", "controls_layout_stub"]
|
||||||
val zoomOverlayResourceId =
|
val zoomOverlayResourceId =
|
||||||
ResourceMappingPatch.resourceMappings.single { it.type == "id" && it.name == "video_zoom_overlay_stub" }.id
|
ResourceMappingPatch["id", "video_zoom_overlay_stub"]
|
||||||
|
|
||||||
methods@ for (method in controlsMethodResult.mutableClass.methods) {
|
methods@ for (method in controlsMethodResult.mutableClass.methods) {
|
||||||
val instructions = method.implementation?.instructions!!
|
val instructions = method.implementation?.instructions!!
|
||||||
|
@ -188,7 +192,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
"""
|
"""
|
||||||
invoke-static {v$inflatedViewRegister}, $INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/View;)V
|
invoke-static {v$inflatedViewRegister}, $INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/View;)V
|
||||||
invoke-static {v$inflatedViewRegister}, $INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/View;)V
|
invoke-static {v$inflatedViewRegister}, $INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/View;)V
|
||||||
"""
|
""",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +205,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
"""
|
"""
|
||||||
invoke-static {p1}, $INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibilityNegatedImmediate(Z)V
|
invoke-static {p1}, $INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibilityNegatedImmediate(Z)V
|
||||||
invoke-static {p1}, $INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibilityNegatedImmediate(Z)V
|
invoke-static {p1}, $INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibilityNegatedImmediate(Z)V
|
||||||
""".trimIndent()
|
""".trimIndent(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +227,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
"""
|
"""
|
||||||
invoke-static {v$targetRegister}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->appendTimeWithoutSegments(Ljava/lang/String;)Ljava/lang/String;
|
invoke-static {v$targetRegister}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->appendTimeWithoutSegments(Ljava/lang/String;)Ljava/lang/String;
|
||||||
move-result-object v$targetRegister
|
move-result-object v$targetRegister
|
||||||
"""
|
""",
|
||||||
)
|
)
|
||||||
|
|
||||||
// initialize the player controller
|
// initialize the player controller
|
||||||
|
@ -236,10 +240,10 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA
|
val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA
|
||||||
addInstruction(
|
addInstruction(
|
||||||
startIndex + 3,
|
startIndex + 3,
|
||||||
"invoke-static {v$frameLayoutRegister}, $INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/ViewGroup;)V"
|
"invoke-static {v$frameLayoutRegister}, $INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/ViewGroup;)V",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} ?: throw ControlsOverlayFingerprint.exception
|
} ?: throw ControlsOverlayFingerprint.exception
|
||||||
|
|
||||||
// get rectangle field name
|
// get rectangle field name
|
||||||
RectangleFieldInvalidatorFingerprint.resolve(context, seekbarSignatureResult.classDef)
|
RectangleFieldInvalidatorFingerprint.resolve(context, seekbarSignatureResult.classDef)
|
||||||
|
@ -258,7 +262,8 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
fun MutableMethod.replaceStringInstruction(index: Int, instruction: Instruction, with: String) {
|
fun MutableMethod.replaceStringInstruction(index: Int, instruction: Instruction, with: String) {
|
||||||
val register = (instruction as OneRegisterInstruction).registerA
|
val register = (instruction as OneRegisterInstruction).registerA
|
||||||
this.replaceInstruction(
|
this.replaceInstruction(
|
||||||
index, "const-string v$register, \"$with\""
|
index,
|
||||||
|
"const-string v$register, \"$with\"",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
for ((index, it) in method.implementation!!.instructions.withIndex()) {
|
for ((index, it) in method.implementation!!.instructions.withIndex()) {
|
||||||
|
@ -268,13 +273,12 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
"replaceMeWithsetSponsorBarRect" -> method.replaceStringInstruction(
|
"replaceMeWithsetSponsorBarRect" -> method.replaceStringInstruction(
|
||||||
index,
|
index,
|
||||||
it,
|
it,
|
||||||
rectangleFieldName
|
rectangleFieldName,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ?: throw PatchException("Could not find the method which contains the replaceMeWith* strings")
|
} ?: throw PatchException("Could not find the method which contains the replaceMeWith* strings")
|
||||||
|
|
||||||
|
|
||||||
// The vote and create segment buttons automatically change their visibility when appropriate,
|
// The vote and create segment buttons automatically change their visibility when appropriate,
|
||||||
// but if buttons are showing when the end of the video is reached then they will not automatically hide.
|
// but if buttons are showing when the end of the video is reached then they will not automatically hide.
|
||||||
// Add a hook to forcefully hide when the end of the video is reached.
|
// Add a hook to forcefully hide when the end of the video is reached.
|
||||||
|
@ -283,7 +287,7 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
it.resolve(context, AutoRepeatParentFingerprint.result!!.classDef)
|
it.resolve(context, AutoRepeatParentFingerprint.result!!.classDef)
|
||||||
}.result?.mutableMethod?.addInstruction(
|
}.result?.mutableMethod?.addInstruction(
|
||||||
0,
|
0,
|
||||||
"invoke-static {}, $INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->endOfVideoReached()V"
|
"invoke-static {}, $INTEGRATIONS_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->endOfVideoReached()V",
|
||||||
) ?: throw AutoRepeatFingerprint.exception
|
) ?: throw AutoRepeatFingerprint.exception
|
||||||
|
|
||||||
// TODO: isSBChannelWhitelisting implementation
|
// TODO: isSBChannelWhitelisting implementation
|
||||||
|
|
|
@ -38,7 +38,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -44,7 +44,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -43,7 +43,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,7 +12,7 @@ internal object MiniPlayerDimensionsCalculatorParentFingerprint : MethodFingerpr
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.CONST_HIGH16,
|
Opcode.CONST_HIGH16,
|
||||||
Opcode.ADD_FLOAT_2ADDR,
|
Opcode.ADD_FLOAT_2ADDR,
|
||||||
Opcode.MUL_FLOAT,
|
null, // Opcode.MUL_FLOAT or Opcode.MUL_FLOAT_2ADDR
|
||||||
Opcode.CONST_4,
|
Opcode.CONST_4,
|
||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
Opcode.MOVE_RESULT,
|
Opcode.MOVE_RESULT,
|
||||||
|
|
|
@ -50,7 +50,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -61,7 +61,9 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -39,7 +39,9 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -34,7 +34,9 @@ import app.revanced.util.exception
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -11,8 +11,9 @@ object SpoofSignatureResourcePatch : ResourcePatch() {
|
||||||
internal var scrubbedPreviewThumbnailResourceId: Long = -1
|
internal var scrubbedPreviewThumbnailResourceId: Long = -1
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
scrubbedPreviewThumbnailResourceId = ResourceMappingPatch.resourceMappings.single {
|
scrubbedPreviewThumbnailResourceId = ResourceMappingPatch[
|
||||||
it.type == "id" && it.name == "thumbnail"
|
"id",
|
||||||
}.id
|
"thumbnail",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,9 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37",
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -36,7 +36,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -40,7 +40,9 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -45,7 +45,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -6,19 +6,14 @@ import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [ResourceMappingPatch::class]
|
dependencies = [ResourceMappingPatch::class],
|
||||||
)
|
)
|
||||||
internal object NavigationBarHookResourcePatch : ResourcePatch() {
|
internal object NavigationBarHookResourcePatch : ResourcePatch() {
|
||||||
internal var imageOnlyTabResourceId: Long = -1
|
internal var imageOnlyTabResourceId: Long = -1
|
||||||
internal var actionBarSearchResultsViewMicId: Long = -1
|
internal var actionBarSearchResultsViewMicId: Long = -1
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
imageOnlyTabResourceId = ResourceMappingPatch.resourceMappings.first {
|
imageOnlyTabResourceId = ResourceMappingPatch["layout", "image_only_tab"]
|
||||||
it.type == "layout" && it.name == "image_only_tab"
|
actionBarSearchResultsViewMicId = ResourceMappingPatch["layout", "action_bar_search_results_view_mic"]
|
||||||
}.id
|
|
||||||
|
|
||||||
actionBarSearchResultsViewMicId = ResourceMappingPatch.resourceMappings.first {
|
|
||||||
it.type == "layout" && it.name == "action_bar_search_results_view_mic"
|
|
||||||
}.id
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,7 @@ object BottomControlsResourcePatch : ResourcePatch(), Closeable {
|
||||||
resourceContext = context
|
resourceContext = context
|
||||||
targetDocumentEditor = context.xmlEditor[TARGET_RESOURCE]
|
targetDocumentEditor = context.xmlEditor[TARGET_RESOURCE]
|
||||||
|
|
||||||
bottomUiContainerResourceId = ResourceMappingPatch.resourceMappings
|
bottomUiContainerResourceId = ResourceMappingPatch["id", "bottom_ui_container_stub"]
|
||||||
.single { it.type == "id" && it.name == "bottom_ui_container_stub" }.id
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -41,7 +41,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -31,10 +31,7 @@ object SettingsResourcePatch : BaseSettingsResourcePatch(
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
// Used for a fingerprint from SettingsPatch.
|
// Used for a fingerprint from SettingsPatch.
|
||||||
appearanceStringId =
|
appearanceStringId = ResourceMappingPatch["string", "app_theme_appearance_dark"]
|
||||||
ResourceMappingPatch.resourceMappings.find {
|
|
||||||
it.type == "string" && it.name == "app_theme_appearance_dark"
|
|
||||||
}!!.id
|
|
||||||
|
|
||||||
arrayOf(
|
arrayOf(
|
||||||
ResourceGroup("layout", "revanced_settings_with_toolbar.xml"),
|
ResourceGroup("layout", "revanced_settings_with_toolbar.xml"),
|
||||||
|
|
|
@ -45,7 +45,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -25,7 +25,9 @@ import app.revanced.patches.youtube.video.speed.remember.RememberPlaybackSpeedPa
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -8,8 +8,9 @@ internal object CustomPlaybackSpeedResourcePatch : ResourcePatch() {
|
||||||
var speedUnavailableId: Long = -1
|
var speedUnavailableId: Long = -1
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
speedUnavailableId = ResourceMappingPatch.resourceMappings.single {
|
speedUnavailableId = ResourceMappingPatch[
|
||||||
it.type == "string" && it.name == "varispeed_unavailable_message"
|
"string",
|
||||||
}.id
|
"varispeed_unavailable_message",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
"19.06.39",
|
"19.06.39",
|
||||||
"19.07.40",
|
"19.07.40",
|
||||||
"19.08.36",
|
"19.08.36",
|
||||||
"19.09.37"
|
"19.09.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43"
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package app.revanced.patches.youtube.video.videoqualitymenu
|
package app.revanced.patches.youtube.video.videoqualitymenu
|
||||||
|
|
||||||
import app.revanced.patcher.data.ResourceContext
|
import app.revanced.patcher.data.ResourceContext
|
||||||
import app.revanced.patcher.patch.PatchException
|
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||||
|
@ -10,7 +9,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class]
|
dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class],
|
||||||
)
|
)
|
||||||
object RestoreOldVideoQualityMenuResourcePatch : ResourcePatch() {
|
object RestoreOldVideoQualityMenuResourcePatch : ResourcePatch() {
|
||||||
internal var videoQualityBottomSheetListFragmentTitle = -1L
|
internal var videoQualityBottomSheetListFragmentTitle = -1L
|
||||||
|
@ -19,13 +18,13 @@ object RestoreOldVideoQualityMenuResourcePatch : ResourcePatch() {
|
||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.VIDEO.addPreferences(
|
SettingsPatch.PreferenceScreen.VIDEO.addPreferences(
|
||||||
SwitchPreference("revanced_restore_old_video_quality_menu")
|
SwitchPreference("revanced_restore_old_video_quality_menu"),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun findResource(name: String) = ResourceMappingPatch.resourceMappings.find { it.name == name }?.id
|
|
||||||
?: throw PatchException("Could not find resource")
|
|
||||||
|
|
||||||
// Used for the old type of the video quality menu.
|
// Used for the old type of the video quality menu.
|
||||||
videoQualityBottomSheetListFragmentTitle = findResource("video_quality_bottom_sheet_list_fragment_title")
|
videoQualityBottomSheetListFragmentTitle = ResourceMappingPatch[
|
||||||
|
"layout",
|
||||||
|
"video_quality_bottom_sheet_list_fragment_title",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.Reference
|
import com.android.tools.smali.dexlib2.iface.reference.Reference
|
||||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||||
|
|
||||||
|
|
||||||
fun MethodFingerprint.resultOrThrow() = result ?: throw exception
|
fun MethodFingerprint.resultOrThrow() = result ?: throw exception
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,24 +58,41 @@ fun MutableMethod.injectHideViewCall(
|
||||||
insertIndex: Int,
|
insertIndex: Int,
|
||||||
viewRegister: Int,
|
viewRegister: Int,
|
||||||
classDescriptor: String,
|
classDescriptor: String,
|
||||||
targetMethod: String
|
targetMethod: String,
|
||||||
) = addInstruction(
|
) = addInstruction(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V"
|
"invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V",
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the index of the first instruction with the id of the given resource name.
|
* Get the index of the first instruction with the id of the given resource name.
|
||||||
|
*
|
||||||
|
* Requires [ResourceMappingPatch] as a dependency.
|
||||||
*
|
*
|
||||||
* @param resourceName the name of the resource to find the id for.
|
* @param resourceName the name of the resource to find the id for.
|
||||||
* @return the index of the first instruction with the id of the given resource name, or -1 if not found.
|
* @return the index of the first instruction with the id of the given resource name, or -1 if not found.
|
||||||
|
* @throws PatchException if the resource cannot be found.
|
||||||
|
* @see [indexOfIdResourceOrThrow]
|
||||||
*/
|
*/
|
||||||
fun Method.findIndexForIdResource(resourceName: String): Int {
|
fun Method.indexOfIdResource(resourceName: String): Int {
|
||||||
fun getIdResourceId(resourceName: String) = ResourceMappingPatch.resourceMappings.single {
|
val resourceId = ResourceMappingPatch["id", resourceName]
|
||||||
it.type == "id" && it.name == resourceName
|
return indexOfFirstWideLiteralInstructionValue(resourceId)
|
||||||
}.id
|
}
|
||||||
|
|
||||||
return indexOfFirstWideLiteralInstructionValue(getIdResourceId(resourceName))
|
/**
|
||||||
|
* Get the index of the first instruction with the id of the given resource name or throw a [PatchException].
|
||||||
|
*
|
||||||
|
* Requires [ResourceMappingPatch] as a dependency.
|
||||||
|
*
|
||||||
|
* @throws [PatchException] if the resource is not found, or the method does not contain the resource id literal value.
|
||||||
|
*/
|
||||||
|
fun Method.indexOfIdResourceOrThrow(resourceName: String): Int {
|
||||||
|
val index = indexOfIdResource(resourceName)
|
||||||
|
if (index < 0) {
|
||||||
|
throw PatchException("Found resource id for: '$resourceName' but method does not contain the id: $this")
|
||||||
|
}
|
||||||
|
|
||||||
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,27 +146,29 @@ inline fun <reified T : Reference> Instruction.getReference() = (this as? Refere
|
||||||
fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) =
|
fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) =
|
||||||
this.implementation!!.instructions.indexOfFirst(predicate)
|
this.implementation!!.instructions.indexOfFirst(predicate)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the resolved methods of [MethodFingerprint]s early.
|
* Return the resolved methods of [MethodFingerprint]s early.
|
||||||
*/
|
*/
|
||||||
fun List<MethodFingerprint>.returnEarly(bool: Boolean = false) {
|
fun List<MethodFingerprint>.returnEarly(bool: Boolean = false) {
|
||||||
val const = if (bool) "0x1" else "0x0"
|
val const = if (bool) "0x1" else "0x0"
|
||||||
this.forEach { fingerprint ->
|
this.forEach { fingerprint ->
|
||||||
fingerprint.result?.let { result ->
|
fingerprint.result?.let { result ->
|
||||||
val stringInstructions = when (result.method.returnType.first()) {
|
val stringInstructions = when (result.method.returnType.first()) {
|
||||||
'L' -> """
|
'L' ->
|
||||||
|
"""
|
||||||
const/4 v0, $const
|
const/4 v0, $const
|
||||||
return-object v0
|
return-object v0
|
||||||
"""
|
"""
|
||||||
'V' -> "return-void"
|
'V' -> "return-void"
|
||||||
'I', 'Z' -> """
|
'I', 'Z' ->
|
||||||
|
"""
|
||||||
const/4 v0, $const
|
const/4 v0, $const
|
||||||
return v0
|
return v0
|
||||||
"""
|
"""
|
||||||
else -> throw Exception("This case should never happen.")
|
else -> throw Exception("This case should never happen.")
|
||||||
}
|
}
|
||||||
|
|
||||||
result.mutableMethod.addInstructions(0, stringInstructions)
|
result.mutableMethod.addInstructions(0, stringInstructions)
|
||||||
} ?: throw fingerprint.exception
|
} ?: throw fingerprint.exception
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue