chore: merge branch dev to main (#266)

This commit is contained in:
oSumAtrIX 2022-12-31 21:20:20 +01:00 committed by GitHub
commit cb560ff097
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 308 additions and 172 deletions

View File

@ -27,7 +27,8 @@
{
"path": "app/build/outputs/apk/release/*.apk"
}
]
],
successComment: false
}
],
[

View File

@ -1,3 +1,17 @@
# [0.91.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.91.0-dev.1...v0.91.0-dev.2) (2022-12-31)
### Bug Fixes
* **youtube/general-ads:** restore swipe back to exit gesture ([#264](https://github.com/revanced/revanced-integrations/issues/264)) ([76c36da](https://github.com/revanced/revanced-integrations/commit/76c36daee09be00d36477ea21c8b97f11444b7d2))
# [0.91.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.90.0...v0.91.0-dev.1) (2022-12-31)
### Features
* **youtube:** `copy-video-url` patch ([#263](https://github.com/revanced/revanced-integrations/issues/263)) ([e856d9d](https://github.com/revanced/revanced-integrations/commit/e856d9dccdf11888005e757e84a06523ad2c8dc5))
# [0.90.0](https://github.com/revanced/revanced-integrations/compare/v0.89.0...v0.90.0) (2022-12-31)

View File

@ -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);
}
}
}

View File

@ -0,0 +1,42 @@
package app.revanced.integrations.patches;
import com.google.android.apps.youtube.app.watchwhile.WatchWhileActivity;
import app.revanced.integrations.utils.LogHelper;
public class FixBackToExitGesturePatch {
/**
* State whether the scroll position reaches the top.
*/
public static boolean isTopView = false;
/**
* Handle the event after clicking the back button.
*
* @param activity The activity, the app is launched with to finish.
*/
public static void onBackPressed(WatchWhileActivity activity) {
if (!isTopView) return;
LogHelper.printDebug(() -> "Activity is closed");
activity.finish();
}
/**
* Handle the event when the homepage list of views is being scrolled.
*/
public static void onScrollingViews() {
LogHelper.printDebug(() -> "Views are scrolling");
isTopView = false;
}
/**
* Handle the event when the homepage list of views reached the top.
*/
public static void onTopView() {
LogHelper.printDebug(() -> "Scrolling reached the top");
isTopView = true;
}
}

View File

@ -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;
@ -39,6 +40,17 @@ public final class VideoInformation {
}
}
/**
* 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.
*
@ -80,6 +92,15 @@ public final class VideoInformation {
});
}
/**
* 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.
*

View File

@ -1,27 +0,0 @@
package app.revanced.integrations.patches.downloads;
import app.revanced.integrations.utils.LogHelper;
/**
* Used by app.revanced.patches.youtube.interaction.downloads.bytecode.patch.DownloadsBytecodePatch
*/
public class DownloadsPatch {
private static String videoId;
/**
* Called when the video changes
* @param videoId The current video id
*/
public static void setVideoId(String videoId) {
LogHelper.printDebug(() -> "newVideoLoaded - " + videoId);
DownloadsPatch.videoId = videoId;
}
/**
* @return The current video id
*/
public static String getCurrentVideoId() {
return videoId;
}
}

View File

@ -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),

View File

@ -26,7 +26,6 @@ import app.revanced.integrations.settings.SettingsEnum;
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 {
@ -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()));
}

View File

@ -123,6 +123,12 @@ public class ReVancedUtils {
}
}
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;
}

View File

