Compare commits

..

4 Commits

Author SHA1 Message Date
semantic-release-bot
25f65c7c02 chore(release): 2.97.0 [skip ci]
# [2.97.0](https://github.com/revanced/revanced-patches/compare/v2.96.0...v2.97.0) (2022-10-29)

### Features

* **youtube/microg-support:** handle availability of Vanced MicroG ([b9e875c](07d39f2b81))
2022-10-29 01:06:18 +00:00
oSumAtrIX
07d39f2b81 feat(youtube/microg-support): handle availability of Vanced MicroG 2022-10-29 03:03:57 +02:00
semantic-release-bot
01e226d0c9 chore(release): 2.96.0 [skip ci]
# [2.96.0](https://github.com/revanced/revanced-patches/compare/v2.95.0...v2.96.0) (2022-10-28)

### Features

* **youtube/return-youtube-dislike:** compatibility for old and new button layout ([03b9b94](c98e10adf7))
2022-10-28 23:56:07 +00:00
oSumAtrIX
c98e10adf7 feat(youtube/return-youtube-dislike): compatibility for old and new button layout 2022-10-29 01:54:28 +02:00
11 changed files with 122 additions and 50 deletions

View File

@@ -1,3 +1,17 @@
# [2.97.0](https://github.com/revanced/revanced-patches/compare/v2.96.0...v2.97.0) (2022-10-29)
### Features
* **youtube/microg-support:** handle availability of Vanced MicroG ([bfd0d14](https://github.com/revanced/revanced-patches/commit/bfd0d1418fb68f1d37687ec2072d3b64a9c3c6ee))
# [2.96.0](https://github.com/revanced/revanced-patches/compare/v2.95.0...v2.96.0) (2022-10-28)
### Features
* **youtube/return-youtube-dislike:** compatibility for old and new button layout ([6629bd7](https://github.com/revanced/revanced-patches/commit/6629bd71716a753be06617724e536b8ab4c3b69a))
# [2.95.0](https://github.com/revanced/revanced-patches/compare/v2.94.0...v2.95.0) (2022-10-28) # [2.95.0](https://github.com/revanced/revanced-patches/compare/v2.94.0...v2.95.0) (2022-10-28)

View File

@@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 2.95.0 version = 2.97.0

View File

@@ -14,7 +14,7 @@ import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.youtube.interaction.swipecontrols.annotation.SwipeControlsCompatibility import app.revanced.patches.youtube.interaction.swipecontrols.annotation.SwipeControlsCompatibility
import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint
import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.WatchWhileActivityFingerprint import app.revanced.shared.fingerprints.WatchWhileActivityFingerprint
import app.revanced.patches.youtube.interaction.swipecontrols.patch.resource.SwipeControlsResourcePatch import app.revanced.patches.youtube.interaction.swipecontrols.patch.resource.SwipeControlsResourcePatch
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.annotations.ReturnYouTubeDislikeCompatibility
@Name("text-component-spec-fingerprint")
@ReturnYouTubeDislikeCompatibility
@Version("0.0.1")
object TextComponentFingerprint : MethodFingerprint(
strings = listOf("com.google.android.apps.youtube.music")
)

View File

@@ -4,7 +4,10 @@ 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.MethodFingerprintExtensions.name
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
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.PatchResultError
@@ -12,10 +15,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.youtube.layout.returnyoutubedislike.annotations.ReturnYouTubeDislikeCompatibility import app.revanced.patches.youtube.layout.returnyoutubedislike.annotations.ReturnYouTubeDislikeCompatibility
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.DislikeFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.*
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.LikeFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RemoveLikeFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.TextComponentSpecParentFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch
@@ -32,49 +32,53 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
) )
) { ) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
LikeFingerprint.result!!.mutableMethod.addInstructions( listOf(
0, LikeFingerprint.toPatch(Vote.LIKE),
""" DislikeFingerprint.toPatch(Vote.DISLIKE),
const/4 v0, 1 RemoveLikeFingerprint.toPatch(Vote.REMOVE_LIKE)
invoke-static {v0}, Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->sendVote(I)V ).forEach { (fingerprint, vote) ->
""" with(fingerprint.result ?: return PatchResultError("Failed to find ${fingerprint.name} method.")) {
) mutableMethod.addInstructions(
DislikeFingerprint.result!!.mutableMethod.addInstructions( 0,
0, """
""" const/4 v0, ${vote.value}
const/4 v0, -1 invoke-static {v0}, Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->sendVote(I)V
invoke-static {v0}, Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->sendVote(I)V """
""" )
) }
RemoveLikeFingerprint.result!!.mutableMethod.addInstructions( }
0,
"""
const/4 v0, 0
invoke-static {v0}, Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->sendVote(I)V
"""
)
VideoIdPatch.injectCall("Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->newVideoLoaded(Ljava/lang/String;)V") VideoIdPatch.injectCall("Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->newVideoLoaded(Ljava/lang/String;)V")
val parentResult = TextComponentSpecParentFingerprint.result!! with(TextComponentFingerprint
val createComponentMethod = parentResult.mutableClass.methods.find { method -> .also { it.resolve(context, TextComponentSpecParentFingerprint.result!!.classDef) }
method.parameters.size >= 19 && method.parameterTypes.takeLast(4) .result ?: return PatchResultError("Could not find createComponent method")
.all { param -> param == "Ljava/util/concurrent/atomic/AtomicReference;" } ) {
val createComponentMethod = mutableMethod
val conversionContextParam = 5
val textRefParam = createComponentMethod.parameters.size - 2
val insertIndex = scanResult.stringsScanResult!!.matches.first().index - 2
createComponentMethod.addInstructions(
insertIndex,
"""
move-object/from16 v7, p$conversionContextParam
move-object/from16 v8, p$textRefParam
invoke-static {v7, v8}, Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->onComponentCreated(Ljava/lang/Object;Ljava/util/concurrent/atomic/AtomicReference;)V
"""
)
} }
?: return PatchResultError("TextComponentSpec.createComponent not found")
val conversionContextParam = 5
val textRefParam = createComponentMethod.parameters.size - 2
createComponentMethod.addInstructions(
0,
"""
move-object/from16 v0, p$conversionContextParam
move-object/from16 v1, p$textRefParam
invoke-static {v0, v1}, Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;->onComponentCreated(Ljava/lang/Object;Ljava/util/concurrent/atomic/AtomicReference;)V
"""
)
return PatchResultSuccess() return PatchResultSuccess()
} }
private fun MethodFingerprint.toPatch(voteKind: Vote) = VotePatch(this, voteKind)
private data class VotePatch(val fingerprint: MethodFingerprint, val voteKind: Vote)
private enum class Vote(val value: Int) {
LIKE(1),
DISLIKE(-1),
REMOVE_LIKE(0)
}
} }

