From 8a7098cce43a9f181e0db5d0849b53102e06f0bb Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 1 May 2023 15:12:31 +0400 Subject: [PATCH] refactor(youtube/return-youtube-dislike): simplify branching (#379) --- .../patches/ReturnYouTubeDislikePatch.java | 38 ++++++------- .../ReturnYouTubeDislike.java | 54 ++++++------------- .../requests/ReturnYouTubeDislikeApi.java | 13 +++-- 3 files changed, 41 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/app/revanced/integrations/patches/ReturnYouTubeDislikePatch.java b/app/src/main/java/app/revanced/integrations/patches/ReturnYouTubeDislikePatch.java index 695b4afe..93f0020d 100644 --- a/app/src/main/java/app/revanced/integrations/patches/ReturnYouTubeDislikePatch.java +++ b/app/src/main/java/app/revanced/integrations/patches/ReturnYouTubeDislikePatch.java @@ -3,7 +3,7 @@ package app.revanced.integrations.patches; import static app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike.Vote; import android.text.Editable; -import android.text.SpannableString; +import android.text.Spannable; import android.text.Spanned; import android.text.TextWatcher; import android.widget.TextView; @@ -16,6 +16,7 @@ import java.util.concurrent.atomic.AtomicReference; import app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike; import app.revanced.integrations.settings.SettingsEnum; +import app.revanced.integrations.shared.PlayerType; import app.revanced.integrations.utils.LogHelper; import app.revanced.integrations.utils.ReVancedUtils; @@ -68,14 +69,9 @@ public class ReturnYouTubeDislikePatch { if (oldUITextView == null) { return; } - Spanned dislikes = ReturnYouTubeDislike.getDislikesSpanForRegularVideo(oldUIOriginalSpan, false); - if (dislikes == null) { // Dislikes not available. - // Must reset text back to original as the TextView may contain dislikes of a prior video. - dislikes = oldUIOriginalSpan; - } - oldUIReplacementSpan = dislikes; - if (!dislikes.equals(oldUITextView.getText())) { - oldUITextView.setText(dislikes); + oldUIReplacementSpan = ReturnYouTubeDislike.getDislikesSpanForRegularVideo(oldUIOriginalSpan, false); + if (!oldUIReplacementSpan.equals(oldUITextView.getText())) { + oldUITextView.setText(oldUIReplacementSpan); } } @@ -138,14 +134,23 @@ public class ReturnYouTubeDislikePatch { @NonNull AtomicReference textRef, @NonNull CharSequence original) { try { - if (!SettingsEnum.RYD_ENABLED.getBoolean()) { + if (!SettingsEnum.RYD_ENABLED.getBoolean() || PlayerType.getCurrent().isNoneOrHidden()) { return original; } - SpannableString replacement = ReturnYouTubeDislike.getDislikeSpanForContext(conversionContext, original); - if (replacement != null) { - textRef.set(replacement); - return replacement; + + String conversionContextString = conversionContext.toString(); + final boolean isSegmentedButton; + if (conversionContextString.contains("|segmented_like_dislike_button.eml|")) { + isSegmentedButton = true; + } else if (conversionContextString.contains("|dislike_button.eml|")) { + isSegmentedButton = false; + } else { + return original; } + + Spanned replacement = ReturnYouTubeDislike.getDislikesSpanForRegularVideo((Spannable) original, isSegmentedButton); + textRef.set(replacement); + return replacement; } catch (Exception ex) { LogHelper.printException(() -> "onLithoTextLoaded failure", ex); } @@ -162,10 +167,7 @@ public class ReturnYouTubeDislikePatch { if (!SettingsEnum.RYD_ENABLED.getBoolean()) { return original; } - SpannableString replacement = ReturnYouTubeDislike.getDislikeSpanForShort(original); - if (replacement != null) { - return replacement; - } + return ReturnYouTubeDislike.getDislikeSpanForShort(original); } catch (Exception ex) { LogHelper.printException(() -> "onShortsComponentCreated failure", ex); } diff --git a/app/src/main/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java b/app/src/main/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java index a170efbf..5bee15ea 100644 --- a/app/src/main/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/app/src/main/java/app/revanced/integrations/returnyoutubedislike/ReturnYouTubeDislike.java @@ -207,31 +207,10 @@ public class ReturnYouTubeDislike { } /** - * @return NULL if the span does not need changing or if RYD is not available. + * @return the replacement span containing dislikes, or the original span if RYD is not available. */ - @Nullable - public static SpannableString getDislikeSpanForContext(@NonNull Object conversionContext, @NonNull CharSequence original) { - if (PlayerType.getCurrent().isNoneOrHidden()) { - return null; - } - String conversionContextString = conversionContext.toString(); - final boolean isSegmentedButton; - if (conversionContextString.contains("|segmented_like_dislike_button.eml|")) { - isSegmentedButton = true; - } else if (conversionContextString.contains("|dislike_button.eml|")) { - isSegmentedButton = false; - } else { - return null; - } - - return getDislikesSpanForRegularVideo((Spannable) original, isSegmentedButton); - } - - /** - * @return NULL if the span does not need changing or if RYD is not available. - */ - @Nullable - public static SpannableString getDislikesSpanForRegularVideo(@NonNull Spanned original, boolean isSegmentedButton) { + @NonNull + public static Spanned getDislikesSpanForRegularVideo(@NonNull Spanned original, boolean isSegmentedButton) { if (dislikeDataIsShort) { // user: // 1, opened a video @@ -239,16 +218,16 @@ public class ReturnYouTubeDislike { // 3. closed the short // 4. regular video is now present, but the videoId and RYD data is still for the short LogHelper.printDebug(() -> "Ignoring getDislikeSpanForContext(), as data loaded is for prior short"); - return null; + return original; } - return waitForFetchAndUpdateReplacementSpan(original, isSegmentedButton); } /** * Called when a Shorts dislike Spannable is created. */ - public static SpannableString getDislikeSpanForShort(@NonNull Spanned original) { + @NonNull + public static Spanned getDislikeSpanForShort(@NonNull Spanned original) { dislikeDataIsShort = true; // it's now certain the video and data are a short return waitForFetchAndUpdateReplacementSpan(original, false); } @@ -258,17 +237,14 @@ public class ReturnYouTubeDislike { return span.toString().indexOf(MIDDLE_SEPARATOR_CHARACTER) != -1; } - /** - * @return NULL if the span does not need changing or if RYD is not available. - */ - @Nullable - private static SpannableString waitForFetchAndUpdateReplacementSpan(@NonNull Spanned oldSpannable, boolean isSegmentedButton) { + @NonNull + private static Spanned waitForFetchAndUpdateReplacementSpan(@NonNull Spanned oldSpannable, boolean isSegmentedButton) { try { synchronized (videoIdLockObject) { if (replacementLikeDislikeSpan != null) { if (spansHaveEqualTextAndColor(replacementLikeDislikeSpan, oldSpannable)) { LogHelper.printDebug(() -> "Ignoring previously created dislikes span"); - return null; + return oldSpannable; } if (spansHaveEqualTextAndColor(Objects.requireNonNull(originalDislikeSpan), oldSpannable)) { LogHelper.printDebug(() -> "Replacing span with previously created dislike span"); @@ -277,11 +253,11 @@ public class ReturnYouTubeDislike { } if (isSegmentedButton && isPreviouslyCreatedSegmentedSpan(oldSpannable)) { // need to recreate using original, as oldSpannable has prior outdated dislike values - oldSpannable = originalDislikeSpan; - if (oldSpannable == null) { + if (originalDislikeSpan == null) { LogHelper.printDebug(() -> "Cannot add dislikes - original span is null"); // should never happen - return null; + return oldSpannable; } + oldSpannable = originalDislikeSpan; } else { originalDislikeSpan = oldSpannable; // most up to date original } @@ -292,12 +268,12 @@ public class ReturnYouTubeDislike { Future fetchFuture = getVoteFetchFuture(); if (fetchFuture == null) { LogHelper.printDebug(() -> "fetch future not available (user enabled RYD while video was playing?)"); - return null; + return oldSpannable; } RYDVoteData votingData = fetchFuture.get(MAX_MILLISECONDS_TO_BLOCK_UI_WHILE_WAITING_FOR_FETCH_VOTES_TO_COMPLETE, TimeUnit.MILLISECONDS); if (votingData == null) { LogHelper.printDebug(() -> "Cannot add dislike to UI (RYD data not available)"); - return null; + return oldSpannable; } SpannableString replacement = createDislikeSpan(oldSpannable, isSegmentedButton, votingData); @@ -312,7 +288,7 @@ public class ReturnYouTubeDislike { } catch (Exception e) { LogHelper.printException(() -> "waitForFetchAndUpdateReplacementSpan failure", e); // should never happen } - return null; + return oldSpannable; } public static void sendVote(@NonNull Vote vote) { diff --git a/app/src/main/java/app/revanced/integrations/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java b/app/src/main/java/app/revanced/integrations/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java index 970f3e48..dcc5bf9d 100644 --- a/app/src/main/java/app/revanced/integrations/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java +++ b/app/src/main/java/app/revanced/integrations/returnyoutubedislike/requests/ReturnYouTubeDislikeApi.java @@ -136,21 +136,20 @@ public class ReturnYouTubeDislikeApi { /** * Simulates a slow response by doing meaningless calculations. * Used to debug the app UI and verify UI timeout logic works - * - * @param maximumTimeToWait maximum time to wait */ @SuppressWarnings("UnusedReturnValue") - private static long randomlyWaitIfLocallyDebugging(long maximumTimeToWait) { + private static long randomlyWaitIfLocallyDebugging() { final boolean DEBUG_RANDOMLY_DELAY_NETWORK_CALLS = false; // set true to debug UI if (DEBUG_RANDOMLY_DELAY_NETWORK_CALLS) { - final long amountOfTimeToWaste = (long) (Math.random() * maximumTimeToWait); + final long amountOfTimeToWaste = (long) (Math.random() + * (API_GET_VOTES_TCP_TIMEOUT_MILLISECONDS + API_GET_VOTES_HTTP_TIMEOUT_MILLISECONDS)); final long timeCalculationStarted = System.currentTimeMillis(); - LogHelper.printDebug(() -> "Artificially creating network delay of: " + amountOfTimeToWaste + " ms"); + LogHelper.printDebug(() -> "Artificially creating network delay of: " + amountOfTimeToWaste + "ms"); long meaninglessValue = 0; while (System.currentTimeMillis() - timeCalculationStarted < amountOfTimeToWaste) { // could do a thread sleep, but that will trigger an exception if the thread is interrupted - meaninglessValue += Long.numberOfLeadingZeros((long) (Math.random() * Long.MAX_VALUE)); + meaninglessValue += Long.numberOfLeadingZeros((long)Math.exp(Math.random())); } // return the value, otherwise the compiler or VM might optimize and remove the meaningless time wasting work, // leaving an empty loop that hammers on the System.currentTimeMillis native call @@ -246,7 +245,7 @@ public class ReturnYouTubeDislikeApi { connection.setConnectTimeout(API_GET_VOTES_TCP_TIMEOUT_MILLISECONDS); // timeout for TCP connection to server connection.setReadTimeout(API_GET_VOTES_HTTP_TIMEOUT_MILLISECONDS); // timeout for server response - randomlyWaitIfLocallyDebugging(2*(API_GET_VOTES_TCP_TIMEOUT_MILLISECONDS + API_GET_VOTES_HTTP_TIMEOUT_MILLISECONDS)); + randomlyWaitIfLocallyDebugging(); final int responseCode = connection.getResponseCode(); if (checkIfRateLimitWasHit(responseCode)) {