@ -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"));
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -1,161 +1,69 @@
package app.revanced.integrations.videoplayer;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.constraint.ConstraintLayout;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;
import java.lang.ref.WeakReference;
import app.revanced.integrations.patches.downloads.DownloadsPatch;
import app.revanced.integrations.patches.VideoInformation;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.sponsorblock.StringRef;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.SharedPrefHelper;
/* loaded from: classes6.dex */
//ToDo: Refactor
public class DownloadButton {
static WeakReference<ImageView> _button = new WeakReference<>(null);
static ConstraintLayout _constraintLayout;
static int fadeDurationFast;
static int fadeDurationScheduled;
static Animation fadeIn;
static Animation fadeOut;
public static boolean isDownloadButtonEnabled;
static boolean isShowing;
public class DownloadButton extends BottomControlButton {
public static DownloadButton instance;
public static void initializeDownloadButton(Object obj) {
public DownloadButton(Object obj) {
super(
obj,
"download_button",
SettingsEnum.DOWNLOADS_BUTTON_SHOWN.getBoolean(),
DownloadButton::onDownloadClick
);
}
public static void initializeButton(Object obj) {
instance = new DownloadButton(obj);
}
public static void changeVisibility(boolean showing) {
if (instance != null) instance.setVisibility(showing);
}
private static void onDownloadClick(View view) {
LogHelper.printDebug(() -> "Download button clicked");
final var context = view.getContext();
var downloaderPackageName = SettingsEnum.DOWNLOADS_PACKAGE_NAME.getString();
boolean packageEnabled = false;
try {
LogHelper.printDebug(() -> "initializing");
_constraintLayout = (ConstraintLayout) obj;
isDownloadButtonEnabled = shouldBeShown();
ImageView imageView = _constraintLayout.findViewById(getIdentifier("download_button", "id"));
if (imageView == null) {
LogHelper.printDebug(() -> "Couldn't find imageView with id \"download_button\"");
return;
}
imageView.setOnClickListener(view -> {
LogHelper.printDebug(() -> "Download button clicked");
final var context = view.getContext();
var downloaderPackageName = SettingsEnum.DOWNLOADS_PACKAGE_NAME.getString();
boolean packageEnabled = false;
try {
assert context != null;
packageEnabled = context.getPackageManager().getApplicationInfo(downloaderPackageName, 0).enabled;
} catch (PackageManager.NameNotFoundException error) {
LogHelper.printDebug(() -> "Downloader could not be found: " + error);
}
// If the package is not installed, show the toast
if (!packageEnabled) {
Toast.makeText(context, downloaderPackageName + " " + StringRef.str("downloader_not_installed_warning"), Toast.LENGTH_LONG).show();
return;
}
// Launch PowerTube intent
try {
String content = String.format("https://youtu.be/%s", DownloadsPatch.getCurrentVideoId());
Intent intent = new Intent("android.intent.action.SEND");
intent.setType("text/plain");
intent.setPackage(downloaderPackageName);
intent.putExtra("android.intent.extra.TEXT", content);
context.startActivity(intent);
LogHelper.printDebug(() -> "Launched the intent with the content: " + content);
} catch (Exception error) {
LogHelper.printDebug(() -> "Failed to launch the intent: " + error);
}
//var options = Arrays.asList("Video", "Audio").toArray(new CharSequence[0]);
//
//new AlertDialog.Builder(view.getContext())
// .setItems(options, (dialog, which) -> {
// LogHelper.debug(DownloadButton.class, String.valueOf(options[which]));
// })
// .show();
// TODO: show popup and download via newpipe
});
_button = new WeakReference<>(imageView);
fadeDurationFast = getInteger("fade_duration_fast");
fadeDurationScheduled = getInteger("fade_duration_scheduled");
Animation animation = getAnimation("fade_in");
fadeIn = animation;
animation.setDuration(fadeDurationFast);
Animation animation2 = getAnimation("fade_out");
fadeOut = animation2;
animation2.setDuration(fadeDurationScheduled);
isShowing = true;
changeVisibility(false);
} catch (Exception e) {
LogHelper.printException(() -> ("Unable to set FrameLayout"), e);
assert context != null;
packageEnabled = context.getPackageManager().getApplicationInfo(downloaderPackageName, 0).enabled;
} catch (PackageManager.NameNotFoundException error) {
LogHelper.printDebug(() -> "Downloader could not be found: " + error);
}
}
public static void changeVisibility(boolean z) {
if (isShowing == z) return;
isShowing = z;
ImageView imageView = _button.get();
if (_constraintLayout == null || imageView == null)
// If the package is not installed, show the toast
if (!packageEnabled) {
Toast.makeText(context, downloaderPackageName + " " + StringRef.str("downloader_not_installed_warning"), Toast.LENGTH_LONG).show();
return;
if (z && isDownloadButtonEnabled) {
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);
}
}
public static void refreshShouldBeShown() {
isDownloadButtonEnabled = shouldBeShown();
}
private static boolean shouldBeShown() {
if (!SettingsEnum.DOWNLOADS_BUTTON_SHOWN.getBoolean()) {
return false;
}
Context appContext = ReVancedUtils.getContext();
if (appContext == null) {
LogHelper.printException(() -> ("shouldBeShown - context is null!"));
return false;
}
String string = SharedPrefHelper.getString(appContext, SharedPrefHelper.SharedPrefNames.YOUTUBE, "pref_download_button_list", "PLAYER" /* TODO: set the default to null, as this will be set by the settings page later */);
if (string == null || string.isEmpty()) {
return false;
}
return string.equalsIgnoreCase("PLAYER");
}
// Launch PowerTube intent
try {
String content = String.format("https://youtu.be/%s", VideoInformation.getCurrentVideoId());
private static int getIdentifier(String str, String str2) {
Context appContext = ReVancedUtils.getContext();
return appContext.getResources().getIdentifier(str, str2, appContext.getPackageName());
}
Intent intent = new Intent("android.intent.action.SEND");
intent.setType("text/plain");
intent.setPackage(downloaderPackageName);
intent.putExtra("android.intent.extra.TEXT", content);
context.startActivity(intent);
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"));
LogHelper.printDebug(() -> "Launched the intent with the content: " + content);
} catch (Exception error) {
LogHelper.printDebug(() -> "Failed to launch the intent: " + error);
}
}
}

View File

@ -0,0 +1,7 @@
package com.google.android.apps.youtube.app.watchwhile;
import android.app.Activity;
// Dummy class
public final class WatchWhileActivity extends Activity { }

View File

@ -1,3 +1,3 @@
org.gradle.jvmargs = -Xmx2048m
android.useAndroidX = true
version = 0.90.0
version = 0.91.0-dev.2