mirror of
https://github.com/revanced/revanced-patches
synced 2025-01-03 22:25:51 +01:00
feat: implement wide-searchbar
Patch (#130)
This commit is contained in:
parent
04f0342726
commit
332f4d12d0
@ -0,0 +1,13 @@
|
||||
package app.revanced.patches.youtube.layout.widesearchbar.annotations
|
||||
|
||||
import app.revanced.patcher.annotation.Compatibility
|
||||
import app.revanced.patcher.annotation.Package
|
||||
|
||||
@Compatibility(
|
||||
[Package(
|
||||
"com.google.android.youtube", arrayOf("17.25.34")
|
||||
)]
|
||||
)
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
internal annotation class WideSearchbarCompatibility
|
@ -0,0 +1,47 @@
|
||||
package app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodone
|
||||
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
|
||||
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import app.revanced.patches.youtube.layout.reels.annotations.HideReelsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("wide-searchbar-methodone-fingerprint")
|
||||
@MatchingMethod(
|
||||
"Ljkg;", "i"
|
||||
)
|
||||
@DirectPatternScanMethod
|
||||
@HideReelsCompatibility
|
||||
@Version("0.0.1")
|
||||
|
||||
/*
|
||||
This finds the following method:
|
||||
public final View i(akrl akrlVar, adpd adpdVar) {
|
||||
}
|
||||
|
||||
Method we search for is located in smali now.
|
||||
See:
|
||||
.method public final i(Lakrl;Ladpd;)Landroid/view/View;
|
||||
iget-object v0, p0, Ljkg;->a:Landroid/app/Activity;
|
||||
invoke-static {v0}, Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater;
|
||||
move-result-object v0
|
||||
iget-object v1, p0, Ljkg;->g:Ljis;
|
||||
const/4 v2, 0x0
|
||||
invoke-interface {v1, v2}, Ljis;->h(Z)V
|
||||
iget-object p1, p1, Lakrl;->f:Lahnq;
|
||||
if-nez p1, :cond_12
|
||||
sget-object p1, Lahnq;->a:Lahnq;
|
||||
:cond_12
|
||||
iget-object v1, p0, Ljkg;->x:Ltxm;
|
||||
invoke-static {v1}, Lfbn;->aF(Ltxm;)Z //THIS IS WHAT WE SEARCH FOR (Method fbn.aF)
|
||||
move-result v1
|
||||
*/
|
||||
|
||||
object WideSearchbarOneFingerprint : MethodFingerprint(
|
||||
"L", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L", "L"), listOf(Opcode.IF_NEZ, Opcode.SGET_OBJECT, Opcode.IGET_OBJECT, Opcode.INVOKE_STATIC),
|
||||
null, null
|
||||
)
|
@ -0,0 +1,46 @@
|
||||
package app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodone
|
||||
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.layout.reels.annotations.HideReelsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
@Name("wide-searchbar-methodone-parent-fingerprint")
|
||||
@MatchingMethod(
|
||||
"Ljkg;", "l"
|
||||
)
|
||||
@FuzzyPatternScanMethod(3)
|
||||
@HideReelsCompatibility
|
||||
@Version("0.0.1")
|
||||
|
||||
/*
|
||||
* This finds the following method:
|
||||
private final void l(PaneDescriptor paneDescriptor) {
|
||||
Class cls = null;
|
||||
ahat f = paneDescriptor != null ? paneDescriptor.f() : null;
|
||||
if (paneDescriptor != null) {
|
||||
cls = paneDescriptor.a;
|
||||
}
|
||||
ftu k = k();
|
||||
if ((k == null || !k.bk()) && ((!frx.k(f) && !((Boolean) aqer.S(this.n).X(new fac(this, f, 19)).K(irx.i).aH(false)).booleanValue()) || (f != null && f.qA(ReelWatchEndpointOuterClass$ReelWatchEndpoint.reelWatchEndpoint)))) {
|
||||
String j = frx.j(f);
|
||||
if ((j != null && ("FEhistory".equals(j) || "FEmy_videos".equals(j) || "FEpurchases".equals(j) || j.startsWith("VL"))) || cls == this.I.E() || cls == this.G.a) {
|
||||
this.F = 3;
|
||||
return;
|
||||
} else {
|
||||
this.F = 2;
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.F = 1;
|
||||
}
|
||||
*/
|
||||
|
||||
object WideSearchbarOneParentFingerprint : MethodFingerprint(
|
||||
"V", AccessFlags.PRIVATE or AccessFlags.FINAL, listOf("L"), null,
|
||||
listOf("FEhistory", "FEmy_videos", "FEpurchases")
|
||||
)
|
@ -0,0 +1,48 @@
|
||||
package app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodtwo
|
||||
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
|
||||
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import app.revanced.patches.youtube.layout.reels.annotations.HideReelsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.Opcode
|
||||
|
||||
@Name("wide-searchbar-methodtwo-fingerprint")
|
||||
@MatchingMethod(
|
||||
"Lkrf;", "h"
|
||||
)
|
||||
@DirectPatternScanMethod
|
||||
@HideReelsCompatibility
|
||||
@Version("0.0.1")
|
||||
|
||||
/*
|
||||
public static jis h(Context context, txm txmVar, uag uagVar, txp txpVar) {
|
||||
return fbn.aB(txmVar) ? new jhx(context, txmVar, uagVar, txpVar) : jis.d;
|
||||
}
|
||||
|
||||
Method we search for is located in smali now.
|
||||
See:
|
||||
.method public static h(Landroid/content/Context;Ltxm;Luag;Ltxp;)Ljis;
|
||||
invoke-static {p1}, Lfbn;->aB(Ltxm;)Z //this is the method we want to change. fbn.aB
|
||||
move-result v0
|
||||
if-eqz v0, :cond_c
|
||||
new-instance v0, Ljhx;
|
||||
invoke-direct {v0, p0, p1, p2, p3}, Ljhx;-><init>(Landroid/content/Context;Ltxm;Luag;Ltxp;)V
|
||||
goto :goto_e
|
||||
:cond_c
|
||||
sget-object v0, Ljis;->d:Ljis;
|
||||
:goto_e
|
||||
return-object v0
|
||||
.end method
|
||||
|
||||
*/
|
||||
|
||||
object WideSearchbarTwoFingerprint : MethodFingerprint(
|
||||
"L", AccessFlags.PUBLIC or AccessFlags.STATIC, listOf("L", "L", "L", "L"), listOf(
|
||||
Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT, Opcode.IF_EQZ, Opcode.NEW_INSTANCE
|
||||
),
|
||||
null, null
|
||||
)
|
@ -0,0 +1,34 @@
|
||||
package app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodtwo
|
||||
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
|
||||
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
|
||||
import app.revanced.patches.youtube.layout.reels.annotations.HideReelsCompatibility
|
||||
import org.jf.dexlib2.AccessFlags
|
||||
|
||||
@Name("wide-searchbar-methodtwo-parent-fingerprint")
|
||||
@MatchingMethod(
|
||||
"Lkrf;", "i"
|
||||
)
|
||||
@FuzzyPatternScanMethod(3)
|
||||
@HideReelsCompatibility
|
||||
@Version("0.0.1")
|
||||
|
||||
/*
|
||||
This finds following method:
|
||||
public static ies i(br brVar) {
|
||||
bp f = brVar.getSupportFragmentManager().f("VIDEO_QUALITIES_QUICK_MENU_BOTTOM_SHEET_FRAGMENT");
|
||||
if (f != null) {
|
||||
return (kga) f;
|
||||
}
|
||||
return new kga();
|
||||
}
|
||||
*/
|
||||
|
||||
object WideSearchbarTwoParentFingerprint : MethodFingerprint(
|
||||
"L", AccessFlags.PUBLIC or AccessFlags.STATIC, listOf("L"), null,
|
||||
listOf("VIDEO_QUALITIES_QUICK_MENU_BOTTOM_SHEET_FRAGMENT")
|
||||
)
|
@ -0,0 +1,105 @@
|
||||
package app.revanced.patches.youtube.layout.widesearchbar.patch
|
||||
|
||||
import app.revanced.patcher.annotation.Description
|
||||
import app.revanced.patcher.annotation.Name
|
||||
import app.revanced.patcher.annotation.Version
|
||||
import app.revanced.patcher.data.impl.BytecodeData
|
||||
import app.revanced.patcher.data.impl.toMethodWalker
|
||||
import app.revanced.patcher.extensions.addInstructions
|
||||
import app.revanced.patcher.fingerprint.method.utils.MethodFingerprintUtils.resolve
|
||||
import app.revanced.patcher.patch.PatchResult
|
||||
import app.revanced.patcher.patch.PatchResultSuccess
|
||||
import app.revanced.patcher.patch.annotations.Dependencies
|
||||
import app.revanced.patcher.patch.annotations.Patch
|
||||
import app.revanced.patcher.patch.impl.BytecodePatch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.youtube.layout.widesearchbar.annotations.WideSearchbarCompatibility
|
||||
import app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodone.WideSearchbarOneFingerprint
|
||||
import app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodone.WideSearchbarOneParentFingerprint
|
||||
import app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodtwo.WideSearchbarTwoFingerprint
|
||||
import app.revanced.patches.youtube.layout.widesearchbar.fingerprints.methodtwo.WideSearchbarTwoParentFingerprint
|
||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||
|
||||
@Patch(include = false)
|
||||
@Dependencies(dependencies = [IntegrationsPatch::class])
|
||||
@Name("enable-wide-searchbar")
|
||||
@Description("Replaces the search-icon with a wide searchbar. This will hide the youtube logo when this is active.")
|
||||
@WideSearchbarCompatibility
|
||||
@Version("0.0.1")
|
||||
class WideSearchbarPatch : BytecodePatch(
|
||||
listOf(
|
||||
WideSearchbarOneParentFingerprint, WideSearchbarTwoParentFingerprint
|
||||
)
|
||||
) {
|
||||
override fun execute(data: BytecodeData): PatchResult {
|
||||
WideSearchbarOneFingerprint.resolve(data, WideSearchbarOneParentFingerprint.result!!.classDef)
|
||||
WideSearchbarTwoFingerprint.resolve(data, WideSearchbarTwoParentFingerprint.result!!.classDef)
|
||||
|
||||
val resultOne = WideSearchbarOneFingerprint.result
|
||||
|
||||
//This should be the method aF in class fbn
|
||||
val targetMethodOne =
|
||||
data.toMethodWalker(resultOne!!.method).nextMethod(resultOne!!.patternScanResult!!.endIndex, true).getMethod() as MutableMethod
|
||||
|
||||
//Since both methods have the same smali code, inject instructions using a method.
|
||||
addInstructions(targetMethodOne)
|
||||
|
||||
val resultTwo = WideSearchbarTwoFingerprint.result
|
||||
|
||||
//This should be the method aB in class fbn
|
||||
val targetMethodTwo =
|
||||
data.toMethodWalker(resultTwo!!.method).nextMethod(resultTwo!!.patternScanResult!!.startIndex, true).getMethod() as MutableMethod
|
||||
|
||||
//Since both methods have the same smali code, inject instructions using a method.
|
||||
addInstructions(targetMethodTwo)
|
||||
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
||||
private fun addInstructions(method: MutableMethod) {
|
||||
val index = method.implementation!!.instructions.size - 1
|
||||
method.addInstructions(
|
||||
index, """
|
||||
invoke-static {}, Lapp/revanced/integrations/patches/NewActionbarPatch;->getNewActionBar()Z
|
||||
move-result p0
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
||||
//targetMethodOne: in class fbn
|
||||
/*
|
||||
.method public static aF(Ltxm;)Z
|
||||
invoke-virtual {p0}, Ltxm;->b()Lahah;
|
||||
move-result-object p0
|
||||
iget-object p0, p0, Lahah;->e:Lakfd;
|
||||
if-nez p0, :cond_a
|
||||
sget-object p0, Lakfd;->a:Lakfd;
|
||||
:cond_a
|
||||
iget-boolean p0, p0, Lakfd;->V:Z
|
||||
//added code here:
|
||||
invoke-static {}, app/revanced/integrations/patches/NewActionbarPatch;->getNewActionBar()Z
|
||||
move-result p0
|
||||
//original code here:
|
||||
return p0
|
||||
.end method
|
||||
*/
|
||||
|
||||
//targetMethodTwo: in class fbn
|
||||
/*
|
||||
.method public static aB(Ltxm;)Z
|
||||
invoke-virtual {p0}, Ltxm;->b()Lahah;
|
||||
move-result-object p0
|
||||
iget-object p0, p0, Lahah;->e:Lakfd;
|
||||
if-nez p0, :cond_a
|
||||
sget-object p0, Lakfd;->a:Lakfd;
|
||||
:cond_a
|
||||
iget-boolean p0, p0, Lakfd;->y:Z
|
||||
//added code here:
|
||||
invoke-static {}, app/revanced/integrations/patches/NewActionbarPatch;->getNewActionBar()Z
|
||||
move-result p0
|
||||
//original code here:
|
||||
return p0
|
||||
.end method
|
||||
|
||||
*/
|
||||
}
|
Loading…
Reference in New Issue
Block a user