fix(YouTube Music - Return YouTube Dislike): Length of the separator is different in the new action bar

This commit is contained in:
inotia00 2025-02-13 11:01:30 +09:00
parent 5bde7019a6
commit 80b9f754ed
6 changed files with 45 additions and 17 deletions

View File

@ -20,6 +20,7 @@ import app.revanced.extension.shared.utils.Logger;
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class ReturnYouTubeDislikePatch { public class ReturnYouTubeDislikePatch {
private static volatile boolean isNewActionBar = false;
/** /**
* Injection point. * Injection point.
@ -52,7 +53,7 @@ public class ReturnYouTubeDislikePatch {
if (!(original instanceof Spanned)) { if (!(original instanceof Spanned)) {
original = new SpannableString(original); original = new SpannableString(original);
} }
return videoData.getDislikesSpan((Spanned) original, true); return videoData.getDislikesSpan((Spanned) original, true, isNewActionBar);
} catch (Exception ex) { } catch (Exception ex) {
Logger.printException(() -> "onLithoTextLoaded failure", ex); Logger.printException(() -> "onLithoTextLoaded failure", ex);
} }
@ -90,13 +91,21 @@ public class ReturnYouTubeDislikePatch {
if (videoData == null) { if (videoData == null) {
return original; // User enabled RYD while a video was on screen. 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) { } catch (Exception ex) {
Logger.printException(() -> "onSpannedCreated failure", ex); Logger.printException(() -> "onSpannedCreated failure", ex);
} }
return original; return original;
} }
/**
* Injection point.
*/
public static boolean actionBarFeatureFlagLoaded(boolean original) {
isNewActionBar = original;
return original;
}
/** /**
* Injection point. * Injection point.
*/ */

View File

@ -159,7 +159,8 @@ public class ReturnYouTubeDislike {
@NonNull @NonNull
private static SpannableString createDislikeSpan(@NonNull Spanned oldSpannable, private static SpannableString createDislikeSpan(@NonNull Spanned oldSpannable,
@NonNull RYDVoteData voteData, @NonNull RYDVoteData voteData,
boolean isLithoText) { boolean isLithoText,
boolean isNewActionBar) {
CharSequence oldLikes = oldSpannable; CharSequence oldLikes = oldSpannable;
// YouTube creators can hide the like count on a video, // YouTube creators can hide the like count on a video,
@ -191,9 +192,17 @@ public class ReturnYouTubeDislike {
if (middleSeparatorBounds == null) { if (middleSeparatorBounds == null) {
final DisplayMetrics dp = Utils.getResources().getDisplayMetrics(); 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, leftSeparatorBounds = new Rect(0, 0,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1.2f, dp), (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 = final int middleSeparatorSize =
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp); (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp);
middleSeparatorBounds = new Rect(0, 0, middleSeparatorSize, middleSeparatorSize); 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. * @return the replacement span containing dislikes, or the original span if RYD is not available.
*/ */
@NonNull @NonNull
public synchronized Spanned getDislikesSpan(@NonNull Spanned original, boolean isLithoText) { public synchronized Spanned getDislikesSpan(@NonNull Spanned original, boolean isLithoText, boolean isNewActionBar) {
return waitForFetchAndUpdateReplacementSpan(original, isLithoText); return waitForFetchAndUpdateReplacementSpan(original, isLithoText, isNewActionBar);
} }
@NonNull @NonNull
private Spanned waitForFetchAndUpdateReplacementSpan(@NonNull Spanned original, boolean isLithoText) { private Spanned waitForFetchAndUpdateReplacementSpan(@NonNull Spanned original, boolean isLithoText, boolean isNewActionBar) {
try { try {
RYDVoteData votingData = getFetchData(MAX_MILLISECONDS_TO_BLOCK_UI_WAITING_FOR_FETCH); RYDVoteData votingData = getFetchData(MAX_MILLISECONDS_TO_BLOCK_UI_WAITING_FOR_FETCH);
if (votingData == null) { if (votingData == null) {
@ -479,7 +488,7 @@ public class ReturnYouTubeDislike {
votingData.updateUsingVote(userVote); votingData.updateUsingVote(userVote);
} }
originalDislikeSpan = original; originalDislikeSpan = original;
replacementLikeDislikeSpan = createDislikeSpan(original, votingData, isLithoText); replacementLikeDislikeSpan = createDislikeSpan(original, votingData, isLithoText, isNewActionBar);
Logger.printDebug(() -> "Replaced: '" + originalDislikeSpan + "' with: '" Logger.printDebug(() -> "Replaced: '" + originalDislikeSpan + "' with: '"
+ replacementLikeDislikeSpan + "'" + " using video: " + videoId); + replacementLikeDislikeSpan + "'" + " using video: " + videoId);

View File

@ -6,6 +6,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.smali.ExternalLabel 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.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.music.utils.extension.Constants.ACTIONBAR_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.extension.Constants.ACTIONBAR_CLASS_DESCRIPTOR
import app.revanced.patches.music.utils.extension.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.extension.Constants.COMPONENTS_PATH

View File

@ -22,15 +22,6 @@ internal val actionBarComponentFingerprint = legacyFingerprint(
literals = listOf(99180L), 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( internal val likeDislikeContainerFingerprint = legacyFingerprint(
name = "likeDislikeContainerFingerprint", name = "likeDislikeContainerFingerprint",
returnType = "V", returnType = "V",

View File

@ -6,6 +6,15 @@ import app.revanced.util.or
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode 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( internal val pendingIntentReceiverFingerprint = legacyFingerprint(
name = "pendingIntentReceiverFingerprint", name = "pendingIntentReceiverFingerprint",
returnType = "V", returnType = "V",

View File

@ -4,6 +4,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.patch.resourcePatch 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.compatibility.Constants.COMPATIBLE_PACKAGE
import app.revanced.patches.music.utils.extension.Constants.UTILS_PATH import app.revanced.patches.music.utils.extension.Constants.UTILS_PATH
import app.revanced.patches.music.utils.patch.PatchList.RETURN_YOUTUBE_DISLIKE 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.hookSpannableString
import app.revanced.patches.shared.textcomponent.textComponentPatch import app.revanced.patches.shared.textcomponent.textComponentPatch
import app.revanced.util.adoptChild import app.revanced.util.adoptChild
import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall
import app.revanced.util.fingerprint.methodOrThrow import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode 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) { if (is_7_17_or_greater) {