feat(youtube): support version 18.19.35
This commit is contained in:
parent
19798bf31c
commit
491f292182
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.ad.general.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideAdsCompatibility
|
internal annotation class HideAdsCompatibility
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.ad.video.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class VideoAdsCompatibility
|
internal annotation class VideoAdsCompatibility
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.interaction.copyvideourl.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class CopyVideoUrlCompatibility
|
internal annotation class CopyVideoUrlCompatibility
|
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.interaction.downloads.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class DownloadsCompatibility
|
internal annotation class DownloadsCompatibility
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.interaction.seekbar.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class SeekbarTappingCompatibility
|
internal annotation class SeekbarTappingCompatibility
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import app.revanced.patches.youtube.interaction.seekbar.patch.EnableSeekbarTappingResourcePatch
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||||
|
|
||||||
|
|
||||||
|
object AccessibilityPlayerProgressTimeFingerprint : MethodFingerprint(
|
||||||
|
returnType = "L",
|
||||||
|
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
methodDef.implementation?.instructions?.any { instruction ->
|
||||||
|
if (instruction.opcode != Opcode.CONST) return@any false
|
||||||
|
|
||||||
|
val wideLiteral = (instruction as WideLiteralInstruction).wideLiteral
|
||||||
|
|
||||||
|
EnableSeekbarTappingResourcePatch.accessibilityPlayerProgressTime == wideLiteral
|
||||||
|
} ?: false
|
||||||
|
}
|
||||||
|
)
|
|
@ -1,34 +1,34 @@
|
||||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
|
||||||
object SeekbarTappingFingerprint : MethodFingerprint(
|
object SeekbarTappingFingerprint : MethodFingerprint(
|
||||||
"Z", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L"), listOf(
|
returnType = "Z",
|
||||||
Opcode.INVOKE_VIRTUAL,
|
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
Opcode.MOVE_RESULT_WIDE,
|
parameters = listOf("L"),
|
||||||
Opcode.IGET,
|
opcodes = listOf(
|
||||||
Opcode.IGET_OBJECT,
|
|
||||||
Opcode.IGET,
|
|
||||||
Opcode.DIV_INT_2ADDR,
|
|
||||||
Opcode.ADD_INT,
|
|
||||||
Opcode.SUB_INT_2ADDR,
|
|
||||||
Opcode.INT_TO_FLOAT,
|
|
||||||
Opcode.CMPG_FLOAT,
|
|
||||||
Opcode.IF_GTZ,
|
|
||||||
Opcode.INT_TO_FLOAT,
|
|
||||||
Opcode.CMPG_FLOAT,
|
|
||||||
Opcode.IF_GTZ,
|
|
||||||
Opcode.CONST_4,
|
|
||||||
Opcode.INVOKE_INTERFACE,
|
|
||||||
Opcode.NEW_INSTANCE,
|
|
||||||
Opcode.INVOKE_DIRECT,
|
|
||||||
Opcode.IPUT_OBJECT,
|
Opcode.IPUT_OBJECT,
|
||||||
Opcode.INVOKE_VIRTUAL
|
Opcode.INVOKE_VIRTUAL,
|
||||||
)
|
// Insert seekbar tapping instructions here.
|
||||||
|
Opcode.RETURN,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
),
|
||||||
|
customFingerprint = custom@{ methodDef, _ ->
|
||||||
|
if (methodDef.name != "onTouchEvent") return@custom false
|
||||||
|
|
||||||
|
methodDef.implementation!!.instructions.any { instruction ->
|
||||||
|
if (instruction.opcode != Opcode.CONST) return@any false
|
||||||
|
|
||||||
|
val literal = (instruction as NarrowLiteralInstruction).narrowLiteral
|
||||||
|
|
||||||
|
// onTouchEvent method contains a CONST instruction
|
||||||
|
// with this literal making it unique with the rest of the properties of this fingerprint.
|
||||||
|
literal == Integer.MAX_VALUE
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
|
@ -1,44 +0,0 @@
|
||||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import org.jf.dexlib2.AccessFlags
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
|
|
||||||
|
|
||||||
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
|
|
||||||
object SeekbarTappingParentFingerprint : MethodFingerprint(
|
|
||||||
"L", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.CONST_4,
|
|
||||||
Opcode.NEW_ARRAY,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_WIDE,
|
|
||||||
Opcode.INVOKE_STATIC,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.INVOKE_STATIC,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.CONST_4,
|
|
||||||
Opcode.APUT_OBJECT,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_WIDE,
|
|
||||||
Opcode.INVOKE_STATIC,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.INVOKE_STATIC,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.CONST_4,
|
|
||||||
Opcode.APUT_OBJECT,
|
|
||||||
Opcode.CONST,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.RETURN_OBJECT
|
|
||||||
)
|
|
||||||
)
|
|
|
@ -1,109 +1,95 @@
|
||||||
package app.revanced.patches.youtube.interaction.seekbar.patch
|
package app.revanced.patches.youtube.interaction.seekbar.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
import app.revanced.patcher.annotation.Name
|
import app.revanced.patcher.annotation.Name
|
||||||
import app.revanced.patcher.annotation.Version
|
import app.revanced.patcher.annotation.Version
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.addInstructions
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.extensions.instruction
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.PatchResult
|
import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultError
|
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patcher.util.smali.ExternalLabel
|
||||||
import app.revanced.patches.youtube.interaction.seekbar.annotation.SeekbarTappingCompatibility
|
import app.revanced.patches.youtube.interaction.seekbar.annotation.SeekbarTappingCompatibility
|
||||||
|
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.AccessibilityPlayerProgressTimeFingerprint
|
||||||
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.SeekbarTappingFingerprint
|
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.SeekbarTappingFingerprint
|
||||||
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.SeekbarTappingParentFingerprint
|
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
|
||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.builder.instruction.BuilderInstruction21t
|
|
||||||
import org.jf.dexlib2.iface.Method
|
import org.jf.dexlib2.iface.Method
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction11n
|
import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
@DependsOn([IntegrationsPatch::class, EnableSeekbarTappingResourcePatch::class])
|
||||||
@Name("seekbar-tapping")
|
@Name("seekbar-tapping")
|
||||||
@Description("Enables tap-to-seek on the seekbar of the video player.")
|
@Description("Enables tap-to-seek on the seekbar of the video player.")
|
||||||
@SeekbarTappingCompatibility
|
@SeekbarTappingCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class EnableSeekbarTappingPatch : BytecodePatch(
|
class EnableSeekbarTappingPatch : BytecodePatch(
|
||||||
listOf(
|
listOf(AccessibilityPlayerProgressTimeFingerprint, SeekbarTappingFingerprint)
|
||||||
SeekbarTappingParentFingerprint, SeekbarTappingFingerprint
|
|
||||||
)
|
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(
|
// Find the required methods to tap the seekbar.
|
||||||
SwitchPreference(
|
val seekbarTappingMethods =
|
||||||
"revanced_tap_seeking",
|
AccessibilityPlayerProgressTimeFingerprint.result?.classDef?.methods?.let { methods ->
|
||||||
StringResource("revanced_tap_seeking_title", "Enable seekbar tapping"),
|
buildMap {
|
||||||
StringResource("revanced_tap_seeking_summary_on", "Seekbar tapping is enabled"),
|
// find the methods which tap the seekbar
|
||||||
StringResource("revanced_tap_seeking_summary_off", "Seekbar tapping is disabled")
|
methods.forEach { method ->
|
||||||
)
|
if (method.implementation == null) return@forEach
|
||||||
)
|
|
||||||
|
|
||||||
var result = SeekbarTappingParentFingerprint.result!!
|
val instructions = method.implementation!!.instructions
|
||||||
|
|
||||||
val tapSeekMethods = mutableMapOf<String, Method>()
|
// The method has more than 7 instructions.
|
||||||
|
if (instructions.count() < 7) return@forEach
|
||||||
|
|
||||||
// find the methods which tap the seekbar
|
// The 7th instruction has the opcode CONST_4.
|
||||||
for (it in result.classDef.methods) {
|
val instruction = instructions.elementAt(6)
|
||||||
if (it.implementation == null) continue
|
if (instruction.opcode != Opcode.CONST_4) return@forEach
|
||||||
|
|
||||||
val instructions = it.implementation!!.instructions
|
// the literal for this instruction has to be either 1 or 2.
|
||||||
// here we make sure we actually find the method because it has more than 7 instructions
|
val literal = (instruction as NarrowLiteralInstruction).narrowLiteral
|
||||||
if (instructions.count() < 7) continue
|
|
||||||
|
|
||||||
// we know that the 7th instruction has the opcode CONST_4
|
// Based on the literal, determine which method is which.
|
||||||
val instruction = instructions.elementAt(6)
|
if (literal == 1) this["P"] = method
|
||||||
if (instruction.opcode != Opcode.CONST_4) continue
|
if (literal == 2) this["O"] = method
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// the literal for this instruction has to be either 1 or 2
|
seekbarTappingMethods ?: return AccessibilityPlayerProgressTimeFingerprint.toErrorResult()
|
||||||
val literal = (instruction as Instruction11n).narrowLiteral
|
|
||||||
|
|
||||||
// method founds
|
SeekbarTappingFingerprint.result?.let {
|
||||||
if (literal == 1) tapSeekMethods["P"] = it
|
val insertIndex = it.scanResult.patternScanResult!!.endIndex - 1
|
||||||
if (literal == 2) tapSeekMethods["O"] = it
|
|
||||||
}
|
|
||||||
|
|
||||||
// replace map because we don't need the upper one anymore
|
it.mutableMethod.apply {
|
||||||
result = SeekbarTappingFingerprint.result!!
|
val thisInstanceRegister = instruction<Instruction35c>(insertIndex - 1).registerC
|
||||||
|
|
||||||
val implementation = result.mutableMethod.implementation!!
|
val freeRegister = 0
|
||||||
|
val xAxisRegister = 2
|
||||||
|
|
||||||
// if tap-seeking is enabled, do not invoke the two methods below
|
val pMethod = seekbarTappingMethods["P"]!!
|
||||||
val pMethod = tapSeekMethods["P"]!!
|
val oMethod = seekbarTappingMethods["O"]!!
|
||||||
val oMethod = tapSeekMethods["O"]!!
|
|
||||||
|
|
||||||
val insertIndex = result.scanResult.patternScanResult!!.endIndex + 1
|
fun Method.toInvokeInstructionString() =
|
||||||
|
"invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $definingClass->$name(I)V"
|
||||||
|
|
||||||
// get the required register
|
addInstructions(
|
||||||
val instruction = implementation.instructions[insertIndex - 1]
|
insertIndex,
|
||||||
if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return PatchResultError("Could not find the correct register")
|
"""
|
||||||
val register = (instruction as Instruction35c).registerC
|
invoke-static { }, Lapp/revanced/integrations/patches/SeekbarTappingPatch;->seekbarTappingEnabled()Z
|
||||||
|
move-result v$freeRegister
|
||||||
|
if-eqz v$freeRegister, :disabled
|
||||||
|
${oMethod.toInvokeInstructionString()}
|
||||||
|
${pMethod.toInvokeInstructionString()}
|
||||||
|
""",
|
||||||
|
listOf(ExternalLabel("disabled", instruction(insertIndex)))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} ?: return SeekbarTappingFingerprint.toErrorResult()
|
||||||
|
|
||||||
val elseLabel = implementation.newLabelForIndex(insertIndex)
|
|
||||||
// the instructions are written in reverse order.
|
|
||||||
result.mutableMethod.addInstructions(
|
|
||||||
insertIndex, """
|
|
||||||
invoke-virtual { v$register, v2 }, ${oMethod.definingClass}->${oMethod.name}(I)V
|
|
||||||
invoke-virtual { v$register, v2 }, ${pMethod.definingClass}->${pMethod.name}(I)V
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
|
|
||||||
// if tap-seeking is disabled, do not invoke the two methods above by jumping to the else label
|
|
||||||
implementation.addInstruction(
|
|
||||||
insertIndex, BuilderInstruction21t(Opcode.IF_EQZ, 0, elseLabel)
|
|
||||||
)
|
|
||||||
result.mutableMethod.addInstructions(
|
|
||||||
insertIndex, """
|
|
||||||
invoke-static { }, Lapp/revanced/integrations/patches/SeekbarTappingPatch;->isTapSeekingEnabled()Z
|
|
||||||
move-result v0
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package app.revanced.patches.youtube.interaction.seekbar.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
|
||||||
|
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
||||||
|
@Version("0.0.1")
|
||||||
|
class EnableSeekbarTappingResourcePatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_seekbar_tapping",
|
||||||
|
StringResource("revanced_seekbar_tapping_title", "Enable seekbar tapping"),
|
||||||
|
StringResource("revanced_seekbar_tapping_summary_on", "Seekbar tapping is enabled"),
|
||||||
|
StringResource("revanced_seekbar_tapping_summary_off", "Seekbar tapping is disabled")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
accessibilityPlayerProgressTime = ResourceMappingPatch.resourceMappings.find {
|
||||||
|
it.name == "accessibility_player_progress_time"
|
||||||
|
}?.id ?: return PatchResultError("Failed to find required resource")
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal companion object {
|
||||||
|
var accessibilityPlayerProgressTime = -1L
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.interaction.swipecontrols.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class SwipeControlsCompatibility
|
internal annotation class SwipeControlsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.autocaptions.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class AutoCaptionsCompatibility
|
internal annotation class AutoCaptionsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.buttons.action.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideButtonsCompatibility
|
internal annotation class HideButtonsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.buttons.autoplay.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class AutoplayButtonCompatibility
|
internal annotation class AutoplayButtonCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.buttons.captions.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideCaptionsButtonCompatibility
|
internal annotation class HideCaptionsButtonCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.buttons.navigation.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class NavigationButtonsCompatibility
|
internal annotation class NavigationButtonsCompatibility
|
|
@ -2,6 +2,6 @@ package app.revanced.patches.youtube.layout.buttons.player.background.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class PlayerButtonBackgroundCompatibility
|
internal annotation class PlayerButtonBackgroundCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.buttons.player.hide.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HidePlayerButtonsCompatibility
|
internal annotation class HidePlayerButtonsCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.albumcards.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class AlbumCardsCompatibility
|
internal annotation class AlbumCardsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.artistcards.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideArtistCardCompatibility
|
internal annotation class HideArtistCardCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.breakingnews.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class BreakingNewsCompatibility
|
internal annotation class BreakingNewsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.comments.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideCommentsCompatibility
|
internal annotation class HideCommentsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.crowdfundingbox.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class CrowdfundingBoxCompatibility
|
internal annotation class CrowdfundingBoxCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.endscreencards.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideEndscreenCardsCompatibility
|
internal annotation class HideEndscreenCardsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.filterbar.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideFilterBar
|
internal annotation class HideFilterBar
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.floatingmicrophone.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideFloatingMicrophoneButtonCompatibility
|
internal annotation class HideFloatingMicrophoneButtonCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.getpremium.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideGetPremiumCompatibility
|
internal annotation class HideGetPremiumCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.infocards.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideInfocardsCompatibility
|
internal annotation class HideInfocardsCompatibility
|
||||||
|
|
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.hide.loadmorebutton.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideLoadMoreButtonCompatibility
|
internal annotation class HideLoadMoreButtonCompatibility
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.personalinformation.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideEmailAddressCompatibility
|
internal annotation class HideEmailAddressCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.seekbar.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideSeekbarCompatibility
|
internal annotation class HideSeekbarCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.shorts.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideShortsComponentsCompatibility
|
internal annotation class HideShortsComponentsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.time.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideTimeCompatibility
|
internal annotation class HideTimeCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.watchinvr.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class WatchInVRCompatibility
|
internal annotation class WatchInVRCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.hide.watermark.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HideWatermarkCompatibility
|
internal annotation class HideWatermarkCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.panels.fullscreen.remove.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class FullscreenPanelsCompatibility
|
internal annotation class FullscreenPanelsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.panels.popup.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class PlayerPopupPanelsCompatibility
|
internal annotation class PlayerPopupPanelsCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class ReturnYouTubeDislikeCompatibility
|
internal annotation class ReturnYouTubeDislikeCompatibility
|
|
@ -13,8 +13,7 @@ object TextComponentAtomicReferenceFingerprint : MethodFingerprint(
|
||||||
access = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
access = AccessFlags.PROTECTED or AccessFlags.FINAL,
|
||||||
parameters = listOf("L"),
|
parameters = listOf("L"),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.MOVE_OBJECT, // available unused register
|
Opcode.MOVE_OBJECT_FROM16, // available unused register
|
||||||
Opcode.MOVE_OBJECT_FROM16,
|
|
||||||
Opcode.MOVE_OBJECT_FROM16,
|
Opcode.MOVE_OBJECT_FROM16,
|
||||||
Opcode.MOVE_OBJECT_FROM16,
|
Opcode.MOVE_OBJECT_FROM16,
|
||||||
Opcode.MOVE_OBJECT_FROM16,
|
Opcode.MOVE_OBJECT_FROM16,
|
||||||
|
|
|
@ -99,7 +99,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
|
||||||
val atomicReferenceStartIndex = TextComponentAtomicReferenceFingerprint.result!!
|
val atomicReferenceStartIndex = TextComponentAtomicReferenceFingerprint.result!!
|
||||||
.scanResult.patternScanResult!!.startIndex
|
.scanResult.patternScanResult!!.startIndex
|
||||||
|
|
||||||
val insertIndex = atomicReferenceStartIndex + 8
|
val insertIndex = atomicReferenceStartIndex + 7
|
||||||
|
|
||||||
textComponentContextFingerprintResult.mutableMethod.apply {
|
textComponentContextFingerprintResult.mutableMethod.apply {
|
||||||
// Get the conversion context obfuscated field name, and the registers for the AtomicReference and CharSequence
|
// Get the conversion context obfuscated field name, and the registers for the AtomicReference and CharSequence
|
||||||
|
@ -111,7 +111,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
|
||||||
instruction<TwoRegisterInstruction>(atomicReferenceStartIndex).registerB
|
instruction<TwoRegisterInstruction>(atomicReferenceStartIndex).registerB
|
||||||
|
|
||||||
val atomicReferenceRegister =
|
val atomicReferenceRegister =
|
||||||
instruction<FiveRegisterInstruction>(atomicReferenceStartIndex + 5).registerC
|
instruction<FiveRegisterInstruction>(atomicReferenceStartIndex + 4).registerC
|
||||||
|
|
||||||
val moveCharSequenceInstruction = instruction<TwoRegisterInstruction>(insertIndex)
|
val moveCharSequenceInstruction = instruction<TwoRegisterInstruction>(insertIndex)
|
||||||
val charSequenceRegister = moveCharSequenceInstruction.registerB
|
val charSequenceRegister = moveCharSequenceInstruction.registerB
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.searchbar.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class WideSearchbarCompatibility
|
internal annotation class WideSearchbarCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.sponsorblock.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class SponsorBlockCompatibility
|
internal annotation class SponsorBlockCompatibility
|
|
@ -103,17 +103,18 @@ class SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
val seekbarMethodInstructions = seekbarMethod.implementation!!.instructions
|
val seekbarMethodInstructions = seekbarMethod.implementation!!.instructions
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the instance of the seekbar rectangle
|
* Get left and right of seekbar rectangle
|
||||||
*/
|
*/
|
||||||
for ((index, instruction) in seekbarMethodInstructions.withIndex()) {
|
val moveRectangleToRegisterIndex = seekbarMethodInstructions.indexOfFirst {
|
||||||
if (instruction.opcode != Opcode.MOVE_OBJECT_FROM16) continue
|
it.opcode == Opcode.MOVE_OBJECT_FROM16
|
||||||
seekbarMethod.addInstruction(
|
|
||||||
index + 1,
|
|
||||||
"invoke-static/range {p0 .. p0}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V"
|
|
||||||
)
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
seekbarMethod.addInstruction(
|
||||||
|
moveRectangleToRegisterIndex + 1,
|
||||||
|
"invoke-static/range {p0 .. p0}, " +
|
||||||
|
"$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V"
|
||||||
|
)
|
||||||
|
|
||||||
for ((index, instruction) in seekbarMethodInstructions.withIndex()) {
|
for ((index, instruction) in seekbarMethodInstructions.withIndex()) {
|
||||||
if (instruction.opcode != Opcode.INVOKE_STATIC) continue
|
if (instruction.opcode != Opcode.INVOKE_STATIC) continue
|
||||||
|
|
||||||
|
@ -125,38 +126,15 @@ class SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
// set the thickness of the segment
|
// set the thickness of the segment
|
||||||
seekbarMethod.addInstruction(
|
seekbarMethod.addInstruction(
|
||||||
insertIndex,
|
insertIndex,
|
||||||
"invoke-static {v${invokeInstruction.registerC}}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V"
|
"invoke-static {v${invokeInstruction.registerC}}, " +
|
||||||
|
"$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V"
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Set rectangle absolute left and right positions
|
|
||||||
*/
|
|
||||||
val drawRectangleInstructions = seekbarMethodInstructions.withIndex().filter { (_, instruction) ->
|
|
||||||
instruction is ReferenceInstruction && (instruction.reference as? MethodReference)?.name == "drawRect"
|
|
||||||
}.map { (index, instruction) -> // TODO: improve code
|
|
||||||
index to (instruction as FiveRegisterInstruction).registerD
|
|
||||||
}
|
|
||||||
|
|
||||||
val (indexRight, rectangleRightRegister) = drawRectangleInstructions[0]
|
|
||||||
val (indexLeft, rectangleLeftRegister) = drawRectangleInstructions[3]
|
|
||||||
|
|
||||||
// order of operation is important here due to the code above which has to be improved
|
|
||||||
// the reason for that is that we get the index, add instructions and then the offset would be wrong
|
|
||||||
seekbarMethod.addInstruction(
|
|
||||||
indexLeft + 1,
|
|
||||||
"invoke-static {v$rectangleLeftRegister}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarAbsoluteLeft(Landroid/graphics/Rect;)V"
|
|
||||||
)
|
|
||||||
seekbarMethod.addInstruction(
|
|
||||||
indexRight + 1,
|
|
||||||
"invoke-static {v$rectangleRightRegister}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarAbsoluteRight(Landroid/graphics/Rect;)V"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Draw segment
|
* Draw segment
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Find the drawCircle call and draw the segment before it
|
// Find the drawCircle call and draw the segment before it
|
||||||
for (i in seekbarMethodInstructions.size - 1 downTo 0) {
|
for (i in seekbarMethodInstructions.size - 1 downTo 0) {
|
||||||
val invokeInstruction = seekbarMethodInstructions[i] as? ReferenceInstruction ?: continue
|
val invokeInstruction = seekbarMethodInstructions[i] as? ReferenceInstruction ?: continue
|
||||||
|
|
|
@ -10,7 +10,6 @@ import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
||||||
import app.revanced.patches.shared.settings.preference.impl.Preference
|
import app.revanced.patches.shared.settings.preference.impl.Preference
|
||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
import app.revanced.patches.youtube.layout.sponsorblock.annotations.SponsorBlockCompatibility
|
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.util.resources.ResourceUtils
|
import app.revanced.util.resources.ResourceUtils
|
||||||
import app.revanced.util.resources.ResourceUtils.copyResources
|
import app.revanced.util.resources.ResourceUtils.copyResources
|
||||||
|
@ -18,7 +17,6 @@ import app.revanced.util.resources.ResourceUtils.copyXmlNode
|
||||||
import app.revanced.util.resources.ResourceUtils.mergeStrings
|
import app.revanced.util.resources.ResourceUtils.mergeStrings
|
||||||
|
|
||||||
@Name("sponsorblock-resource-patch")
|
@Name("sponsorblock-resource-patch")
|
||||||
@SponsorBlockCompatibility
|
|
||||||
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class SponsorBlockResourcePatch : ResourcePatch {
|
class SponsorBlockResourcePatch : ResourcePatch {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.spoofappversion.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class SpoofAppVersionCompatibility
|
internal annotation class SpoofAppVersionCompatibility
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.startupshortsreset.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class StartupShortsResetCompatibility
|
internal annotation class StartupShortsResetCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.tabletminiplayer.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class TabletMiniPlayerCompatibility
|
internal annotation class TabletMiniPlayerCompatibility
|
||||||
|
|
|
@ -8,8 +8,8 @@ import app.revanced.patcher.patch.*
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patches.youtube.layout.seekbar.bytecode.patch.SeekbarColorBytecodePatch
|
import app.revanced.patches.youtube.layout.seekbar.bytecode.patch.SeekbarColorBytecodePatch
|
||||||
import app.revanced.patches.youtube.layout.theme.resource.ThemeResourcePatch
|
|
||||||
import app.revanced.patches.youtube.layout.theme.annotations.ThemeCompatibility
|
import app.revanced.patches.youtube.layout.theme.annotations.ThemeCompatibility
|
||||||
|
import app.revanced.patches.youtube.layout.theme.resource.ThemeResourcePatch
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("theme")
|
@Name("theme")
|
||||||
|
@ -45,5 +45,14 @@ class ThemeBytecodePatch : BytecodePatch() {
|
||||||
description = "The background color of the light theme. Can be a hex color or a resource reference.",
|
description = "The background color of the light theme. Can be a hex color or a resource reference.",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var splashScreenBackgroundColor: String? by option(
|
||||||
|
PatchOption.StringOption(
|
||||||
|
key = "splashScreenBackgroundColor",
|
||||||
|
default = "@android:color/black",
|
||||||
|
title = "Background color for the splash screen",
|
||||||
|
description = "The background color of the splash screen. Can be a hex color or a resource reference.",
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package app.revanced.patches.youtube.layout.theme.resource
|
package app.revanced.patches.youtube.layout.theme.resource
|
||||||
|
|
||||||
import app.revanced.patcher.data.ResourceContext
|
import app.revanced.patcher.data.ResourceContext
|
||||||
import app.revanced.patcher.patch.*
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
||||||
import app.revanced.patches.shared.settings.preference.impl.InputType
|
import app.revanced.patches.shared.settings.preference.impl.InputType
|
||||||
|
@ -9,9 +11,8 @@ import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
import app.revanced.patches.shared.settings.preference.impl.TextPreference
|
import app.revanced.patches.shared.settings.preference.impl.TextPreference
|
||||||
import app.revanced.patches.youtube.layout.theme.bytecode.patch.ThemeBytecodePatch.Companion.darkThemeBackgroundColor
|
import app.revanced.patches.youtube.layout.theme.bytecode.patch.ThemeBytecodePatch.Companion.darkThemeBackgroundColor
|
||||||
import app.revanced.patches.youtube.layout.theme.bytecode.patch.ThemeBytecodePatch.Companion.lightThemeBackgroundColor
|
import app.revanced.patches.youtube.layout.theme.bytecode.patch.ThemeBytecodePatch.Companion.lightThemeBackgroundColor
|
||||||
|
import app.revanced.patches.youtube.layout.theme.bytecode.patch.ThemeBytecodePatch.Companion.splashScreenBackgroundColor
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.util.resources.ResourceUtils
|
|
||||||
import app.revanced.util.resources.ResourceUtils.copyResources
|
|
||||||
import org.w3c.dom.Element
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
||||||
|
@ -29,35 +30,80 @@ class ThemeResourcePatch : ResourcePatch {
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
val darkThemeBackgroundColor = darkThemeBackgroundColor!!
|
|
||||||
val lightThemeBackgroundColor = lightThemeBackgroundColor!!
|
|
||||||
|
|
||||||
// Edit theme colors via resources.
|
// Edit theme colors via resources.
|
||||||
context.xmlEditor["res/values/colors.xml"].use { editor ->
|
context.xmlEditor["res/values/colors.xml"].use { editor ->
|
||||||
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
|
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
|
||||||
|
|
||||||
for (i in 0 until resourcesNode.childNodes.length) {
|
val children = resourcesNode.childNodes
|
||||||
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
|
for (i in 0 until children.length) {
|
||||||
|
val node = children.item(i) as? Element ?: continue
|
||||||
|
|
||||||
node.textContent = when (node.getAttribute("name")) {
|
node.textContent = when (node.getAttribute("name")) {
|
||||||
"yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", "yt_black2", "yt_black3",
|
"yt_black0", "yt_black1", "yt_black1_opacity95", "yt_black1_opacity98", "yt_black2", "yt_black3",
|
||||||
"yt_black4", "yt_status_bar_background_dark", "material_grey_850" -> darkThemeBackgroundColor
|
"yt_black4", "yt_status_bar_background_dark", "material_grey_850" -> darkThemeBackgroundColor
|
||||||
|
?: continue
|
||||||
|
|
||||||
"yt_white1", "yt_white1_opacity95", "yt_white1_opacity98",
|
"yt_white1", "yt_white1_opacity95", "yt_white1_opacity98",
|
||||||
"yt_white2", "yt_white3", "yt_white4",
|
"yt_white2", "yt_white3", "yt_white4",
|
||||||
-> lightThemeBackgroundColor
|
-> lightThemeBackgroundColor ?: continue
|
||||||
|
|
||||||
else -> continue
|
else -> continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the resource file to change the splash screen color.
|
splashScreenBackgroundColor ?: return PatchResultSuccess()
|
||||||
context.copyResources(
|
|
||||||
"theme", ResourceUtils.ResourceGroup("values-night-v31", "styles.xml")
|
// Edit splash screen background color for Android 11 and below.
|
||||||
)
|
context.xmlEditor["res/values/styles.xml"].use {
|
||||||
|
val resourcesNode = it.file.getElementsByTagName("resources").item(0) as Element
|
||||||
|
|
||||||
|
val children = resourcesNode.childNodes
|
||||||
|
for (i in 0 until children.length) {
|
||||||
|
val node = children.item(i) as? Element ?: continue
|
||||||
|
|
||||||
|
if (node.tagName != "style") continue
|
||||||
|
|
||||||
|
val name = node.getAttribute("name")
|
||||||
|
if (name != LAUNCHER_STYLE_NAME) continue
|
||||||
|
|
||||||
|
it.file.createElement("item").apply {
|
||||||
|
setAttribute("name", "android:windowSplashScreenBackground")
|
||||||
|
textContent = splashScreenBackgroundColor
|
||||||
|
}.also(node::appendChild)
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Edit splash screen background color for Android 12+.
|
||||||
|
|
||||||
|
// Add the splash screen background color to the colors.xml file.
|
||||||
|
context.xmlEditor["res/values/colors.xml"].use {
|
||||||
|
val resourcesNode = it.file.getElementsByTagName("resources").item(0) as Element
|
||||||
|
|
||||||
|
it.file.createElement("color").apply {
|
||||||
|
setAttribute("name", COLOR_NAME)
|
||||||
|
setAttribute("category", "color")
|
||||||
|
textContent = splashScreenBackgroundColor
|
||||||
|
}.also(resourcesNode::appendChild)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Point to the splash screen background color.
|
||||||
|
context.xmlEditor["res/drawable/quantum_launchscreen_youtube.xml"].use {
|
||||||
|
val node = it.file.getElementsByTagName("layer-list").item(0) as Element
|
||||||
|
|
||||||
|
val backgroundColorItem = node.childNodes.item(1) as Element
|
||||||
|
backgroundColorItem.apply {
|
||||||
|
setAttribute("android:drawable", "@color/$COLOR_NAME")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
private companion object {
|
||||||
|
private const val LAUNCHER_STYLE_NAME = "Base.Theme.YouTube.Launcher"
|
||||||
|
private const val COLOR_NAME = "splash_background_color"
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.autorepeat.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class AutoRepeatCompatibility
|
internal annotation class AutoRepeatCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class FixBackToExitGestureCompatibility
|
internal annotation class FixBackToExitGestureCompatibility
|
|
@ -1,8 +1,8 @@
|
||||||
package app.revanced.patches.shared.misc.fix.spoof.annotations
|
package app.revanced.patches.youtube.misc.fix.playback.annotations
|
||||||
|
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class ClientSpoofCompatibility
|
internal annotation class ClientSpoofCompatibility
|
|
@ -1,4 +1,4 @@
|
||||||
package app.revanced.patches.shared.misc.fix.spoof.fingerprints
|
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||||
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
@ -1,4 +1,4 @@
|
||||||
package app.revanced.patches.shared.misc.fix.spoof.patch
|
package app.revanced.patches.youtube.misc.fix.playback.patch
|
||||||
|
|
||||||
import app.revanced.extensions.toErrorResult
|
import app.revanced.extensions.toErrorResult
|
||||||
import app.revanced.patcher.annotation.Description
|
import app.revanced.patcher.annotation.Description
|
||||||
|
@ -12,9 +12,8 @@ import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patches.shared.misc.fix.spoof.annotations.ClientSpoofCompatibility
|
import app.revanced.patches.youtube.misc.fix.playback.annotations.ClientSpoofCompatibility
|
||||||
import app.revanced.patches.shared.misc.fix.spoof.fingerprints.UserAgentHeaderBuilderFingerprint
|
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.UserAgentHeaderBuilderFingerprint
|
||||||
import app.revanced.patches.youtube.misc.fix.playback.patch.SpoofSignatureVerificationPatch
|
|
||||||
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
|
|
||||||
@Patch
|
@Patch
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.integrations.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class IntegrationsCompatibility
|
internal annotation class IntegrationsCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.links.open.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class OpenLinksExternallyCompatibility
|
internal annotation class OpenLinksExternallyCompatibility
|
||||||
|
|
|
@ -3,7 +3,7 @@ package app.revanced.patches.youtube.misc.litho.filter.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class LithoFilterCompatibility
|
internal annotation class LithoFilterCompatibility
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.microg.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class MicroGPatchCompatibility
|
internal annotation class MicroGPatchCompatibility
|
|
@ -10,9 +10,7 @@ import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
||||||
import app.revanced.patches.shared.misc.fix.spoof.patch.ClientSpoofPatch
|
|
||||||
import app.revanced.patches.youtube.layout.buttons.cast.patch.HideCastButtonPatch
|
import app.revanced.patches.youtube.layout.buttons.cast.patch.HideCastButtonPatch
|
||||||
import app.revanced.patches.youtube.misc.fix.playback.patch.SpoofSignatureVerificationPatch
|
|
||||||
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
|
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
|
||||||
import app.revanced.patches.youtube.misc.microg.fingerprints.*
|
import app.revanced.patches.youtube.misc.microg.fingerprints.*
|
||||||
import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePatch
|
import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePatch
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.minimizedplayback.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37" ) )])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37" , "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class MinimizedPlaybackCompatibility
|
internal annotation class MinimizedPlaybackCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.playercontrols.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class PlayerControlsCompatibility
|
internal annotation class PlayerControlsCompatibility
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.playeroverlay.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class PlayerOverlaysHookCompatibility
|
internal annotation class PlayerOverlaysHookCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.misc.playertype.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class PlayerTypeHookCompatibility
|
internal annotation class PlayerTypeHookCompatibility
|
||||||
|
|
|
@ -4,6 +4,6 @@ import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
// TODO: delete this
|
// TODO: delete this
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class CustomVideoBufferCompatibility
|
internal annotation class CustomVideoBufferCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.video.hdrbrightness.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class HDRBrightnessCompatibility
|
internal annotation class HDRBrightnessCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.video.information.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class VideoInformationCompatibility
|
internal annotation class VideoInformationCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.video.oldqualitylayout.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class OldQualityLayoutCompatibility
|
internal annotation class OldQualityLayoutCompatibility
|
|
@ -1,12 +1,12 @@
|
||||||
package app.revanced.patches.youtube.video.oldqualitylayout.fingerprints
|
package app.revanced.patches.youtube.video.oldqualitylayout.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import app.revanced.patches.youtube.video.oldqualitylayout.patch.OldQualityLayoutResourcePatch
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
|
||||||
|
|
||||||
object QualityMenuViewInflateFingerprint : MethodFingerprint(
|
object QualityMenuViewInflateFingerprint : MethodFingerprint(
|
||||||
"L", AccessFlags.FINAL or AccessFlags.PUBLIC, listOf("L", "L", "L"), listOf(
|
opcodes = listOf(
|
||||||
Opcode.INVOKE_SUPER,
|
Opcode.INVOKE_SUPER,
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.CONST_4,
|
Opcode.CONST_4,
|
||||||
|
@ -20,12 +20,15 @@ object QualityMenuViewInflateFingerprint : MethodFingerprint(
|
||||||
Opcode.CONST,
|
Opcode.CONST,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
Opcode.CHECK_CAST,
|
Opcode.CHECK_CAST
|
||||||
Opcode.CONST,
|
),
|
||||||
Opcode.INVOKE_VIRTUAL,
|
customFingerprint = { methodDef, _ ->
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
methodDef.implementation?.instructions?.any {
|
||||||
Opcode.IGET_OBJECT,
|
if (it.opcode != Opcode.CONST) return@any false
|
||||||
Opcode.IGET_OBJECT,
|
|
||||||
Opcode.CONST_STRING,
|
val literal = (it as WideLiteralInstruction).wideLiteral
|
||||||
)
|
|
||||||
|
literal == OldQualityLayoutResourcePatch.videoQualityBottomSheetListFragmentTitle
|
||||||
|
} ?: false
|
||||||
|
}
|
||||||
)
|
)
|
|
@ -10,35 +10,19 @@ import app.revanced.patcher.patch.PatchResult
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
import app.revanced.patcher.patch.annotations.DependsOn
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
|
||||||
import app.revanced.patches.youtube.video.oldqualitylayout.annotations.OldQualityLayoutCompatibility
|
import app.revanced.patches.youtube.video.oldqualitylayout.annotations.OldQualityLayoutCompatibility
|
||||||
import app.revanced.patches.youtube.video.oldqualitylayout.fingerprints.QualityMenuViewInflateFingerprint
|
import app.revanced.patches.youtube.video.oldqualitylayout.fingerprints.QualityMenuViewInflateFingerprint
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
|
||||||
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
|
||||||
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
@DependsOn([IntegrationsPatch::class, OldQualityLayoutResourcePatch::class])
|
||||||
@Name("old-quality-layout")
|
@Name("old-quality-layout")
|
||||||
@Description("Enables the original video quality flyout in the video player settings")
|
@Description("Enables the original video quality flyout in the video player settings.")
|
||||||
@OldQualityLayoutCompatibility
|
@OldQualityLayoutCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
// new ReVanced users have no idea what it means to use the "old quality layout menu"
|
class OldQualityLayoutPatch : BytecodePatch(listOf(QualityMenuViewInflateFingerprint)) {
|
||||||
// maybe rename this patch to better describe what it provides (ie: user-selectable-video-resolution )
|
|
||||||
class OldQualityLayoutPatch : BytecodePatch(
|
|
||||||
listOf(QualityMenuViewInflateFingerprint)
|
|
||||||
) {
|
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
SettingsPatch.PreferenceScreen.VIDEO.addPreferences(
|
|
||||||
SwitchPreference(
|
|
||||||
"revanced_show_old_video_menu",
|
|
||||||
StringResource("revanced_show_old_video_menu_title", "Use old video quality player menu"),
|
|
||||||
StringResource("revanced_show_old_video_menu_summary_on", "Old video quality menu is used"),
|
|
||||||
StringResource("revanced_show_old_video_menu_summary_off", "Old video quality menu is not used")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val inflateFingerprintResult = QualityMenuViewInflateFingerprint.result!!
|
val inflateFingerprintResult = QualityMenuViewInflateFingerprint.result!!
|
||||||
val method = inflateFingerprintResult.mutableMethod
|
val method = inflateFingerprintResult.mutableMethod
|
||||||
val instructions = method.implementation!!.instructions
|
val instructions = method.implementation!!.instructions
|
||||||
|
@ -57,4 +41,4 @@ class OldQualityLayoutPatch : BytecodePatch(
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package app.revanced.patches.youtube.video.oldqualitylayout.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
|
||||||
|
@DependsOn([SettingsPatch::class, ResourceMappingPatch::class])
|
||||||
|
class OldQualityLayoutResourcePatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.VIDEO.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_show_old_video_menu",
|
||||||
|
StringResource("revanced_show_old_video_menu_title", "Use old video quality player menu"),
|
||||||
|
StringResource("revanced_show_old_video_menu_summary_on", "Old video quality menu is used"),
|
||||||
|
StringResource("revanced_show_old_video_menu_summary_off", "Old video quality menu is not used")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
videoQualityBottomSheetListFragmentTitle =
|
||||||
|
ResourceMappingPatch.resourceMappings.find { it.name == "video_quality_bottom_sheet_list_fragment_title" }
|
||||||
|
?.id ?: return PatchResultError("Could not find resource")
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal companion object {
|
||||||
|
var videoQualityBottomSheetListFragmentTitle = -1L
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.video.quality.annotations
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class RememberVideoQualityCompatibility
|
internal annotation class RememberVideoQualityCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.video.speed
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class VideoSpeedCompatibility
|
internal annotation class VideoSpeedCompatibility
|
||||||
|
|
|
@ -3,6 +3,6 @@ package app.revanced.patches.youtube.video.videoid.annotation
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37"))])
|
@Compatibility([Package("com.google.android.youtube", arrayOf("18.16.37", "18.19.35"))])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class VideoIdCompatibility
|
internal annotation class VideoIdCompatibility
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<style name="Base.Theme.YouTube.Launcher" parent="@style/Theme.AppCompat.NoActionBar">
|
|
||||||
<item name="android:windowSplashScreenBackground">@android:color/black</item>
|
|
||||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/avd_anim</item>
|
|
||||||
<item name="android:windowSplashScreenAnimationDuration">1000</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
Loading…
Reference in a new issue