From bed3d1571fdc5e8117ef98d9373c79692f110b22 Mon Sep 17 00:00:00 2001 From: Bryce Hackel <34104885+bhackel@users.noreply.github.com> Date: Thu, 4 Jul 2024 15:19:29 -0700 Subject: [PATCH] New Settings UI, Playback in feeds --- Source/Settings.xm | 61 +++++++++++++++++++ YTLitePlus.xm | 10 +++ .../ar.lproj/Localizable.strings | 8 +++ .../de.lproj/Localizable.strings | 8 +++ .../en.lproj/Localizable.strings | 8 +++ .../es.lproj/Localizable.strings | 8 +++ .../fr.lproj/Localizable.strings | 8 +++ .../ja.lproj/Localizable.strings | 8 +++ .../pt.lproj/Localizable.strings | 8 +++ .../ro.lproj/Localizable.strings | 8 +++ .../ru.lproj/Localizable.strings | 8 +++ .../template.lproj/Localizable.strings | 8 +++ .../tr.lproj/Localizable.strings | 8 +++ .../zh_TW.lproj/Localizable.strings | 8 +++ 14 files changed, 167 insertions(+) diff --git a/Source/Settings.xm b/Source/Settings.xm index 159cfdb..63f6b01 100644 --- a/Source/Settings.xm +++ b/Source/Settings.xm @@ -39,6 +39,25 @@ static const NSInteger YTLitePlusSection = 788; extern NSBundle *YTLitePlusBundle(); +// Add both YTLite and YTLitePlus to YouGroupSettings +static const NSInteger YTLiteSection = 789; // Grabbed from YTLite +%hook YTSettingsGroupData ++ (NSMutableArray *)tweaks { + NSMutableArray *originalTweaks = %orig; + + // Use a static variable to ensure the array is modified only once. + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [originalTweaks addObject:@(YTLitePlusSection)]; + [originalTweaks addObject:@(YTLiteSection)]; + }); + + // Return the modified array. + return originalTweaks; +} +%end + + // Settings %hook YTAppSettingsPresentationData + (NSArray *)settingsCategoryOrder { @@ -271,9 +290,51 @@ extern NSBundle *YTLitePlusBundle(); }]; [sectionItems addObject:themeGroup]; +# pragma mark - Copy of Playback in feeds section - @bhackel + // This section is hidden in vanilla YouTube when using the new settings UI, so + // we can recreate it here + YTSettingsSectionItem *playbackInFeedsGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"PLAYBACK_IN_FEEDS") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + switch (GetSelection(@"inline_muted_playback_enabled")) { + case 3: + return LOC(@"PLAYBACK_IN_FEEDS_WIFI_ONLY"); + case 1: + return LOC(@"PLAYBACK_IN_FEEDS_OFF"); + case 2: + default: + return LOC(@"PLAYBACK_IN_FEEDS_ALWAYS_ON"); + } + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PLAYBACK_IN_FEEDS_OFF") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"inline_muted_playback_enabled"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PLAYBACK_IN_FEEDS_ALWAYS_ON") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"inline_muted_playback_enabled"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PLAYBACK_IN_FEEDS_WIFI_ONLY") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"inline_muted_playback_enabled"]; + [settingsViewController reloadData]; + return YES; + }], + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"PLAYBACK_IN_FEEDS") pickerSectionTitle:nil rows:rows selectedItemIndex:(GetSelection(@"inline_muted_playback_enabled") - 1) parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + } + ]; + # pragma mark - Miscellaneous YTSettingsSectionItem *miscellaneousGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"MISCELLANEOUS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ + playbackInFeedsGroup, + BASIC_SWITCH(LOC(@"NEW_SETTINGS_UI"), LOC(@"NEW_SETTINGS_UI_DESC"), @"newSettingsUI_enabled"), BASIC_SWITCH(LOC(@"ENABLE_YT_STARTUP_ANIMATION"), LOC(@"ENABLE_YT_STARTUP_ANIMATION_DESC"), @"ytStartupAnimation_enabled"), BASIC_SWITCH(LOC(@"HIDE_MODERN_INTERFACE"), LOC(@"HIDE_MODERN_INTERFACE_DESC"), @"ytNoModernUI_enabled"), BASIC_SWITCH(LOC(@"IPAD_LAYOUT"), LOC(@"IPAD_LAYOUT_DESC"), @"iPadLayout_enabled"), diff --git a/YTLitePlus.xm b/YTLitePlus.xm index c5659f5..82540b4 100644 --- a/YTLitePlus.xm +++ b/YTLitePlus.xm @@ -447,6 +447,13 @@ static NSData *cellDividerData = nil; } %end +// New Settings UI - @bhackel +%hook YTColdConfig +- (BOOL)mainAppCoreClientEnableCairoSettings { + return IS_ENABLED(@"newSettingsUI_enabled"); +} +%end + // BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer %group Main %hook YTWatchMiniBarView @@ -718,4 +725,7 @@ static NSData *cellDividerData = nil; if (![allKeys containsObject:@"YouPiPEnabled"]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YouPiPEnabled"]; } + if (![allKeys containsObject:@"newSettingsUI_enabled"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"newSettingsUI_enabled"]; + } } diff --git a/lang/YTLitePlus.bundle/ar.lproj/Localizable.strings b/lang/YTLitePlus.bundle/ar.lproj/Localizable.strings index eee3340..fa3bdce 100644 --- a/lang/YTLitePlus.bundle/ar.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/ar.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "متنوع"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/de.lproj/Localizable.strings b/lang/YTLitePlus.bundle/de.lproj/Localizable.strings index a63deb9..351c9cc 100644 --- a/lang/YTLitePlus.bundle/de.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/de.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Verschiedenes"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "YouTube-Startanimation aktivieren"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/en.lproj/Localizable.strings b/lang/YTLitePlus.bundle/en.lproj/Localizable.strings index a803563..0ceb43c 100644 --- a/lang/YTLitePlus.bundle/en.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/en.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Miscellaneous"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/es.lproj/Localizable.strings b/lang/YTLitePlus.bundle/es.lproj/Localizable.strings index 71112a5..7981598 100644 --- a/lang/YTLitePlus.bundle/es.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/es.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Misceláneos"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Activar la animación de inicio de YouTube"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/fr.lproj/Localizable.strings b/lang/YTLitePlus.bundle/fr.lproj/Localizable.strings index 20a4094..675d020 100644 --- a/lang/YTLitePlus.bundle/fr.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/fr.lproj/Localizable.strings @@ -67,6 +67,14 @@ // Miscellaneous "MISCELLANEOUS" = "Divers"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Activer l'animation de démarrage YouTube"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/ja.lproj/Localizable.strings b/lang/YTLitePlus.bundle/ja.lproj/Localizable.strings index 009ca30..fa52201 100644 --- a/lang/YTLitePlus.bundle/ja.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/ja.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "その他"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "YouTube起動時のアニメーションを有効化"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/pt.lproj/Localizable.strings b/lang/YTLitePlus.bundle/pt.lproj/Localizable.strings index 90d896b..6888eb9 100644 --- a/lang/YTLitePlus.bundle/pt.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/pt.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Miscellaneous"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/ro.lproj/Localizable.strings b/lang/YTLitePlus.bundle/ro.lproj/Localizable.strings index e4bb217..1071e50 100644 --- a/lang/YTLitePlus.bundle/ro.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/ro.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Diverse"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Activare animație de pornire YouTube"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/ru.lproj/Localizable.strings b/lang/YTLitePlus.bundle/ru.lproj/Localizable.strings index 396b34b..f23eef1 100644 --- a/lang/YTLitePlus.bundle/ru.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/ru.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Miscellaneous"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/template.lproj/Localizable.strings b/lang/YTLitePlus.bundle/template.lproj/Localizable.strings index 2e98fa6..9e5ff2d 100644 --- a/lang/YTLitePlus.bundle/template.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/template.lproj/Localizable.strings @@ -79,6 +79,14 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap // Miscellaneous "MISCELLANEOUS" = "Miscellaneous"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/tr.lproj/Localizable.strings b/lang/YTLitePlus.bundle/tr.lproj/Localizable.strings index 4143157..d306764 100644 --- a/lang/YTLitePlus.bundle/tr.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/tr.lproj/Localizable.strings @@ -64,6 +64,14 @@ // Miscellaneous "MISCELLANEOUS" = "Miscellaneous"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "Enable YouTube startup animation"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = ""; diff --git a/lang/YTLitePlus.bundle/zh_TW.lproj/Localizable.strings b/lang/YTLitePlus.bundle/zh_TW.lproj/Localizable.strings index dc8181d..ac9a63b 100644 --- a/lang/YTLitePlus.bundle/zh_TW.lproj/Localizable.strings +++ b/lang/YTLitePlus.bundle/zh_TW.lproj/Localizable.strings @@ -62,6 +62,14 @@ // Miscellaneous "MISCELLANEOUS" = "更多"; +"PLAYBACK_IN_FEEDS" = "Playback in feeds"; +"PLAYBACK_IN_FEEDS_ALWAYS_ON" = "Always on"; +"PLAYBACK_IN_FEEDS_WIFI_ONLY" = "Wi-Fi only"; +"PLAYBACK_IN_FEEDS_OFF" = "Off"; + +"NEW_SETTINGS_UI" = "New Settings UI"; +"NEW_SETTINGS_UI_DESC" = "Use new grouped settings UI. May hide some settings"; + "ENABLE_YT_STARTUP_ANIMATION" = "啟用 Youtube 歡迎動畫"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = "";