From be5cf2e834d87d51b5d3061d46bd7154d6306787 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 27 Dec 2024 19:31:39 +0400 Subject: [PATCH] fix(YouTube - Exit fullscreen mode): Exit fullscreen mode of first video opened after cold start --- .../youtube/patches/ExitFullscreenPatch.java | 21 ++++++++++++------- .../player/fullscreen/ExitFullscreenPatch.kt | 12 ++++++----- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java index dddea1387c..02d53fa696 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ExitFullscreenPatch.java @@ -38,13 +38,20 @@ public static void endOfVideoReached() { } } - ImageView fullscreenButton = PlayerControlsPatch.fullscreenButtonRef.get(); - if (fullscreenButton == null) { - Logger.printDebug(() -> "Fullscreen button is null, cannot click"); - } else { - Logger.printDebug(() -> "Clicking fullscreen button"); - fullscreenButton.performClick(); - } + // If the user cold launches the app and plays a video but does not + // tap to show the overlay controls, the fullscreen button is not + // set because the overlay controls are not attached. + // To fix this, push the perform click to the back fo the main thread, + // and by then the overlay controls will be visible since the video is now finished. + Utils.runOnMainThread(() -> { + ImageView button = PlayerControlsPatch.fullscreenButtonRef.get(); + if (button == null) { + Logger.printDebug(() -> "Fullscreen button is null, cannot click"); + } else { + Logger.printDebug(() -> "Clicking fullscreen button"); + button.performClick(); + } + }); } } catch (Exception ex) { Logger.printException(() -> "endOfVideoReached failure", ex); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index d1d93748d5..105494a221 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -12,6 +11,7 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.autoRepeatFingerprint import app.revanced.patches.youtube.shared.autoRepeatParentFingerprint +import app.revanced.util.addInstructionsAtControlFlowLabel @Suppress("unused") internal val exitFullscreenPatch = bytecodePatch( @@ -57,9 +57,11 @@ internal val exitFullscreenPatch = bytecodePatch( ) ) - autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.addInstruction( - 0, - "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", - ) + autoRepeatFingerprint.match(autoRepeatParentFingerprint.originalClassDef).method.apply { + addInstructionsAtControlFlowLabel( + implementation!!.instructions.lastIndex, + "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", + ) + } } }