From 5dd7f1485dc767f22c4d1b0674ade24d2d6fad19 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sun, 26 Nov 2023 19:31:04 +0900 Subject: [PATCH] fix(YouTube/Enable tablet layout): respect the original device layout --- .../misc/layoutswitch/LayoutSwitchPatch.kt | 84 +++++++++---------- .../ClientFormFactorFingerprint.kt | 14 ---- .../ClientFormFactorParentFingerprint.kt | 8 -- .../ClientFormFactorWalkerFingerprint.kt | 14 ---- .../fingerprints/GetFormFactorFingerprint.kt | 25 ++++++ 5 files changed, 65 insertions(+), 80 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorParentFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorWalkerFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt index dc3ced459..7da8000c1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt @@ -2,21 +2,22 @@ package app.revanced.patches.youtube.misc.layoutswitch import app.revanced.extensions.exception import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstructions +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.misc.layoutswitch.fingerprints.ClientFormFactorFingerprint -import app.revanced.patches.youtube.misc.layoutswitch.fingerprints.ClientFormFactorParentFingerprint -import app.revanced.patches.youtube.misc.layoutswitch.fingerprints.ClientFormFactorWalkerFingerprint +import app.revanced.patches.youtube.misc.layoutswitch.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.utils.fingerprints.LayoutSwitchFingerprint import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.integrations.Constants.MISC_PATH import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction10x @Patch( name = "Layout switch", @@ -52,55 +53,50 @@ import com.android.tools.smali.dexlib2.Opcode @Suppress("unused") object LayoutSwitchPatch : BytecodePatch( setOf( - ClientFormFactorParentFingerprint, + GetFormFactorFingerprint, LayoutSwitchFingerprint ) ) { override fun execute(context: BytecodeContext) { - fun MutableMethod.injectTabletLayout(jumpIndex: Int) { - addInstructionsWithLabels( - 0, """ - invoke-static {}, $MISC_PATH/LayoutOverridePatch;->enableTabletLayout()Z - move-result v0 - if-nez v0, :tablet_layout - """, ExternalLabel("tablet_layout", getInstruction(jumpIndex)) - ) - } + GetFormFactorFingerprint.result?.let { + it.mutableMethod.apply { + val returnCurrentFormFactorIndex = getInstructions().lastIndex - 2 - ClientFormFactorParentFingerprint.result?.classDef?.let { classDef -> - try { - ClientFormFactorFingerprint.also { it.resolve(context, classDef) }.result!!.apply { - mutableMethod.injectTabletLayout(scanResult.patternScanResult!!.startIndex + 1) - } - } catch (_: Exception) { - ClientFormFactorWalkerFingerprint.also { - it.resolve( - context, - classDef + val returnIsLargeFormFactorLabel = getInstruction(returnCurrentFormFactorIndex - 2) + val returnFormFactorIndex = getInstruction(returnCurrentFormFactorIndex) + + val insertIndex = returnCurrentFormFactorIndex + 1 + + // Replace the labeled instruction with a nop and add the preserved instructions back + replaceInstruction(returnCurrentFormFactorIndex, BuilderInstruction10x(Opcode.NOP)) + addInstruction(insertIndex, returnFormFactorIndex) + + // Because the labeled instruction is now a nop, we can add our own instructions right after it + addInstructionsWithLabels( + insertIndex, """ + invoke-static { }, $MISC_PATH/LayoutOverridePatch;->enableTabletLayout()Z + move-result v0 # Free register + if-nez v0, :is_large_form_factor + """, + ExternalLabel( + "is_large_form_factor", + returnIsLargeFormFactorLabel ) - }.result?.let { - (context - .toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod).apply { - - val jumpIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.RETURN_OBJECT - } - 1 - - injectTabletLayout(jumpIndex) - } - } ?: throw ClientFormFactorWalkerFingerprint.exception + ) } - } ?: throw ClientFormFactorParentFingerprint.exception + } ?: GetFormFactorFingerprint.exception - LayoutSwitchFingerprint.result?.mutableMethod?.addInstructions( - 4, """ - invoke-static {p0}, $MISC_PATH/LayoutOverridePatch;->getLayoutOverride(I)I - move-result p0 - """ - ) ?: throw LayoutSwitchFingerprint.exception + LayoutSwitchFingerprint.result?.let { + it.mutableMethod.apply { + addInstructions( + 4, """ + invoke-static {p0}, $MISC_PATH/LayoutOverridePatch;->getLayoutOverride(I)I + move-result p0 + """ + ) + } + } ?: throw LayoutSwitchFingerprint.exception /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorFingerprint.kt deleted file mode 100644 index 2c42ff13f..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorFingerprint.kt +++ /dev/null @@ -1,14 +0,0 @@ -package app.revanced.patches.youtube.misc.layoutswitch.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.Opcode - -object ClientFormFactorFingerprint : MethodFingerprint( - returnType = "L", - parameters = emptyList(), - opcodes = listOf( - Opcode.IF_EQZ, - Opcode.SGET_OBJECT, - Opcode.GOTO - ) -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorParentFingerprint.kt deleted file mode 100644 index c00123234..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorParentFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.youtube.misc.layoutswitch.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint - -object ClientFormFactorParentFingerprint : MethodFingerprint( - returnType = "V", - strings = listOf("ClientFormFactor"), -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorWalkerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorWalkerFingerprint.kt deleted file mode 100644 index 26d8d6c68..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/ClientFormFactorWalkerFingerprint.kt +++ /dev/null @@ -1,14 +0,0 @@ -package app.revanced.patches.youtube.misc.layoutswitch.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.Opcode - -object ClientFormFactorWalkerFingerprint : MethodFingerprint( - returnType = "L", - parameters = emptyList(), - opcodes = listOf( - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT - ) -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt new file mode 100644 index 000000000..0617efcc8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt @@ -0,0 +1,25 @@ +package app.revanced.patches.youtube.misc.layoutswitch.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +object GetFormFactorFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, + returnType = "L", + parameters = listOf("Landroid/content/Context;", "Ljava/util/List;"), + opcodes = listOf( + Opcode.SGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_EQZ, + Opcode.SGET_OBJECT, + Opcode.RETURN_OBJECT, + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT_OBJECT, + Opcode.RETURN_OBJECT + ) +) \ No newline at end of file