feat(YouTube): Add Snack bar components patch

This commit is contained in:
inotia00
2025-01-22 13:01:31 +09:00
parent e85a343c02
commit 78f1d962cd
14 changed files with 642 additions and 44 deletions

View File

@ -61,7 +61,7 @@ public abstract class Filter {
*/
public boolean skip(String conversionContext, SpannableString spannableString, Object span, int start, int end,
int flags, boolean isWord, SpanType spanType, StringFilterGroup matchedGroup) {
if (BaseSettings.ENABLE_DEBUG_LOGGING.get()) {
if (BaseSettings.ENABLE_DEBUG_BUFFER_LOGGING.get()) {
String filterSimpleName = getClass().getSimpleName();
Logger.printDebug(() -> filterSimpleName + " Removed setSpan: " + spanType.type);
}

View File

@ -188,10 +188,6 @@ public class GeneralPatch {
return Settings.HIDE_FLOATING_MICROPHONE.get() || original;
}
public static boolean hideSnackBar() {
return Settings.HIDE_SNACK_BAR.get();
}
// endregion
// region [Hide navigation bar components] patch

View File

@ -0,0 +1,115 @@
package app.revanced.extension.youtube.patches.general;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.widget.FrameLayout;
import java.util.concurrent.atomic.AtomicBoolean;
import app.revanced.extension.shared.utils.ResourceUtils;
import app.revanced.extension.shared.utils.Utils;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.utils.ThemeUtils;
@SuppressWarnings("unused")
public final class SnackBarPatch {
private static final boolean HIDE_SNACK_BAR =
Settings.HIDE_SNACK_BAR.get();
private static final boolean HIDE_SERVER_SIDE_SNACK_BAR =
Settings.HIDE_SERVER_SIDE_SNACK_BAR.get();
private static final boolean CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND =
!HIDE_SNACK_BAR && !HIDE_SERVER_SIDE_SNACK_BAR && Settings.CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND.get();
private static final boolean INVERT_SNACK_BAR_THEME =
!HIDE_SNACK_BAR && Settings.INVERT_SNACK_BAR_THEME.get();
private static final boolean INVERT_SERVER_SIDE_SNACK_BAR_THEME =
!HIDE_SERVER_SIDE_SNACK_BAR && INVERT_SNACK_BAR_THEME;
private static final int SNACK_BAR_BLACK_COLOR = 0xFF0F0F0F;
private static final int SNACK_BAR_WHITE_COLOR = 0xFFF1F1F1;
private static final AtomicBoolean lithoSnackBarLoaded = new AtomicBoolean(false);
private static int blackColor = 0;
private static int whiteColor = 0;
public static boolean hideSnackBar() {
return HIDE_SNACK_BAR;
}
public static void hideLithoSnackBar(FrameLayout frameLayout) {
if (HIDE_SERVER_SIDE_SNACK_BAR) {
Utils.hideViewByLayoutParams(frameLayout);
}
}
public static void setLithoSnackBarBackground(View view) {
if (CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND) {
int snackBarRoundedCornersBackgroundIdentifier =
ResourceUtils.getDrawableIdentifier("snackbar_rounded_corners_background");
Context mContext = invertSnackBarTheme(view.getContext());
Drawable snackBarRoundedCornersBackground = mContext.getDrawable(snackBarRoundedCornersBackgroundIdentifier);
if (snackBarRoundedCornersBackground != null) {
view.setBackground(snackBarRoundedCornersBackground);
}
}
}
public static void setLithoSnackBarBackgroundColor(FrameLayout frameLayout, int color) {
if (CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND) {
return;
}
frameLayout.setBackgroundColor(color);
}
public static Context invertSnackBarTheme(Context mContext) {
if (INVERT_SERVER_SIDE_SNACK_BAR_THEME) {
String styleId = ThemeUtils.isDarkTheme()
? "Base.Theme.YouTube.Light"
: "Base.Theme.YouTube.Dark";
int styleIdentifier = ResourceUtils.getStyleIdentifier(styleId);
mContext = new ContextThemeWrapper(mContext, styleIdentifier);
}
return mContext;
}
public static Enum<?> invertSnackBarTheme(Enum<?> appTheme, Enum<?> darkTheme) {
if (INVERT_SNACK_BAR_THEME) {
return appTheme == darkTheme
? null
: darkTheme;
}
return appTheme;
}
public static void lithoSnackBarLoaded() {
lithoSnackBarLoaded.compareAndSet(false, true);
}
public static int getLithoColor(int originalValue) {
if (CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND &&
lithoSnackBarLoaded.compareAndSet(true, false)) {
if (originalValue == SNACK_BAR_BLACK_COLOR) {
return INVERT_SERVER_SIDE_SNACK_BAR_THEME
? getWhiteColor()
: getBlackColor();
} else if (originalValue == SNACK_BAR_WHITE_COLOR) {
return INVERT_SERVER_SIDE_SNACK_BAR_THEME
? getBlackColor()
: getWhiteColor();
}
}
return originalValue;
}
private static int getBlackColor() {
if (blackColor == 0) blackColor = ResourceUtils.getColor("revanced_snack_bar_color_dark");
return blackColor;
}
private static int getWhiteColor() {
if (whiteColor == 0) whiteColor = ResourceUtils.getColor("revanced_snack_bar_color_light");
return whiteColor;
}
}

View File

@ -0,0 +1,62 @@
package app.revanced.extension.youtube.patches.spans;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import app.revanced.extension.shared.patches.spans.Filter;
import app.revanced.extension.shared.patches.spans.SpanType;
import app.revanced.extension.shared.patches.spans.StringFilterGroup;
import app.revanced.extension.shared.utils.ResourceUtils;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.utils.ThemeUtils;
@SuppressWarnings({"unused", "FieldCanBeLocal"})
public final class SnackBarFilter extends Filter {
private static final boolean HIDE_SNACK_BAR =
Settings.HIDE_SNACK_BAR.get() || Settings.HIDE_SERVER_SIDE_SNACK_BAR.get();
private static final boolean CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND =
!HIDE_SNACK_BAR && Settings.CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND.get();
private static final boolean INVERT_SNACK_BAR_THEME =
!HIDE_SNACK_BAR && Settings.INVERT_SNACK_BAR_THEME.get();
private final ForegroundColorSpan foregroundColorSpanBlack =
new ForegroundColorSpan(ResourceUtils.getColor("yt_black1"));
private final ForegroundColorSpan foregroundColorSpanWhite =
new ForegroundColorSpan(ResourceUtils.getColor("yt_white1"));
public SnackBarFilter() {
addCallbacks(
new StringFilterGroup(
Settings.CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND,
"snackbar.eml|"
)
);
}
private ForegroundColorSpan getForegroundColorSpan() {
if (INVERT_SNACK_BAR_THEME) {
return ThemeUtils.isDarkTheme()
? foregroundColorSpanWhite
: foregroundColorSpanBlack;
}
return ThemeUtils.isDarkTheme()
? foregroundColorSpanBlack
: foregroundColorSpanWhite;
}
@Override
public boolean skip(String conversionContext, SpannableString spannableString, Object span,
int start, int end, int flags, boolean isWord, SpanType spanType, StringFilterGroup matchedGroup) {
if (CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND && spanType == SpanType.FOREGROUND_COLOR) {
spannableString.setSpan(
getForegroundColorSpan(),
start,
end,
flags
);
return super.skip(conversionContext, spannableString, span, start, end, flags, isWord, spanType, matchedGroup);
}
return false;
}
}

View File

@ -93,7 +93,6 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_FEED_SURVEY = new BooleanSetting("revanced_hide_feed_survey", TRUE);
public static final BooleanSetting HIDE_TICKET_SHELF = new BooleanSetting("revanced_hide_ticket_shelf", TRUE);
// PreferenceScreen: Feed - Category bar
public static final BooleanSetting HIDE_CATEGORY_BAR_IN_FEED = new BooleanSetting("revanced_hide_category_bar_in_feed", FALSE, true);
public static final BooleanSetting HIDE_CATEGORY_BAR_IN_SEARCH = new BooleanSetting("revanced_hide_category_bar_in_search", FALSE, true);
@ -152,7 +151,6 @@ public class Settings extends BaseSettings {
public static final BooleanSetting ENABLE_GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_enable_gradient_loading_screen", FALSE, true);
public static final BooleanSetting HIDE_FLOATING_MICROPHONE = new BooleanSetting("revanced_hide_floating_microphone", TRUE, true);
public static final BooleanSetting HIDE_GRAY_SEPARATOR = new BooleanSetting("revanced_hide_gray_separator", TRUE);
public static final BooleanSetting HIDE_SNACK_BAR = new BooleanSetting("revanced_hide_snack_bar", FALSE);
public static final BooleanSetting REMOVE_VIEWER_DISCRETION_DIALOG = new BooleanSetting("revanced_remove_viewer_discretion_dialog", FALSE);
public static final EnumSetting<FormFactor> CHANGE_LAYOUT = new EnumSetting<>("revanced_change_layout", FormFactor.ORIGINAL, true);
@ -232,6 +230,12 @@ public class Settings extends BaseSettings {
public static final BooleanSetting HIDE_SETTINGS_MENU_POST_PURCHASE = new BooleanSetting("revanced_hide_settings_menu_post_purchase", FALSE, true);
public static final BooleanSetting HIDE_SETTINGS_MENU_THIRD_PARTY = new BooleanSetting("revanced_hide_settings_menu_third_party", FALSE, true);
// PreferenceScreen: General - Snack bar
public static final BooleanSetting HIDE_SNACK_BAR = new BooleanSetting("revanced_hide_snack_bar", FALSE, true);
public static final BooleanSetting HIDE_SERVER_SIDE_SNACK_BAR = new BooleanSetting("revanced_hide_server_side_snack_bar", FALSE, true);
public static final BooleanSetting CHANGE_SERVER_SIDE_SNACK_BAR_BACKGROUND = new BooleanSetting("revanced_change_server_side_snack_bar_background", FALSE, true, "revanced_change_server_side_snack_bar_background_user_dialog_message");
public static final BooleanSetting INVERT_SNACK_BAR_THEME = new BooleanSetting("revanced_invert_snack_bar_theme", FALSE, true);
// PreferenceScreen: General - Toolbar
public static final BooleanSetting CHANGE_YOUTUBE_HEADER = new BooleanSetting("revanced_change_youtube_header", TRUE, true);
public static final BooleanSetting ENABLE_WIDE_SEARCH_BAR = new BooleanSetting("revanced_enable_wide_search_bar", FALSE, true);