From 645612459f1ff47f1c3858a3ee5d517c0a1cc715 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 25 Apr 2023 16:48:01 +0400 Subject: [PATCH] fix(youtube/return-youtube-dislike): fix dislikes using wrong font if dark mode is enabled during video playback (#368) --- .../ReturnYouTubeDislike.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/integrations/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java b/integrations/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java index b256964bb..bc950f701 100644 --- a/integrations/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/integrations/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java @@ -15,6 +15,7 @@ import android.text.Spannable; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; +import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; import android.util.DisplayMetrics; import android.util.TypedValue; @@ -257,12 +258,11 @@ public class ReturnYouTubeDislike { try { synchronized (videoIdLockObject) { if (replacementLikeDislikeSpan != null) { - String oldSpannableString = oldSpannable.toString(); - if (replacementLikeDislikeSpan.toString().equals(oldSpannableString)) { + if (spansHaveEqualTextAndColor(replacementLikeDislikeSpan, oldSpannable)) { LogHelper.printDebug(() -> "Ignoring previously created dislikes span"); return null; } - if (originalDislikeSpan.toString().equals(oldSpannableString)) { + if (spansHaveEqualTextAndColor(Objects.requireNonNull(originalDislikeSpan), oldSpannable)) { LogHelper.printDebug(() -> "Replacing span with previously created dislike span"); return replacementLikeDislikeSpan; } @@ -470,6 +470,27 @@ public class ReturnYouTubeDislike { return false; } + private static boolean spansHaveEqualTextAndColor(@NonNull Spanned one, @NonNull Spanned two) { + // Cannot use equals on the span, because many of the inner styling spans do not implement equals. + // Instead, compare the underlying text and the text color to handle when dark mode is changed. + // Cannot compare the status of device dark mode, as Litho components are updated just before dark mode status changes. + if (!one.toString().equals(two.toString())) { + return false; + } + ForegroundColorSpan[] oneColors = one.getSpans(0, one.length(), ForegroundColorSpan.class); + ForegroundColorSpan[] twoColors = two.getSpans(0, two.length(), ForegroundColorSpan.class); + final int oneLength = oneColors.length; + if (oneLength != twoColors.length) { + return false; + } + for (int i = 0; i < oneLength; i++) { + if (oneColors[i].getForegroundColor() != twoColors[i].getForegroundColor()) { + return false; + } + } + return true; + } + private static SpannableString newSpannableWithDislikes(@NonNull Spanned sourceStyling, @NonNull RYDVoteData voteData) { return newSpanUsingStylingOfAnotherSpan(sourceStyling, SettingsEnum.RYD_SHOW_DISLIKE_PERCENTAGE.getBoolean()