Skip to content

Commit

Permalink
feat(youtube): copy-video-url patch (#263)
Browse files Browse the repository at this point in the history
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
  • Loading branch information
aliernfrog and oSumAtrIX committed Dec 31, 2022
1 parent 1f74ccf commit e856d9d
Show file tree
Hide file tree
Showing 10 changed files with 237 additions and 165 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package app.revanced.integrations.patches;

import android.content.Context;
import android.widget.Toast;

import app.revanced.integrations.sponsorblock.StringRef;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;

public class CopyVideoUrlPatch {
public static void copyUrl(Boolean withTimestamp) {
try {
String url = String.format("https://youtu.be/%s", VideoInformation.getCurrentVideoId());
if (withTimestamp) {
long seconds = VideoInformation.getVideoTime() / 1000;
url += String.format("?t=%s", seconds);
}

Context context = ReVancedUtils.getContext();

ReVancedUtils.setClipboard(url);
if (context != null) Toast.makeText(context, StringRef.str("share_copy_url_success"), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
LogHelper.printException(() -> "Failed to generate video url", e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public final class VideoInformation {
private static WeakReference<Object> playerController;
private static Method seekMethod;

private static String videoId = "";
private static long videoLength = 1;
private static long videoTime = -1;

Expand All @@ -39,6 +40,17 @@ public static void playerController_onCreateHook(final Object thisRef) {
}
}

/**
* Set the video id.
*
* @param videoId The id of the video.
*/
public static void setVideoId(String videoId) {
LogHelper.printDebug(() -> "Setting current video id to: " + videoId);

VideoInformation.videoId = videoId;
}

/**
* Set the video length.
*
Expand Down Expand Up @@ -80,6 +92,15 @@ public static void seekTo(final long millisecond) {
});
}

/**
* Get the id of the current video playing.
*
* @return The id of the video. Empty string if not set yet.
*/
public static String getCurrentVideoId() {
return videoId;
}

/**
* Get the length of the current video playing.
*
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ public enum SettingsEnum {
DOWNLOADS_BUTTON_SHOWN("revanced_downloads", true, ReturnType.BOOLEAN, true),
DOWNLOADS_PACKAGE_NAME("revanced_downloads_package_name", "org.schabi.newpipe" /* NewPipe */, ReturnType.STRING),

// Copy video URL settings
COPY_VIDEO_URL_BUTTON_SHOWN("revanced_copy_video_url", true, ReturnType.BOOLEAN, true),
COPY_VIDEO_URL_TIMESTAMP_BUTTON_SHOWN("revanced_copy_video_url_timestamp", true, ReturnType.BOOLEAN, true),

// Video settings
OLD_STYLE_VIDEO_QUALITY_PLAYER_SETTINGS("revanced_use_old_style_quality_settings", true, ReturnType.BOOLEAN),
PREFERRED_VIDEO_SPEED("revanced_pref_video_speed", -2.0f, ReturnType.FLOAT),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.SharedPrefHelper;
import app.revanced.integrations.videoplayer.DownloadButton;

public class ReVancedSettingsFragment extends PreferenceFragment {

Expand Down Expand Up @@ -85,10 +84,6 @@ public class ReVancedSettingsFragment extends PreferenceFragment {
} else {
LogHelper.printException(() -> ("No valid setting found: " + setting.toString()));
}

if ("pref_download_button_list".equals(str)) {
DownloadButton.refreshShouldBeShown();
}
} else {
LogHelper.printException(() -> ("Setting cannot be handled! " + pref.toString()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ public static Context getContext() {
}
}

public static void setClipboard(String text) {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("ReVanced", text);
clipboard.setPrimaryClip(clip);
}

public static boolean isTablet(Context context) {
return context.getResources().getConfiguration().smallestScreenWidthDp >= 600;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package app.revanced.integrations.videoplayer;

import android.content.Context;
import android.support.constraint.ConstraintLayout;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

import java.lang.ref.WeakReference;

import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;

public abstract class BottomControlButton {
WeakReference<ImageView> button = new WeakReference<>(null);
ConstraintLayout constraintLayout;
Boolean isButtonEnabled;
Boolean isShowing;

private Animation fadeIn;
private Animation fadeOut;

public BottomControlButton(Object obj, String viewId, Boolean isEnabled, View.OnClickListener onClickListener) {
try {
LogHelper.printDebug(() -> "Initializing button with id: " + viewId);
constraintLayout = (ConstraintLayout) obj;
isButtonEnabled = isEnabled;

ImageView imageView = constraintLayout.findViewById(getIdentifier(viewId, "id"));
if (imageView == null) {
LogHelper.printDebug(() -> "Couldn't find ImageView with id: " + viewId);
return;
}

imageView.setOnClickListener(onClickListener);

button = new WeakReference<>(imageView);
fadeIn = getAnimation("fade_in");
fadeOut = getAnimation("fade_out");

int fadeDurationFast = getInteger("fade_duration_fast");
int fadeDurationScheduled = getInteger("fade_duration_scheduled");
fadeIn.setDuration(fadeDurationFast);
fadeOut.setDuration(fadeDurationScheduled);
isShowing = true;
setVisibility(false);
} catch (Exception e) {
LogHelper.printException(() -> "Failed to initialize button with id: " + viewId, e);
}
}

public void setVisibility(boolean showing) {
if (isShowing == showing) return;

isShowing = showing;
ImageView imageView = button.get();

if (constraintLayout == null || imageView == null)
return;

if (showing && isButtonEnabled) {
LogHelper.printDebug(() -> "Fading in");
imageView.setVisibility(View.VISIBLE);
imageView.startAnimation(fadeIn);
}
else if (imageView.getVisibility() == View.VISIBLE) {
LogHelper.printDebug(() -> "Fading out");
imageView.startAnimation(fadeOut);
imageView.setVisibility(View.GONE);
}
}

private static int getIdentifier(String str, String str2) {
Context appContext = ReVancedUtils.getContext();
return appContext.getResources().getIdentifier(str, str2, appContext.getPackageName());
}

private static int getInteger(String str) {
return ReVancedUtils.getContext().getResources().getInteger(getIdentifier(str, "integer"));
}

private static Animation getAnimation(String str) {
return AnimationUtils.loadAnimation(ReVancedUtils.getContext(), getIdentifier(str, "anim"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package app.revanced.integrations.videoplayer;


import app.revanced.integrations.patches.CopyVideoUrlPatch;
import app.revanced.integrations.settings.SettingsEnum;

public class CopyVideoUrlButton extends BottomControlButton {
public static CopyVideoUrlButton instance;

public CopyVideoUrlButton(Object obj) {
super(
obj,
"copy_video_url_button",
SettingsEnum.COPY_VIDEO_URL_BUTTON_SHOWN.getBoolean(),
view -> CopyVideoUrlPatch.copyUrl(false)
);
}

public static void initializeButton(Object obj) {
instance = new CopyVideoUrlButton(obj);
}

public static void changeVisibility(boolean showing) {
if (instance != null) instance.setVisibility(showing);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package app.revanced.integrations.videoplayer;

import app.revanced.integrations.patches.CopyVideoUrlPatch;
import app.revanced.integrations.settings.SettingsEnum;

public class CopyVideoUrlTimestampButton extends BottomControlButton {
public static CopyVideoUrlTimestampButton instance;

public CopyVideoUrlTimestampButton(Object obj) {
super(
obj,
"copy_video_url_timestamp_button",
SettingsEnum.COPY_VIDEO_URL_TIMESTAMP_BUTTON_SHOWN.getBoolean(),
view -> CopyVideoUrlPatch.copyUrl(true)
);
}

public static void initializeButton(Object obj) {
instance = new CopyVideoUrlTimestampButton(obj);
}

public static void changeVisibility(boolean showing) {
if (instance != null) instance.setVisibility(showing);
}

}
Loading

0 comments on commit e856d9d

Please sign in to comment.