fix(YouTube - Hide Shorts components): Correctly hide Shorts if navigation tab is changed using device back button (#3007)
This commit is contained in:
parent
1a7fe5eede
commit
e5848e99c4
|
@ -36,7 +36,9 @@ object NavigationBarHookPatch : BytecodePatch(
|
||||||
NavigationEnumFingerprint,
|
NavigationEnumFingerprint,
|
||||||
PivotBarButtonsCreateDrawableViewFingerprint,
|
PivotBarButtonsCreateDrawableViewFingerprint,
|
||||||
PivotBarButtonsCreateResourceViewFingerprint,
|
PivotBarButtonsCreateResourceViewFingerprint,
|
||||||
|
PivotBarButtonsViewSetSelectedFingerprint,
|
||||||
NavigationBarHookCallbackFingerprint,
|
NavigationBarHookCallbackFingerprint,
|
||||||
|
MainActivityOnBackPressedFingerprint,
|
||||||
ActionBarSearchResultsFingerprint,
|
ActionBarSearchResultsFingerprint,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
|
@ -90,6 +92,29 @@ object NavigationBarHookPatch : BytecodePatch(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PivotBarButtonsViewSetSelectedFingerprint.resultOrThrow().mutableMethod.apply {
|
||||||
|
val index = PivotBarButtonsViewSetSelectedFingerprint.indexOfSetViewSelectedInstruction(this)
|
||||||
|
val instruction = getInstruction<FiveRegisterInstruction>(index)
|
||||||
|
val viewRegister = instruction.registerC
|
||||||
|
val isSelectedRegister = instruction.registerD
|
||||||
|
|
||||||
|
addInstruction(
|
||||||
|
index + 1,
|
||||||
|
"invoke-static { v$viewRegister, v$isSelectedRegister }, " +
|
||||||
|
"$INTEGRATIONS_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hook onto back button pressed. Needed to fix race problem with
|
||||||
|
// litho filtering based on navigation tab before the tab is updated.
|
||||||
|
MainActivityOnBackPressedFingerprint.resultOrThrow().mutableMethod.apply {
|
||||||
|
addInstruction(
|
||||||
|
0,
|
||||||
|
"invoke-static { p0 }, " +
|
||||||
|
"$INTEGRATIONS_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Hook the search bar.
|
// Hook the search bar.
|
||||||
|
|
||||||
// Two different layouts are used at the hooked code.
|
// Two different layouts are used at the hooked code.
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package app.revanced.patches.youtube.misc.navigation.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
internal object MainActivityOnBackPressedFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf(),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
(methodDef.definingClass.endsWith("MainActivity;") ||
|
||||||
|
// Old versions of YouTube called this class "WatchWhileActivity" instead.
|
||||||
|
methodDef.definingClass.endsWith("WatchWhileActivity;"))
|
||||||
|
&& methodDef.name == "onBackPressed"
|
||||||
|
}
|
||||||
|
)
|
|
@ -0,0 +1,27 @@
|
||||||
|
package app.revanced.patches.youtube.misc.navigation.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.navigation.fingerprints.PivotBarButtonsViewSetSelectedFingerprint.indexOfSetViewSelectedInstruction
|
||||||
|
import app.revanced.util.getReference
|
||||||
|
import app.revanced.util.indexOfFirstInstruction
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
import com.android.tools.smali.dexlib2.iface.Method
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
|
internal object PivotBarButtonsViewSetSelectedFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = listOf("I", "Z"),
|
||||||
|
returnType = "V",
|
||||||
|
customFingerprint = { methodDef, classDef ->
|
||||||
|
classDef.type == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" &&
|
||||||
|
indexOfSetViewSelectedInstruction(methodDef) >= 0
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
fun indexOfSetViewSelectedInstruction(methodDef: Method) =
|
||||||
|
methodDef.indexOfFirstInstruction {
|
||||||
|
opcode == Opcode.INVOKE_VIRTUAL && getReference<MethodReference>()?.name == "setSelected"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue