From 3c46f7b453bba04573a68e411e86e3a2ebd04e61 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 08:22:06 +0300 Subject: [PATCH 01/44] fix(YouTube - Tablet mini player): Correctly show mini player buttons --- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 95 ++++++++----------- .../MiniPlayerOverrideNoContextFingerprint.kt | 5 +- 2 files changed, 40 insertions(+), 60 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index d3b4183aa1..d7a588520e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.layout.tabletminiplayer import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage @@ -16,8 +16,9 @@ import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPla import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.exception +import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( @@ -63,6 +64,9 @@ object TabletMiniPlayerPatch : BytecodePatch( MiniPlayerOverrideFingerprint ) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "Lapp/revanced/integrations/youtube/patches/TabletMiniPlayerOverridePatch;" + override fun execute(context: BytecodeContext) { AddResourcesPatch(this::class) @@ -70,83 +74,58 @@ object TabletMiniPlayerPatch : BytecodePatch( SwitchPreference("revanced_tablet_miniplayer") ) - // First resolve the fingerprints via the parent fingerprint. - MiniPlayerDimensionsCalculatorParentFingerprint.result - ?: throw MiniPlayerDimensionsCalculatorParentFingerprint.exception - val miniPlayerClass = MiniPlayerDimensionsCalculatorParentFingerprint.result!!.classDef - - /* - * No context parameter method. - */ - MiniPlayerOverrideNoContextFingerprint.resolve(context, miniPlayerClass) - val (method, _, parameterRegister) = MiniPlayerOverrideNoContextFingerprint.addProxyCall() - - // Insert right before the return instruction. - val secondInsertIndex = method.implementation!!.instructions.size - 1 - method.insertOverride( - secondInsertIndex, parameterRegister - /** same register used to return **/ - ) - /* * Override every return instruction with the proxy call. */ - MiniPlayerOverrideFingerprint.result?.let { result -> - result.mutableMethod.let { method -> - val appNameStringIndex = result.scanResult.stringsScanResult!!.matches.first().index + 2 - context.toMethodWalker(method).nextMethod(appNameStringIndex, true) - .getMethod() as MutableMethod - }.apply { - implementation!!.let { implementation -> - val returnIndices = implementation.instructions - .withIndex() - .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } - .map { (index, _) -> index } + MiniPlayerOverrideNoContextFingerprint.resolve( + context, + MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef + ) + MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { + findReturnIndexes().forEach { index -> insertOverride(index) } + } - if (returnIndices.isEmpty()) throw PatchException("No return instructions found.") + MiniPlayerOverrideFingerprint.resultOrThrow().let { + val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 - // This method clobbers register p0 to return the value, calculate to override. - val returnedRegister = implementation.registerCount - parameters.size + it.mutableMethod.apply { + val walkerMethod = context.toMethodWalker(this) + .nextMethod(appNameStringIndex, true) + .getMethod() as MutableMethod - // Hook the returned register on every return instruction. - returnIndices.forEach { index -> insertOverride(index, returnedRegister) } + walkerMethod.apply { + findReturnIndexes().forEach { index -> insertOverride(index) } } } - - return@let - } ?: throw MiniPlayerOverrideFingerprint.exception + } /* * Size check return value override. */ - MiniPlayerResponseModelSizeCheckFingerprint.addProxyCall() + MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { + it.mutableMethod.insertOverride(it.scanResult.patternScanResult!!.endIndex) + } } - // Helper methods. - private fun MethodFingerprint.addProxyCall(): Triple { - val (method, scanIndex, parameterRegister) = this.unwrap() - method.insertOverride(scanIndex, parameterRegister) + private fun Method.findReturnIndexes(): List { + val indexes = implementation!!.instructions + .withIndex() + .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } + .map { (index, _) -> index } + .reversed() + if (indexes.isEmpty()) throw PatchException("No return instructions found.") - return Triple(method, scanIndex, parameterRegister) + return indexes; } - private fun MutableMethod.insertOverride(index: Int, overrideRegister: Int) { + private fun MutableMethod.insertOverride(index: Int) { + val register = getInstruction(index).registerA this.addInstructions( index, """ - invoke-static {v$overrideRegister}, Lapp/revanced/integrations/youtube/patches/TabletMiniPlayerOverridePatch;->getTabletMiniPlayerOverride(Z)Z - move-result v$overrideRegister + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->getTabletMiniPlayerOverride(Z)Z + move-result v$register """ ) } - - private fun MethodFingerprint.unwrap(): Triple { - val result = this.result!! - val scanIndex = result.scanResult.patternScanResult!!.endIndex - val method = result.mutableMethod - val instructions = method.implementation!!.instructions - val parameterRegister = (instructions[scanIndex] as OneRegisterInstruction).registerA - - return Triple(method, scanIndex, parameterRegister) - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt index c6ea61f3f9..87499056c6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt @@ -6,6 +6,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal object MiniPlayerOverrideNoContextFingerprint : MethodFingerprint( - "Z", AccessFlags.FINAL or AccessFlags.PRIVATE, - opcodes = listOf(Opcode.RETURN), // anchor to insert the instruction + returnType = "Z", + accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + opcodes = listOf(Opcode.IGET_BOOLEAN), // anchor to insert the instruction ) \ No newline at end of file From 0576089e489b870dd9f4cb40806d54a32f721281 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 08:23:23 +0300 Subject: [PATCH 02/44] fix(YouTube - Spoof client): Add support for 18.x --- .../misc/fix/playback/SpoofClientPatch.kt | 5 ++++- .../CreatePlaybackSpeedMenuItemFingerprint.kt | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt index c008f67365..de6994840d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt @@ -286,9 +286,12 @@ object SpoofClientPatch : BytecodePatch( // Fix playback speed menu item if spoofing to iOS. CreatePlaybackSpeedMenuItemFingerprint.resultOrThrow().let { - val shouldCreateMenuIndex = it.scanResult.patternScanResult!!.endIndex + val scanResult = it.scanResult.patternScanResult!! + if (scanResult.startIndex != 0) throw PatchException("Unexpected start index: ${scanResult.startIndex}") it.mutableMethod.apply { + // Find the conditional check if the playback speed menu item is not created. + val shouldCreateMenuIndex = indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ } val shouldCreateMenuRegister = getInstruction(shouldCreateMenuIndex).registerA addInstructions( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt index 389977dd80..07a79c7c3e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt @@ -8,15 +8,25 @@ import com.android.tools.smali.dexlib2.Opcode internal object CreatePlaybackSpeedMenuItemFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", - parameters = listOf("[L", "F"), opcodes = listOf( - Opcode.IGET_OBJECT, + Opcode.IGET_OBJECT, // First instruction of the method Opcode.IGET_OBJECT, Opcode.IGET_OBJECT, Opcode.CONST_4, Opcode.IF_EQZ, Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT, // Return value controls the creation of the playback speed menu item. - Opcode.IF_EQZ, // If the return value is false, the playback speed menu item is not created. + null // MOVE_RESULT or MOVE_RESULT_OBJECT, Return value controls the creation of the playback speed menu item. ), + // 19.01 and earlier is missing the second parameter. + // Since this fingerprint is somewhat weak, work around by checking for both method parameter signatures. + customFingerprint = custom@{ methodDef, _ -> + val parameterTypes = methodDef.parameterTypes + val firstParameter = parameterTypes.firstOrNull() + + if (firstParameter == null || !firstParameter.startsWith("[L")) { + return@custom false + } + + parameterTypes.size == 1 || (parameterTypes.size == 2 && parameterTypes[1] == "F") + } ) From e99e880277072d19e856ef3853b69535f87be244 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:23:57 +0300 Subject: [PATCH 03/44] feat(YouTube - Enable tablet layout): Modern tablet mini player --- api/revanced-patches.api | 1 + .../tabletminiplayer/TabletMiniPlayerPatch.kt | 113 +++++++++++++++--- .../TabletMiniPlayerResourcePatch.kt | 30 +++++ ...erDimensionsCalculatorParentFingerprint.kt | 20 +--- ...dernMiniPlayerCloseImageViewFingerprint.kt | 13 ++ .../ModernMiniPlayerConfigFingerprint.kt | 17 +++ .../ModernMiniPlayerConstructorFingerprint.kt | 10 ++ ...ernMiniPlayerExpandImageViewFingerprint.kt | 13 ++ .../kotlin/app/revanced/util/BytecodeUtils.kt | 15 ++- .../resources/addresources/values/strings.xml | 6 + 10 files changed, 206 insertions(+), 32 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 75d89226c5..aed9a23798 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1901,6 +1901,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstInstructionOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I public static synthetic fun indexOfFirstInstructionOrThrow$default (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)I public static final fun indexOfFirstWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)I + public static final fun indexOfFirstWideLiteralInstructionValueOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I public static final fun indexOfIdResource (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun indexOfIdResourceOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index d7a588520e..791b00c78f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -1,8 +1,10 @@ package app.revanced.patches.youtube.layout.tabletminiplayer 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.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage @@ -14,17 +16,33 @@ import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPla import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerOverrideFingerprint import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint +import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerCloseImageViewFingerprint +import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerConfigFingerprint +import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerConstructorFingerprint +import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerExpandImageViewFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow import app.revanced.util.resultOrThrow +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.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "Tablet mini player", description = "Adds an option to enable the tablet mini player layout.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + AddResourcesPatch::class, + TabletMiniPlayerResourcePatch::class + ], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", arrayOf( @@ -61,7 +79,11 @@ object TabletMiniPlayerPatch : BytecodePatch( setOf( MiniPlayerDimensionsCalculatorParentFingerprint, MiniPlayerResponseModelSizeCheckFingerprint, - MiniPlayerOverrideFingerprint + MiniPlayerOverrideFingerprint, + ModernMiniPlayerConfigFingerprint, + ModernMiniPlayerConstructorFingerprint, + ModernMiniPlayerExpandImageViewFingerprint, + ModernMiniPlayerCloseImageViewFingerprint, ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = @@ -71,18 +93,18 @@ object TabletMiniPlayerPatch : BytecodePatch( AddResourcesPatch(this::class) SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_tablet_miniplayer") + SwitchPreference("revanced_tablet_mini_player"), + SwitchPreference("revanced_tablet_mini_player_modern"), + SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close") ) - /* - * Override every return instruction with the proxy call. - */ + // Override every return instruction with the proxy call. MiniPlayerOverrideNoContextFingerprint.resolve( context, MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef ) MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { - findReturnIndexes().forEach { index -> insertOverride(index) } + findReturnIndexes().forEach { index -> insertTabletOverride(index) } } MiniPlayerOverrideFingerprint.resultOrThrow().let { @@ -94,16 +116,53 @@ object TabletMiniPlayerPatch : BytecodePatch( .getMethod() as MutableMethod walkerMethod.apply { - findReturnIndexes().forEach { index -> insertOverride(index) } + findReturnIndexes().forEach { index -> insertTabletOverride(index) } } } } - /* - * Size check return value override. - */ + // Size check return value override. MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertOverride(it.scanResult.patternScanResult!!.endIndex) + it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) + } + + // Enable modern mini player + ModernMiniPlayerConfigFingerprint.resultOrThrow().let { + it.mutableMethod.apply { + insertModernTabletOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) + } + } + + ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { + it.apply { + if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { + val iPutIndex = indexOfFirstInstructionOrThrow { + this.opcode == Opcode.IPUT && this.getReference()?.type == "I" + } + + insertModernTabletOverrideInt(iPutIndex) + } else { + findReturnIndexes().forEach { index -> insertModernTabletOverrideBoolean(index) } + } + } + } + + // Hide modern mini player buttons + listOf( + ModernMiniPlayerExpandImageViewFingerprint to TabletMiniPlayerResourcePatch.modernMiniplayerExpand, + ModernMiniPlayerCloseImageViewFingerprint to TabletMiniPlayerResourcePatch.modernMiniplayerClose + ).forEach { (fingerprint, resourceId) -> + fingerprint.resultOrThrow().mutableMethod.apply { + val imageViewIndex = indexOfFirstInstructionOrThrow( + indexOfFirstWideLiteralInstructionValueOrThrow(resourceId) + ) { + opcode == Opcode.MOVE_RESULT_OBJECT + } + + val register = getInstruction(imageViewIndex).registerA + addInstruction(imageViewIndex + 1, + "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->hideModernMiniPlayerButtonView(Landroid/view/View;)V") + } } } @@ -118,14 +177,36 @@ object TabletMiniPlayerPatch : BytecodePatch( return indexes; } - private fun MutableMethod.insertOverride(index: Int) { + private fun MutableMethod.insertTabletOverride(index: Int) { + insertOverride(index, "getTabletMiniPlayerOverride") + } + + private fun MutableMethod.insertModernTabletOverrideBoolean(index: Int) { + insertOverride(index, "getModernTabletMiniPlayerOverrideBoolean") + } + + private fun MutableMethod.insertOverride(index: Int, methodName: String) { val register = getInstruction(index).registerA this.addInstructions( index, """ - invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->getTabletMiniPlayerOverride(Z)Z - move-result v$register - """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z + move-result v$register + """ + ) + } + + private fun MutableMethod.insertModernTabletOverrideInt(iPutIndex: Int) { + val targetInstruction = getInstruction(iPutIndex) + val targetReference = (targetInstruction as ReferenceInstruction).reference + + addInstructions( + iPutIndex + 1, """ + invoke-static {v${targetInstruction.registerA}}, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernTabletMiniPlayerOverrideInt(I)I + move-result v${targetInstruction.registerA} + iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference + """ ) + removeInstruction(iPutIndex) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt new file mode 100644 index 0000000000..a117c7a683 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt @@ -0,0 +1,30 @@ +package app.revanced.patches.youtube.layout.tabletminiplayer + +import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch + +@Patch(dependencies = [ResourceMappingPatch::class]) +internal object TabletMiniPlayerResourcePatch : ResourcePatch() { + internal var floatyBarButtonTopMargin = -1L + internal var modernMiniplayerClose = -1L + internal var modernMiniplayerExpand = -1L + + override fun execute(context: ResourceContext) { + floatyBarButtonTopMargin = ResourceMappingPatch[ + "dimen", + "floaty_bar_button_top_margin" + ] + + modernMiniplayerClose = ResourceMappingPatch[ + "id", + "modern_miniplayer_close" + ] + + modernMiniplayerExpand = ResourceMappingPatch[ + "id", + "modern_miniplayer_expand" + ] + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt index 2e1612373b..8737da2444 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt @@ -1,23 +1,13 @@ package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.layout.tabletminiplayer.TabletMiniPlayerResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -internal object MiniPlayerDimensionsCalculatorParentFingerprint : MethodFingerprint( +internal object MiniPlayerDimensionsCalculatorParentFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", - parameters = listOf("F"), - opcodes = listOf( - Opcode.CONST_HIGH16, - Opcode.ADD_FLOAT_2ADDR, - null, // Opcode.MUL_FLOAT or Opcode.MUL_FLOAT_2ADDR - Opcode.CONST_4, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT, - Opcode.FLOAT_TO_INT, - Opcode.INVOKE_INTERFACE, - Opcode.RETURN_VOID, - ) + parameters = listOf("L"), + literalSupplier = { TabletMiniPlayerResourcePatch.floatyBarButtonTopMargin } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt new file mode 100644 index 0000000000..2d3afef8e8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.layout.tabletminiplayer.TabletMiniPlayerResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object ModernMiniPlayerCloseImageViewFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Landroid/widget/ImageView;", + parameters = listOf(), + literalSupplier = { TabletMiniPlayerResourcePatch.modernMiniplayerClose } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt new file mode 100644 index 0000000000..0305de9a3b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt @@ -0,0 +1,17 @@ +package app.revanced.patches.youtube.layout.tabletminiplayer.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 + +internal object ModernMiniPlayerConfigFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, + returnType = "L", + parameters = listOf("Landroid/content/Context;", "L", "L", "L", "L", "L", "L"), + opcodes = listOf( + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_EQZ + ) +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt new file mode 100644 index 0000000000..34f81c751c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object ModernMiniPlayerConstructorFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + literalSupplier = { 45623000 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt new file mode 100644 index 0000000000..da4f0112d5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.layout.tabletminiplayer.TabletMiniPlayerResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object ModernMiniPlayerExpandImageViewFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Landroid/widget/ImageView;", + parameters = listOf(), + literalSupplier = { TabletMiniPlayerResourcePatch.modernMiniplayerExpand } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index acc989c377..a3c4c51d61 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -99,6 +99,7 @@ fun Method.indexOfIdResourceOrThrow(resourceName: String): Int { * Find the index of the first wide literal instruction with the given value. * * @return the first literal instruction with the value, or -1 if not found. + * @see indexOfFirstWideLiteralInstructionValueOrThrow */ fun Method.indexOfFirstWideLiteralInstructionValue(literal: Long) = implementation?.let { it.instructions.indexOfFirst { instruction -> @@ -106,6 +107,18 @@ fun Method.indexOfFirstWideLiteralInstructionValue(literal: Long) = implementati } } ?: -1 +/** + * Find the index of the first wide literal instruction with the given value, + * or throw an exception if not found. + * + * @return the first literal instruction with the value, or throws [PatchException] if not found. + */ +fun Method.indexOfFirstWideLiteralInstructionValueOrThrow(literal: Long) : Int { + val index = indexOfFirstWideLiteralInstructionValue(literal) + if (index < 0) throw PatchException("Could not find literal value: $literal") + return index +} + /** * Check if the method contains a literal with the given value. * @@ -144,7 +157,7 @@ inline fun Instruction.getReference() = (this as? Refere * @return The index of the first [Instruction] that matches the predicate. */ // TODO: delete this on next major release, the overloaded method with an optional start index serves the same purposes. -@Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)")) +//@Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)")) fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) = indexOfFirstInstruction(0, predicate) /** diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index b4506ea356..1fc89fdf33 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -952,6 +952,12 @@ Enable tablet mini player Mini player is enabled Mini player is disabled + Enable modern tablet mini player + Modern Mini player is enabled + Modern mini player is disabled + Hide player expand and close buttons + Expand and close buttons are hidden (swipe to expand or close) + Expand and close buttons are shown Enable gradient loading screen From 173fa914db45cd89c5087130401a83b41014416b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:47:20 +0300 Subject: [PATCH 04/44] refactor: Consolidate tablet settings in new submenu, Merge `EnableTabletLayout` and `Tablet mini player` into a single patch --- api/revanced-patches.api | 6 + .../layout/tablet/EnableTabletLayoutPatch.kt | 49 +--- .../layout/tablet/TabletLayoutPatch.kt | 245 ++++++++++++++++++ .../TabletLayoutResourcePatch.kt} | 10 +- .../fingerprints/GetFormFactorFingerprint.kt | 3 +- ...erDimensionsCalculatorParentFingerprint.kt | 6 +- .../MiniPlayerOverrideFingerprint.kt | 2 +- .../MiniPlayerOverrideNoContextFingerprint.kt | 2 +- ...PlayerResponseModelSizeCheckFingerprint.kt | 2 +- ...dernMiniPlayerCloseImageViewFingerprint.kt | 6 +- .../ModernMiniPlayerConfigFingerprint.kt | 2 +- .../ModernMiniPlayerConstructorFingerprint.kt | 2 +- ...ernMiniPlayerExpandImageViewFingerprint.kt | 6 +- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 207 +-------------- .../resources/addresources/values/strings.xml | 24 +- 15 files changed, 289 insertions(+), 283 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer/TabletMiniPlayerResourcePatch.kt => tablet/TabletLayoutResourcePatch.kt} (72%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt (59%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/MiniPlayerOverrideFingerprint.kt (83%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt (85%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt (88%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt (60%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/ModernMiniPlayerConfigFingerprint.kt (88%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/ModernMiniPlayerConstructorFingerprint.kt (81%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tabletminiplayer => tablet}/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt (60%) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index aed9a23798..658fad29fb 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1602,6 +1602,12 @@ public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayout public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } +public final class app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/youtube/layout/tablet/TabletLayoutPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + public final class app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch : app/revanced/patcher/patch/BytecodePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt index f09c7d6947..7ef4234bcd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt @@ -1,55 +1,10 @@ package app.revanced.patches.youtube.layout.tablet import app.revanced.patcher.data.BytecodeContext -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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.all.misc.resources.AddResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint -import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.exception -@Patch( - name = "Enable tablet layout", - description = "Adds an option to spoof the device form factor to a tablet which enables the tablet layout.", - dependencies = [IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class], - compatiblePackages = [CompatiblePackage("com.google.android.youtube")] -) -@Suppress("unused") -object EnableTabletLayoutPatch : BytecodePatch( - setOf(GetFormFactorFingerprint) -) { +@Deprecated("This patch class has been renamed to TabletLayoutPatch.") +object EnableTabletLayoutPatch : BytecodePatch(dependencies = setOf(TabletLayoutPatch::class)) { override fun execute(context: BytecodeContext) { - AddResourcesPatch(this::class) - - SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_tablet_layout") - ) - - GetFormFactorFingerprint.result?.let { - it.mutableMethod.apply { - val returnIsLargeFormFactorIndex = getInstructions().lastIndex - 4 - val returnIsLargeFormFactorLabel = getInstruction(returnIsLargeFormFactorIndex) - - addInstructionsWithLabels( - 0, - """ - invoke-static { }, Lapp/revanced/integrations/youtube/patches/EnableTabletLayoutPatch;->enableTabletLayout()Z - move-result v0 # Free register - if-nez v0, :is_large_form_factor - """, - ExternalLabel( - "is_large_form_factor", - returnIsLargeFormFactorLabel - ) - ) - } - } ?: GetFormFactorFingerprint.exception } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt new file mode 100644 index 0000000000..2b5c79818c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt @@ -0,0 +1,245 @@ +package app.revanced.patches.youtube.layout.tablet + +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.removeInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException +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.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideNoContextFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerCloseImageViewFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConfigFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConstructorFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandImageViewFingerprint +import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch +import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow +import app.revanced.util.resultOrThrow +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.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +@Patch( + name = "Tablet layout", + description = "Adds an option to force tablet layout and to use the tablet mini player", + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + AddResourcesPatch::class, + TabletLayoutResourcePatch::class + ], + compatiblePackages = [ + CompatiblePackage( + "com.google.android.youtube", arrayOf( + "18.32.39", + "18.37.36", + "18.38.44", + "18.43.45", + "18.44.41", + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34", + "19.02.39", + "19.03.36", + "19.04.38", + "19.05.36", + "19.06.39", + "19.07.40", + "19.08.36", + "19.09.38", + "19.10.39", + "19.11.43", + "19.12.41", + "19.13.37", + "19.14.43", + "19.15.36", + "19.16.39", + ) + ) + ] +) +@Suppress("unused") +object TabletLayoutPatch : BytecodePatch( + setOf(GetFormFactorFingerprint, + MiniPlayerDimensionsCalculatorParentFingerprint, + MiniPlayerResponseModelSizeCheckFingerprint, + MiniPlayerOverrideFingerprint, + ModernMiniPlayerConfigFingerprint, + ModernMiniPlayerConstructorFingerprint, + ModernMiniPlayerExpandImageViewFingerprint, + ModernMiniPlayerCloseImageViewFingerprint + ) +) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/TabletLayoutPatch;" + + override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( + PreferenceScreen( + key = "revanced_tablet_screen", + sorting = PreferenceScreen.Sorting.UNSORTED, + preferences = setOf( + SwitchPreference("revanced_tablet_layout"), + SwitchPreference("revanced_tablet_mini_player"), + SwitchPreference("revanced_tablet_mini_player_modern"), + SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close") + ) + ) + ) + + // Enable tablet mode. + GetFormFactorFingerprint.resultOrThrow().let { + it.mutableMethod.apply { + val returnIsLargeFormFactorIndex = getInstructions().lastIndex - 4 + val returnIsLargeFormFactorLabel = getInstruction(returnIsLargeFormFactorIndex) + + addInstructionsWithLabels( + 0, + """ + invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getTabletLayoutEnabled()Z + move-result v0 + if-nez v0, :is_large_form_factor + """, + ExternalLabel( + "is_large_form_factor", + returnIsLargeFormFactorLabel + ) + ) + } + } + + // Enable tablet mini player + + MiniPlayerOverrideNoContextFingerprint.resolve( + context, + MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef + ) + MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { + findReturnIndexes().forEach { index -> insertTabletOverride(index) } + } + + MiniPlayerOverrideFingerprint.resultOrThrow().let { + val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 + + it.mutableMethod.apply { + val walkerMethod = context.toMethodWalker(this) + .nextMethod(appNameStringIndex, true) + .getMethod() as MutableMethod + + walkerMethod.apply { + findReturnIndexes().forEach { index -> insertTabletOverride(index) } + } + } + } + + // Size check return value override. + MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { + it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) + } + + // Enable modern mini player + ModernMiniPlayerConfigFingerprint.resultOrThrow().let { + it.mutableMethod.apply { + insertModernTabletOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) + } + } + + ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { + it.apply { + if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { + val iPutIndex = indexOfFirstInstructionOrThrow { + this.opcode == Opcode.IPUT && this.getReference()?.type == "I" + } + + insertModernTabletOverrideInt(iPutIndex) + } else { + findReturnIndexes().forEach { index -> insertModernTabletOverrideBoolean(index) } + } + } + } + + // Hide modern mini player buttons + listOf( + ModernMiniPlayerExpandImageViewFingerprint to TabletLayoutResourcePatch.modernMiniplayerExpand, + ModernMiniPlayerCloseImageViewFingerprint to TabletLayoutResourcePatch.modernMiniplayerClose + ).forEach { (fingerprint, resourceId) -> + fingerprint.resultOrThrow().mutableMethod.apply { + val imageViewIndex = indexOfFirstInstructionOrThrow( + indexOfFirstWideLiteralInstructionValueOrThrow(resourceId) + ) { + opcode == Opcode.MOVE_RESULT_OBJECT + } + + val register = getInstruction(imageViewIndex).registerA + addInstruction(imageViewIndex + 1, + "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->hideModernMiniPlayerButtonView(Landroid/view/View;)V") + } + } + } + + private fun Method.findReturnIndexes(): List { + val indexes = implementation!!.instructions + .withIndex() + .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } + .map { (index, _) -> index } + .reversed() + if (indexes.isEmpty()) throw PatchException("No return instructions found.") + + return indexes; + } + + private fun MutableMethod.insertTabletOverride(index: Int) { + insertOverride(index, "getTabletMiniPlayerOverride") + } + + private fun MutableMethod.insertModernTabletOverrideBoolean(index: Int) { + insertOverride(index, "getModernTabletMiniPlayerOverrideBoolean") + } + + private fun MutableMethod.insertOverride(index: Int, methodName: String) { + val register = getInstruction(index).registerA + this.addInstructions( + index, + """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z + move-result v$register + """ + ) + } + + private fun MutableMethod.insertModernTabletOverrideInt(iPutIndex: Int) { + val targetInstruction = getInstruction(iPutIndex) + val targetReference = (targetInstruction as ReferenceInstruction).reference + + addInstructions( + iPutIndex + 1, """ + invoke-static {v${targetInstruction.registerA}}, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernTabletMiniPlayerOverrideInt(I)I + move-result v${targetInstruction.registerA} + iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference + """ + ) + removeInstruction(iPutIndex) + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt similarity index 72% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt index a117c7a683..565f5516cf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer +package app.revanced.patches.youtube.layout.tablet import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch @@ -6,10 +6,10 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch @Patch(dependencies = [ResourceMappingPatch::class]) -internal object TabletMiniPlayerResourcePatch : ResourcePatch() { - internal var floatyBarButtonTopMargin = -1L - internal var modernMiniplayerClose = -1L - internal var modernMiniplayerExpand = -1L +internal object TabletLayoutResourcePatch : ResourcePatch() { + var floatyBarButtonTopMargin = -1L + var modernMiniplayerClose = -1L + var modernMiniplayerExpand = -1L override fun execute(context: ResourceContext) { floatyBarButtonTopMargin = ResourceMappingPatch[ diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/GetFormFactorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/GetFormFactorFingerprint.kt index c7cb6d1e77..8742fe5bce 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/GetFormFactorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/GetFormFactorFingerprint.kt @@ -21,5 +21,6 @@ internal object GetFormFactorFingerprint : MethodFingerprint( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT - ) + ), + strings = listOf("") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt similarity index 59% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt index 8737da2444..b4c7d1c12d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tabletminiplayer.TabletMiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -9,5 +9,5 @@ internal object MiniPlayerDimensionsCalculatorParentFingerprint : LiteralValueFi accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L"), - literalSupplier = { TabletMiniPlayerResourcePatch.floatyBarButtonTopMargin } + literalSupplier = { TabletLayoutResourcePatch.floatyBarButtonTopMargin } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideFingerprint.kt similarity index 83% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideFingerprint.kt index 9e80c81a2e..8d15964665 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt index 87499056c6..c874fe6f44 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt index 4ac508edc5..0784352bb2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt similarity index 60% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt index 2d3afef8e8..b416cbb8af 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tabletminiplayer.TabletMiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -9,5 +9,5 @@ internal object ModernMiniPlayerCloseImageViewFingerprint : LiteralValueFingerpr accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { TabletMiniPlayerResourcePatch.modernMiniplayerClose } + literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerClose } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConfigFingerprint.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConfigFingerprint.kt index 0305de9a3b..f6ef856880 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConfigFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConstructorFingerprint.kt similarity index 81% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConstructorFingerprint.kt index 34f81c751c..3bbac7ab9c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConstructorFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or import app.revanced.util.patch.LiteralValueFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt similarity index 60% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt index da4f0112d5..ee95bb6f77 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints +package app.revanced.patches.youtube.layout.tablet.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tabletminiplayer.TabletMiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -9,5 +9,5 @@ internal object ModernMiniPlayerExpandImageViewFingerprint : LiteralValueFingerp accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { TabletMiniPlayerResourcePatch.modernMiniplayerExpand } + literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerExpand } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index 791b00c78f..edc4d996a4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -1,212 +1,11 @@ package app.revanced.patches.youtube.layout.tabletminiplayer 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.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException -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.patches.all.misc.resources.AddResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerOverrideFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerCloseImageViewFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerConfigFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerConstructorFingerprint -import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.ModernMiniPlayerExpandImageViewFingerprint -import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow -import app.revanced.util.resultOrThrow -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.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference - -@Patch( - name = "Tablet mini player", - description = "Adds an option to enable the tablet mini player layout.", - dependencies = [ - IntegrationsPatch::class, - SettingsPatch::class, - AddResourcesPatch::class, - TabletMiniPlayerResourcePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", arrayOf( - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.43", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39", - "19.03.36", - "19.04.38", - "19.05.36", - "19.06.39", - "19.07.40", - "19.08.36", - "19.09.38", - "19.10.39", - "19.11.43", - "19.12.41", - "19.13.37", - "19.14.43", - "19.15.36", - "19.16.39", - ) - ) - ] -) -@Suppress("unused") -object TabletMiniPlayerPatch : BytecodePatch( - setOf( - MiniPlayerDimensionsCalculatorParentFingerprint, - MiniPlayerResponseModelSizeCheckFingerprint, - MiniPlayerOverrideFingerprint, - ModernMiniPlayerConfigFingerprint, - ModernMiniPlayerConstructorFingerprint, - ModernMiniPlayerExpandImageViewFingerprint, - ModernMiniPlayerCloseImageViewFingerprint, - ) -) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/youtube/patches/TabletMiniPlayerOverridePatch;" +import app.revanced.patches.youtube.layout.tablet.TabletLayoutPatch +@Deprecated("This patch class has been merged into TabletLayoutPatch.") +object TabletMiniPlayerPatch : BytecodePatch(dependencies = setOf(TabletLayoutPatch::class)) { override fun execute(context: BytecodeContext) { - AddResourcesPatch(this::class) - - SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_tablet_mini_player"), - SwitchPreference("revanced_tablet_mini_player_modern"), - SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close") - ) - - // Override every return instruction with the proxy call. - MiniPlayerOverrideNoContextFingerprint.resolve( - context, - MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef - ) - MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } - } - - MiniPlayerOverrideFingerprint.resultOrThrow().let { - val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 - - it.mutableMethod.apply { - val walkerMethod = context.toMethodWalker(this) - .nextMethod(appNameStringIndex, true) - .getMethod() as MutableMethod - - walkerMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } - } - } - } - - // Size check return value override. - MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) - } - - // Enable modern mini player - ModernMiniPlayerConfigFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - insertModernTabletOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) - } - } - - ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { - it.apply { - if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { - val iPutIndex = indexOfFirstInstructionOrThrow { - this.opcode == Opcode.IPUT && this.getReference()?.type == "I" - } - - insertModernTabletOverrideInt(iPutIndex) - } else { - findReturnIndexes().forEach { index -> insertModernTabletOverrideBoolean(index) } - } - } - } - - // Hide modern mini player buttons - listOf( - ModernMiniPlayerExpandImageViewFingerprint to TabletMiniPlayerResourcePatch.modernMiniplayerExpand, - ModernMiniPlayerCloseImageViewFingerprint to TabletMiniPlayerResourcePatch.modernMiniplayerClose - ).forEach { (fingerprint, resourceId) -> - fingerprint.resultOrThrow().mutableMethod.apply { - val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstWideLiteralInstructionValueOrThrow(resourceId) - ) { - opcode == Opcode.MOVE_RESULT_OBJECT - } - - val register = getInstruction(imageViewIndex).registerA - addInstruction(imageViewIndex + 1, - "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->hideModernMiniPlayerButtonView(Landroid/view/View;)V") - } - } - } - - private fun Method.findReturnIndexes(): List { - val indexes = implementation!!.instructions - .withIndex() - .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } - .map { (index, _) -> index } - .reversed() - if (indexes.isEmpty()) throw PatchException("No return instructions found.") - - return indexes; - } - - private fun MutableMethod.insertTabletOverride(index: Int) { - insertOverride(index, "getTabletMiniPlayerOverride") - } - - private fun MutableMethod.insertModernTabletOverrideBoolean(index: Int) { - insertOverride(index, "getModernTabletMiniPlayerOverrideBoolean") - } - - private fun MutableMethod.insertOverride(index: Int, methodName: String) { - val register = getInstruction(index).registerA - this.addInstructions( - index, - """ - invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z - move-result v$register - """ - ) - } - - private fun MutableMethod.insertModernTabletOverrideInt(iPutIndex: Int) { - val targetInstruction = getInstruction(iPutIndex) - val targetReference = (targetInstruction as ReferenceInstruction).reference - - addInstructions( - iPutIndex + 1, """ - invoke-static {v${targetInstruction.registerA}}, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernTabletMiniPlayerOverrideInt(I)I - move-result v${targetInstruction.registerA} - iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference - """ - ) - removeInstruction(iPutIndex) } } diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 1fc89fdf33..113f9365f0 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -942,22 +942,22 @@ Shorts player will not resume on app startup Shorts player will resume on app startup - + + Tablet layout + Tablet related settings Enable tablet layout Tablet layout is enabled Tablet layout is disabled Community posts do not show up on tablet layouts - - - Enable tablet mini player - Mini player is enabled - Mini player is disabled - Enable modern tablet mini player - Modern Mini player is enabled - Modern mini player is disabled - Hide player expand and close buttons - Expand and close buttons are hidden (swipe to expand or close) - Expand and close buttons are shown + Enable tablet mini player + Mini player is enabled + Mini player is disabled + Enable modern tablet mini player + Modern Mini player is enabled + Modern mini player is disabled + Hide expand and close buttons + Buttons are hidden\n(swipe mini player to expand or close) + Expand and close buttons are shown Enable gradient loading screen From b086b082e20a443c841c06e3654c35b8c91e0ec2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:54:11 +0300 Subject: [PATCH 05/44] refactor: Include the resource name in the exception if not found --- .../patches/shared/misc/mapping/ResourceMappingPatch.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 388c4ef613..45131b34e5 100644 --- a/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.shared.misc.mapping import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import org.w3c.dom.Element import java.util.* @@ -51,9 +52,11 @@ object ResourceMappingPatch : ResourcePatch() { threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) } - operator fun get(type: String, name: String) = resourceMappings.first { - it.type == type && it.name == name - }.id + operator fun get(type: String, name: String) : Long { + return resourceMappings.firstOrNull { + it.type == type && it.name == name + }?.id ?: throw PatchException("Could not find resource type: $type name: $name") + } data class ResourceElement(val type: String, val name: String, val id: Long) } From a8a13b51baf71a198a828c9cb43d3324180bcd8b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:16:19 +0300 Subject: [PATCH 06/44] restrict to only working versions --- .../layout/tablet/TabletLayoutPatch.kt | 33 +++++-------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt index 2b5c79818c..4923f659c7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt @@ -51,28 +51,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", arrayOf( - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.43", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39", - "19.03.36", - "19.04.38", - "19.05.36", - "19.06.39", - "19.07.40", - "19.08.36", - "19.09.38", - "19.10.39", - "19.11.43", - "19.12.41", - "19.13.37", - "19.14.43", + // Hide modern mini player is only present in 19.15+ + // If a robust way of detecting the target app version is added, + // then all changes except modern mini player could be applied to older versions. "19.15.36", "19.16.39", ) @@ -110,6 +91,7 @@ object TabletLayoutPatch : BytecodePatch( ) // Enable tablet mode. + GetFormFactorFingerprint.resultOrThrow().let { it.mutableMethod.apply { val returnIsLargeFormFactorIndex = getInstructions().lastIndex - 4 @@ -160,6 +142,7 @@ object TabletLayoutPatch : BytecodePatch( } // Enable modern mini player + ModernMiniPlayerConfigFingerprint.resultOrThrow().let { it.mutableMethod.apply { insertModernTabletOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) @@ -193,8 +176,10 @@ object TabletLayoutPatch : BytecodePatch( } val register = getInstruction(imageViewIndex).registerA - addInstruction(imageViewIndex + 1, - "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->hideModernMiniPlayerButtonView(Landroid/view/View;)V") + addInstruction( + imageViewIndex + 1, + "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->hideModernMiniPlayerButtonView(Landroid/view/View;)V" + ) } } } From 9460336f77871479e35ddf319210add9c1a75a3f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:13:21 +0300 Subject: [PATCH 07/44] feat: Adjust mini player overlay opacity --- .../layout/tablet/TabletLayoutPatch.kt | 29 +++++++++++++------ .../tablet/TabletLayoutResourcePatch.kt | 6 ++++ ...dernMiniPlayerCloseImageViewFingerprint.kt | 3 ++ ...ernMiniPlayerExpandImageViewFingerprint.kt | 3 ++ .../ModernMiniPlayerOverlayViewFingerprint.kt | 16 ++++++++++ .../ModernMiniPlayerViewParentFingerprint.kt | 12 ++++++++ .../resources/addresources/values/strings.xml | 6 +++- 7 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt index 4923f659c7..296e2c25bd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt @@ -14,8 +14,10 @@ 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.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideFingerprint @@ -25,6 +27,8 @@ import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerC import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConfigFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConstructorFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandImageViewFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerOverlayViewFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerViewParentFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.getReference @@ -68,8 +72,7 @@ object TabletLayoutPatch : BytecodePatch( MiniPlayerOverrideFingerprint, ModernMiniPlayerConfigFingerprint, ModernMiniPlayerConstructorFingerprint, - ModernMiniPlayerExpandImageViewFingerprint, - ModernMiniPlayerCloseImageViewFingerprint + ModernMiniPlayerViewParentFingerprint ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/TabletLayoutPatch;" @@ -85,7 +88,8 @@ object TabletLayoutPatch : BytecodePatch( SwitchPreference("revanced_tablet_layout"), SwitchPreference("revanced_tablet_mini_player"), SwitchPreference("revanced_tablet_mini_player_modern"), - SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close") + SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close"), + TextPreference("revanced_tablet_mini_player_opacity", inputType = InputType.NUMBER), ) ) ) @@ -163,22 +167,29 @@ object TabletLayoutPatch : BytecodePatch( } } - // Hide modern mini player buttons + // Hide modern mini player buttons. + listOf( - ModernMiniPlayerExpandImageViewFingerprint to TabletLayoutResourcePatch.modernMiniplayerExpand, - ModernMiniPlayerCloseImageViewFingerprint to TabletLayoutResourcePatch.modernMiniplayerClose - ).forEach { (fingerprint, resourceId) -> + Triple(ModernMiniPlayerOverlayViewFingerprint, TabletLayoutResourcePatch.scrimOverlay, "adjustModernTabletMiniPlayerOpacity"), + Triple(ModernMiniPlayerExpandImageViewFingerprint, TabletLayoutResourcePatch.modernMiniplayerExpand, "hideModernMiniPlayerButtonView"), + Triple(ModernMiniPlayerCloseImageViewFingerprint, TabletLayoutResourcePatch.modernMiniplayerClose, "hideModernMiniPlayerButtonView") + ).forEach { (fingerprint, resourceId, integrationsMethodName) -> + fingerprint.resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) + fingerprint.resultOrThrow().mutableMethod.apply { val imageViewIndex = indexOfFirstInstructionOrThrow( indexOfFirstWideLiteralInstructionValueOrThrow(resourceId) ) { - opcode == Opcode.MOVE_RESULT_OBJECT + opcode == Opcode.CHECK_CAST } val register = getInstruction(imageViewIndex).registerA addInstruction( imageViewIndex + 1, - "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->hideModernMiniPlayerButtonView(Landroid/view/View;)V" + "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->$integrationsMethodName(Landroid/widget/ImageView;)V" ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt index 565f5516cf..83aa128bf6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt @@ -10,6 +10,7 @@ internal object TabletLayoutResourcePatch : ResourcePatch() { var floatyBarButtonTopMargin = -1L var modernMiniplayerClose = -1L var modernMiniplayerExpand = -1L + var scrimOverlay = -1L override fun execute(context: ResourceContext) { floatyBarButtonTopMargin = ResourceMappingPatch[ @@ -26,5 +27,10 @@ internal object TabletLayoutResourcePatch : ResourcePatch() { "id", "modern_miniplayer_expand" ] + + scrimOverlay = ResourceMappingPatch[ + "id", + "scrim_overlay" + ] } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt index b416cbb8af..53eca2ab4c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt @@ -5,6 +5,9 @@ import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ internal object ModernMiniPlayerCloseImageViewFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt index ee95bb6f77..6b75c0564b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt @@ -5,6 +5,9 @@ import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ internal object ModernMiniPlayerExpandImageViewFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt new file mode 100644 index 0000000000..c5c686126d --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.layout.tablet.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ +internal object ModernMiniPlayerOverlayViewFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "V", + parameters = listOf(), + literalSupplier = { TabletLayoutResourcePatch.scrimOverlay } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt new file mode 100644 index 0000000000..a30550f889 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.layout.tablet.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object ModernMiniPlayerViewParentFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Ljava/lang/String;", + parameters = listOf(), + strings = listOf("player_overlay_modern_mini_player_controls") +) \ No newline at end of file diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 113f9365f0..3b38d14203 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -661,6 +661,7 @@ Player overlay opacity Opacity value between 0-100, where 0 is transparent + Player overlay opacity must be between 0-100 Return YouTube Dislike @@ -953,11 +954,14 @@ Mini player is enabled Mini player is disabled Enable modern tablet mini player - Modern Mini player is enabled + Modern mini player is enabled Modern mini player is disabled Hide expand and close buttons Buttons are hidden\n(swipe mini player to expand or close) Expand and close buttons are shown + Modern mini player overlay opacity + Opacity value between 0-100, where 0 is transparent + Mini player overlay opacity must be between 0-100 Enable gradient loading screen From 907f23966bab673c5dc1cbd42c535ddc8ac98577 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:44:06 +0300 Subject: [PATCH 08/44] feat: Hide mini player back / forward buttons --- api/revanced-patches.api | 1 + .../layout/tablet/TabletLayoutPatch.kt | 84 ++++++++++++------- .../tablet/TabletLayoutResourcePatch.kt | 18 +++- ...ModernMiniPlayerCloseButtonFingerprint.kt} | 2 +- ...odernMiniPlayerExpandButtonFingerprint.kt} | 2 +- ...odernMiniPlayerForwardButtonFingerprint.kt | 16 ++++ ...ModernMiniPlayerRewindButtonFingerprint.kt | 16 ++++ .../util/patch/LiteralValueFingerprint.kt | 2 +- .../resources/addresources/values/strings.xml | 3 + 9 files changed, 110 insertions(+), 34 deletions(-) rename src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/{ModernMiniPlayerCloseImageViewFingerprint.kt => ModernMiniPlayerCloseButtonFingerprint.kt} (87%) rename src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/{ModernMiniPlayerExpandImageViewFingerprint.kt => ModernMiniPlayerExpandButtonFingerprint.kt} (87%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 658fad29fb..603e200f7e 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1937,6 +1937,7 @@ public final class app/revanced/util/ResourceUtilsKt { public abstract class app/revanced/util/patch/LiteralValueFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { public fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function0;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLiteralSupplier ()Lkotlin/jvm/functions/Function0; } public final class app/revanced/util/resource/ArrayResource : app/revanced/util/resource/BaseResource { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt index 296e2c25bd..ccbd17202b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt @@ -23,17 +23,20 @@ import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerDimensi import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideNoContextFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerCloseImageViewFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerCloseButtonFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConfigFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConstructorFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandImageViewFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandButtonFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerForwardButtonFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerOverlayViewFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerRewindButtonFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerViewParentFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow +import app.revanced.util.patch.LiteralValueFingerprint import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -89,7 +92,8 @@ object TabletLayoutPatch : BytecodePatch( SwitchPreference("revanced_tablet_mini_player"), SwitchPreference("revanced_tablet_mini_player_modern"), SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close"), - TextPreference("revanced_tablet_mini_player_opacity", inputType = InputType.NUMBER), + SwitchPreference("revanced_tablet_mini_player_modern_hide_rewind_forward"), + TextPreference("revanced_tablet_mini_player_opacity", inputType = InputType.NUMBER) ) ) ) @@ -116,7 +120,7 @@ object TabletLayoutPatch : BytecodePatch( } } - // Enable tablet mini player + // Enable tablet mini player. MiniPlayerOverrideNoContextFingerprint.resolve( context, @@ -145,7 +149,7 @@ object TabletLayoutPatch : BytecodePatch( it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) } - // Enable modern mini player + // Enable modern mini player. ModernMiniPlayerConfigFingerprint.resultOrThrow().let { it.mutableMethod.apply { @@ -169,30 +173,30 @@ object TabletLayoutPatch : BytecodePatch( // Hide modern mini player buttons. - listOf( - Triple(ModernMiniPlayerOverlayViewFingerprint, TabletLayoutResourcePatch.scrimOverlay, "adjustModernTabletMiniPlayerOpacity"), - Triple(ModernMiniPlayerExpandImageViewFingerprint, TabletLayoutResourcePatch.modernMiniplayerExpand, "hideModernMiniPlayerButtonView"), - Triple(ModernMiniPlayerCloseImageViewFingerprint, TabletLayoutResourcePatch.modernMiniplayerClose, "hideModernMiniPlayerButtonView") - ).forEach { (fingerprint, resourceId, integrationsMethodName) -> - fingerprint.resolve( - context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef - ) + ModernMiniPlayerOverlayViewFingerprint.addModernTabletMiniPlayerImageViewHook( + context, + "adjustModernTabletMiniPlayerOpacity" + ) - fingerprint.resultOrThrow().mutableMethod.apply { - val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstWideLiteralInstructionValueOrThrow(resourceId) - ) { - opcode == Opcode.CHECK_CAST - } + ModernMiniPlayerExpandButtonFingerprint.addModernTabletMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerExpandClose" + ) - val register = getInstruction(imageViewIndex).registerA - addInstruction( - imageViewIndex + 1, - "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->$integrationsMethodName(Landroid/widget/ImageView;)V" - ) - } - } + ModernMiniPlayerCloseButtonFingerprint.addModernTabletMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerExpandClose" + ) + + ModernMiniPlayerRewindButtonFingerprint.addModernTabletMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerRewindForward" + ) + + ModernMiniPlayerForwardButtonFingerprint.addModernTabletMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerRewindForward" + ) } private fun Method.findReturnIndexes(): List { @@ -203,7 +207,7 @@ object TabletLayoutPatch : BytecodePatch( .reversed() if (indexes.isEmpty()) throw PatchException("No return instructions found.") - return indexes; + return indexes } private fun MutableMethod.insertTabletOverride(index: Int) { @@ -238,4 +242,28 @@ object TabletLayoutPatch : BytecodePatch( ) removeInstruction(iPutIndex) } + + private fun LiteralValueFingerprint.addModernTabletMiniPlayerImageViewHook( + context: BytecodeContext, + integrationsMethodName: String + ) { + resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) + + resultOrThrow().mutableMethod.apply { + val imageViewIndex = indexOfFirstInstructionOrThrow( + indexOfFirstWideLiteralInstructionValueOrThrow(literalSupplier.invoke()) + ) { + opcode == Opcode.CHECK_CAST + } + + val register = getInstruction(imageViewIndex).registerA + addInstruction( + imageViewIndex + 1, + "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->$integrationsMethodName(Landroid/widget/ImageView;)V" + ) + } + } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt index 83aa128bf6..a819f4fba3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt @@ -8,9 +8,11 @@ import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch @Patch(dependencies = [ResourceMappingPatch::class]) internal object TabletLayoutResourcePatch : ResourcePatch() { var floatyBarButtonTopMargin = -1L + var scrimOverlay = -1L var modernMiniplayerClose = -1L var modernMiniplayerExpand = -1L - var scrimOverlay = -1L + var modernMiniplayerRewindButton = -1L + var modernMiniplayerForwardButton = -1L override fun execute(context: ResourceContext) { floatyBarButtonTopMargin = ResourceMappingPatch[ @@ -18,6 +20,11 @@ internal object TabletLayoutResourcePatch : ResourcePatch() { "floaty_bar_button_top_margin" ] + scrimOverlay = ResourceMappingPatch[ + "id", + "scrim_overlay" + ] + modernMiniplayerClose = ResourceMappingPatch[ "id", "modern_miniplayer_close" @@ -28,9 +35,14 @@ internal object TabletLayoutResourcePatch : ResourcePatch() { "modern_miniplayer_expand" ] - scrimOverlay = ResourceMappingPatch[ + modernMiniplayerRewindButton = ResourceMappingPatch[ "id", - "scrim_overlay" + "modern_miniplayer_rewind_button" + ] + + modernMiniplayerForwardButton = ResourceMappingPatch[ + "id", + "modern_miniplayer_forward_button" ] } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt similarity index 87% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt index 53eca2ab4c..a64b22e9de 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. */ -internal object ModernMiniPlayerCloseImageViewFingerprint : LiteralValueFingerprint( +internal object ModernMiniPlayerCloseButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt similarity index 87% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt index 6b75c0564b..ddabcee05e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. */ -internal object ModernMiniPlayerExpandImageViewFingerprint : LiteralValueFingerprint( +internal object ModernMiniPlayerExpandButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt new file mode 100644 index 0000000000..69dd104a42 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.layout.tablet.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ +internal object ModernMiniPlayerForwardButtonFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Landroid/widget/ImageView;", + parameters = listOf(), + literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerForwardButton } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt new file mode 100644 index 0000000000..2f58ee1ccd --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.layout.tablet.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ +internal object ModernMiniPlayerRewindButtonFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Landroid/widget/ImageView;", + parameters = listOf(), + literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerRewindButton } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt b/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt index 6b1b67174e..c42e07fc0e 100644 --- a/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt +++ b/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt @@ -21,7 +21,7 @@ abstract class LiteralValueFingerprint( opcodes: Iterable? = null, strings: Iterable? = null, // Has to be a supplier because the fingerprint is created before patches can set literals. - literalSupplier: () -> Long + val literalSupplier: () -> Long ) : MethodFingerprint( returnType = returnType, accessFlags = accessFlags, diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 3b38d14203..9b67653f3e 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -959,6 +959,9 @@ Hide expand and close buttons Buttons are hidden\n(swipe mini player to expand or close) Expand and close buttons are shown + Hide skip forward and back buttons + Skip forward and back are hidden + Skip forward and back are shown Modern mini player overlay opacity Opacity value between 0-100, where 0 is transparent Mini player overlay opacity must be between 0-100 From 4731c3a1d91e23ed4adea11571fe0c792848558e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:34:05 +0300 Subject: [PATCH 09/44] refactor: Use throws method --- .../player/overlay/CustomPlayerOverlayOpacityPatch.kt | 6 +++--- .../youtube/layout/seekbar/SeekbarColorBytecodePatch.kt | 6 +++--- .../patches/youtube/layout/theme/ThemeBytecodePatch.kt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index fd00bf39b3..f64d7d76b6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -1,7 +1,5 @@ package app.revanced.patches.youtube.layout.player.overlay -import app.revanced.util.exception -import app.revanced.util.indexOfFirstWideLiteralInstructionValue import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -9,6 +7,8 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.layout.player.overlay.fingerprints.CreatePlayerOverviewFingerprint +import app.revanced.util.exception +import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( @@ -27,7 +27,7 @@ object CustomPlayerOverlayOpacityPatch : BytecodePatch(setOf(CreatePlayerOvervie CreatePlayerOverviewFingerprint.result?.let { result -> result.mutableMethod.apply { val viewRegisterIndex = - indexOfFirstWideLiteralInstructionValue(CustomPlayerOverlayOpacityResourcePatch.scrimOverlayId) + 3 + indexOfFirstWideLiteralInstructionValueOrThrow(CustomPlayerOverlayOpacityResourcePatch.scrimOverlayId) + 3 val viewRegister = getInstruction(viewRegisterIndex).registerA diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt index 98acf716c5..08d3fa0274 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorBytecodePatch.kt @@ -1,7 +1,5 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.util.exception -import app.revanced.util.indexOfFirstWideLiteralInstructionValue import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction @@ -15,6 +13,8 @@ import app.revanced.patches.youtube.layout.seekbar.fingerprints.ShortsSeekbarCol import app.revanced.patches.youtube.layout.theme.LithoColorHookPatch import app.revanced.patches.youtube.layout.theme.LithoColorHookPatch.lithoColorOverrideHook import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch +import app.revanced.util.exception +import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -30,7 +30,7 @@ internal object SeekbarColorBytecodePatch : BytecodePatch( override fun execute(context: BytecodeContext) { fun MutableMethod.addColorChangeInstructions(resourceId: Long) { - val registerIndex = indexOfFirstWideLiteralInstructionValue(resourceId) + 2 + val registerIndex = indexOfFirstWideLiteralInstructionValueOrThrow(resourceId) + 2 val colorRegister = getInstruction(registerIndex).registerA addInstructions( registerIndex + 1, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index 3e9bfd6035..23d7a62fdd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -16,7 +16,7 @@ import app.revanced.patches.youtube.layout.theme.fingerprints.UseGradientLoading import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.util.exception -import app.revanced.util.indexOfFirstWideLiteralInstructionValue +import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -123,7 +123,7 @@ object ThemeBytecodePatch : BytecodePatch( ) UseGradientLoadingScreenFingerprint.result?.mutableMethod?.apply { - val isEnabledIndex = indexOfFirstWideLiteralInstructionValue(GRADIENT_LOADING_SCREEN_AB_CONSTANT) + 3 + val isEnabledIndex = indexOfFirstWideLiteralInstructionValueOrThrow(GRADIENT_LOADING_SCREEN_AB_CONSTANT) + 3 val isEnabledRegister = getInstruction(isEnabledIndex - 1).registerA addInstructions( From b1e6c0ae642eadceebdc9052f572f43cfe7d93c4 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:52:44 +0300 Subject: [PATCH 10/44] fix: Fix icons of tablet modern mini player --- .../layout/tablet/TabletLayoutPatch.kt | 71 +++++++++++++++---- .../tablet/TabletLayoutResourcePatch.kt | 12 ++++ ...niPlayerExpandCloseDrawablesFingerprint.kt | 16 +++++ 3 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt index ccbd17202b..719e35f192 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt @@ -7,6 +7,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstructions import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage @@ -18,6 +19,8 @@ import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch.ytOutlinePictureInPictureWhite24 +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch.ytOutlineXWhite24 import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideFingerprint @@ -27,6 +30,7 @@ import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerC import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConfigFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConstructorFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandButtonFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandCloseDrawablesFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerForwardButtonFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerOverlayViewFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerRewindButtonFingerprint @@ -98,7 +102,7 @@ object TabletLayoutPatch : BytecodePatch( ) ) - // Enable tablet mode. + // region Enable tablet mode. GetFormFactorFingerprint.resultOrThrow().let { it.mutableMethod.apply { @@ -120,7 +124,10 @@ object TabletLayoutPatch : BytecodePatch( } } - // Enable tablet mini player. + // endregion + + + // region Enable tablet mini player. MiniPlayerOverrideNoContextFingerprint.resolve( context, @@ -130,6 +137,12 @@ object TabletLayoutPatch : BytecodePatch( findReturnIndexes().forEach { index -> insertTabletOverride(index) } } + // endregion + + + // region Pre 19.15 patches. + // These are not required for 19.15+. + MiniPlayerOverrideFingerprint.resultOrThrow().let { val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 @@ -144,19 +157,21 @@ object TabletLayoutPatch : BytecodePatch( } } - // Size check return value override. MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) } - // Enable modern mini player. - ModernMiniPlayerConfigFingerprint.resultOrThrow().let { it.mutableMethod.apply { insertModernTabletOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) } } + // endregion + + + // region Enable modern mini player. + ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { it.apply { if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { @@ -171,7 +186,32 @@ object TabletLayoutPatch : BytecodePatch( } } - // Hide modern mini player buttons. + // endregion + + + // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern mini player. + + ModernMiniPlayerExpandCloseDrawablesFingerprint.resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) + + ModernMiniPlayerExpandCloseDrawablesFingerprint.resultOrThrow().mutableMethod.apply { + listOf( + ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, + ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, + ).forEach { (originalResource, replacementResource) -> + val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) + val register = getInstruction(imageResourceIndex).registerA + + replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") + } + } + + // endregion + + + // region Hide modern mini player buttons. ModernMiniPlayerOverlayViewFingerprint.addModernTabletMiniPlayerImageViewHook( context, @@ -197,6 +237,8 @@ object TabletLayoutPatch : BytecodePatch( context, "hideModernMiniPlayerRewindForward" ) + + // endregion } private fun Method.findReturnIndexes(): List { @@ -211,21 +253,21 @@ object TabletLayoutPatch : BytecodePatch( } private fun MutableMethod.insertTabletOverride(index: Int) { - insertOverride(index, "getTabletMiniPlayerOverride") + insertModernTabletOverride(index, "getTabletMiniPlayerOverride") } private fun MutableMethod.insertModernTabletOverrideBoolean(index: Int) { - insertOverride(index, "getModernTabletMiniPlayerOverrideBoolean") + insertModernTabletOverride(index, "getModernTabletMiniPlayerOverrideBoolean") } - private fun MutableMethod.insertOverride(index: Int, methodName: String) { + private fun MutableMethod.insertModernTabletOverride(index: Int, methodName: String) { val register = getInstruction(index).registerA this.addInstructions( index, """ - invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z - move-result v$register - """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z + move-result v$register + """ ) } @@ -235,9 +277,10 @@ object TabletLayoutPatch : BytecodePatch( addInstructions( iPutIndex + 1, """ - invoke-static {v${targetInstruction.registerA}}, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernTabletMiniPlayerOverrideInt(I)I + invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernTabletMiniPlayerOverrideInt(I)I move-result v${targetInstruction.registerA} - iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference + # Original instruction + iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference """ ) removeInstruction(iPutIndex) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt index a819f4fba3..238ec0cdad 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt @@ -13,6 +13,8 @@ internal object TabletLayoutResourcePatch : ResourcePatch() { var modernMiniplayerExpand = -1L var modernMiniplayerRewindButton = -1L var modernMiniplayerForwardButton = -1L + var ytOutlineXWhite24 = -1L + var ytOutlinePictureInPictureWhite24 = -1L override fun execute(context: ResourceContext) { floatyBarButtonTopMargin = ResourceMappingPatch[ @@ -44,5 +46,15 @@ internal object TabletLayoutResourcePatch : ResourcePatch() { "id", "modern_miniplayer_forward_button" ] + + ytOutlineXWhite24 = ResourceMappingPatch[ + "drawable", + "yt_outline_x_white_24" + ] + + ytOutlinePictureInPictureWhite24 = ResourceMappingPatch[ + "drawable", + "yt_outline_picture_in_picture_white_24" + ] } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt new file mode 100644 index 0000000000..87c6f133e9 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.layout.tablet.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.util.patch.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ +internal object ModernMiniPlayerExpandCloseDrawablesFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "V", + parameters = listOf("L"), + literalSupplier = { TabletLayoutResourcePatch.ytOutlinePictureInPictureWhite24 } +) \ No newline at end of file From 508e3eee3efbb6986d969131c6576037a665f465 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:30:32 +0300 Subject: [PATCH 11/44] feat: Allow selecting which mini player to use --- api/revanced-patches.api | 6 + .../layout/miniplayer/MiniPlayerPatch.kt | 283 ++++++++++++++++++ .../MiniPlayerResourcePatch.kt} | 11 +- ...erDimensionsCalculatorParentFingerprint.kt | 6 +- .../MiniPlayerOverrideFingerprint.kt | 2 +- .../MiniPlayerOverrideNoContextFingerprint.kt | 2 +- ...PlayerResponseModelSizeCheckFingerprint.kt | 2 +- .../ModernMiniPlayerCloseButtonFingerprint.kt | 6 +- .../ModernMiniPlayerConfigFingerprint.kt | 2 +- .../ModernMiniPlayerConstructorFingerprint.kt | 2 +- ...ModernMiniPlayerExpandButtonFingerprint.kt | 6 +- ...niPlayerExpandCloseDrawablesFingerprint.kt | 6 +- ...odernMiniPlayerForwardButtonFingerprint.kt | 6 +- .../ModernMiniPlayerOverlayViewFingerprint.kt | 6 +- ...ModernMiniPlayerRewindButtonFingerprint.kt | 6 +- .../ModernMiniPlayerViewParentFingerprint.kt | 2 +- .../layout/tablet/TabletLayoutPatch.kt | 278 ++--------------- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 6 +- .../resources/addresources/values/arrays.xml | 17 ++ .../resources/addresources/values/strings.xml | 36 +-- 20 files changed, 391 insertions(+), 300 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet/TabletLayoutResourcePatch.kt => miniplayer/MiniPlayerResourcePatch.kt} (72%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt (61%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/MiniPlayerOverrideFingerprint.kt (84%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt (86%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt (89%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt (67%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerConfigFingerprint.kt (88%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerConstructorFingerprint.kt (83%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt (67%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt (65%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt (66%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt (67%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt (66%) rename src/main/kotlin/app/revanced/patches/youtube/layout/{tablet => miniplayer}/fingerprints/ModernMiniPlayerViewParentFingerprint.kt (86%) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 603e200f7e..b6acff01c9 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1528,6 +1528,12 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } +public final class app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch; + public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V + public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V +} + public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch : app/revanced/patcher/patch/BytecodePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt new file mode 100644 index 0000000000..68bcc32c8d --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt @@ -0,0 +1,283 @@ +package app.revanced.patches.youtube.layout.miniplayer + +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.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException +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.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch.ytOutlinePictureInPictureWhite24 +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch.ytOutlineXWhite24 +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerCloseButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerConfigFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerConstructorFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandCloseDrawablesFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerForwardButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerOverlayViewFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerRewindButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerViewParentFingerprint +import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint +import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch +import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow +import app.revanced.util.patch.LiteralValueFingerprint +import app.revanced.util.resultOrThrow +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.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +@Patch( + name = "Mini player", + description = "Adds options to change the in app minimized player", + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + AddResourcesPatch::class, + MiniPlayerResourcePatch::class + ], + compatiblePackages = [ + CompatiblePackage( + "com.google.android.youtube", [ + // Hide modern mini player is only present in 19.15+ + // If a robust way of detecting the target app version is added, + // then all changes except modern mini player could be applied to older versions. + "19.15.36", + "19.16.39" + ] + ) + ] +) +@Suppress("unused") +object MiniPlayerPatch : BytecodePatch( + setOf(GetFormFactorFingerprint, + MiniPlayerDimensionsCalculatorParentFingerprint, + MiniPlayerResponseModelSizeCheckFingerprint, + MiniPlayerOverrideFingerprint, + ModernMiniPlayerConfigFingerprint, + ModernMiniPlayerConstructorFingerprint, + ModernMiniPlayerViewParentFingerprint + ) +) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/MiniPlayerPatch;" + + override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.PLAYER.addPreferences( + PreferenceScreen( + key = "revanced_mini_player_screen", + sorting = PreferenceScreen.Sorting.UNSORTED, + preferences = setOf( + ListPreference(key = "revanced_mini_player_type", summaryKey = null,), + SwitchPreference("revanced_mini_player_tablet_modern_hide_expand_close"), + SwitchPreference("revanced_mini_player_tablet_modern_hide_rewind_forward"), + TextPreference("revanced_mini_player_tablet_modern_opacity", inputType = InputType.NUMBER) + ) + ) + ) + + // region Enable tablet mini player. + + MiniPlayerOverrideNoContextFingerprint.resolve( + context, + MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef + ) + MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { + findReturnIndexes().forEach { index -> insertTabletOverride(index) } + } + + // endregion + + + // region Pre 19.15 patches. + // These are not required for 19.15+. + + MiniPlayerOverrideFingerprint.resultOrThrow().let { + val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 + + it.mutableMethod.apply { + val walkerMethod = context.toMethodWalker(this) + .nextMethod(appNameStringIndex, true) + .getMethod() as MutableMethod + + walkerMethod.apply { + findReturnIndexes().forEach { index -> insertTabletOverride(index) } + } + } + } + + MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { + it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) + } + + // endregion + + + // region Enable modern mini player. + + ModernMiniPlayerConfigFingerprint.resultOrThrow().let { + it.mutableMethod.apply { + insertModernOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) + } + } + + ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { + it.apply { + if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { + val iPutIndex = indexOfFirstInstructionOrThrow { + this.opcode == Opcode.IPUT && this.getReference()?.type == "I" + } + + insertModernOverrideInt(iPutIndex) + } else { + findReturnIndexes().forEach { index -> insertModernOverrideBoolean(index) } + } + } + } + + // endregion + + + // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern mini player. + + ModernMiniPlayerExpandCloseDrawablesFingerprint.resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) + + ModernMiniPlayerExpandCloseDrawablesFingerprint.resultOrThrow().mutableMethod.apply { + listOf( + ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, + ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, + ).forEach { (originalResource, replacementResource) -> + val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) + val register = getInstruction(imageResourceIndex).registerA + + replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") + } + } + + // endregion + + + // region Hide tablet modern mini player buttons. + + ModernMiniPlayerOverlayViewFingerprint.addModernMiniPlayerImageViewHook( + context, + "adjustModernMiniPlayerOpacity" + ) + + ModernMiniPlayerExpandButtonFingerprint.addModernMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerExpandClose" + ) + + ModernMiniPlayerCloseButtonFingerprint.addModernMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerExpandClose" + ) + + ModernMiniPlayerRewindButtonFingerprint.addModernMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerRewindForward" + ) + + ModernMiniPlayerForwardButtonFingerprint.addModernMiniPlayerImageViewHook( + context, + "hideModernMiniPlayerRewindForward" + ) + + // endregion + } + + private fun Method.findReturnIndexes(): List { + val indexes = implementation!!.instructions + .withIndex() + .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } + .map { (index, _) -> index } + .reversed() + if (indexes.isEmpty()) throw PatchException("No return instructions found.") + + return indexes + } + + private fun MutableMethod.insertTabletOverride(index: Int) { + insertModernTabletOverride(index, "getTabletMiniPlayerOverride") + } + + private fun MutableMethod.insertModernOverrideBoolean(index: Int) { + insertModernTabletOverride(index, "getModernMiniPlayerOverrideBoolean") + } + + private fun MutableMethod.insertModernTabletOverride(index: Int, methodName: String) { + val register = getInstruction(index).registerA + this.addInstructions( + index, + """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z + move-result v$register + """ + ) + } + + private fun MutableMethod.insertModernOverrideInt(iPutIndex: Int) { + val targetInstruction = getInstruction(iPutIndex) + val targetReference = (targetInstruction as ReferenceInstruction).reference + + addInstructions( + iPutIndex + 1, """ + invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernMiniPlayerOverrideInt(I)I + move-result v${targetInstruction.registerA} + # Original instruction + iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference + """ + ) + removeInstruction(iPutIndex) + } + + private fun LiteralValueFingerprint.addModernMiniPlayerImageViewHook( + context: BytecodeContext, + integrationsMethodName: String + ) { + resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) + + resultOrThrow().mutableMethod.apply { + val imageViewIndex = indexOfFirstInstructionOrThrow( + indexOfFirstWideLiteralInstructionValueOrThrow(literalSupplier.invoke()) + ) { + opcode == Opcode.CHECK_CAST + } + + val register = getInstruction(imageViewIndex).registerA + addInstruction( + imageViewIndex + 1, + "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->$integrationsMethodName(Landroid/widget/ImageView;)V" + ) + } + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt similarity index 72% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt index 238ec0cdad..8db05d4ca8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt @@ -1,12 +1,19 @@ -package app.revanced.patches.youtube.layout.tablet +package app.revanced.patches.youtube.layout.miniplayer import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.all.misc.resources.AddResourcesPatch import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference +import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch(dependencies = [ResourceMappingPatch::class]) -internal object TabletLayoutResourcePatch : ResourcePatch() { +internal object MiniPlayerResourcePatch : ResourcePatch() { var floatyBarButtonTopMargin = -1L var scrimOverlay = -1L var modernMiniplayerClose = -1L diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt similarity index 61% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt index b4c7d1c12d..10a9134174 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -9,5 +9,5 @@ internal object MiniPlayerDimensionsCalculatorParentFingerprint : LiteralValueFi accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L"), - literalSupplier = { TabletLayoutResourcePatch.floatyBarButtonTopMargin } + literalSupplier = { MiniPlayerResourcePatch.floatyBarButtonTopMargin } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideFingerprint.kt similarity index 84% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideFingerprint.kt index 8d15964665..1686236e1f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt index c874fe6f44..95e39623fa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt similarity index 89% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt index 0784352bb2..9f5110780e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt similarity index 67% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt index a64b22e9de..8d9a0faefb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -12,5 +12,5 @@ internal object ModernMiniPlayerCloseButtonFingerprint : LiteralValueFingerprint accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerClose } + literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerClose } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConfigFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt index f6ef856880..a81a673790 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt similarity index 83% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConstructorFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt index 3bbac7ab9c..f4b0b0944a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or import app.revanced.util.patch.LiteralValueFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt similarity index 67% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt index ddabcee05e..8b0cab7086 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -12,5 +12,5 @@ internal object ModernMiniPlayerExpandButtonFingerprint : LiteralValueFingerprin accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerExpand } + literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerExpand } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt similarity index 65% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt index 87c6f133e9..9960b4d024 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -12,5 +12,5 @@ internal object ModernMiniPlayerExpandCloseDrawablesFingerprint : LiteralValueFi accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L"), - literalSupplier = { TabletLayoutResourcePatch.ytOutlinePictureInPictureWhite24 } + literalSupplier = { MiniPlayerResourcePatch.ytOutlinePictureInPictureWhite24 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt similarity index 66% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt index 69dd104a42..8c85cfac31 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -12,5 +12,5 @@ internal object ModernMiniPlayerForwardButtonFingerprint : LiteralValueFingerpri accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerForwardButton } + literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerForwardButton } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt similarity index 67% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt index c5c686126d..0c66152a4a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -12,5 +12,5 @@ internal object ModernMiniPlayerOverlayViewFingerprint : LiteralValueFingerprint accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf(), - literalSupplier = { TabletLayoutResourcePatch.scrimOverlay } + literalSupplier = { MiniPlayerResourcePatch.scrimOverlay } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt similarity index 66% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt index 2f58ee1ccd..4661328602 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags @@ -12,5 +12,5 @@ internal object ModernMiniPlayerRewindButtonFingerprint : LiteralValueFingerprin accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { TabletLayoutResourcePatch.modernMiniplayerRewindButton } + literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerRewindButton } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerViewParentFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerViewParentFingerprint.kt index a30550f889..5cc4af852b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/fingerprints/ModernMiniPlayerViewParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerViewParentFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.tablet.fingerprints +package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt index 719e35f192..f5afff33e3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt @@ -1,109 +1,70 @@ package app.revanced.patches.youtube.layout.tablet 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.removeInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException 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.all.misc.resources.AddResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.InputType -import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.shared.misc.settings.preference.TextPreference -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch.ytOutlinePictureInPictureWhite24 -import app.revanced.patches.youtube.layout.tablet.TabletLayoutResourcePatch.ytOutlineXWhite24 import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerOverrideNoContextFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerCloseButtonFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConfigFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerConstructorFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandButtonFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerExpandCloseDrawablesFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerForwardButtonFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerOverlayViewFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerRewindButtonFingerprint -import app.revanced.patches.youtube.layout.tablet.fingerprints.ModernMiniPlayerViewParentFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow -import app.revanced.util.patch.LiteralValueFingerprint import app.revanced.util.resultOrThrow -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.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Patch( name = "Tablet layout", - description = "Adds an option to force tablet layout and to use the tablet mini player", + description = "Adds an option to enable tablet layout", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class, - TabletLayoutResourcePatch::class ], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", arrayOf( - // Hide modern mini player is only present in 19.15+ - // If a robust way of detecting the target app version is added, - // then all changes except modern mini player could be applied to older versions. + "18.32.39", + "18.37.36", + "18.38.44", + "18.43.45", + "18.44.41", + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34", + "19.02.39", + "19.03.36", + "19.04.38", + "19.05.36", + "19.06.39", + "19.07.40", + "19.08.36", + "19.09.38", + "19.10.39", + "19.11.43", + "19.12.41", + "19.13.37", + "19.14.43", "19.15.36", - "19.16.39", - ) + "19.16.39" + ) ) ] ) @Suppress("unused") -object TabletLayoutPatch : BytecodePatch( - setOf(GetFormFactorFingerprint, - MiniPlayerDimensionsCalculatorParentFingerprint, - MiniPlayerResponseModelSizeCheckFingerprint, - MiniPlayerOverrideFingerprint, - ModernMiniPlayerConfigFingerprint, - ModernMiniPlayerConstructorFingerprint, - ModernMiniPlayerViewParentFingerprint - ) -) { +object TabletLayoutPatch : BytecodePatch(setOf(GetFormFactorFingerprint)) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/TabletLayoutPatch;" override fun execute(context: BytecodeContext) { AddResourcesPatch(this::class) SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( - PreferenceScreen( - key = "revanced_tablet_screen", - sorting = PreferenceScreen.Sorting.UNSORTED, - preferences = setOf( - SwitchPreference("revanced_tablet_layout"), - SwitchPreference("revanced_tablet_mini_player"), - SwitchPreference("revanced_tablet_mini_player_modern"), - SwitchPreference("revanced_tablet_mini_player_modern_hide_expand_close"), - SwitchPreference("revanced_tablet_mini_player_modern_hide_rewind_forward"), - TextPreference("revanced_tablet_mini_player_opacity", inputType = InputType.NUMBER) - ) - ) + SwitchPreference("revanced_tablet_layout") ) - // region Enable tablet mode. - GetFormFactorFingerprint.resultOrThrow().let { it.mutableMethod.apply { val returnIsLargeFormFactorIndex = getInstructions().lastIndex - 4 @@ -123,190 +84,5 @@ object TabletLayoutPatch : BytecodePatch( ) } } - - // endregion - - - // region Enable tablet mini player. - - MiniPlayerOverrideNoContextFingerprint.resolve( - context, - MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef - ) - MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } - } - - // endregion - - - // region Pre 19.15 patches. - // These are not required for 19.15+. - - MiniPlayerOverrideFingerprint.resultOrThrow().let { - val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 - - it.mutableMethod.apply { - val walkerMethod = context.toMethodWalker(this) - .nextMethod(appNameStringIndex, true) - .getMethod() as MutableMethod - - walkerMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } - } - } - } - - MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) - } - - ModernMiniPlayerConfigFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - insertModernTabletOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) - } - } - - // endregion - - - // region Enable modern mini player. - - ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { - it.apply { - if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { - val iPutIndex = indexOfFirstInstructionOrThrow { - this.opcode == Opcode.IPUT && this.getReference()?.type == "I" - } - - insertModernTabletOverrideInt(iPutIndex) - } else { - findReturnIndexes().forEach { index -> insertModernTabletOverrideBoolean(index) } - } - } - } - - // endregion - - - // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern mini player. - - ModernMiniPlayerExpandCloseDrawablesFingerprint.resolve( - context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef - ) - - ModernMiniPlayerExpandCloseDrawablesFingerprint.resultOrThrow().mutableMethod.apply { - listOf( - ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, - ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, - ).forEach { (originalResource, replacementResource) -> - val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) - val register = getInstruction(imageResourceIndex).registerA - - replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") - } - } - - // endregion - - - // region Hide modern mini player buttons. - - ModernMiniPlayerOverlayViewFingerprint.addModernTabletMiniPlayerImageViewHook( - context, - "adjustModernTabletMiniPlayerOpacity" - ) - - ModernMiniPlayerExpandButtonFingerprint.addModernTabletMiniPlayerImageViewHook( - context, - "hideModernMiniPlayerExpandClose" - ) - - ModernMiniPlayerCloseButtonFingerprint.addModernTabletMiniPlayerImageViewHook( - context, - "hideModernMiniPlayerExpandClose" - ) - - ModernMiniPlayerRewindButtonFingerprint.addModernTabletMiniPlayerImageViewHook( - context, - "hideModernMiniPlayerRewindForward" - ) - - ModernMiniPlayerForwardButtonFingerprint.addModernTabletMiniPlayerImageViewHook( - context, - "hideModernMiniPlayerRewindForward" - ) - - // endregion - } - - private fun Method.findReturnIndexes(): List { - val indexes = implementation!!.instructions - .withIndex() - .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } - .map { (index, _) -> index } - .reversed() - if (indexes.isEmpty()) throw PatchException("No return instructions found.") - - return indexes - } - - private fun MutableMethod.insertTabletOverride(index: Int) { - insertModernTabletOverride(index, "getTabletMiniPlayerOverride") - } - - private fun MutableMethod.insertModernTabletOverrideBoolean(index: Int) { - insertModernTabletOverride(index, "getModernTabletMiniPlayerOverrideBoolean") - } - - private fun MutableMethod.insertModernTabletOverride(index: Int, methodName: String) { - val register = getInstruction(index).registerA - this.addInstructions( - index, - """ - invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z - move-result v$register - """ - ) - } - - private fun MutableMethod.insertModernTabletOverrideInt(iPutIndex: Int) { - val targetInstruction = getInstruction(iPutIndex) - val targetReference = (targetInstruction as ReferenceInstruction).reference - - addInstructions( - iPutIndex + 1, """ - invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernTabletMiniPlayerOverrideInt(I)I - move-result v${targetInstruction.registerA} - # Original instruction - iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference - """ - ) - removeInstruction(iPutIndex) - } - - private fun LiteralValueFingerprint.addModernTabletMiniPlayerImageViewHook( - context: BytecodeContext, - integrationsMethodName: String - ) { - resolve( - context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef - ) - - resultOrThrow().mutableMethod.apply { - val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstWideLiteralInstructionValueOrThrow(literalSupplier.invoke()) - ) { - opcode == Opcode.CHECK_CAST - } - - val register = getInstruction(imageViewIndex).registerA - addInstruction( - imageViewIndex + 1, - "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->$integrationsMethodName(Landroid/widget/ImageView;)V" - ) - } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index edc4d996a4..6dcf2ca255 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -2,10 +2,10 @@ package app.revanced.patches.youtube.layout.tabletminiplayer import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patches.youtube.layout.tablet.TabletLayoutPatch +import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerPatch -@Deprecated("This patch class has been merged into TabletLayoutPatch.") -object TabletMiniPlayerPatch : BytecodePatch(dependencies = setOf(TabletLayoutPatch::class)) { +@Deprecated("This patch class has been renamed to MiniPlayer.") +object TabletMiniPlayerPatch : BytecodePatch(dependencies = setOf(MiniPlayerPatch::class)) { override fun execute(context: BytecodeContext) { } } diff --git a/src/main/resources/addresources/values/arrays.xml b/src/main/resources/addresources/values/arrays.xml index 5fad2d8841..f13710f1f0 100644 --- a/src/main/resources/addresources/values/arrays.xml +++ b/src/main/resources/addresources/values/arrays.xml @@ -16,6 +16,23 @@ 17.33.42 + + + @string/revanced_mini_player_type_entry_1 + @string/revanced_mini_player_type_entry_2 + @string/revanced_mini_player_type_entry_3 + @string/revanced_mini_player_type_entry_4 + @string/revanced_mini_player_type_entry_5 + + + + ORIGINAL + PHONE + PHONE_MODERN + TABLET + TABLET_MODERN + + @string/revanced_start_page_entry_0 diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 9b67653f3e..84b3be02d7 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -944,27 +944,29 @@ Shorts player will resume on app startup - Tablet layout - Tablet related settings Enable tablet layout Tablet layout is enabled Tablet layout is disabled Community posts do not show up on tablet layouts - Enable tablet mini player - Mini player is enabled - Mini player is disabled - Enable modern tablet mini player - Modern mini player is enabled - Modern mini player is disabled - Hide expand and close buttons - Buttons are hidden\n(swipe mini player to expand or close) - Expand and close buttons are shown - Hide skip forward and back buttons - Skip forward and back are hidden - Skip forward and back are shown - Modern mini player overlay opacity - Opacity value between 0-100, where 0 is transparent - Mini player overlay opacity must be between 0-100 + x + + Mini player + Modify the in app minimized player + Mini player type + Original + Phone mini player + Phone mini player modern + Tablet mini player + Tablet mini player modern + Hide expand and close buttons + Buttons are hidden\n(swipe mini player to expand or close) + Expand and close buttons are shown + Hide skip forward and back buttons + Skip forward and back are hidden + Skip forward and back are shown + Modern mini player overlay opacity + Opacity value between 0-100, where 0 is transparent + Mini player overlay opacity must be between 0-100 Enable gradient loading screen From f8076f567178f2e497efea4a5470b1b20de607a4 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:34:24 +0300 Subject: [PATCH 12/44] refactor: removed fingerprint that patches code twice --- .../layout/miniplayer/MiniPlayerPatch.kt | 34 ++++++++----------- .../miniplayer/MiniPlayerResourcePatch.kt | 7 ---- .../ModernMiniPlayerConfigFingerprint.kt | 17 ---------- 3 files changed, 14 insertions(+), 44 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt index 68bcc32c8d..4672867a59 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt @@ -24,7 +24,6 @@ import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOve import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerCloseButtonFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerConfigFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerConstructorFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandButtonFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandCloseDrawablesFingerprint @@ -75,7 +74,6 @@ object MiniPlayerPatch : BytecodePatch( MiniPlayerDimensionsCalculatorParentFingerprint, MiniPlayerResponseModelSizeCheckFingerprint, MiniPlayerOverrideFingerprint, - ModernMiniPlayerConfigFingerprint, ModernMiniPlayerConstructorFingerprint, ModernMiniPlayerViewParentFingerprint ) @@ -137,12 +135,6 @@ object MiniPlayerPatch : BytecodePatch( // region Enable modern mini player. - ModernMiniPlayerConfigFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - insertModernOverrideBoolean(it.scanResult.patternScanResult!!.endIndex) - } - } - ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { it.apply { if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { @@ -162,20 +154,22 @@ object MiniPlayerPatch : BytecodePatch( // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern mini player. - ModernMiniPlayerExpandCloseDrawablesFingerprint.resolve( - context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef - ) + ModernMiniPlayerExpandCloseDrawablesFingerprint.let { + it.resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) - ModernMiniPlayerExpandCloseDrawablesFingerprint.resultOrThrow().mutableMethod.apply { - listOf( - ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, - ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, - ).forEach { (originalResource, replacementResource) -> - val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) - val register = getInstruction(imageResourceIndex).registerA + it.resultOrThrow().mutableMethod.apply { + listOf( + ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, + ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, + ).forEach { (originalResource, replacementResource) -> + val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) + val register = getInstruction(imageResourceIndex).registerA - replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") + replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") + } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt index 8db05d4ca8..5a25198ac2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt @@ -3,14 +3,7 @@ package app.revanced.patches.youtube.layout.miniplayer import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.all.misc.resources.AddResourcesPatch import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch -import app.revanced.patches.shared.misc.settings.preference.InputType -import app.revanced.patches.shared.misc.settings.preference.ListPreference -import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.shared.misc.settings.preference.TextPreference -import app.revanced.patches.youtube.misc.settings.SettingsPatch @Patch(dependencies = [ResourceMappingPatch::class]) internal object MiniPlayerResourcePatch : ResourcePatch() { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt deleted file mode 100644 index a81a673790..0000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConfigFingerprint.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.revanced.patches.youtube.layout.miniplayer.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 - -internal object ModernMiniPlayerConfigFingerprint : MethodFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, - returnType = "L", - parameters = listOf("Landroid/content/Context;", "L", "L", "L", "L", "L", "L"), - opcodes = listOf( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ - ) -) \ No newline at end of file From 36e4fafd26c1fe8ed46407483fcaedb70765f740 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 5 Jun 2024 20:46:28 +0300 Subject: [PATCH 13/44] Hide sub titles and 'continue watching' --- .../layout/miniplayer/MiniPlayerPatch.kt | 23 ++++++++++++++++--- ...ernMiniPlayerAddViewListenerFingerprint.kt | 14 +++++++++++ .../resources/addresources/values/strings.xml | 21 +++++++++-------- 3 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt index 4672867a59..3e08b1e39a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt @@ -23,6 +23,7 @@ import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerDim import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerAddViewListenerFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerCloseButtonFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerConstructorFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandButtonFingerprint @@ -89,9 +90,10 @@ object MiniPlayerPatch : BytecodePatch( sorting = PreferenceScreen.Sorting.UNSORTED, preferences = setOf( ListPreference(key = "revanced_mini_player_type", summaryKey = null,), - SwitchPreference("revanced_mini_player_tablet_modern_hide_expand_close"), - SwitchPreference("revanced_mini_player_tablet_modern_hide_rewind_forward"), - TextPreference("revanced_mini_player_tablet_modern_opacity", inputType = InputType.NUMBER) + SwitchPreference("revanced_mini_player_modern_hide_expand_close"), + SwitchPreference("revanced_mini_player_modern_hide_sub_text"), + SwitchPreference("revanced_mini_player_modern_hide_rewind_forward"), + TextPreference("revanced_mini_player_modern_opacity", inputType = InputType.NUMBER) ) ) ) @@ -203,6 +205,21 @@ object MiniPlayerPatch : BytecodePatch( "hideModernMiniPlayerRewindForward" ) + ModernMiniPlayerAddViewListenerFingerprint.let { + it.resolve( + context, + ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + ) + + it.resultOrThrow().mutableMethod.apply { + addInstruction( + 0, + "invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->" + + "hideModernMiniPlayerView(Landroid/view/View;)V" + ) + } + } + // endregion } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt new file mode 100644 index 0000000000..289f66ae38 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.layout.miniplayer.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +/** + * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + */ +internal object ModernMiniPlayerAddViewListenerFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "V", + parameters = listOf("Landroid/view/View;") +) \ No newline at end of file diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 84b3be02d7..a3acf04dda 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -958,15 +958,18 @@ Phone mini player modern Tablet mini player Tablet mini player modern - Hide expand and close buttons - Buttons are hidden\n(swipe mini player to expand or close) - Expand and close buttons are shown - Hide skip forward and back buttons - Skip forward and back are hidden - Skip forward and back are shown - Modern mini player overlay opacity - Opacity value between 0-100, where 0 is transparent - Mini player overlay opacity must be between 0-100 + Hide expand and close buttons + Buttons are hidden\n(swipe mini player to expand or close) + Expand and close buttons are shown + Hide sub texts + Sub texts are hidden + Sub texts are shown + Hide skip forward and back buttons + Skip forward and back are hidden + Skip forward and back are shown + Modern mini player overlay opacity + Opacity value between 0-100, where 0 is transparent + Mini player overlay opacity must be between 0-100 Enable gradient loading screen From 93202b6cdbff4d9a31d5158b95c6afefe085a851 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:07:53 +0300 Subject: [PATCH 14/44] refactor: Mini Player -> Miniplayer --- api/revanced-patches.api | 4 +- ...{MiniPlayerPatch.kt => MiniplayerPatch.kt} | 134 +++++++++--------- ...rcePatch.kt => MiniplayerResourcePatch.kt} | 2 +- ...rDimensionsCalculatorParentFingerprint.kt} | 6 +- ...playerModernAddViewListenerFingerprint.kt} | 4 +- ...MiniplayerModernCloseButtonFingerprint.kt} | 8 +- ...MiniplayerModernConstructorFingerprint.kt} | 3 +- ...iniplayerModernExpandButtonFingerprint.kt} | 8 +- ...rModernExpandCloseDrawablesFingerprint.kt} | 8 +- ...niplayerModernForwardButtonFingerprint.kt} | 8 +- ...MiniplayerModernOverlayViewFingerprint.kt} | 8 +- ...iniplayerModernRewindButtonFingerprint.kt} | 8 +- ... MiniplayerModernViewParentFingerprint.kt} | 2 +- ...nt.kt => MiniplayerOverrideFingerprint.kt} | 2 +- ...MiniplayerOverrideNoContextFingerprint.kt} | 4 +- ...layerResponseModelSizeCheckFingerprint.kt} | 10 +- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 6 +- .../resources/addresources/values/arrays.xml | 18 +-- .../resources/addresources/values/strings.xml | 42 +++--- 19 files changed, 144 insertions(+), 141 deletions(-) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/{MiniPlayerPatch.kt => MiniplayerPatch.kt} (70%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/{MiniPlayerResourcePatch.kt => MiniplayerResourcePatch.kt} (96%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{MiniPlayerDimensionsCalculatorParentFingerprint.kt => MiniplayerDimensionsCalculatorParentFingerprint.kt} (66%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerAddViewListenerFingerprint.kt => MiniplayerModernAddViewListenerFingerprint.kt} (75%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerCloseButtonFingerprint.kt => MiniplayerModernCloseButtonFingerprint.kt} (61%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerConstructorFingerprint.kt => MiniplayerModernConstructorFingerprint.kt} (78%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerExpandButtonFingerprint.kt => MiniplayerModernExpandButtonFingerprint.kt} (61%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerExpandCloseDrawablesFingerprint.kt => MiniplayerModernExpandCloseDrawablesFingerprint.kt} (61%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerForwardButtonFingerprint.kt => MiniplayerModernForwardButtonFingerprint.kt} (62%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerOverlayViewFingerprint.kt => MiniplayerModernOverlayViewFingerprint.kt} (59%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerRewindButtonFingerprint.kt => MiniplayerModernRewindButtonFingerprint.kt} (62%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{ModernMiniPlayerViewParentFingerprint.kt => MiniplayerModernViewParentFingerprint.kt} (86%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{MiniPlayerOverrideFingerprint.kt => MiniplayerOverrideFingerprint.kt} (85%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{MiniPlayerOverrideNoContextFingerprint.kt => MiniplayerOverrideNoContextFingerprint.kt} (87%) rename src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/{MiniPlayerResponseModelSizeCheckFingerprint.kt => MiniplayerResponseModelSizeCheckFingerprint.kt} (65%) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index b6acff01c9..76aa078116 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1528,8 +1528,8 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch : app/revanced/patcher/patch/BytecodePatch { - public static final field INSTANCE Lapp/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch; +public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch : app/revanced/patcher/patch/BytecodePatch { + public static final field INSTANCE Lapp/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt similarity index 70% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 3e08b1e39a..3b2acf84e9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -15,23 +15,24 @@ import app.revanced.patches.all.misc.resources.AddResourcesPatch import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen.Sorting import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch.ytOutlinePictureInPictureWhite24 -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch.ytOutlineXWhite24 -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerDimensionsCalculatorParentFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerAddViewListenerFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerCloseButtonFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerConstructorFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandButtonFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerExpandCloseDrawablesFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerForwardButtonFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerOverlayViewFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerRewindButtonFingerprint -import app.revanced.patches.youtube.layout.miniplayer.fingerprints.ModernMiniPlayerViewParentFingerprint +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.ytOutlinePictureInPictureWhite24 +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.ytOutlineXWhite24 +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerDimensionsCalculatorParentFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernAddViewListenerFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernCloseButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernConstructorFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernExpandButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernExpandCloseDrawablesFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernForwardButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernOverlayViewFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernRewindButtonFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerModernViewParentFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerOverrideFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerOverrideNoContextFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerResponseModelSizeCheckFingerprint import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -48,21 +49,22 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference +// YT uses "Miniplayer" without a space between 'mini' and 'player. @Patch( - name = "Mini player", + name = "Miniplayer", description = "Adds options to change the in app minimized player", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, AddResourcesPatch::class, - MiniPlayerResourcePatch::class + MiniplayerResourcePatch::class ], compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - // Hide modern mini player is only present in 19.15+ + // Hide modern miniplayer is only present in 19.15+ // If a robust way of detecting the target app version is added, - // then all changes except modern mini player could be applied to older versions. + // then all changes except modern miniplayer could be applied to older versions. "19.15.36", "19.16.39" ] @@ -70,41 +72,41 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference ] ) @Suppress("unused") -object MiniPlayerPatch : BytecodePatch( +object MiniplayerPatch : BytecodePatch( setOf(GetFormFactorFingerprint, - MiniPlayerDimensionsCalculatorParentFingerprint, - MiniPlayerResponseModelSizeCheckFingerprint, - MiniPlayerOverrideFingerprint, - ModernMiniPlayerConstructorFingerprint, - ModernMiniPlayerViewParentFingerprint + MiniplayerDimensionsCalculatorParentFingerprint, + MiniplayerResponseModelSizeCheckFingerprint, + MiniplayerOverrideFingerprint, + MiniplayerModernConstructorFingerprint, + MiniplayerModernViewParentFingerprint ) ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/MiniPlayerPatch;" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/MiniplayerPatch;" override fun execute(context: BytecodeContext) { AddResourcesPatch(this::class) SettingsPatch.PreferenceScreen.PLAYER.addPreferences( PreferenceScreen( - key = "revanced_mini_player_screen", - sorting = PreferenceScreen.Sorting.UNSORTED, + key = "revanced_miniplayer_screen", + sorting = Sorting.UNSORTED, preferences = setOf( - ListPreference(key = "revanced_mini_player_type", summaryKey = null,), - SwitchPreference("revanced_mini_player_modern_hide_expand_close"), - SwitchPreference("revanced_mini_player_modern_hide_sub_text"), - SwitchPreference("revanced_mini_player_modern_hide_rewind_forward"), - TextPreference("revanced_mini_player_modern_opacity", inputType = InputType.NUMBER) + ListPreference(key = "revanced_miniplayer_type", summaryKey = null,), + SwitchPreference("revanced_miniplayer_hide_expand_close"), + SwitchPreference("revanced_miniplayer_hide_sub_text"), + SwitchPreference("revanced_miniplayer_hide_rewind_forward"), + TextPreference("revanced_miniplayer_opacity", inputType = InputType.NUMBER) ) ) ) - // region Enable tablet mini player. + // region Enable tablet miniplayer. - MiniPlayerOverrideNoContextFingerprint.resolve( + MiniplayerOverrideNoContextFingerprint.resolve( context, - MiniPlayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef + MiniplayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef ) - MiniPlayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { + MiniplayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { findReturnIndexes().forEach { index -> insertTabletOverride(index) } } @@ -114,7 +116,7 @@ object MiniPlayerPatch : BytecodePatch( // region Pre 19.15 patches. // These are not required for 19.15+. - MiniPlayerOverrideFingerprint.resultOrThrow().let { + MiniplayerOverrideFingerprint.resultOrThrow().let { val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 it.mutableMethod.apply { @@ -128,16 +130,16 @@ object MiniPlayerPatch : BytecodePatch( } } - MiniPlayerResponseModelSizeCheckFingerprint.resultOrThrow().let { + MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) } // endregion - // region Enable modern mini player. + // region Enable modern miniplayer. - ModernMiniPlayerConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { + MiniplayerModernConstructorFingerprint.resultOrThrow().mutableClass.methods.forEach { it.apply { if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { val iPutIndex = indexOfFirstInstructionOrThrow { @@ -146,7 +148,7 @@ object MiniPlayerPatch : BytecodePatch( insertModernOverrideInt(iPutIndex) } else { - findReturnIndexes().forEach { index -> insertModernOverrideBoolean(index) } + findReturnIndexes().forEach { index -> insertModernOverride(index) } } } } @@ -154,12 +156,12 @@ object MiniPlayerPatch : BytecodePatch( // endregion - // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern mini player. + // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern. - ModernMiniPlayerExpandCloseDrawablesFingerprint.let { + MiniplayerModernExpandCloseDrawablesFingerprint.let { it.resolve( context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) it.resultOrThrow().mutableMethod.apply { @@ -178,44 +180,44 @@ object MiniPlayerPatch : BytecodePatch( // endregion - // region Hide tablet modern mini player buttons. + // region Hide tablet modern miniplayer buttons. - ModernMiniPlayerOverlayViewFingerprint.addModernMiniPlayerImageViewHook( + MiniplayerModernExpandButtonFingerprint.addModernMiniplayerImageViewHook( context, - "adjustModernMiniPlayerOpacity" + "hideMiniplayerExpandClose" ) - ModernMiniPlayerExpandButtonFingerprint.addModernMiniPlayerImageViewHook( + MiniplayerModernCloseButtonFingerprint.addModernMiniplayerImageViewHook( context, - "hideModernMiniPlayerExpandClose" + "hideMiniplayerExpandClose" ) - ModernMiniPlayerCloseButtonFingerprint.addModernMiniPlayerImageViewHook( + MiniplayerModernRewindButtonFingerprint.addModernMiniplayerImageViewHook( context, - "hideModernMiniPlayerExpandClose" + "hideMiniplayerRewindForward" ) - ModernMiniPlayerRewindButtonFingerprint.addModernMiniPlayerImageViewHook( + MiniplayerModernForwardButtonFingerprint.addModernMiniplayerImageViewHook( context, - "hideModernMiniPlayerRewindForward" + "hideMiniplayerRewindForward" ) - ModernMiniPlayerForwardButtonFingerprint.addModernMiniPlayerImageViewHook( + MiniplayerModernOverlayViewFingerprint.addModernMiniplayerImageViewHook( context, - "hideModernMiniPlayerRewindForward" + "adjustMiniplayerOpacity" ) - ModernMiniPlayerAddViewListenerFingerprint.let { + MiniplayerModernAddViewListenerFingerprint.let { it.resolve( context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) it.resultOrThrow().mutableMethod.apply { addInstruction( 0, "invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->" + - "hideModernMiniPlayerView(Landroid/view/View;)V" + "hideMiniplayerSubTexts(Landroid/view/View;)V" ) } } @@ -229,17 +231,17 @@ object MiniPlayerPatch : BytecodePatch( .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } .map { (index, _) -> index } .reversed() - if (indexes.isEmpty()) throw PatchException("No return instructions found.") + if (indexes.isEmpty()) throw PatchException("No return instructions found in: $this") return indexes } private fun MutableMethod.insertTabletOverride(index: Int) { - insertModernTabletOverride(index, "getTabletMiniPlayerOverride") + insertModernTabletOverride(index, "getTabletOverride") } - private fun MutableMethod.insertModernOverrideBoolean(index: Int) { - insertModernTabletOverride(index, "getModernMiniPlayerOverrideBoolean") + private fun MutableMethod.insertModernOverride(index: Int) { + insertModernTabletOverride(index, "getModernOverride") } private fun MutableMethod.insertModernTabletOverride(index: Int, methodName: String) { @@ -259,7 +261,7 @@ object MiniPlayerPatch : BytecodePatch( addInstructions( iPutIndex + 1, """ - invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernMiniPlayerOverrideInt(I)I + invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernOverrideType(I)I move-result v${targetInstruction.registerA} # Original instruction iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference @@ -268,13 +270,13 @@ object MiniPlayerPatch : BytecodePatch( removeInstruction(iPutIndex) } - private fun LiteralValueFingerprint.addModernMiniPlayerImageViewHook( + private fun LiteralValueFingerprint.addModernMiniplayerImageViewHook( context: BytecodeContext, integrationsMethodName: String ) { resolve( context, - ModernMiniPlayerViewParentFingerprint.resultOrThrow().classDef + MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) resultOrThrow().mutableMethod.apply { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt similarity index 96% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt index 5a25198ac2..e5a9969756 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniPlayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch @Patch(dependencies = [ResourceMappingPatch::class]) -internal object MiniPlayerResourcePatch : ResourcePatch() { +internal object MiniplayerResourcePatch : ResourcePatch() { var floatyBarButtonTopMargin = -1L var scrimOverlay = -1L var modernMiniplayerClose = -1L diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt similarity index 66% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt index 10a9134174..bc156e7afe 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerDimensionsCalculatorParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt @@ -1,13 +1,13 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object MiniPlayerDimensionsCalculatorParentFingerprint : LiteralValueFingerprint( +internal object MiniplayerDimensionsCalculatorParentFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L"), - literalSupplier = { MiniPlayerResourcePatch.floatyBarButtonTopMargin } + literalSupplier = { MiniplayerResourcePatch.floatyBarButtonTopMargin } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernAddViewListenerFingerprint.kt similarity index 75% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernAddViewListenerFingerprint.kt index 289f66ae38..c4e9472409 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerAddViewListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernAddViewListenerFingerprint.kt @@ -5,9 +5,9 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerAddViewListenerFingerprint : MethodFingerprint( +internal object MiniplayerModernAddViewListenerFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("Landroid/view/View;") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt similarity index 61% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt index 8d9a0faefb..e4bbd9aad0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerCloseButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt @@ -1,16 +1,16 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerCloseButtonFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernCloseButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerClose } + literalSupplier = { MiniplayerResourcePatch.modernMiniplayerClose } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt similarity index 78% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt index f4b0b0944a..01d21a3066 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt @@ -4,7 +4,8 @@ import app.revanced.patcher.extensions.or import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object ModernMiniPlayerConstructorFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernConstructorFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + parameters = listOf("L"), literalSupplier = { 45623000 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt similarity index 61% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt index 8b0cab7086..35629e30d1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt @@ -1,16 +1,16 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerExpandButtonFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernExpandButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerExpand } + literalSupplier = { MiniplayerResourcePatch.modernMiniplayerExpand } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt similarity index 61% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt index 9960b4d024..9ee56819e8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerExpandCloseDrawablesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt @@ -1,16 +1,16 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerExpandCloseDrawablesFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernExpandCloseDrawablesFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("L"), - literalSupplier = { MiniPlayerResourcePatch.ytOutlinePictureInPictureWhite24 } + literalSupplier = { MiniplayerResourcePatch.ytOutlinePictureInPictureWhite24 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt similarity index 62% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt index 8c85cfac31..52053750cb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerForwardButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt @@ -1,16 +1,16 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerForwardButtonFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernForwardButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerForwardButton } + literalSupplier = { MiniplayerResourcePatch.modernMiniplayerForwardButton } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt similarity index 59% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt index 0c66152a4a..02730f443f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerOverlayViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt @@ -1,16 +1,16 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerOverlayViewFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernOverlayViewFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf(), - literalSupplier = { MiniPlayerResourcePatch.scrimOverlay } + literalSupplier = { MiniplayerResourcePatch.scrimOverlay } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt similarity index 62% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt index 4661328602..71b9c054bc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerRewindButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt @@ -1,16 +1,16 @@ package app.revanced.patches.youtube.layout.miniplayer.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerResourcePatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags /** - * Resolves using the class found in [ModernMiniPlayerViewParentFingerprint]. + * Resolves using the class found in [MiniplayerModernViewParentFingerprint]. */ -internal object ModernMiniPlayerRewindButtonFingerprint : LiteralValueFingerprint( +internal object MiniplayerModernRewindButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", parameters = listOf(), - literalSupplier = { MiniPlayerResourcePatch.modernMiniplayerRewindButton } + literalSupplier = { MiniplayerResourcePatch.modernMiniplayerRewindButton } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerViewParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernViewParentFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerViewParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernViewParentFingerprint.kt index 5cc4af852b..a6baeec709 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/ModernMiniPlayerViewParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernViewParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object ModernMiniPlayerViewParentFingerprint : MethodFingerprint( +internal object MiniplayerModernViewParentFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Ljava/lang/String;", parameters = listOf(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerOverrideFingerprint.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerOverrideFingerprint.kt index 1686236e1f..9d9bf5e153 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerOverrideFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object MiniPlayerOverrideFingerprint : MethodFingerprint( +internal object MiniplayerOverrideFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerOverrideNoContextFingerprint.kt similarity index 87% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerOverrideNoContextFingerprint.kt index 95e39623fa..53900f993b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerOverrideNoContextFingerprint.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal object MiniPlayerOverrideNoContextFingerprint : MethodFingerprint( - returnType = "Z", +internal object MiniplayerOverrideNoContextFingerprint : MethodFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + returnType = "Z", opcodes = listOf(Opcode.IGET_BOOLEAN), // anchor to insert the instruction ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerResponseModelSizeCheckFingerprint.kt similarity index 65% rename from src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerResponseModelSizeCheckFingerprint.kt index 9f5110780e..b25e727cba 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerResponseModelSizeCheckFingerprint.kt @@ -5,11 +5,11 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal object MiniPlayerResponseModelSizeCheckFingerprint : MethodFingerprint( - "L", - AccessFlags.PUBLIC or AccessFlags.FINAL, - listOf("Ljava/lang/Object;", "Ljava/lang/Object;"), - listOf( +internal object MiniplayerResponseModelSizeCheckFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "L", + parameters = listOf("Ljava/lang/Object;", "Ljava/lang/Object;"), + opcodes = listOf( Opcode.RETURN_OBJECT, Opcode.CHECK_CAST, Opcode.CHECK_CAST, diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt index 6dcf2ca255..6b1f154bfe 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -2,10 +2,10 @@ package app.revanced.patches.youtube.layout.tabletminiplayer import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patches.youtube.layout.miniplayer.MiniPlayerPatch +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerPatch -@Deprecated("This patch class has been renamed to MiniPlayer.") -object TabletMiniPlayerPatch : BytecodePatch(dependencies = setOf(MiniPlayerPatch::class)) { +@Deprecated("This patch class has been renamed to Miniplayer.") +object TabletMiniPlayerPatch : BytecodePatch(dependencies = setOf(MiniplayerPatch::class)) { override fun execute(context: BytecodeContext) { } } diff --git a/src/main/resources/addresources/values/arrays.xml b/src/main/resources/addresources/values/arrays.xml index f13710f1f0..11a65ddf63 100644 --- a/src/main/resources/addresources/values/arrays.xml +++ b/src/main/resources/addresources/values/arrays.xml @@ -16,15 +16,15 @@ 17.33.42 - - - @string/revanced_mini_player_type_entry_1 - @string/revanced_mini_player_type_entry_2 - @string/revanced_mini_player_type_entry_3 - @string/revanced_mini_player_type_entry_4 - @string/revanced_mini_player_type_entry_5 - - + + + @string/revanced_miniplayer_type_entry_1 + @string/revanced_miniplayer_type_entry_2 + @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 + @string/revanced_miniplayer_type_entry_5 + + ORIGINAL PHONE diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index a3acf04dda..96ecaff28b 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -949,27 +949,27 @@ Tablet layout is disabled Community posts do not show up on tablet layouts x - - Mini player - Modify the in app minimized player - Mini player type - Original - Phone mini player - Phone mini player modern - Tablet mini player - Tablet mini player modern - Hide expand and close buttons - Buttons are hidden\n(swipe mini player to expand or close) - Expand and close buttons are shown - Hide sub texts - Sub texts are hidden - Sub texts are shown - Hide skip forward and back buttons - Skip forward and back are hidden - Skip forward and back are shown - Modern mini player overlay opacity - Opacity value between 0-100, where 0 is transparent - Mini player overlay opacity must be between 0-100 + + Miniplayer + Modify the in app minimized player + Miniplayer type + Original + Phone miniplayer + Phone miniplayer modern + Tablet miniplayer + Tablet miniplayer modern + Hide expand and close buttons + Buttons are hidden\n(swipe miniplayer to expand or close) + Expand and close buttons are shown + Hide sub texts + Sub texts are hidden + Sub texts are shown + Hide skip forward and back buttons + Skip forward and back are hidden + Skip forward and back are shown + Overlay opacity + Opacity value between 0-100, where 0 is transparent + Miniplayer overlay opacity must be between 0-100 Enable gradient loading screen From e83527befb448f77e379d4d620e737c5b603ec5d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:24:17 +0300 Subject: [PATCH 15/44] fix: Allow patching older versions without modern miniplayer options --- .../layout/miniplayer/MiniplayerPatch.kt | 102 +++++++++++++----- .../miniplayer/MiniplayerResourcePatch.kt | 32 +++--- .../resources/addresources/values/arrays.xml | 14 ++- 3 files changed, 106 insertions(+), 42 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 3b2acf84e9..ecc98f9a04 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -52,7 +52,8 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference // YT uses "Miniplayer" without a space between 'mini' and 'player. @Patch( name = "Miniplayer", - description = "Adds options to change the in app minimized player", + description = "Adds options to change the in app minimized player, " + + "and if patching 19.16+ also adds options to use modern miniplayers.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, @@ -62,11 +63,32 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference compatiblePackages = [ CompatiblePackage( "com.google.android.youtube", [ - // Hide modern miniplayer is only present in 19.15+ - // If a robust way of detecting the target app version is added, - // then all changes except modern miniplayer could be applied to older versions. - "19.15.36", - "19.16.39" + "18.32.39", + "18.37.36", + "18.38.44", + "18.43.45", + "18.44.41", + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34", + "19.02.39", + "19.03.36", + "19.04.38", + "19.05.36", + "19.06.39", + "19.07.40", + "19.08.36", + "19.09.38", + "19.10.39", + "19.11.43", + "19.12.41", + "19.13.37", + // 19.14 is left out, as it has some code but is missing UI resources. + // It's simpler to not bother with supporting this single old version. + // 19.15 has a different code for handling sub title texts, + // and probably not worth making changes just to support this single old version. + "19.16.39" // Earliest supported version with modern miniplayers. ] ) ] @@ -86,17 +108,38 @@ object MiniplayerPatch : BytecodePatch( override fun execute(context: BytecodeContext) { AddResourcesPatch(this::class) + // Modern mini player is only present and functional in 19.15+ + // Of note, some modern miniplayer code is present in 19.14 but the feature is not complete. + val isPatchingLegacy = ytOutlinePictureInPictureWhite24 < 0 + SettingsPatch.PreferenceScreen.PLAYER.addPreferences( PreferenceScreen( key = "revanced_miniplayer_screen", sorting = Sorting.UNSORTED, - preferences = setOf( - ListPreference(key = "revanced_miniplayer_type", summaryKey = null,), - SwitchPreference("revanced_miniplayer_hide_expand_close"), - SwitchPreference("revanced_miniplayer_hide_sub_text"), - SwitchPreference("revanced_miniplayer_hide_rewind_forward"), - TextPreference("revanced_miniplayer_opacity", inputType = InputType.NUMBER) - ) + preferences = + if (isPatchingLegacy) { + setOf( + ListPreference( + "revanced_miniplayer_type", + summaryKey = null, + entriesKey = "revanced_miniplayer_type_legacy_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_entry_values" + ) + ) + } else { + setOf( + ListPreference( + "revanced_miniplayer_type", + summaryKey = null, + entriesKey = "revanced_miniplayer_type_19_15_entries", + entryValuesKey = "revanced_miniplayer_type_19_15_entry_values" + ), + SwitchPreference("revanced_miniplayer_hide_expand_close"), + SwitchPreference("revanced_miniplayer_hide_sub_text"), + SwitchPreference("revanced_miniplayer_hide_rewind_forward"), + TextPreference("revanced_miniplayer_opacity", inputType = InputType.NUMBER) + ) + } ) ) @@ -113,25 +156,28 @@ object MiniplayerPatch : BytecodePatch( // endregion - // region Pre 19.15 patches. - // These are not required for 19.15+. + // region Legacy pre 19.15 targets - MiniplayerOverrideFingerprint.resultOrThrow().let { - val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 + if (isPatchingLegacy) { + MiniplayerOverrideFingerprint.resultOrThrow().let { + val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 - it.mutableMethod.apply { - val walkerMethod = context.toMethodWalker(this) - .nextMethod(appNameStringIndex, true) - .getMethod() as MutableMethod + it.mutableMethod.apply { + val walkerMethod = context.toMethodWalker(this) + .nextMethod(appNameStringIndex, true) + .getMethod() as MutableMethod - walkerMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } + walkerMethod.apply { + findReturnIndexes().forEach { index -> insertTabletOverride(index) } + } } } - } - MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) + MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { + it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) + } + + return } // endregion @@ -155,8 +201,8 @@ object MiniplayerPatch : BytecodePatch( // endregion - - // region Fix YT 19.15 and 19.16 using mixed up drawables for tablet modern. + // region Fix 19.16 using mixed up drawables for tablet modern. + // YT fixed this mistake in 19.17 MiniplayerModernExpandCloseDrawablesFingerprint.let { it.resolve( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt index e5a9969756..596bd59fc2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.miniplayer import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch @@ -8,13 +9,15 @@ import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch @Patch(dependencies = [ResourceMappingPatch::class]) internal object MiniplayerResourcePatch : ResourcePatch() { var floatyBarButtonTopMargin = -1L + + // 19.15+ resources + var ytOutlineXWhite24 = -1L + var ytOutlinePictureInPictureWhite24 = -1L var scrimOverlay = -1L var modernMiniplayerClose = -1L var modernMiniplayerExpand = -1L var modernMiniplayerRewindButton = -1L var modernMiniplayerForwardButton = -1L - var ytOutlineXWhite24 = -1L - var ytOutlinePictureInPictureWhite24 = -1L override fun execute(context: ResourceContext) { floatyBarButtonTopMargin = ResourceMappingPatch[ @@ -22,6 +25,21 @@ internal object MiniplayerResourcePatch : ResourcePatch() { "floaty_bar_button_top_margin" ] + try { + ytOutlinePictureInPictureWhite24 = ResourceMappingPatch[ + "drawable", + "yt_outline_picture_in_picture_white_24" + ] + } catch (exception: PatchException) { + // Ignore, and assume the app is 19.14 or earlier. + return + } + + ytOutlineXWhite24 = ResourceMappingPatch[ + "drawable", + "yt_outline_x_white_24" + ] + scrimOverlay = ResourceMappingPatch[ "id", "scrim_overlay" @@ -46,15 +64,5 @@ internal object MiniplayerResourcePatch : ResourcePatch() { "id", "modern_miniplayer_forward_button" ] - - ytOutlineXWhite24 = ResourceMappingPatch[ - "drawable", - "yt_outline_x_white_24" - ] - - ytOutlinePictureInPictureWhite24 = ResourceMappingPatch[ - "drawable", - "yt_outline_picture_in_picture_white_24" - ] } } diff --git a/src/main/resources/addresources/values/arrays.xml b/src/main/resources/addresources/values/arrays.xml index 11a65ddf63..4f88fad508 100644 --- a/src/main/resources/addresources/values/arrays.xml +++ b/src/main/resources/addresources/values/arrays.xml @@ -17,14 +17,14 @@ - + @string/revanced_miniplayer_type_entry_1 @string/revanced_miniplayer_type_entry_2 @string/revanced_miniplayer_type_entry_3 @string/revanced_miniplayer_type_entry_4 @string/revanced_miniplayer_type_entry_5 - + ORIGINAL PHONE @@ -32,6 +32,16 @@ TABLET TABLET_MODERN + + @string/revanced_miniplayer_type_entry_1 + @string/revanced_miniplayer_type_entry_2 + @string/revanced_miniplayer_type_entry_4 + + + ORIGINAL + PHONE + TABLET + From a98f668c855b33434f3a6d2f029c3394087337cb Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:31:10 +0300 Subject: [PATCH 16/44] fix: Rename back to `Enable tablet layout` --- api/revanced-patches.api | 6 -- .../layout/tablet/EnableTabletLayoutPatch.kt | 82 ++++++++++++++++- .../layout/tablet/TabletLayoutPatch.kt | 88 ------------------- 3 files changed, 80 insertions(+), 96 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 76aa078116..e795d660c9 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1608,12 +1608,6 @@ public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayout public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V } -public final class app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch : app/revanced/patcher/patch/BytecodePatch { - public static final field INSTANCE Lapp/revanced/patches/youtube/layout/tablet/TabletLayoutPatch; - public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V - public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V -} - public final class app/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch : app/revanced/patcher/patch/BytecodePatch { public static final field INSTANCE Lapp/revanced/patches/youtube/layout/tabletminiplayer/TabletMiniPlayerPatch; public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt index 7ef4234bcd..8b41fc5dfc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt @@ -1,10 +1,88 @@ package app.revanced.patches.youtube.layout.tablet import app.revanced.patcher.data.BytecodeContext +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.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.CompatiblePackage +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.all.misc.resources.AddResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint +import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch +import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.resultOrThrow + +@Patch( + name = "Enable tablet layout", + description = "Adds an option to enable tablet layout", + dependencies = [ + IntegrationsPatch::class, + SettingsPatch::class, + AddResourcesPatch::class, + ], + compatiblePackages = [ + CompatiblePackage( + "com.google.android.youtube", arrayOf( + "18.32.39", + "18.37.36", + "18.38.44", + "18.43.45", + "18.44.41", + "18.45.43", + "18.48.39", + "18.49.37", + "19.01.34", + "19.02.39", + "19.03.36", + "19.04.38", + "19.05.36", + "19.06.39", + "19.07.40", + "19.08.36", + "19.09.38", + "19.10.39", + "19.11.43", + "19.12.41", + "19.13.37", + "19.14.43", + "19.15.36", + "19.16.39" + ) + ) + ] +) +@Suppress("unused") +object EnableTabletLayoutPatch : BytecodePatch(setOf(GetFormFactorFingerprint)) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/TabletLayoutPatch;" -@Deprecated("This patch class has been renamed to TabletLayoutPatch.") -object EnableTabletLayoutPatch : BytecodePatch(dependencies = setOf(TabletLayoutPatch::class)) { override fun execute(context: BytecodeContext) { + AddResourcesPatch(this::class) + + SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( + SwitchPreference("revanced_tablet_layout") + ) + + GetFormFactorFingerprint.resultOrThrow().let { + it.mutableMethod.apply { + val returnIsLargeFormFactorIndex = getInstructions().lastIndex - 4 + val returnIsLargeFormFactorLabel = getInstruction(returnIsLargeFormFactorIndex) + + addInstructionsWithLabels( + 0, + """ + invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getTabletLayoutEnabled()Z + move-result v0 + if-nez v0, :is_large_form_factor + """, + ExternalLabel( + "is_large_form_factor", + returnIsLargeFormFactorLabel + ) + ) + } + } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt deleted file mode 100644 index f5afff33e3..0000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/TabletLayoutPatch.kt +++ /dev/null @@ -1,88 +0,0 @@ -package app.revanced.patches.youtube.layout.tablet - -import app.revanced.patcher.data.BytecodeContext -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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.all.misc.resources.AddResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint -import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.resultOrThrow - -@Patch( - name = "Tablet layout", - description = "Adds an option to enable tablet layout", - dependencies = [ - IntegrationsPatch::class, - SettingsPatch::class, - AddResourcesPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", arrayOf( - "18.32.39", - "18.37.36", - "18.38.44", - "18.43.45", - "18.44.41", - "18.45.43", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39", - "19.03.36", - "19.04.38", - "19.05.36", - "19.06.39", - "19.07.40", - "19.08.36", - "19.09.38", - "19.10.39", - "19.11.43", - "19.12.41", - "19.13.37", - "19.14.43", - "19.15.36", - "19.16.39" - ) - ) - ] -) -@Suppress("unused") -object TabletLayoutPatch : BytecodePatch(setOf(GetFormFactorFingerprint)) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/TabletLayoutPatch;" - - override fun execute(context: BytecodeContext) { - AddResourcesPatch(this::class) - - SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_tablet_layout") - ) - - GetFormFactorFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - val returnIsLargeFormFactorIndex = getInstructions().lastIndex - 4 - val returnIsLargeFormFactorLabel = getInstruction(returnIsLargeFormFactorIndex) - - addInstructionsWithLabels( - 0, - """ - invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getTabletLayoutEnabled()Z - move-result v0 - if-nez v0, :is_large_form_factor - """, - ExternalLabel( - "is_large_form_factor", - returnIsLargeFormFactorLabel - ) - ) - } - } - } -} From 63fe6540ede9d711aeb06e400eccff0dec4ab9ee Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:38:39 +0300 Subject: [PATCH 17/44] refactor: Extract helper method --- api/revanced-patches.api | 1 + .../youtube/layout/miniplayer/MiniplayerPatch.kt | 12 ++---------- .../kotlin/app/revanced/util/BytecodeUtils.kt | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index e795d660c9..631ba41f35 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1900,6 +1900,7 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat public final class app/revanced/util/BytecodeUtilsKt { public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod; + public static final fun findOpcodeIndexes (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException; public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index ecc98f9a04..ca4113566f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -36,6 +36,7 @@ import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerRes import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch +import app.revanced.util.findOpcodeIndexes import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow @@ -271,16 +272,7 @@ object MiniplayerPatch : BytecodePatch( // endregion } - private fun Method.findReturnIndexes(): List { - val indexes = implementation!!.instructions - .withIndex() - .filter { (_, instruction) -> instruction.opcode == Opcode.RETURN } - .map { (index, _) -> index } - .reversed() - if (indexes.isEmpty()) throw PatchException("No return instructions found in: $this") - - return indexes - } + private fun Method.findReturnIndexes() = findOpcodeIndexes(Opcode.RETURN) private fun MutableMethod.insertTabletOverride(index: Int) { insertModernTabletOverride(index, "getTabletOverride") diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index a3c4c51d61..d512b9be31 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -8,6 +8,7 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @@ -192,6 +193,21 @@ fun Method.indexOfFirstInstructionOrThrow(startIndex: Int = 0, predicate: Instru return index } +/** + * @return All indexes for a specific opcodes, with indexes in reverse order. + */ +fun Method.findOpcodeIndexes(opcode: Opcode): List { + val indexes = implementation!!.instructions + .withIndex() + .filter { (_, instruction) -> instruction.opcode == opcode } + .map { (index, _) -> index } + .reversed() + + if (indexes.isEmpty()) throw PatchException("No ${opcode.name} instructions found in: $this") + + return indexes +} + /** * Return the resolved methods of [MethodFingerprint]s early. */ From d5ca630dc30371c68fad338ddd7fa8467da1873d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:44:30 +0300 Subject: [PATCH 18/44] Comments --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 4 ++-- .../fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index ca4113566f..ff1609c43e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -7,7 +7,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod @@ -204,6 +203,7 @@ object MiniplayerPatch : BytecodePatch( // region Fix 19.16 using mixed up drawables for tablet modern. // YT fixed this mistake in 19.17 + // Fix this, by swapping the drawable resource values with each other. MiniplayerModernExpandCloseDrawablesFingerprint.let { it.resolve( @@ -227,7 +227,7 @@ object MiniplayerPatch : BytecodePatch( // endregion - // region Hide tablet modern miniplayer buttons. + // region Add hooks to hide tablet modern miniplayer buttons. MiniplayerModernExpandButtonFingerprint.addModernMiniplayerImageViewHook( context, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt index 07a79c7c3e..035771ce2d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlaybackSpeedMenuItemFingerprint.kt @@ -20,6 +20,8 @@ internal object CreatePlaybackSpeedMenuItemFingerprint : MethodFingerprint( // 19.01 and earlier is missing the second parameter. // Since this fingerprint is somewhat weak, work around by checking for both method parameter signatures. customFingerprint = custom@{ methodDef, _ -> + // 19.01 and earlier parameters are: "[L" + // 19.02+ parameters are "[L", "F" val parameterTypes = methodDef.parameterTypes val firstParameter = parameterTypes.firstOrNull() From 7730e2c7a5eb1e1af04177590bf6f595deb9fd9d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:47:02 +0300 Subject: [PATCH 19/44] Refactor --- api/revanced-patches.api | 2 +- .../layout/miniplayer/MiniplayerPatch.kt | 52 +++++++++---------- .../kotlin/app/revanced/util/BytecodeUtils.kt | 2 +- .../resources/addresources/values/strings.xml | 2 +- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 631ba41f35..16e0fdcc83 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1900,7 +1900,7 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat public final class app/revanced/util/BytecodeUtilsKt { public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod; - public static final fun findOpcodeIndexes (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; + public static final fun findOpcodeIndices (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException; public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index ff1609c43e..99714f4cd6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -35,7 +35,7 @@ import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerRes import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.findOpcodeIndexes +import app.revanced.util.findOpcodeIndices import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow @@ -150,7 +150,7 @@ object MiniplayerPatch : BytecodePatch( MiniplayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef ) MiniplayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } + findReturnIndices().forEach { index -> insertTabletOverride(index) } } // endregion @@ -168,7 +168,7 @@ object MiniplayerPatch : BytecodePatch( .getMethod() as MutableMethod walkerMethod.apply { - findReturnIndexes().forEach { index -> insertTabletOverride(index) } + findReturnIndices().forEach { index -> insertTabletOverride(index) } } } } @@ -194,7 +194,7 @@ object MiniplayerPatch : BytecodePatch( insertModernOverrideInt(iPutIndex) } else { - findReturnIndexes().forEach { index -> insertModernOverride(index) } + findReturnIndices().forEach { index -> insertModernOverride(index) } } } } @@ -205,22 +205,20 @@ object MiniplayerPatch : BytecodePatch( // YT fixed this mistake in 19.17 // Fix this, by swapping the drawable resource values with each other. - MiniplayerModernExpandCloseDrawablesFingerprint.let { - it.resolve( + MiniplayerModernExpandCloseDrawablesFingerprint.apply { + resolve( context, MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) - - it.resultOrThrow().mutableMethod.apply { - listOf( - ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, - ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, - ).forEach { (originalResource, replacementResource) -> - val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) - val register = getInstruction(imageResourceIndex).registerA - - replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") - } + }.resultOrThrow().mutableMethod.apply { + listOf( + ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, + ytOutlineXWhite24 to ytOutlinePictureInPictureWhite24, + ).forEach { (originalResource, replacementResource) -> + val imageResourceIndex = indexOfFirstWideLiteralInstructionValueOrThrow(originalResource) + val register = getInstruction(imageResourceIndex).registerA + + replaceInstruction(imageResourceIndex, "const v$register, $replacementResource") } } @@ -254,25 +252,23 @@ object MiniplayerPatch : BytecodePatch( "adjustMiniplayerOpacity" ) - MiniplayerModernAddViewListenerFingerprint.let { - it.resolve( + MiniplayerModernAddViewListenerFingerprint.apply { + resolve( context, MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) - - it.resultOrThrow().mutableMethod.apply { - addInstruction( - 0, - "invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->" + - "hideMiniplayerSubTexts(Landroid/view/View;)V" - ) - } + }.resultOrThrow().mutableMethod.apply { + addInstruction( + 0, + "invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->" + + "hideMiniplayerSubTexts(Landroid/view/View;)V" + ) } // endregion } - private fun Method.findReturnIndexes() = findOpcodeIndexes(Opcode.RETURN) + private fun Method.findReturnIndices() = findOpcodeIndices(Opcode.RETURN) private fun MutableMethod.insertTabletOverride(index: Int) { insertModernTabletOverride(index, "getTabletOverride") diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index d512b9be31..b5b1ed089f 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -196,7 +196,7 @@ fun Method.indexOfFirstInstructionOrThrow(startIndex: Int = 0, predicate: Instru /** * @return All indexes for a specific opcodes, with indexes in reverse order. */ -fun Method.findOpcodeIndexes(opcode: Opcode): List { +fun Method.findOpcodeIndices(opcode: Opcode): List { val indexes = implementation!!.instructions .withIndex() .filter { (_, instruction) -> instruction.opcode == opcode } diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 96ecaff28b..73b8aafff9 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -943,7 +943,7 @@ Shorts player will not resume on app startup Shorts player will resume on app startup - + Enable tablet layout Tablet layout is enabled Tablet layout is disabled From e406117fb4337d480398b215376cc7f334789952 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:01:25 +0300 Subject: [PATCH 20/44] refactor: Cleanup --- .../layout/miniplayer/MiniplayerPatch.kt | 37 ++++++------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 99714f4cd6..c1c70cd7c2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -84,10 +84,10 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference "19.11.43", "19.12.41", "19.13.37", - // 19.14 is left out, as it has some code but is missing UI resources. + // 19.14 is left out, as it has incomplete miniplayer code and missing some UI resources. // It's simpler to not bother with supporting this single old version. // 19.15 has a different code for handling sub title texts, - // and probably not worth making changes just to support this single old version. + // and also probably not worth making changes just to support this single old version. "19.16.39" // Earliest supported version with modern miniplayers. ] ) @@ -227,30 +227,15 @@ object MiniplayerPatch : BytecodePatch( // region Add hooks to hide tablet modern miniplayer buttons. - MiniplayerModernExpandButtonFingerprint.addModernMiniplayerImageViewHook( - context, - "hideMiniplayerExpandClose" - ) - - MiniplayerModernCloseButtonFingerprint.addModernMiniplayerImageViewHook( - context, - "hideMiniplayerExpandClose" - ) - - MiniplayerModernRewindButtonFingerprint.addModernMiniplayerImageViewHook( - context, - "hideMiniplayerRewindForward" - ) - - MiniplayerModernForwardButtonFingerprint.addModernMiniplayerImageViewHook( - context, - "hideMiniplayerRewindForward" - ) - - MiniplayerModernOverlayViewFingerprint.addModernMiniplayerImageViewHook( - context, - "adjustMiniplayerOpacity" - ) + listOf( + MiniplayerModernExpandButtonFingerprint to "hideMiniplayerExpandClose", + MiniplayerModernCloseButtonFingerprint to "hideMiniplayerExpandClose", + MiniplayerModernRewindButtonFingerprint to "hideMiniplayerRewindForward", + MiniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", + MiniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity", + ).forEach { (fingerprint, methodName) -> + fingerprint.addModernMiniplayerImageViewHook(context, methodName) + } MiniplayerModernAddViewListenerFingerprint.apply { resolve( From ad8173f11d0195b1c76fa735ad6272b1e562686f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 19:14:03 +0300 Subject: [PATCH 21/44] refactor --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index c1c70cd7c2..fa01441945 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -256,7 +256,7 @@ object MiniplayerPatch : BytecodePatch( private fun Method.findReturnIndices() = findOpcodeIndices(Opcode.RETURN) private fun MutableMethod.insertTabletOverride(index: Int) { - insertModernTabletOverride(index, "getTabletOverride") + insertModernTabletOverride(index, "getLegacyTabletOverride") } private fun MutableMethod.insertModernOverride(index: Int) { From 2870b69d2c0af7312343792a78e9c7246017acf4 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:57:45 +0300 Subject: [PATCH 22/44] refactor --- .../layout/miniplayer/MiniplayerPatch.kt | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index fa01441945..fdd381fba0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -48,12 +48,13 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.TypeReference // YT uses "Miniplayer" without a space between 'mini' and 'player. @Patch( name = "Miniplayer", description = "Adds options to change the in app minimized player, " + - "and if patching 19.16+ also adds options to use modern miniplayers.", + "and if patching target 19.16+ adds options to use modern miniplayers.", dependencies = [ IntegrationsPatch::class, SettingsPatch::class, @@ -150,7 +151,7 @@ object MiniplayerPatch : BytecodePatch( MiniplayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef ) MiniplayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { - findReturnIndices().forEach { index -> insertTabletOverride(index) } + findReturnIndices().forEach { index -> insertLegacyTabletOverride(index) } } // endregion @@ -168,13 +169,13 @@ object MiniplayerPatch : BytecodePatch( .getMethod() as MutableMethod walkerMethod.apply { - findReturnIndices().forEach { index -> insertTabletOverride(index) } + findReturnIndices().forEach { index -> insertLegacyTabletOverride(index) } } } } MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertTabletOverride(it.scanResult.patternScanResult!!.endIndex) + it.mutableMethod.insertLegacyTabletOverride(it.scanResult.patternScanResult!!.endIndex) } return @@ -194,7 +195,7 @@ object MiniplayerPatch : BytecodePatch( insertModernOverrideInt(iPutIndex) } else { - findReturnIndices().forEach { index -> insertModernOverride(index) } + findReturnIndices().forEach { index -> insertModernOverrideBoolean(index) } } } } @@ -255,15 +256,7 @@ object MiniplayerPatch : BytecodePatch( private fun Method.findReturnIndices() = findOpcodeIndices(Opcode.RETURN) - private fun MutableMethod.insertTabletOverride(index: Int) { - insertModernTabletOverride(index, "getLegacyTabletOverride") - } - - private fun MutableMethod.insertModernOverride(index: Int) { - insertModernTabletOverride(index, "getModernOverride") - } - - private fun MutableMethod.insertModernTabletOverride(index: Int, methodName: String) { + private fun MutableMethod.insertBooleanOverride(index: Int, methodName: String) { val register = getInstruction(index).registerA this.addInstructions( index, @@ -274,6 +267,14 @@ object MiniplayerPatch : BytecodePatch( ) } + private fun MutableMethod.insertLegacyTabletOverride(index: Int) { + insertBooleanOverride(index, "getLegacyTabletOverride") + } + + private fun MutableMethod.insertModernOverrideBoolean(index: Int) { + insertBooleanOverride(index, "getModernOverride") + } + private fun MutableMethod.insertModernOverrideInt(iPutIndex: Int) { val targetInstruction = getInstruction(iPutIndex) val targetReference = (targetInstruction as ReferenceInstruction).reference @@ -302,7 +303,8 @@ object MiniplayerPatch : BytecodePatch( val imageViewIndex = indexOfFirstInstructionOrThrow( indexOfFirstWideLiteralInstructionValueOrThrow(literalSupplier.invoke()) ) { - opcode == Opcode.CHECK_CAST + opcode == Opcode.CHECK_CAST && + getReference()?.type == "Landroid/widget/ImageView;" } val register = getInstruction(imageViewIndex).registerA From 4a894f8cac87f33d259e34cb7d87708109c2b226 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:02:56 +0300 Subject: [PATCH 23/44] fix: Hide broken subtitle of modern 2 miniplayer --- .../layout/miniplayer/MiniplayerPatch.kt | 65 +++++++++++++++---- .../miniplayer/MiniplayerResourcePatch.kt | 6 ++ .../YouTubePlayerOverlaysLayoutFingerprint.kt | 13 ++++ 3 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/YouTubePlayerOverlaysLayoutFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index fdd381fba0..2fc4e2e552 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -10,6 +10,7 @@ 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.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.AddResourcesPatch import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.ListPreference @@ -32,6 +33,8 @@ import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerMod import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerOverrideFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerOverrideNoContextFingerprint import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerResponseModelSizeCheckFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.YouTubePlayerOverlaysLayoutFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.YouTubePlayerOverlaysLayoutFingerprint.YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch @@ -43,12 +46,15 @@ import app.revanced.util.patch.LiteralValueFingerprint import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.TypeReference +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter // YT uses "Miniplayer" without a space between 'mini' and 'player. @Patch( @@ -101,7 +107,8 @@ object MiniplayerPatch : BytecodePatch( MiniplayerResponseModelSizeCheckFingerprint, MiniplayerOverrideFingerprint, MiniplayerModernConstructorFingerprint, - MiniplayerModernViewParentFingerprint + MiniplayerModernViewParentFingerprint, + YouTubePlayerOverlaysLayoutFingerprint ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/MiniplayerPatch;" @@ -235,7 +242,15 @@ object MiniplayerPatch : BytecodePatch( MiniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", MiniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity", ).forEach { (fingerprint, methodName) -> - fingerprint.addModernMiniplayerImageViewHook(context, methodName) + fingerprint.resolve( + context, + MiniplayerModernViewParentFingerprint.resultOrThrow().classDef + ) + + fingerprint.addInflatedViewHook( + "$INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", + "Landroid/widget/ImageView;" + ) } MiniplayerModernAddViewListenerFingerprint.apply { @@ -251,6 +266,36 @@ object MiniplayerPatch : BytecodePatch( ) } + + // Modern 2 has a broken overlay subtitle view that is always present. + // Modern 2 uses the same overlay controls as the regular video player, + // and the overlay views are added at runtime. + // Add a hook to the overlay class, and pass the added views to integrations. + YouTubePlayerOverlaysLayoutFingerprint.resultOrThrow().mutableClass.methods.add( + ImmutableMethod( + YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, + "addView", + listOf( + ImmutableMethodParameter("Landroid/view/View;", null, null), + ImmutableMethodParameter("I", null, null), + ImmutableMethodParameter("Landroid/view/ViewGroup\$LayoutParams;", null, null), + ), + "V", + AccessFlags.PUBLIC.value, + null, + null, + MutableMethodImplementation(4), + ).toMutable().apply { + addInstructions( + """ + invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V + invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V + return-void + """, + ) + } + ) + // endregion } @@ -290,27 +335,21 @@ object MiniplayerPatch : BytecodePatch( removeInstruction(iPutIndex) } - private fun LiteralValueFingerprint.addModernMiniplayerImageViewHook( - context: BytecodeContext, - integrationsMethodName: String + private fun LiteralValueFingerprint.addInflatedViewHook( + integrationsMethodName: String, + hookedClassType: String, ) { - resolve( - context, - MiniplayerModernViewParentFingerprint.resultOrThrow().classDef - ) - resultOrThrow().mutableMethod.apply { val imageViewIndex = indexOfFirstInstructionOrThrow( indexOfFirstWideLiteralInstructionValueOrThrow(literalSupplier.invoke()) ) { - opcode == Opcode.CHECK_CAST && - getReference()?.type == "Landroid/widget/ImageView;" + opcode == Opcode.CHECK_CAST && getReference()?.type == hookedClassType } val register = getInstruction(imageViewIndex).registerA addInstruction( imageViewIndex + 1, - "invoke-static { v$register }, $INTEGRATIONS_CLASS_DESCRIPTOR->$integrationsMethodName(Landroid/widget/ImageView;)V" + "invoke-static { v$register }, $integrationsMethodName" ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt index 596bd59fc2..5611a31c20 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt @@ -18,6 +18,7 @@ internal object MiniplayerResourcePatch : ResourcePatch() { var modernMiniplayerExpand = -1L var modernMiniplayerRewindButton = -1L var modernMiniplayerForwardButton = -1L + var playerOverlays = -1L override fun execute(context: ResourceContext) { floatyBarButtonTopMargin = ResourceMappingPatch[ @@ -64,5 +65,10 @@ internal object MiniplayerResourcePatch : ResourcePatch() { "id", "modern_miniplayer_forward_button" ] + + playerOverlays = ResourceMappingPatch[ + "layout", + "player_overlays" + ] } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/YouTubePlayerOverlaysLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/YouTubePlayerOverlaysLayoutFingerprint.kt new file mode 100644 index 0000000000..c53a208e9c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/YouTubePlayerOverlaysLayoutFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.youtube.layout.miniplayer.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.layout.miniplayer.fingerprints.YouTubePlayerOverlaysLayoutFingerprint.YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME + +internal object YouTubePlayerOverlaysLayoutFingerprint : MethodFingerprint( + customFingerprint = { _, classDef -> + classDef.type == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME + } +) { + const val YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME = + "Lcom/google/android/apps/youtube/app/common/player/overlay/YouTubePlayerOverlaysLayout;" +} \ No newline at end of file From 5810841a6b9371fcfbc36ee73c4c1d1d72cdc6c3 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:47:58 +0300 Subject: [PATCH 24/44] feat: Allow mini player 2 --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 6 +++--- src/main/resources/addresources/values/arrays.xml | 8 +++++--- src/main/resources/addresources/values/strings.xml | 9 +++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 2fc4e2e552..a4e5f07b6e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -248,8 +248,8 @@ object MiniplayerPatch : BytecodePatch( ) fingerprint.addInflatedViewHook( - "$INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", - "Landroid/widget/ImageView;" + "Landroid/widget/ImageView;", + "$INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V" ) } @@ -336,8 +336,8 @@ object MiniplayerPatch : BytecodePatch( } private fun LiteralValueFingerprint.addInflatedViewHook( - integrationsMethodName: String, hookedClassType: String, + integrationsMethodName: String, ) { resultOrThrow().mutableMethod.apply { val imageViewIndex = indexOfFirstInstructionOrThrow( diff --git a/src/main/resources/addresources/values/arrays.xml b/src/main/resources/addresources/values/arrays.xml index 4f88fad508..f8f2b42183 100644 --- a/src/main/resources/addresources/values/arrays.xml +++ b/src/main/resources/addresources/values/arrays.xml @@ -23,19 +23,21 @@ @string/revanced_miniplayer_type_entry_3 @string/revanced_miniplayer_type_entry_4 @string/revanced_miniplayer_type_entry_5 + @string/revanced_miniplayer_type_entry_6 ORIGINAL PHONE - PHONE_MODERN TABLET - TABLET_MODERN + MODERN_1 + MODERN_2 + MODERN_3 @string/revanced_miniplayer_type_entry_1 @string/revanced_miniplayer_type_entry_2 - @string/revanced_miniplayer_type_entry_4 + @string/revanced_miniplayer_type_entry_3 ORIGINAL diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 73b8aafff9..94ab40312c 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -954,10 +954,11 @@ Modify the in app minimized player Miniplayer type Original - Phone miniplayer - Phone miniplayer modern - Tablet miniplayer - Tablet miniplayer modern + Phone + Tablet + Modern 1 + Modern 2 + Modern 3 Hide expand and close buttons Buttons are hidden\n(swipe miniplayer to expand or close) Expand and close buttons are shown From f09938c06a4a3145a7224c0793178cae639fc02e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:49:28 +0300 Subject: [PATCH 25/44] fix: legacy tablet hook can still be required for new targets --- .../layout/miniplayer/MiniplayerPatch.kt | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index a4e5f07b6e..0b91a45428 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -164,27 +164,27 @@ object MiniplayerPatch : BytecodePatch( // endregion - // region Legacy pre 19.15 targets + // region Legacy tablet hooks. - if (isPatchingLegacy) { - MiniplayerOverrideFingerprint.resultOrThrow().let { - val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 + MiniplayerOverrideFingerprint.resultOrThrow().let { + val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 - it.mutableMethod.apply { - val walkerMethod = context.toMethodWalker(this) - .nextMethod(appNameStringIndex, true) - .getMethod() as MutableMethod + it.mutableMethod.apply { + val walkerMethod = context.toMethodWalker(this) + .nextMethod(appNameStringIndex, true) + .getMethod() as MutableMethod - walkerMethod.apply { - findReturnIndices().forEach { index -> insertLegacyTabletOverride(index) } - } + walkerMethod.apply { + findReturnIndices().forEach { index -> insertLegacyTabletOverride(index) } } } + } - MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertLegacyTabletOverride(it.scanResult.patternScanResult!!.endIndex) - } + MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { + it.mutableMethod.insertLegacyTabletOverride(it.scanResult.patternScanResult!!.endIndex) + } + if (isPatchingLegacy) { return } From 74262a33af54574106bf7d9a229ef51ebdc9d772 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 7 Jun 2024 17:30:10 +0300 Subject: [PATCH 26/44] cleanup --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- src/main/resources/addresources/values/strings.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 0b91a45428..ccc5a39718 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -143,7 +143,7 @@ object MiniplayerPatch : BytecodePatch( entryValuesKey = "revanced_miniplayer_type_19_15_entry_values" ), SwitchPreference("revanced_miniplayer_hide_expand_close"), - SwitchPreference("revanced_miniplayer_hide_sub_text"), + SwitchPreference("revanced_miniplayer_hide_subtext"), SwitchPreference("revanced_miniplayer_hide_rewind_forward"), TextPreference("revanced_miniplayer_opacity", inputType = InputType.NUMBER) ) diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 94ab40312c..0458008f88 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -962,9 +962,9 @@ Hide expand and close buttons Buttons are hidden\n(swipe miniplayer to expand or close) Expand and close buttons are shown - Hide sub texts - Sub texts are hidden - Sub texts are shown + Hide subtexts + Subtexts are hidden + Subtexts are shown Hide skip forward and back buttons Skip forward and back are hidden Skip forward and back are shown From 91410b4deb73e8091db9abf72ee11a9f21c7ff6c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 00:31:23 +0300 Subject: [PATCH 27/44] Update src/main/kotlin/app/revanced/util/BytecodeUtils.kt Co-authored-by: oSumAtrIX --- src/main/kotlin/app/revanced/util/BytecodeUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index b5b1ed089f..3e56152444 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -194,7 +194,7 @@ fun Method.indexOfFirstInstructionOrThrow(startIndex: Int = 0, predicate: Instru } /** - * @return All indexes for a specific opcodes, with indexes in reverse order. + * @return The list of indices of the opcode in reverse order. */ fun Method.findOpcodeIndices(opcode: Opcode): List { val indexes = implementation!!.instructions From 47f85589b11c3de4738871a117a0b478ac722f8e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 00:31:59 +0300 Subject: [PATCH 28/44] Update src/main/kotlin/app/revanced/util/BytecodeUtils.kt Co-authored-by: oSumAtrIX --- src/main/kotlin/app/revanced/util/BytecodeUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 3e56152444..d14c5c39a5 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -196,7 +196,7 @@ fun Method.indexOfFirstInstructionOrThrow(startIndex: Int = 0, predicate: Instru /** * @return The list of indices of the opcode in reverse order. */ -fun Method.findOpcodeIndices(opcode: Opcode): List { +fun Method.findOpcodeIndicesReversed(opcode: Opcode): List { val indexes = implementation!!.instructions .withIndex() .filter { (_, instruction) -> instruction.opcode == opcode } From bac439410c61b9dc9ee8503e37c91dceac7026da Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 00:38:36 +0300 Subject: [PATCH 29/44] fixing build --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index ccc5a39718..96e98e9eec 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -38,7 +38,7 @@ import app.revanced.patches.youtube.layout.miniplayer.fingerprints.YouTubePlayer import app.revanced.patches.youtube.layout.tablet.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch -import app.revanced.util.findOpcodeIndices +import app.revanced.util.findOpcodeIndicesReversed import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow @@ -299,7 +299,7 @@ object MiniplayerPatch : BytecodePatch( // endregion } - private fun Method.findReturnIndices() = findOpcodeIndices(Opcode.RETURN) + private fun Method.findReturnIndices() = findOpcodeIndicesReversed(Opcode.RETURN) private fun MutableMethod.insertBooleanOverride(index: Int, methodName: String) { val register = getInstruction(index).registerA From 2f93fddb8697b3a231e4f66145c33c33d139e3e7 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 00:57:03 +0300 Subject: [PATCH 30/44] refactor --- api/revanced-patches.api | 2 +- .../misc/mapping/ResourceMappingPatch.kt | 5 +- .../layout/miniplayer/MiniplayerPatch.kt | 53 +++++++++++-------- .../miniplayer/MiniplayerResourcePatch.kt | 7 +++ .../MiniplayerModernConstructorFingerprint.kt | 2 +- .../kotlin/app/revanced/util/BytecodeUtils.kt | 2 + 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 16e0fdcc83..91f37d498d 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1900,7 +1900,7 @@ public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPat public final class app/revanced/util/BytecodeUtilsKt { public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod; - public static final fun findOpcodeIndices (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; + public static final fun findOpcodeIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List; public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException; public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I diff --git a/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 45131b34e5..2c165e1f1c 100644 --- a/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -52,11 +52,10 @@ object ResourceMappingPatch : ResourcePatch() { threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) } - operator fun get(type: String, name: String) : Long { - return resourceMappings.firstOrNull { + operator fun get(type: String, name: String) = + resourceMappings.firstOrNull { it.type == type && it.name == name }?.id ?: throw PatchException("Could not find resource type: $type name: $name") - } data class ResourceElement(val type: String, val name: String, val id: Long) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 96e98e9eec..79e0802808 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -158,7 +158,7 @@ object MiniplayerPatch : BytecodePatch( MiniplayerDimensionsCalculatorParentFingerprint.resultOrThrow().classDef ) MiniplayerOverrideNoContextFingerprint.resultOrThrow().mutableMethod.apply { - findReturnIndices().forEach { index -> insertLegacyTabletOverride(index) } + findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } // endregion @@ -175,13 +175,13 @@ object MiniplayerPatch : BytecodePatch( .getMethod() as MutableMethod walkerMethod.apply { - findReturnIndices().forEach { index -> insertLegacyTabletOverride(index) } + findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } } } MiniplayerResponseModelSizeCheckFingerprint.resultOrThrow().let { - it.mutableMethod.insertLegacyTabletOverride(it.scanResult.patternScanResult!!.endIndex) + it.mutableMethod.insertLegacyTabletMiniplayerOverride(it.scanResult.patternScanResult!!.endIndex) } if (isPatchingLegacy) { @@ -200,9 +200,9 @@ object MiniplayerPatch : BytecodePatch( this.opcode == Opcode.IPUT && this.getReference()?.type == "I" } - insertModernOverrideInt(iPutIndex) + insertModernMiniplayerTypeOverride(iPutIndex) } else { - findReturnIndices().forEach { index -> insertModernOverrideBoolean(index) } + findReturnIndicesReversed().forEach { index -> insertModernMiniplayerOverride(index) } } } } @@ -258,13 +258,11 @@ object MiniplayerPatch : BytecodePatch( context, MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) - }.resultOrThrow().mutableMethod.apply { - addInstruction( - 0, - "invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->" + - "hideMiniplayerSubTexts(Landroid/view/View;)V" - ) - } + }.resultOrThrow().mutableMethod.addInstruction( + 0, + "invoke-static { p1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->" + + "hideMiniplayerSubTexts(Landroid/view/View;)V" + ) // Modern 2 has a broken overlay subtitle view that is always present. @@ -299,7 +297,21 @@ object MiniplayerPatch : BytecodePatch( // endregion } - private fun Method.findReturnIndices() = findOpcodeIndicesReversed(Opcode.RETURN) + private fun Method.findReturnIndicesReversed() = findOpcodeIndicesReversed(Opcode.RETURN) + + /** + * Adds an override to force legacy tablet miniplayer to be used or not used. + */ + private fun MutableMethod.insertLegacyTabletMiniplayerOverride(index: Int) { + insertBooleanOverride(index, "getLegacyTabletMiniplayerOverride") + } + + /** + * Adds an override to force modern miniplayer to be used or not used. + */ + private fun MutableMethod.insertModernMiniplayerOverride(index: Int) { + insertBooleanOverride(index, "getModernMiniplayerOverride") + } private fun MutableMethod.insertBooleanOverride(index: Int, methodName: String) { val register = getInstruction(index).registerA @@ -312,21 +324,16 @@ object MiniplayerPatch : BytecodePatch( ) } - private fun MutableMethod.insertLegacyTabletOverride(index: Int) { - insertBooleanOverride(index, "getLegacyTabletOverride") - } - - private fun MutableMethod.insertModernOverrideBoolean(index: Int) { - insertBooleanOverride(index, "getModernOverride") - } - - private fun MutableMethod.insertModernOverrideInt(iPutIndex: Int) { + /** + * Adds an override to specify which modern miniplayer is used. + */ + private fun MutableMethod.insertModernMiniplayerTypeOverride(iPutIndex: Int) { val targetInstruction = getInstruction(iPutIndex) val targetReference = (targetInstruction as ReferenceInstruction).reference addInstructions( iPutIndex + 1, """ - invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernOverrideType(I)I + invoke-static { v${targetInstruction.registerA} }, $INTEGRATIONS_CLASS_DESCRIPTOR->getModernMiniplayerOverrideType(I)I move-result v${targetInstruction.registerA} # Original instruction iput v${targetInstruction.registerA}, v${targetInstruction.registerB}, $targetReference diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt index 5611a31c20..78d28139df 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt @@ -70,5 +70,12 @@ internal object MiniplayerResourcePatch : ResourcePatch() { "layout", "player_overlays" ] + + // Resource id is not used during patching, but is used by integrations. + // Verify the resource is present while patching. + ResourceMappingPatch[ + "id", + "modern_miniplayer_subtitle_text" + ] } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt index 01d21a3066..0afb5e5264 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/fingerprints/MiniplayerModernConstructorFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object MiniplayerModernConstructorFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = listOf("L"), - literalSupplier = { 45623000 } + literalSupplier = { 45623000L } // Magic number found in the constructor. ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index d14c5c39a5..7e5388d3ff 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -158,6 +158,8 @@ inline fun Instruction.getReference() = (this as? Refere * @return The index of the first [Instruction] that matches the predicate. */ // TODO: delete this on next major release, the overloaded method with an optional start index serves the same purposes. +// Method is deprecated, but annotation is commented out otherwise during compilation usage of the replacement is +// incorrectly flagged as deprecated. //@Deprecated("Use the overloaded method with an optional start index.", ReplaceWith("indexOfFirstInstruction(predicate)")) fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) = indexOfFirstInstruction(0, predicate) From 55e76ff2cc064dd8054702462e8efe642af85443 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:01:58 +0300 Subject: [PATCH 31/44] adjust text --- src/main/resources/addresources/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 0458008f88..774198dbd0 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -951,7 +951,7 @@ x Miniplayer - Modify the in app minimized player + Change the style of the in app minimized player Miniplayer type Original Phone From 06dd01d75bea3633185e181e62872e5b739fb287 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:02:22 +0300 Subject: [PATCH 32/44] Remove literal supplier property --- api/revanced-patches.api | 1 - .../layout/miniplayer/MiniplayerPatch.kt | 21 ++++++++++++------- .../util/patch/LiteralValueFingerprint.kt | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/api/revanced-patches.api b/api/revanced-patches.api index 91f37d498d..9f25387065 100644 --- a/api/revanced-patches.api +++ b/api/revanced-patches.api @@ -1938,7 +1938,6 @@ public final class app/revanced/util/ResourceUtilsKt { public abstract class app/revanced/util/patch/LiteralValueFingerprint : app/revanced/patcher/fingerprint/MethodFingerprint { public fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function0;)V public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Iterable;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function0;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getLiteralSupplier ()Lkotlin/jvm/functions/Function0; } public final class app/revanced/util/resource/ArrayResource : app/revanced/util/resource/BaseResource { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 79e0802808..1bdb8acecb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -18,6 +18,11 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen.Sorting import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.modernMiniplayerClose +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.modernMiniplayerExpand +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.modernMiniplayerForwardButton +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.modernMiniplayerRewindButton +import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.scrimOverlay import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.ytOutlinePictureInPictureWhite24 import app.revanced.patches.youtube.layout.miniplayer.MiniplayerResourcePatch.ytOutlineXWhite24 import app.revanced.patches.youtube.layout.miniplayer.fingerprints.MiniplayerDimensionsCalculatorParentFingerprint @@ -236,18 +241,19 @@ object MiniplayerPatch : BytecodePatch( // region Add hooks to hide tablet modern miniplayer buttons. listOf( - MiniplayerModernExpandButtonFingerprint to "hideMiniplayerExpandClose", - MiniplayerModernCloseButtonFingerprint to "hideMiniplayerExpandClose", - MiniplayerModernRewindButtonFingerprint to "hideMiniplayerRewindForward", - MiniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", - MiniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity", - ).forEach { (fingerprint, methodName) -> + Triple(MiniplayerModernExpandButtonFingerprint, modernMiniplayerExpand,"hideMiniplayerExpandClose"), + Triple(MiniplayerModernCloseButtonFingerprint, modernMiniplayerClose, "hideMiniplayerExpandClose"), + Triple(MiniplayerModernRewindButtonFingerprint, modernMiniplayerRewindButton, "hideMiniplayerRewindForward"), + Triple(MiniplayerModernForwardButtonFingerprint, modernMiniplayerForwardButton, "hideMiniplayerRewindForward"), + Triple(MiniplayerModernOverlayViewFingerprint, scrimOverlay, "adjustMiniplayerOpacity") + ).forEach { (fingerprint, literalValue, methodName) -> fingerprint.resolve( context, MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) fingerprint.addInflatedViewHook( + literalValue, "Landroid/widget/ImageView;", "$INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V" ) @@ -343,12 +349,13 @@ object MiniplayerPatch : BytecodePatch( } private fun LiteralValueFingerprint.addInflatedViewHook( + literalValue: Long, hookedClassType: String, integrationsMethodName: String, ) { resultOrThrow().mutableMethod.apply { val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstWideLiteralInstructionValueOrThrow(literalSupplier.invoke()) + indexOfFirstWideLiteralInstructionValueOrThrow(literalValue) ) { opcode == Opcode.CHECK_CAST && getReference()?.type == hookedClassType } diff --git a/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt b/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt index c42e07fc0e..6b1b67174e 100644 --- a/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt +++ b/src/main/kotlin/app/revanced/util/patch/LiteralValueFingerprint.kt @@ -21,7 +21,7 @@ abstract class LiteralValueFingerprint( opcodes: Iterable? = null, strings: Iterable? = null, // Has to be a supplier because the fingerprint is created before patches can set literals. - val literalSupplier: () -> Long + literalSupplier: () -> Long ) : MethodFingerprint( returnType = returnType, accessFlags = accessFlags, From e7cafe31d0cdeba4b41ae3b9448edeccb10300e6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:03:58 +0300 Subject: [PATCH 33/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 1bdb8acecb..f4d71ce0ec 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -169,7 +169,7 @@ object MiniplayerPatch : BytecodePatch( // endregion - // region Legacy tablet hooks. + // region Legacy tablet Miniplayer hooks. MiniplayerOverrideFingerprint.resultOrThrow().let { val appNameStringIndex = it.scanResult.stringsScanResult!!.matches.first().index + 2 From dcb078e5b6ced8370786e91566248f0117a9171c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:04:09 +0300 Subject: [PATCH 34/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index f4d71ce0ec..f859f5c8fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -348,7 +348,7 @@ object MiniplayerPatch : BytecodePatch( removeInstruction(iPutIndex) } - private fun LiteralValueFingerprint.addInflatedViewHook( + private fun LiteralValueFingerprint.hookInflatedView( literalValue: Long, hookedClassType: String, integrationsMethodName: String, From f488e10ca78c11a12b9bb580b03892e93a53713a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:05:33 +0300 Subject: [PATCH 35/44] refactor --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index f859f5c8fd..3338da76fc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -252,7 +252,7 @@ object MiniplayerPatch : BytecodePatch( MiniplayerModernViewParentFingerprint.resultOrThrow().classDef ) - fingerprint.addInflatedViewHook( + fingerprint.hookInflatedView( literalValue, "Landroid/widget/ImageView;", "$INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V" From 70fec0e7722b87feba05ddd70eb00c9cb06ee97c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:11:11 +0300 Subject: [PATCH 36/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt Co-authored-by: oSumAtrIX --- .../youtube/layout/miniplayer/MiniplayerResourcePatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt index 78d28139df..3870f06544 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerResourcePatch.kt @@ -10,7 +10,7 @@ import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch internal object MiniplayerResourcePatch : ResourcePatch() { var floatyBarButtonTopMargin = -1L - // 19.15+ resources + // Only available in 19.15 and upwards. var ytOutlineXWhite24 = -1L var ytOutlinePictureInPictureWhite24 = -1L var scrimOverlay = -1L From 0e1971cec688c4189a2c480c0243a9f20aedaa28 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:12:11 +0300 Subject: [PATCH 37/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 3338da76fc..133eff9a78 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -61,7 +61,7 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -// YT uses "Miniplayer" without a space between 'mini' and 'player. +// YT uses "Miniplayer" without a space between 'mini' and 'player: https://support.google.com/youtube/answer/9162927. @Patch( name = "Miniplayer", description = "Adds options to change the in app minimized player, " + From 06bf850b3d8fa1ea8a2f9b8aace1675300255bb2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:12:57 +0300 Subject: [PATCH 38/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 133eff9a78..fbe7eb7f86 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -121,7 +121,7 @@ object MiniplayerPatch : BytecodePatch( override fun execute(context: BytecodeContext) { AddResourcesPatch(this::class) - // Modern mini player is only present and functional in 19.15+ + // Modern mini player is only present and functional in 19.15+. // Of note, some modern miniplayer code is present in 19.14 but the feature is not complete. val isPatchingLegacy = ytOutlinePictureInPictureWhite24 < 0 From fe7c719a3781c6bd09f6eab76d8226ad510b5912 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:13:12 +0300 Subject: [PATCH 39/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index fbe7eb7f86..1b3fec9999 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -122,7 +122,7 @@ object MiniplayerPatch : BytecodePatch( AddResourcesPatch(this::class) // Modern mini player is only present and functional in 19.15+. - // Of note, some modern miniplayer code is present in 19.14 but the feature is not complete. + // Resource is not present in older versions. Using it to determine, if patching an old version. val isPatchingLegacy = ytOutlinePictureInPictureWhite24 < 0 SettingsPatch.PreferenceScreen.PLAYER.addPreferences( From 81531ae0469614ff9561244c47ea583e7d22f5ee Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:13:41 +0300 Subject: [PATCH 40/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 1b3fec9999..837e2f7d6c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -190,6 +190,7 @@ object MiniplayerPatch : BytecodePatch( } if (isPatchingLegacy) { + // Return here, as patch below is only intended for new versions of the app. return } From bc062f961fae60f34a866d9d2661336a922cd5bf Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:14:15 +0300 Subject: [PATCH 41/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 837e2f7d6c..a37a342177 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -168,7 +168,6 @@ object MiniplayerPatch : BytecodePatch( // endregion - // region Legacy tablet Miniplayer hooks. MiniplayerOverrideFingerprint.resultOrThrow().let { From 8fa532da29e2cf543c15c49a84d3cb42f7d8525d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:15:58 +0300 Subject: [PATCH 42/44] refactor --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index a37a342177..9f38fd1275 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -123,14 +123,14 @@ object MiniplayerPatch : BytecodePatch( // Modern mini player is only present and functional in 19.15+. // Resource is not present in older versions. Using it to determine, if patching an old version. - val isPatchingLegacy = ytOutlinePictureInPictureWhite24 < 0 + val isPatchingOldVersion = ytOutlinePictureInPictureWhite24 < 0 SettingsPatch.PreferenceScreen.PLAYER.addPreferences( PreferenceScreen( key = "revanced_miniplayer_screen", sorting = Sorting.UNSORTED, preferences = - if (isPatchingLegacy) { + if (isPatchingOldVersion) { setOf( ListPreference( "revanced_miniplayer_type", @@ -188,7 +188,7 @@ object MiniplayerPatch : BytecodePatch( it.mutableMethod.insertLegacyTabletMiniplayerOverride(it.scanResult.patternScanResult!!.endIndex) } - if (isPatchingLegacy) { + if (isPatchingOldVersion) { // Return here, as patch below is only intended for new versions of the app. return } From 2f0d4b934f1b4c13a32fbb9072e8980ba26f3d1c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Jun 2024 01:17:36 +0300 Subject: [PATCH 43/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt Co-authored-by: oSumAtrIX --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 9f38fd1275..17a7f0d4cc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -215,7 +215,7 @@ object MiniplayerPatch : BytecodePatch( // endregion // region Fix 19.16 using mixed up drawables for tablet modern. - // YT fixed this mistake in 19.17 + // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. MiniplayerModernExpandCloseDrawablesFingerprint.apply { From e9abe8e83350fe02a5ba6ad7f2b5e802ea7f2974 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 8 Jun 2024 00:41:38 +0200 Subject: [PATCH 44/44] Update src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt --- .../patches/youtube/layout/miniplayer/MiniplayerPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 17a7f0d4cc..4d7c52a48f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -321,7 +321,7 @@ object MiniplayerPatch : BytecodePatch( private fun MutableMethod.insertBooleanOverride(index: Int, methodName: String) { val register = getInstruction(index).registerA - this.addInstructions( + addInstructions( index, """ invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Z)Z