diff --git a/extensions/shared/src/main/java/app/revanced/extension/music/patches/utils/ReturnYouTubeDislikePatch.java b/extensions/shared/src/main/java/app/revanced/extension/music/patches/utils/ReturnYouTubeDislikePatch.java index 5e74f70a5..50c43f79c 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/music/patches/utils/ReturnYouTubeDislikePatch.java +++ b/extensions/shared/src/main/java/app/revanced/extension/music/patches/utils/ReturnYouTubeDislikePatch.java @@ -20,6 +20,7 @@ import app.revanced.extension.shared.utils.Logger; */ @SuppressWarnings("unused") public class ReturnYouTubeDislikePatch { + private static volatile boolean isNewActionBar = false; /** * Injection point. @@ -52,7 +53,7 @@ public class ReturnYouTubeDislikePatch { if (!(original instanceof Spanned)) { original = new SpannableString(original); } - return videoData.getDislikesSpan((Spanned) original, true); + return videoData.getDislikesSpan((Spanned) original, true, isNewActionBar); } catch (Exception ex) { Logger.printException(() -> "onLithoTextLoaded failure", ex); } @@ -90,13 +91,21 @@ public class ReturnYouTubeDislikePatch { if (videoData == null) { return original; // User enabled RYD while a video was on screen. } - return videoData.getDislikesSpan(original, false); + return videoData.getDislikesSpan(original, false, false); } catch (Exception ex) { Logger.printException(() -> "onSpannedCreated failure", ex); } return original; } + /** + * Injection point. + */ + public static boolean actionBarFeatureFlagLoaded(boolean original) { + isNewActionBar = original; + return original; + } + /** * Injection point. */ diff --git a/extensions/shared/src/main/java/app/revanced/extension/music/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/shared/src/main/java/app/revanced/extension/music/returnyoutubedislike/ReturnYouTubeDislike.java index 183c9388f..faffaad72 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/music/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/shared/src/main/java/app/revanced/extension/music/returnyoutubedislike/ReturnYouTubeDislike.java @@ -159,7 +159,8 @@ public class ReturnYouTubeDislike { @NonNull private static SpannableString createDislikeSpan(@NonNull Spanned oldSpannable, @NonNull RYDVoteData voteData, - boolean isLithoText) { + boolean isLithoText, + boolean isNewActionBar) { CharSequence oldLikes = oldSpannable; // YouTube creators can hide the like count on a video, @@ -191,9 +192,17 @@ public class ReturnYouTubeDislike { if (middleSeparatorBounds == null) { final DisplayMetrics dp = Utils.getResources().getDisplayMetrics(); + final int unit; + if (isNewActionBar) { + unit = 15; + } else if (isLithoText) { + unit = 23; + } else { + unit = 25; + } leftSeparatorBounds = new Rect(0, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1.2f, dp), - (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, isLithoText ? 23 : 25, dp)); + (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, unit, dp)); final int middleSeparatorSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp); middleSeparatorBounds = new Rect(0, 0, middleSeparatorSize, middleSeparatorSize); @@ -439,12 +448,12 @@ public class ReturnYouTubeDislike { * @return the replacement span containing dislikes, or the original span if RYD is not available. */ @NonNull - public synchronized Spanned getDislikesSpan(@NonNull Spanned original, boolean isLithoText) { - return waitForFetchAndUpdateReplacementSpan(original, isLithoText); + public synchronized Spanned getDislikesSpan(@NonNull Spanned original, boolean isLithoText, boolean isNewActionBar) { + return waitForFetchAndUpdateReplacementSpan(original, isLithoText, isNewActionBar); } @NonNull - private Spanned waitForFetchAndUpdateReplacementSpan(@NonNull Spanned original, boolean isLithoText) { + private Spanned waitForFetchAndUpdateReplacementSpan(@NonNull Spanned original, boolean isLithoText, boolean isNewActionBar) { try { RYDVoteData votingData = getFetchData(MAX_MILLISECONDS_TO_BLOCK_UI_WAITING_FOR_FETCH); if (votingData == null) { @@ -479,7 +488,7 @@ public class ReturnYouTubeDislike { votingData.updateUsingVote(userVote); } originalDislikeSpan = original; - replacementLikeDislikeSpan = createDislikeSpan(original, votingData, isLithoText); + replacementLikeDislikeSpan = createDislikeSpan(original, votingData, isLithoText, isNewActionBar); Logger.printDebug(() -> "Replaced: '" + originalDislikeSpan + "' with: '" + replacementLikeDislikeSpan + "'" + " using video: " + videoId); diff --git a/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/ActionBarComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/ActionBarComponentsPatch.kt index d6d6dbf9c..506dac546 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/ActionBarComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/ActionBarComponentsPatch.kt @@ -6,6 +6,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.music.utils.ACTION_BAR_POSITION_FEATURE_FLAG +import app.revanced.patches.music.utils.actionBarPositionFeatureFlagFingerprint import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.extension.Constants.ACTIONBAR_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.extension.Constants.COMPONENTS_PATH diff --git a/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/Fingerprints.kt index 5a170ac93..0584f618f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/actionbar/components/Fingerprints.kt @@ -22,15 +22,6 @@ internal val actionBarComponentFingerprint = legacyFingerprint( literals = listOf(99180L), ) -internal const val ACTION_BAR_POSITION_FEATURE_FLAG = 45658717L - -internal val actionBarPositionFeatureFlagFingerprint = legacyFingerprint( - name = "actionBarPositionFeatureFlagFingerprint", - returnType = "Z", - parameters = emptyList(), - literals = listOf(ACTION_BAR_POSITION_FEATURE_FLAG) -) - internal val likeDislikeContainerFingerprint = legacyFingerprint( name = "likeDislikeContainerFingerprint", returnType = "V", diff --git a/patches/src/main/kotlin/app/revanced/patches/music/utils/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/utils/Fingerprints.kt index 6a66410c5..3b66b1618 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/utils/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/utils/Fingerprints.kt @@ -6,6 +6,15 @@ import app.revanced.util.or import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +internal const val ACTION_BAR_POSITION_FEATURE_FLAG = 45658717L + +internal val actionBarPositionFeatureFlagFingerprint = legacyFingerprint( + name = "actionBarPositionFeatureFlagFingerprint", + returnType = "Z", + parameters = emptyList(), + literals = listOf(ACTION_BAR_POSITION_FEATURE_FLAG) +) + internal val pendingIntentReceiverFingerprint = legacyFingerprint( name = "pendingIntentReceiverFingerprint", returnType = "V", diff --git a/patches/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 9b2405a34..caa969d01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -4,6 +4,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch +import app.revanced.patches.music.utils.ACTION_BAR_POSITION_FEATURE_FLAG +import app.revanced.patches.music.utils.actionBarPositionFeatureFlagFingerprint import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.extension.Constants.UTILS_PATH import app.revanced.patches.music.utils.patch.PatchList.RETURN_YOUTUBE_DISLIKE @@ -25,6 +27,7 @@ import app.revanced.patches.shared.removeLikeFingerprint import app.revanced.patches.shared.textcomponent.hookSpannableString import app.revanced.patches.shared.textcomponent.textComponentPatch import app.revanced.util.adoptChild +import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall import app.revanced.util.fingerprint.methodOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode @@ -78,6 +81,11 @@ private val returnYouTubeDislikeBytecodePatch = bytecodePatch( """ ) } + } else { + actionBarPositionFeatureFlagFingerprint.injectLiteralInstructionBooleanCall( + ACTION_BAR_POSITION_FEATURE_FLAG, + "$EXTENSION_CLASS_DESCRIPTOR->actionBarFeatureFlagLoaded(Z)Z" + ) } if (is_7_17_or_greater) {