View File

@@ -4,10 +4,13 @@ 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.addInstruction
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
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.shared.fingerprints.WatchWhileActivityFingerprint
import app.revanced.patches.youtube.layout.castbutton.patch.HideCastButtonPatch import app.revanced.patches.youtube.layout.castbutton.patch.HideCastButtonPatch
import app.revanced.patches.youtube.misc.clientspoof.patch.ClientSpoofPatch import app.revanced.patches.youtube.misc.clientspoof.patch.ClientSpoofPatch
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
@@ -38,9 +41,10 @@ class MicroGBytecodePatch : BytecodePatch(
CastDynamiteModuleV2Fingerprint, CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint, CastContextFetchFingerprint,
PrimeFingerprint, PrimeFingerprint,
WatchWhileActivityFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext) = override fun execute(context: BytecodeContext): PatchResult {
// apply common microG patch // apply common microG patch
MicroGBytecodeHelper.patchBytecode( MicroGBytecodeHelper.patchBytecode(
context, arrayOf( context, arrayOf(
@@ -62,5 +66,11 @@ class MicroGBytecodePatch : BytecodePatch(
CastDynamiteModuleV2Fingerprint, CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint CastContextFetchFingerprint
) )
).let { PatchResultSuccess() } )
// inject the notice for MicroG
MicroGBytecodeHelper.injectNotice(WatchWhileActivityFingerprint)
return PatchResultSuccess()
}
} }

View File

@@ -53,6 +53,10 @@ class MicroGResourcePatch : ResourcePatch {
SPOOFED_PACKAGE_NAME, SPOOFED_PACKAGE_NAME,
SPOOFED_PACKAGE_SIGNATURE SPOOFED_PACKAGE_SIGNATURE
) )
// add strings
MicroGResourceHelper.addStrings(context)
return PatchResultSuccess() return PatchResultSuccess()
} }
} }

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.interaction.swipecontrols.fingerprints package app.revanced.shared.fingerprints
import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version import app.revanced.patcher.annotation.Version

View File

@@ -1,6 +1,7 @@
package app.revanced.util.microg package app.revanced.util.microg
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
@@ -20,6 +21,17 @@ import org.jf.dexlib2.immutable.reference.ImmutableStringReference
* Helper class for applying bytecode patches needed for the microg-support patches. * Helper class for applying bytecode patches needed for the microg-support patches.
*/ */
internal object MicroGBytecodeHelper { internal object MicroGBytecodeHelper {
/**
* Hook a method to check the availability of MicroG.
*
* @param fingerprint The fingerprint of the method to add the call for the notice in.
*/
fun injectNotice(fingerprint: MethodFingerprint) {
fingerprint.result!!.mutableMethod.addInstruction(
0,
"invoke-static {}, Lapp/revanced/integrations/patches/MicroGSupport;->checkAvailability()V"
)
}
/** /**
* Transform strings with package name out of [fromPackageName] and [toPackageName]. * Transform strings with package name out of [fromPackageName] and [toPackageName].

View File

@@ -1,16 +1,26 @@
package app.revanced.util.microg package app.revanced.util.microg
import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.data.ResourceContext
import app.revanced.util.resources.ResourceUtils.Settings.mergeStrings
/** /**
* Helper class for applying resource patches needed for the microg-support patches. * Helper class for applying resource patches needed for the microg-support patches.
*/ */
internal object MicroGResourceHelper { internal object MicroGResourceHelper {
/**
* Add necessary strings to the strings.xml file.
*
* @param context The resource context.
* @param stringsHost The file which hosts the strings.
*/
fun addStrings(context: ResourceContext, stringsHost: String = "microg/host/values/strings.xml") = context.mergeStrings(stringsHost)
/** /**
* Patch the manifest to work with MicroG. * Patch the manifest to work with MicroG.
* *
* @param context Bytecode context. * @param context The resource context.
* @param fromPackageName Original package name. * @param fromPackageName The original package name.
* @param toPackageName The package name to accept. * @param toPackageName The package name to accept.
* @param toName The new name of the app. * @param toName The new name of the app.
*/ */

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="microg_not_installed_warning">Vanced MicroG is not installed. Please install it.</string>
</resources>