mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-09 02:54:37 +02:00
fix(YouTube - Change live ring click action): Sometimes the channel opens even if the live ring is not clicked.
This commit is contained in:
parent
7fbac85ef1
commit
b95e735345
@ -2,6 +2,7 @@ package app.revanced.extension.youtube.patches.general;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import app.revanced.extension.shared.utils.Logger;
|
||||
@ -15,9 +16,14 @@ public final class OpenChannelOfLiveAvatarPatch {
|
||||
Settings.CHANGE_LIVE_RING_CLICK_ACTION.get();
|
||||
|
||||
private static final AtomicBoolean engagementPanelOpen = new AtomicBoolean(false);
|
||||
private static volatile boolean liveChannelAvatarClicked = false;
|
||||
private static volatile String videoId = "";
|
||||
|
||||
/**
|
||||
* If the video is open by clicking live ring, this key does not exists.
|
||||
*/
|
||||
private static final String VIDEO_THUMBNAIL_VIEW_KEY =
|
||||
"VideoPresenterConstants.VIDEO_THUMBNAIL_VIEW_KEY";
|
||||
|
||||
public static void showEngagementPanel(@Nullable Object object) {
|
||||
engagementPanelOpen.set(object != null);
|
||||
}
|
||||
@ -26,19 +32,15 @@ public final class OpenChannelOfLiveAvatarPatch {
|
||||
engagementPanelOpen.compareAndSet(true, false);
|
||||
}
|
||||
|
||||
public static void liveChannelAvatarClicked() {
|
||||
liveChannelAvatarClicked = true;
|
||||
}
|
||||
|
||||
public static boolean openChannelOfLiveAvatar() {
|
||||
try {
|
||||
if (!CHANGE_LIVE_RING_CLICK_ACTION) {
|
||||
return false;
|
||||
}
|
||||
if (!liveChannelAvatarClicked) {
|
||||
if (engagementPanelOpen.get()) {
|
||||
return false;
|
||||
}
|
||||
if (engagementPanelOpen.get()) {
|
||||
if (videoId.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
VideoDetailsRequest request = VideoDetailsRequest.getRequestForVideoId(videoId);
|
||||
@ -46,7 +48,6 @@ public final class OpenChannelOfLiveAvatarPatch {
|
||||
String channelId = request.getInfo();
|
||||
if (channelId != null) {
|
||||
videoId = "";
|
||||
liveChannelAvatarClicked = false;
|
||||
VideoUtils.openChannel(channelId);
|
||||
return true;
|
||||
}
|
||||
@ -57,12 +58,15 @@ public final class OpenChannelOfLiveAvatarPatch {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void openChannelOfLiveAvatar(String newlyLoadedVideoId) {
|
||||
public static void openChannelOfLiveAvatar(Map<Object, Object> playbackStartDescriptorMap, String newlyLoadedVideoId) {
|
||||
try {
|
||||
if (!CHANGE_LIVE_RING_CLICK_ACTION) {
|
||||
return;
|
||||
}
|
||||
if (!liveChannelAvatarClicked) {
|
||||
if (playbackStartDescriptorMap == null) {
|
||||
return;
|
||||
}
|
||||
if (playbackStartDescriptorMap.containsKey(VIDEO_THUMBNAIL_VIEW_KEY)) {
|
||||
return;
|
||||
}
|
||||
if (engagementPanelOpen.get()) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package app.revanced.patches.youtube.general.livering
|
||||
|
||||
import app.revanced.patches.youtube.utils.resourceid.elementsImage
|
||||
import app.revanced.util.fingerprint.legacyFingerprint
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstruction
|
||||
@ -10,14 +9,6 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.Method
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
internal val elementsImageFingerprint = legacyFingerprint(
|
||||
name = "elementsImageFingerprint",
|
||||
returnType = "Landroid/view/View;",
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC,
|
||||
parameters = listOf("Landroid/view/View;"),
|
||||
literals = listOf(elementsImage),
|
||||
)
|
||||
|
||||
internal val clientSettingEndpointFingerprint = legacyFingerprint(
|
||||
name = "clientSettingEndpointFingerprint",
|
||||
returnType = "V",
|
||||
|
@ -1,6 +1,5 @@
|
||||
package app.revanced.patches.youtube.general.livering
|
||||
|
||||
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
|
||||
@ -10,16 +9,18 @@ import app.revanced.patches.youtube.utils.engagement.engagementPanelHookPatch
|
||||
import app.revanced.patches.youtube.utils.engagement.hookEngagementPanelState
|
||||
import app.revanced.patches.youtube.utils.extension.Constants.GENERAL_PATH
|
||||
import app.revanced.patches.youtube.utils.patch.PatchList.CHANGE_LIVE_RING_CLICK_ACTION
|
||||
import app.revanced.patches.youtube.utils.resourceid.sharedResourceIdPatch
|
||||
import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference
|
||||
import app.revanced.patches.youtube.utils.settings.settingsPatch
|
||||
import app.revanced.patches.youtube.video.playbackstart.playbackStartDescriptorPatch
|
||||
import app.revanced.patches.youtube.video.playbackstart.playbackStartVideoIdReference
|
||||
import app.revanced.util.fingerprint.methodOrThrow
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||
"$GENERAL_PATH/OpenChannelOfLiveAvatarPatch;"
|
||||
@ -33,18 +34,12 @@ val openChannelOfLiveAvatarPatch = bytecodePatch(
|
||||
|
||||
dependsOn(
|
||||
settingsPatch,
|
||||
sharedResourceIdPatch,
|
||||
playbackStartDescriptorPatch,
|
||||
engagementPanelHookPatch,
|
||||
)
|
||||
|
||||
execute {
|
||||
|
||||
elementsImageFingerprint.methodOrThrow().addInstruction(
|
||||
0,
|
||||
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->liveChannelAvatarClicked()V"
|
||||
)
|
||||
|
||||
hookEngagementPanelState(EXTENSION_CLASS_DESCRIPTOR)
|
||||
|
||||
clientSettingEndpointFingerprint.methodOrThrow().apply {
|
||||
@ -66,6 +61,14 @@ val openChannelOfLiveAvatarPatch = bytecodePatch(
|
||||
val playbackStartIndex = indexOfPlaybackStartDescriptorInstruction(this) + 1
|
||||
val playbackStartRegister = getInstruction<OneRegisterInstruction>(playbackStartIndex).registerA
|
||||
|
||||
val mapIndex = indexOfFirstInstructionOrThrow(playbackStartIndex) {
|
||||
val reference = getReference<MethodReference>()
|
||||
opcode == Opcode.INVOKE_STATIC &&
|
||||
reference?.returnType == "Ljava/lang/Object;" &&
|
||||
reference.parameterTypes.firstOrNull() == "Ljava/util/Map;"
|
||||
}
|
||||
val mapRegister = getInstruction<FiveRegisterInstruction>(mapIndex).registerC
|
||||
|
||||
freeIndex = indexOfFirstInstructionOrThrow(playbackStartIndex, Opcode.CONST_STRING)
|
||||
freeRegister = getInstruction<OneRegisterInstruction>(freeIndex).registerA
|
||||
|
||||
@ -73,7 +76,7 @@ val openChannelOfLiveAvatarPatch = bytecodePatch(
|
||||
playbackStartIndex + 1, """
|
||||
invoke-virtual { v$playbackStartRegister }, $playbackStartVideoIdReference
|
||||
move-result-object v$freeRegister
|
||||
invoke-static { v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->openChannelOfLiveAvatar(Ljava/lang/String;)V
|
||||
invoke-static { v$mapRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->openChannelOfLiveAvatar(Ljava/util/Map;Ljava/lang/String;)V
|
||||
"""
|
||||
)
|
||||
}
|
||||
|
@ -83,8 +83,6 @@ var easySeekEduContainer = -1L
|
||||
private set
|
||||
var editSettingsAction = -1L
|
||||
private set
|
||||
var elementsImage = -1L
|
||||
private set
|
||||
var endScreenElementLayoutCircle = -1L
|
||||
private set
|
||||
var endScreenElementLayoutIcon = -1L
|
||||
@ -390,10 +388,6 @@ internal val sharedResourceIdPatch = resourcePatch(
|
||||
STRING,
|
||||
"edit_settings_action"
|
||||
]
|
||||
elementsImage = resourceMappings[
|
||||
ID,
|
||||
"elements_image"
|
||||
]
|
||||
endScreenElementLayoutCircle = resourceMappings[
|
||||
LAYOUT,
|
||||
"endscreen_element_layout_circle"
|
||||
|
Loading…
x
Reference in New Issue
Block a user