diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/AlwaysRepeat.java b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/AlwaysRepeat.java index 1ff5b19abe..7ce36e3666 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/AlwaysRepeat.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/overlaybutton/AlwaysRepeat.java @@ -5,6 +5,10 @@ import static app.revanced.integrations.youtube.utils.ResourceUtils.integer; import android.annotation.SuppressLint; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.support.constraint.ConstraintLayout; import android.view.View; import android.view.animation.Animation; @@ -21,6 +25,7 @@ public class AlwaysRepeat { volatile static boolean isShowing; volatile static boolean isScrubbed; static WeakReference buttonView = new WeakReference<>(null); + static final ColorFilter cf = new PorterDuffColorFilter(Color.parseColor("#fffffc79"), PorterDuff.Mode.SRC_ATOP); @SuppressLint("StaticFieldLeak") static ConstraintLayout constraintLayout; static int fadeDurationFast; @@ -35,7 +40,12 @@ public static void initialize(Object obj) { ImageView imageView = findView(constraintLayout, "always_repeat_button"); imageView.setSelected(SettingsEnum.ALWAYS_REPEAT.getBoolean()); imageView.setOnClickListener(view -> AlwaysRepeat.changeSelected(!view.isSelected(), false)); + imageView.setOnLongClickListener(view -> { + AlwaysRepeat.changeColorFilter(); + return true; + }); buttonView = new WeakReference<>(imageView); + AlwaysRepeat.setColorFilter(SettingsEnum.ALWAYS_REPEAT_PAUSE.getBoolean()); fadeDurationFast = integer("fade_duration_fast"); fadeDurationScheduled = integer("fade_duration_scheduled"); @@ -91,17 +101,40 @@ public static void changeVisibilityNegatedImmediate(boolean isUserScrubbing) { public static void changeSelected(boolean selected, boolean onlyView) { ImageView imageView = buttonView.get(); - if (constraintLayout == null || imageView == null) + if (constraintLayout == null || imageView == null || imageView.getColorFilter() == cf) return; imageView.setSelected(selected); if (!onlyView) SettingsEnum.ALWAYS_REPEAT.saveValue(selected); } + private static void changeColorFilter() { + ImageView imageView = buttonView.get(); + if (constraintLayout == null || imageView == null) return; + + imageView.setSelected(true); + SettingsEnum.ALWAYS_REPEAT.saveValue(true); + + final boolean newValue = !SettingsEnum.ALWAYS_REPEAT_PAUSE.getBoolean(); + SettingsEnum.ALWAYS_REPEAT_PAUSE.saveValue(newValue); + setColorFilter(newValue); + } + public static void refreshVisibility() { isButtonEnabled = setValue(); } + private static void setColorFilter(boolean selected) { + ImageView imageView = buttonView.get(); + if (constraintLayout == null || imageView == null) + return; + + if (selected) + imageView.setColorFilter(cf); + else + imageView.clearColorFilter(); + } + private static boolean setValue() { return SettingsEnum.OVERLAY_BUTTON_ALWAYS_REPEAT.getBoolean(); } diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/utils/AlwaysRepeatPatch.java b/app/src/main/java/app/revanced/integrations/youtube/patches/utils/AlwaysRepeatPatch.java index 624ad911ae..601b55b288 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/utils/AlwaysRepeatPatch.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/utils/AlwaysRepeatPatch.java @@ -1,5 +1,10 @@ package app.revanced.integrations.youtube.patches.utils; +import android.content.Context; +import android.media.AudioManager; +import android.view.KeyEvent; + +import app.revanced.integrations.youtube.utils.ReVancedUtils; import app.revanced.integrations.youtube.settings.SettingsEnum; public class AlwaysRepeatPatch { @@ -7,4 +12,26 @@ public class AlwaysRepeatPatch { public static boolean enableAlwaysRepeat(boolean original) { return !SettingsEnum.ALWAYS_REPEAT.getBoolean() && original; } + + public static void shouldRepeatAndPause() { + Context context = ReVancedUtils.getContext(); + if (context == null) + return; + + pauseMedia(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE), context); + pauseMedia(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PAUSE), context); + + AudioManager audioManager = (AudioManager) context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE); + + if (audioManager == null) + return; + + audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + } + + public static void pauseMedia(KeyEvent keyEvent, Context context) { + Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); + intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); + context.sendOrderedBroadcast(intent, null); + } } diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/video/VideoInformation.java b/app/src/main/java/app/revanced/integrations/youtube/patches/video/VideoInformation.java index 99dabd0279..d95fecb398 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/video/VideoInformation.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/video/VideoInformation.java @@ -2,6 +2,7 @@ import static app.revanced.integrations.youtube.utils.StringRef.str; import static app.revanced.integrations.youtube.patches.video.PlaybackSpeedPatch.overrideSpeed; +import static app.revanced.integrations.youtube.patches.utils.AlwaysRepeatPatch.shouldRepeatAndPause; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -129,9 +130,13 @@ public static boolean videoEnded() { if (!SettingsEnum.ALWAYS_REPEAT.getBoolean()) return false; - ReVancedUtils.runOnMainThreadDelayed(() -> seekTo(0), 0); + final boolean seekResult = false; + ReVancedUtils.runOnMainThreadDelayed(() -> seekResult = seekTo(0), 0); - return true; + if (SettingsEnum.ALWAYS_REPEAT_PAUSE.getBoolean() && seekResult) + shouldRepeatAndPause(); + + return seekResult; } /** diff --git a/app/src/main/java/app/revanced/integrations/youtube/settings/SettingsEnum.java b/app/src/main/java/app/revanced/integrations/youtube/settings/SettingsEnum.java index a4bd768d96..5803768ce5 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/settings/SettingsEnum.java +++ b/app/src/main/java/app/revanced/integrations/youtube/settings/SettingsEnum.java @@ -270,6 +270,7 @@ public enum SettingsEnum { // Overlay Button ALWAYS_REPEAT("revanced_always_repeat", BOOLEAN, FALSE), + ALWAYS_REPEAT_PAUSE("revanced_always_repeat_pause", BOOLEAN, FALSE), OVERLAY_BUTTON_ALWAYS_REPEAT("revanced_overlay_button_always_repeat", BOOLEAN, FALSE), OVERLAY_BUTTON_COPY_VIDEO_URL("revanced_overlay_button_copy_video_url", BOOLEAN, FALSE), OVERLAY_BUTTON_COPY_VIDEO_URL_TIMESTAMP("revanced_overlay_button_copy_video_url_timestamp", BOOLEAN, FALSE),