From b99ca864c2bfa98073c25d34ca5a51fa15006671 Mon Sep 17 00:00:00 2001 From: polymorphicshade Date: Sat, 20 Jan 2024 19:50:51 -0700 Subject: [PATCH] implemented ReturnYouTubeDislike --- .../fragments/detail/VideoDetailFragment.java | 34 ++++++ .../newpipe/settings/NewPipeSettings.java | 1 + .../ReturnYouTubeDislikeSettingsFragment.java | 35 ++++++ .../settings/SettingsResourceRegistry.java | 1 + .../ReturnYouTubeDislikeApiUrlPreference.java | 105 ++++++++++++++++++ .../schabi/newpipe/util/ExtractorHelper.java | 26 ++++- .../dialog_return_youtube_dislike_api_url.xml | 33 ++++++ ...og_return_youtube_dislike_api_url_help.xml | 25 +++++ app/src/main/res/values/settings_keys.xml | 8 ++ app/src/main/res/values/strings.xml | 18 +++ app/src/main/res/xml/main_settings.xml | 6 + .../xml/return_youtube_dislikes_settings.xml | 53 +++++++++ 12 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ReturnYouTubeDislikeSettingsFragment.java create mode 100644 app/src/main/java/org/schabi/newpipe/settings/custom/ReturnYouTubeDislikeApiUrlPreference.java create mode 100644 app/src/main/res/layout/dialog_return_youtube_dislike_api_url.xml create mode 100644 app/src/main/res/layout/dialog_return_youtube_dislike_api_url_help.xml create mode 100644 app/src/main/res/xml/return_youtube_dislikes_settings.xml diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index c1f713710..550902fa0 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -117,6 +117,7 @@ import org.schabi.newpipe.util.ListHelper; import org.schabi.newpipe.util.Localization; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.PermissionHelper; +import org.schabi.newpipe.extractor.returnyoutubedislike.ReturnYouTubeDislikeInfo; import org.schabi.newpipe.util.PlayButtonHelper; import org.schabi.newpipe.util.SponsorBlockMode; import org.schabi.newpipe.util.StreamTypeUtil; @@ -1518,6 +1519,8 @@ public final class VideoDetailFragment public void handleResult(@NonNull final StreamInfo info) { super.handleResult(info); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + currentInfo = info; setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName(), playQueue); @@ -1534,6 +1537,14 @@ public final class VideoDetailFragment displayUploaderAsSubChannel(info); } + final ReturnYouTubeDislikeInfo rydInfo = info.getRydInfo(); + final boolean isRydEnabled = prefs.getBoolean( + getString(R.string.return_youtube_dislike_enable_key), true); + final boolean overrideLikeCount = prefs.getBoolean( + getString(R.string.return_youtube_dislike_override_like_count_key), true); + final boolean overrideViewCount = prefs.getBoolean( + getString(R.string.return_youtube_dislike_override_view_count_key), true); + if (info.getViewCount() >= 0) { if (info.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) { binding.detailViewCountView.setText(Localization.listeningCount(activity, @@ -1550,6 +1561,12 @@ public final class VideoDetailFragment binding.detailViewCountView.setVisibility(View.GONE); } + // RYD override: views + if (rydInfo != null && isRydEnabled && overrideViewCount) { + binding.detailViewCountView.setText(Localization + .localizeViewCount(activity, rydInfo.viewCount)); + } + if (info.getDislikeCount() == -1 && info.getLikeCount() == -1) { binding.detailThumbsDownImgView.setVisibility(View.VISIBLE); binding.detailThumbsUpImgView.setVisibility(View.VISIBLE); @@ -1568,6 +1585,14 @@ public final class VideoDetailFragment binding.detailThumbsDownImgView.setVisibility(View.GONE); } + // RYD override: dislikes + if (rydInfo != null && isRydEnabled) { + binding.detailThumbsDownCountView.setText(Localization + .shortCount(activity, rydInfo.dislikes)); + binding.detailThumbsDownCountView.setVisibility(View.VISIBLE); + binding.detailThumbsDownImgView.setVisibility(View.VISIBLE); + } + if (info.getLikeCount() >= 0) { binding.detailThumbsUpCountView.setText(Localization.shortCount(activity, info.getLikeCount())); @@ -1577,6 +1602,15 @@ public final class VideoDetailFragment binding.detailThumbsUpCountView.setVisibility(View.GONE); binding.detailThumbsUpImgView.setVisibility(View.GONE); } + + // RYD override: likes + if (rydInfo != null && isRydEnabled && overrideLikeCount) { + binding.detailThumbsUpCountView.setText(Localization + .shortCount(activity, rydInfo.likes)); + binding.detailThumbsUpCountView.setVisibility(View.VISIBLE); + binding.detailThumbsUpImgView.setVisibility(View.VISIBLE); + } + binding.detailThumbsDisabledView.setVisibility(View.GONE); } diff --git a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java index 1103eaffa..666dcc6bd 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java +++ b/app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java @@ -65,6 +65,7 @@ public final class NewPipeSettings { PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true); PreferenceManager.setDefaultValues(context, R.xml.sponsor_block_settings, true); PreferenceManager.setDefaultValues(context, R.xml.sponsor_block_category_settings, true); + PreferenceManager.setDefaultValues(context, R.xml.return_youtube_dislikes_settings, true); saveDefaultVideoDownloadDirectory(context); saveDefaultAudioDownloadDirectory(context); diff --git a/app/src/main/java/org/schabi/newpipe/settings/ReturnYouTubeDislikeSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ReturnYouTubeDislikeSettingsFragment.java new file mode 100644 index 000000000..1b119d849 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ReturnYouTubeDislikeSettingsFragment.java @@ -0,0 +1,35 @@ +package org.schabi.newpipe.settings; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; + +import androidx.preference.Preference; + +import org.schabi.newpipe.R; + +public class ReturnYouTubeDislikeSettingsFragment extends BasePreferenceFragment { + + @Override + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResourceRegistry(); + + final Preference rydWebsitePreference = + findPreference(getString(R.string.return_youtube_dislike_home_page_key)); + rydWebsitePreference.setOnPreferenceClickListener((Preference p) -> { + final Intent i = new Intent(Intent.ACTION_VIEW, + Uri.parse(getString(R.string.return_youtube_dislike_home_page_url))); + startActivity(i); + return true; + }); + + final Preference rydSecurityFaqPreference = + findPreference(getString(R.string.return_youtube_dislike_security_faq_key)); + rydSecurityFaqPreference.setOnPreferenceClickListener((Preference p) -> { + final Intent i = new Intent(Intent.ACTION_VIEW, + Uri.parse(getString(R.string.return_youtube_dislike_security_faq_url))); + startActivity(i); + return true; + }); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java index 39fdd5dbb..52aa3412a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java @@ -43,6 +43,7 @@ public final class SettingsResourceRegistry { add(ExoPlayerSettingsFragment.class, R.xml.exoplayer_settings); add(SponsorBlockSettingsFragment.class, R.xml.sponsor_block_settings); add(SponsorBlockCategoriesSettingsFragment.class, R.xml.sponsor_block_category_settings); + add(ReturnYouTubeDislikeSettingsFragment.class, R.xml.return_youtube_dislikes_settings); } private SettingRegistryEntry add( diff --git a/app/src/main/java/org/schabi/newpipe/settings/custom/ReturnYouTubeDislikeApiUrlPreference.java b/app/src/main/java/org/schabi/newpipe/settings/custom/ReturnYouTubeDislikeApiUrlPreference.java new file mode 100644 index 000000000..a900ef10f --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/custom/ReturnYouTubeDislikeApiUrlPreference.java @@ -0,0 +1,105 @@ +package org.schabi.newpipe.settings.custom; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.TypedArray; +import android.net.Uri; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.preference.Preference; + +import org.schabi.newpipe.R; + +public class ReturnYouTubeDislikeApiUrlPreference extends Preference { + public ReturnYouTubeDislikeApiUrlPreference(final Context context, final AttributeSet attrs) { + super(context, attrs); + } + @Override + protected void onSetInitialValue(@Nullable final Object defaultValue) { + // apparently this is how you're supposed to respect default values for a custom preference + persistString(getPersistedString((String) defaultValue)); + } + + @Nullable + @Override + protected Object onGetDefaultValue(@NonNull final TypedArray a, final int index) { + return a.getString(index); + } + + @Override + protected void onClick() { + super.onClick(); + + final Context context = getContext(); + + final String apiUrl = getPersistedString(null); + + final View alertDialogView = LayoutInflater.from(context) + .inflate(R.layout.dialog_return_youtube_dislike_api_url, null); + + final EditText editText = alertDialogView.findViewById(R.id.api_url_edit); + editText.setText(apiUrl); + editText.setOnFocusChangeListener((v, hasFocus) -> editText.post(() -> { + final InputMethodManager inputMethodManager = (InputMethodManager) context + .getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager + .showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); + })); + editText.requestFocus(); + + alertDialogView.findViewById(R.id.icon_api_url_help) + .setOnClickListener(v -> { + final Uri privacyPolicyUri = Uri.parse(context + .getString(R.string.return_youtube_dislike_security_faq_url)); + final View helpDialogView = LayoutInflater.from(context) + .inflate( + R.layout.dialog_return_youtube_dislike_api_url_help, null); + final View privacyPolicyButton = helpDialogView + .findViewById(R.id.return_youtube_dislike_security_faq_button); + privacyPolicyButton.setOnClickListener(v1 -> { + final Intent i = new Intent(Intent.ACTION_VIEW, privacyPolicyUri); + context.startActivity(i); + }); + + new AlertDialog.Builder(context) + .setView(helpDialogView) + .setPositiveButton("Use Official", (dialog, which) -> { + editText.setText(context.getString( + R.string.return_youtube_dislike_default_api_url)); + dialog.dismiss(); + }) + .setNeutralButton("Close", (dialog, which) -> dialog.dismiss()) + .create() + .show(); + }); + + final AlertDialog alertDialog = + new AlertDialog.Builder(context) + .setView(alertDialogView) + .setTitle(context.getString(R.string.return_youtube_dislike_api_url_title)) + .setPositiveButton("OK", (dialog, which) -> { + final String newValue = editText.getText().toString(); + if (!newValue.isEmpty()) { + final SharedPreferences.Editor editor = + getPreferenceManager().getSharedPreferences().edit(); + editor.putString(getKey(), newValue); + editor.apply(); + + callChangeListener(newValue); + } + dialog.dismiss(); + }) + .setNegativeButton("Cancel", (dialog, which) -> dialog.cancel()) + .create(); + + alertDialog.show(); + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index b2ff28a6e..5a5932368 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -47,6 +47,7 @@ import org.schabi.newpipe.extractor.comments.CommentsInfoItem; import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; +import org.schabi.newpipe.extractor.returnyoutubedislike.ReturnYouTubeDislikeApiSettings; import org.schabi.newpipe.extractor.search.SearchInfo; import org.schabi.newpipe.extractor.sponsorblock.SponsorBlockApiSettings; import org.schabi.newpipe.extractor.stream.StreamInfo; @@ -121,10 +122,31 @@ public final class ExtractorHelper { Single.fromCallable(() -> StreamInfo.getInfo( NewPipe.getService(serviceId), url, - buildSponsorBlockApiSettings(context)))); + buildSponsorBlockApiSettings(context), + buildReturnYouTubeDislikeApiSettings(context)))); } - public static Single getChannelInfo(final int serviceId, final String url, + private static ReturnYouTubeDislikeApiSettings buildReturnYouTubeDislikeApiSettings( + final Context context) { + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + final boolean isRydEnabled = prefs.getBoolean(context + .getString(R.string.return_youtube_dislike_enable_key), false); + + if (!isRydEnabled) { + return null; + } + + final ReturnYouTubeDislikeApiSettings result = new ReturnYouTubeDislikeApiSettings(); + result.apiUrl = + prefs.getString( + context.getString(R.string.return_youtube_dislike_api_url_key), null); + + return result; + } + + public static Single getChannelInfo(final int serviceId, + final String url, final boolean forceLoad) { checkServiceId(serviceId); return checkCache(forceLoad, serviceId, url, InfoItem.InfoType.CHANNEL, diff --git a/app/src/main/res/layout/dialog_return_youtube_dislike_api_url.xml b/app/src/main/res/layout/dialog_return_youtube_dislike_api_url.xml new file mode 100644 index 000000000..2d31a7cb1 --- /dev/null +++ b/app/src/main/res/layout/dialog_return_youtube_dislike_api_url.xml @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_return_youtube_dislike_api_url_help.xml b/app/src/main/res/layout/dialog_return_youtube_dislike_api_url_help.xml new file mode 100644 index 000000000..9e5f44cde --- /dev/null +++ b/app/src/main/res/layout/dialog_return_youtube_dislike_api_url_help.xml @@ -0,0 +1,25 @@ + + + +