diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/annotations/WideSearchbarCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/annotations/WideSearchbarCompatibility.kt new file mode 100644 index 00000000..34467314 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/annotations/WideSearchbarCompatibility.kt @@ -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 \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodone/WideSearchbarOneFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodone/WideSearchbarOneFingerprint.kt new file mode 100644 index 00000000..67418ab3 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodone/WideSearchbarOneFingerprint.kt @@ -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 +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodone/WideSearchbarOneParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodone/WideSearchbarOneParentFingerprint.kt new file mode 100644 index 00000000..bf838519 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodone/WideSearchbarOneParentFingerprint.kt @@ -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") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodtwo/WideSearchbarTwoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodtwo/WideSearchbarTwoFingerprint.kt new file mode 100644 index 00000000..5b7d2817 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodtwo/WideSearchbarTwoFingerprint.kt @@ -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;->(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 +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodtwo/WideSearchbarTwoParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodtwo/WideSearchbarTwoParentFingerprint.kt new file mode 100644 index 00000000..867f1b52 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/fingerprints/methodtwo/WideSearchbarTwoParentFingerprint.kt @@ -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") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/patch/WideSearchbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/patch/WideSearchbarPatch.kt new file mode 100644 index 00000000..e6e803ff --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/widesearchbar/patch/WideSearchbarPatch.kt @@ -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 + + */ +}