Skip to content

feat(YouTube - Settings): Add ability to search in settings #4881

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 46 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 45 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
073e99b
feat(YouTube - Settings): Add SearchView to ReVanced settings
MarcaDian Apr 29, 2025
f616b7f
apply from review
MarcaDian Apr 29, 2025
af49e1e
refactor -> replace SearchView with EditText
MarcaDian Apr 30, 2025
e4e6927
remove unnecessary EditText margin
MarcaDian Apr 30, 2025
768e54c
apply from review -> move search ability to another class
MarcaDian May 1, 2025
80ccc8a
redesign Search bar
MarcaDian May 1, 2025
9315832
refactor -> bring back to SearchView
MarcaDian May 1, 2025
e723218
refactor -> resolve margin problem
MarcaDian May 2, 2025
e98a6d5
refactor -> fix text direction in Arabic and Hebrew
MarcaDian May 2, 2025
2da1a90
Revert "refactor -> fix text direction in Arabic and Hebrew"
MarcaDian May 2, 2025
eef25f9
fix toolbar in other fragments
MarcaDian May 2, 2025
75fd5e6
refactor -> fix text direction in Arabic and Hebrew
MarcaDian May 2, 2025
35c794c
reapply from review
MarcaDian May 2, 2025
f910780
Possible fix for settings flickering when language override is used
LisoUseInAIKyrios May 2, 2025
31b1c1c
fix: Search RYD settings
LisoUseInAIKyrios May 2, 2025
82da35a
cleanup
LisoUseInAIKyrios May 2, 2025
fe6b963
Convert SB work in progress
LisoUseInAIKyrios May 2, 2025
c96fa38
fix export error due to RYD migration code
LisoUseInAIKyrios May 2, 2025
82f488c
fix SB settings not updating after importing settings
LisoUseInAIKyrios May 2, 2025
6b60d9b
Use utility method to check for RTL text layout
LisoUseInAIKyrios May 2, 2025
8ca7973
refactor
LisoUseInAIKyrios May 2, 2025
8e6c2ed
fixes, refactor
LisoUseInAIKyrios May 2, 2025
e8ee20a
refactor: Remove unused preference list
LisoUseInAIKyrios May 2, 2025
30355d6
fix sub-preference search in settings
MarcaDian May 3, 2025
2cb1118
clean
MarcaDian May 3, 2025
f4d9a01
Merge remote-tracking branch 'revanced/dev' into add_searchbar_to_set…
MarcaDian May 3, 2025
00f4944
possibly fix looping
MarcaDian May 3, 2025
98e8993
refactor
LisoUseInAIKyrios May 3, 2025
3a0602a
Work in progress: Show navigation path as preference category
LisoUseInAIKyrios May 3, 2025
e3de443
fix duplicate preference groups
LisoUseInAIKyrios May 3, 2025
ed38d91
refactor
LisoUseInAIKyrios May 3, 2025
f6db6c5
fix settings migration
LisoUseInAIKyrios May 3, 2025
db626ea
refactor
LisoUseInAIKyrios May 3, 2025
1d42739
refactor
LisoUseInAIKyrios May 3, 2025
0fd733d
Work in progress: Category titles are clickable. Needs back button f…
LisoUseInAIKyrios May 3, 2025
04c8572
Revert "Work in progress: Category titles are clickable. Needs back …
LisoUseInAIKyrios May 3, 2025
be884f3
cleanup
LisoUseInAIKyrios May 3, 2025
7079e62
work in progress: Modernize SB settings preferences
LisoUseInAIKyrios May 3, 2025
06769f4
Merge remote-tracking branch 'upstream/dev' into add_searchbar_to_set…
LisoUseInAIKyrios May 4, 2025
212b946
possible fix for missing search results after locking/unlocking
LisoUseInAIKyrios May 4, 2025
eec41da
fix categories displayed in inconsistent order compared to it's enclo…
LisoUseInAIKyrios May 4, 2025
f672ff4
Work in progress modernization of last SB settings. Reverting until …
LisoUseInAIKyrios May 4, 2025
2ea2214
Revert "Work in progress modernization of last SB settings. Revertin…
LisoUseInAIKyrios May 4, 2025
ffc7318
fix SB categories not showing in search
LisoUseInAIKyrios May 4, 2025
93e35f1
fix SB categories not working after importing but not restarting
LisoUseInAIKyrios May 4, 2025
65c20bf
fix query hint
MarcaDian May 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ public static void setContext(Context appContext) {
if (language != AppLanguage.DEFAULT) {
// Create a new context with the desired language.
Logger.printDebug(() -> "Using app language: " + language);
Configuration config = appContext.getResources().getConfiguration();
Configuration config = new Configuration(appContext.getResources().getConfiguration());
config.setLocale(language.getLocale());
context = appContext.createConfigurationContext(config);
}
Expand All @@ -391,16 +391,29 @@ public static boolean isTablet() {
private static Boolean isRightToLeftTextLayout;

/**
* If the device language uses right to left text layout (hebrew, arabic, etc)
* If the device language uses right to left text layout (Hebrew, Arabic, etc).
*/
public static boolean isRightToLeftTextLayout() {
public static boolean isRightToLeftLocale() {
if (isRightToLeftTextLayout == null) {
String displayLanguage = Locale.getDefault().getDisplayLanguage();
isRightToLeftTextLayout = new Bidi(displayLanguage, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT).isRightToLeft();
isRightToLeftTextLayout = isRightToLeftLocale(Locale.getDefault());
}
return isRightToLeftTextLayout;
}

/**
* If the locale is right to left text layout (Hebrew, Arabic, etc).
*/
public static boolean isRightToLeftLocale(Locale locale) {
String displayLanguage = locale.getDisplayLanguage();
return new Bidi(displayLanguage, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT).isRightToLeft();
}

public static String getTextDirectionString() {
return isRightToLeftLocale()
? "\u200F" // u200F = right to left character
: "\u200E"; // u200E = left to right character
}

/**
* @return if the text contains at least 1 number character,
* including any unicode numbers such as Arabic.
Expand Down Expand Up @@ -692,9 +705,10 @@ static Sort fromKey(@Nullable String key, @NonNull Sort defaultSort) {
/**
* Strips all punctuation and converts to lower case. A null parameter returns an empty string.
*/
public static String removePunctuationConvertToLowercase(@Nullable CharSequence original) {
public static String removePunctuationToLowercase(@Nullable CharSequence original) {
if (original == null) return "";
return punctuationPattern.matcher(original).replaceAll("").toLowerCase();
return punctuationPattern.matcher(original).replaceAll("")
.toLowerCase(BaseSettings.REVANCED_LANGUAGE.get().getLocale());
}

/**
Expand Down Expand Up @@ -726,7 +740,7 @@ public static void sortPreferenceGroups(@NonNull PreferenceGroup group) {
final String sortValue;
switch (preferenceSort) {
case BY_TITLE:
sortValue = removePunctuationConvertToLowercase(preference.getTitle());
sortValue = removePunctuationToLowercase(preference.getTitle());
break;
case BY_KEY:
sortValue = preference.getKey();
Expand Down Expand Up @@ -810,4 +824,12 @@ public static int getColorFromString(String colorString) throws IllegalArgumentE
}
return getResourceColor(colorString);
}

public static int clamp(int value, int lower, int upper) {
return Math.max(lower, Math.min(value, upper));
}

public static float clamp(float value, float lower, float upper) {
return Math.max(lower, Math.min(value, upper));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,11 @@ public enum AppLanguage {
ZU;

private final String language;
private final Locale locale;

AppLanguage() {
language = name().toLowerCase(Locale.US);
locale = Locale.forLanguageTag(language);
}

/**
Expand All @@ -112,6 +114,6 @@ public Locale getLocale() {
return Locale.getDefault();
}

return Locale.forLanguageTag(language);
return locale;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ public NoTitlePreferenceCategory(Context context, AttributeSet attrs, int defSty
super(context, attrs, defStyleAttr);
}

public NoTitlePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

public NoTitlePreferenceCategory(Context context) {
super(context);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import app.revanced.extension.shared.Utils;
import app.revanced.extension.youtube.patches.components.ReturnYouTubeDislikeFilterPatch;
import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike;
import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.shared.PlayerType;

Expand Down Expand Up @@ -69,13 +68,6 @@ public class ReturnYouTubeDislikePatch {
@Nullable
private static volatile String lastPrefetchedVideoId;

public static void onRYDStatusChange(boolean rydEnabled) {
ReturnYouTubeDislikeApi.resetRateLimits();
// Must remove all values to protect against using stale data
// if the user enables RYD while a video is on screen.
clearData();
}

private static void clearData() {
currentVideoData = null;
lastLithoShortsVideoData = null;
Expand Down Expand Up @@ -274,7 +266,7 @@ private static void addRollingNumberPatchChanges(TextView view) {
Logger.printDebug(() -> "Adding rolling number TextView changes");
view.setCompoundDrawablePadding(ReturnYouTubeDislike.leftSeparatorShapePaddingPixels);
ShapeDrawable separator = ReturnYouTubeDislike.getLeftSeparatorDrawable();
if (Utils.isRightToLeftTextLayout()) {
if (Utils.isRightToLeftLocale()) {
view.setCompoundDrawables(null, null, separator, null);
} else {
view.setCompoundDrawables(separator, null, null, null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public static void setActionBar(View view) {
final int paddingStart = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
8, Resources.getSystem().getDisplayMetrics());

if (Utils.isRightToLeftTextLayout()) {
if (Utils.isRightToLeftLocale()) {
searchBarView.setPadding(paddingLeft, paddingTop, paddingStart, paddingBottom);
} else {
searchBarView.setPadding(paddingStart, paddingTop, paddingRight, paddingBottom);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package app.revanced.extension.youtube.patches.theme;

import static app.revanced.extension.shared.StringRef.str;
import static app.revanced.extension.shared.Utils.clamp;

import android.content.res.Resources;
import android.graphics.Color;
Expand Down Expand Up @@ -378,14 +379,4 @@ private static int getSeekbarColorValue(int originalColor) {
return originalColor;
}
}

/** @noinspection SameParameterValue */
private static int clamp(int value, int lower, int upper) {
return Math.max(lower, Math.min(value, upper));
}

/** @noinspection SameParameterValue */
private static float clamp(float value, float lower, float upper) {
return Math.max(lower, Math.min(value, upper));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ private static SpannableString createDislikeSpan(@NonNull Spanned oldSpannable,
final boolean compactLayout = Settings.RYD_COMPACT_LAYOUT.get();

if (!compactLayout) {
String leftSeparatorString = getTextDirectionString();
String leftSeparatorString = Utils.getTextDirectionString();
final Spannable leftSeparatorSpan;
if (isRollingNumber) {
leftSeparatorSpan = new SpannableString(leftSeparatorString);
Expand Down Expand Up @@ -279,12 +279,6 @@ private static SpannableString createDislikeSpan(@NonNull Spanned oldSpannable,
return new SpannableString(builder);
}

private static @NonNull String getTextDirectionString() {
return Utils.isRightToLeftTextLayout()
? "\u200F" // u200F = right to left character
: "\u200E"; // u200E = left to right character
}

/**
* @return If the text is likely for a previously created likes/dislikes segmented span.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package app.revanced.extension.youtube.returnyoutubedislike.ui;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.preference.Preference;
import android.util.AttributeSet;

/**
* Allows tapping the RYD about preference to open the website.
*/
@SuppressWarnings({"unused", "deprecation"})
public class ReturnYouTubeDislikeAboutPreference extends Preference {
{
setOnPreferenceClickListener(pref -> {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse("https://returnyoutubedislike.com"));
pref.getContext().startActivity(i);
return false;
});
}

public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public ReturnYouTubeDislikeAboutPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ReturnYouTubeDislikeAboutPreference(Context context) {
super(context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package app.revanced.extension.youtube.returnyoutubedislike.ui;

import static app.revanced.extension.shared.StringRef.str;

import android.content.Context;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import app.revanced.extension.shared.Logger;
import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.youtube.returnyoutubedislike.requests.ReturnYouTubeDislikeApi;

@SuppressWarnings({"unused", "deprecation"})
public class ReturnYouTubeDislikeDebugStatsPreferenceCategory extends PreferenceCategory {

private static final boolean SHOW_RYD_DEBUG_STATS = BaseSettings.DEBUG.get();

private static String createSummaryText(int value, String summaryStringZeroKey, String summaryStringOneOrMoreKey) {
if (value == 0) {
return str(summaryStringZeroKey);
}
return str(summaryStringOneOrMoreKey, value);
}

private static String createMillisecondStringFromNumber(long number) {
return String.format(str("revanced_ryd_statistics_millisecond_text"), number);
}

public ReturnYouTubeDislikeDebugStatsPreferenceCategory(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ReturnYouTubeDislikeDebugStatsPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public ReturnYouTubeDislikeDebugStatsPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected View onCreateView(ViewGroup parent) {
if (!SHOW_RYD_DEBUG_STATS) {
// Use an empty view to hide without removing.
return new View(getContext());
}

return super.onCreateView(parent);
}

protected void onAttachedToActivity() {
try {
super.onAttachedToActivity();
if (!SHOW_RYD_DEBUG_STATS) {
return;
}

Logger.printDebug(() -> "Updating stats preferences");
removeAll();

addStatisticPreference(
"revanced_ryd_statistics_getFetchCallResponseTimeAverage_title",
createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeAverage())
);

addStatisticPreference(
"revanced_ryd_statistics_getFetchCallResponseTimeMin_title",
createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMin())
);

addStatisticPreference(
"revanced_ryd_statistics_getFetchCallResponseTimeMax_title",
createMillisecondStringFromNumber(ReturnYouTubeDislikeApi.getFetchCallResponseTimeMax())
);

String fetchCallTimeWaitingLastSummary;
final long fetchCallTimeWaitingLast = ReturnYouTubeDislikeApi.getFetchCallResponseTimeLast();
if (fetchCallTimeWaitingLast == ReturnYouTubeDislikeApi.FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT) {
fetchCallTimeWaitingLastSummary = str("revanced_ryd_statistics_getFetchCallResponseTimeLast_rate_limit_summary");
} else {
fetchCallTimeWaitingLastSummary = createMillisecondStringFromNumber(fetchCallTimeWaitingLast);
}
addStatisticPreference(
"revanced_ryd_statistics_getFetchCallResponseTimeLast_title",
fetchCallTimeWaitingLastSummary
);

addStatisticPreference(
"revanced_ryd_statistics_getFetchCallCount_title",
createSummaryText(ReturnYouTubeDislikeApi.getFetchCallCount(),
"revanced_ryd_statistics_getFetchCallCount_zero_summary",
"revanced_ryd_statistics_getFetchCallCount_non_zero_summary"
)
);

addStatisticPreference(
"revanced_ryd_statistics_getFetchCallNumberOfFailures_title",
createSummaryText(ReturnYouTubeDislikeApi.getFetchCallNumberOfFailures(),
"revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary",
"revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary"
)
);

addStatisticPreference(
"revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title",
createSummaryText(ReturnYouTubeDislikeApi.getNumberOfRateLimitRequestsEncountered(),
"revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary",
"revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_non_zero_summary"
)
);
} catch (Exception ex) {
Logger.printException(() -> "onAttachedToActivity failure", ex);
}
}

private void addStatisticPreference(String titleKey, String SummaryText) {
Preference statisticPreference = new Preference(getContext());
statisticPreference.setSelectable(false);
statisticPreference.setTitle(str(titleKey));
statisticPreference.setSummary(SummaryText);
addPreference(statisticPreference);
}
}
Loading
Loading