diff --git a/Header.h b/Header.h index f099c12..f8df496 100644 --- a/Header.h +++ b/Header.h @@ -1,5 +1,6 @@ #import "Tweaks/YouTubeHeader/YTAppDelegate.h" #import "Tweaks/YouTubeHeader/YTPlayerViewController.h" +#import "Tweaks/YouTubeHeader/YTQTMButton.h" #import #import #import @@ -15,6 +16,7 @@ #import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h" #import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h" #import "Tweaks/YouTubeHeader/YTIBrowseRequest.h" +#import "Tweaks/YouTubeHeader/YTColorPalette.h" #import "Tweaks/YouTubeHeader/YTCommonColorPalette.h" #import "Tweaks/YouTubeHeader/ASCollectionView.h" #import "Tweaks/YouTubeHeader/YTPlayerOverlay.h" @@ -25,6 +27,10 @@ #import "Tweaks/YouTubeHeader/YTAlertView.h" #import "Tweaks/YouTubeHeader/YTISectionListRenderer.h" #import "Tweaks/YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h" +#import "Tweaks/YouTubeHeader/YTPivotBarItemView.h" +#import "Tweaks/YouTubeHeader/YTVideoWithContextNode.h" // YouTube-X +#import "Tweaks/YouTubeHeader/ELMCellNode.h" // YouTube-X +#import "Tweaks/YouTubeHeader/ELMNodeController.h" // YouTube-X #define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil] #define YT_BUNDLE_ID @"com.google.ios.youtube" @@ -63,6 +69,9 @@ @interface boolSettingsVC : UIViewController @end +@interface YTPlaybackButton : UIControl +@end + @interface PlayerManager : NSObject - (float)progress; @end @@ -75,6 +84,12 @@ @property UIButton *downloadsButton; @end +// Buttons +@interface YTRightNavigationButtons : UIView +@property YTQTMButton *notificationButton; +@property YTQTMButton *sponsorBlockButton; +@end + // YTSpeed @interface YTVarispeedSwitchControllerOption : NSObject - (id)initWithTitle:(id)title rate:(float)rate; @@ -99,16 +114,6 @@ - (void)setRate:(float)rate; @end -// iOS16 fix -@interface OBPrivacyLinkButton : UIButton -- (instancetype)initWithCaption:(NSString *)caption - buttonText:(NSString *)buttonText - image:(UIImage *)image - imageSize:(CGSize)imageSize - useLargeIcon:(BOOL)useLargeIcon - displayLanguage:(NSString *)displayLanguage; -@end - // uYouLocal fix @interface YTLocalPlaybackController : NSObject - (id)activeVideo; @@ -119,7 +124,6 @@ @property(nonatomic, strong) id downloadsVC; @end - // BigYTMiniPlayer @interface YTMainAppVideoPlayerOverlayView : UIView - (UIViewController *)_viewControllerForAncestor; @@ -131,9 +135,6 @@ // YTAutoFullScreen @interface YTPlayerViewController (YTAFS) - (void)autoFullscreen; -// DontEatMycontent -- (id)activeVideoPlayerOverlay; -- (id)playerView; // YTSpeed @property id activeVideo; @property float playbackRate; @@ -150,6 +151,9 @@ @interface YTRelatedVideosView : UIView @end +@interface YTTopAlignedView : UIView +@end + @interface ELMView : UIView @end @@ -168,6 +172,9 @@ @interface _ASDisplayView : UIView @end +@interface YTPivotBarIndicatorView : UIView +@end + @interface YTCommentDetailHeaderCell : UIView @end @@ -191,4 +198,4 @@ @interface settingsReorderTable : UIViewController @property(nonatomic, strong) UITableView *tableView; -@end \ No newline at end of file +@end diff --git a/README.md b/README.md index 5afff85..bbcde20 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ ![IMG_2196](https://user-images.githubusercontent.com/52943116/189822859-8a0952db-9264-4b5b-9cbe-d0a87b2db5a0.PNG) -***

Badge @@ -11,17 +10,17 @@

- Badge - Badge - Badge - Badge + Badge + Badge + Badge + Badge

- Badge - Badge - Badge + Badge + Badge + Badge

# Table of Contents @@ -46,6 +45,12 @@

MiRO92

+ + + + +

qnblackcat

+ @@ -64,15 +69,15 @@

BandarHelal

+ + +

galactic

- - - @@ -97,15 +102,15 @@

Foxster

+ + +

ichitaso

- - - @@ -168,6 +173,10 @@ 15. **YTVideoOverlay**: add buttons to overlay the video. +16. **YTNoCommunityPosts**: Tweak to disable all Community Posts on the YouTube app. **<-- uYouPlusExtra Exclusive Feature (may change)** + +17. **LowContrastMode**: this tweak allows users to darken the text in the YouTube app. **<-- uYouPlusExtra Exclusive Feature (may change)** + # Known issues @@ -178,36 +187,36 @@ # Download -- **uYouPlus** (or you can call it uYou+) requires iOS or iPadOS 14.0 or later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases/latest). +- **uYouPlusExtra** (or you can just call it uYou+) requires iOS or iPadOS 14.0 or later. The latest version of **uYouPlusExtra** ipa can be found in the [Release tab](https://github.com/arichorn/uYouPlusExtra/releases/latest). - + - [Open in AltStore (v18.31.3-3.0.1)](https://tinyurl.com/4srfmcm2) - It will take a while to install because AltStore needs to download the IPA first. -- Version info: _(last update: Aug 5)_ +- Version info: _(last update: Aug 15)_
Expand ℹ️ | **Tweaks/App** | **Developer** | **Version** | **Open source** | | - | - | :-: | :-: | -| **YouTube** | Google Inc | 18.30.7 | ✖︎ | -| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 3.0 | ✖︎ | +| **YouTube** | Google Inc | 18.31.3 | ✖︎ | +| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 3.0.1 | ✖︎ | | **Open in YouTube** | [CokePokes](https://github.com/CokePokes) | 1.2 | [✔︎](https://github.com/CokePokes/YoutubeExtensions) | -| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) | +| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.2 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) | | **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) | | **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) | | **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) | -| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.6 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) | +| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.10 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) | | **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) | | **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) | | **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) | -| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.5-1 | [✔︎](https://github.com/PoomSmart/YTUHD) | -| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.19-1 | [✔︎](https://github.com/PoomSmart/YouPiP) | +| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.4.0 | [✔︎](https://github.com/PoomSmart/YTUHD) | +| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.20 | [✔︎](https://github.com/PoomSmart/YouPiP) | | **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) | -| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.5.0 | [✔︎](https://github.com/PoomSmart/YTABConfig) | +| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.5.0-1 | [✔︎](https://github.com/PoomSmart/YTABConfig) | | **YTReExplore** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) | | **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) | | **YTNoPaidPromo** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) | @@ -216,15 +225,24 @@ | **YouMute** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.1-2 | [✔︎](https://github.com/PoomSmart/YouMute) | | **YouQuality** | [PoomSmart](https://twitter.com/poomsmart) | 1.1.4 | [✔︎](https://github.com/PoomSmart/YouQuality) | | **YTVideoOverlay** | [PoomSmart](https://twitter.com/poomsmart) | 1.1.0-2 | [✔︎](https://github.com/PoomSmart/YTVideoOverlay) | +| **YTNoCommunityPosts** | [michael-winay](https://github.com/michael-winay) | 0.0.2 | [✔︎](https://github.com/michael-winay/YTNoCommunityPosts) | +| **LowContrastMode** | [arichorn](https://github.com/arichorn) | 1.4.0 | [✔︎](https://github.com/arichorn/YTLowContrastMode) |
+# uYou Tweak Compatibility List + +| Developer | Tweak Name and Version | App Version Compatibility | +|-----------|:----------------------:|:-------------------------:| +| MiRO92 | uYou 2.1/2.3~1 | Works on v16.42.3-18.01.6 | +| MiRO92 | uYou 3.0 | Works on v18.06.6-18.18.2 | +| MiRO92 | uYou 3.0.1 | Works on v18.06.6-latest | + # Installation See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation). # Support the developers - [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support -- [**Poomsmart**](https://twitter.com/poomsmart): https://poomsmart.github.io - [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg - [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL - [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne @@ -238,4 +256,28 @@ See [FAQ - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/FAQ). # Building (optional) -See [Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building). +See [qnblackcat/Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building) +or [arichorn/Building - Wiki](https://github.com/arichorn/uYouPlusExtra/wiki/Building). + +
+ Balackburn's YTLitePlus +# change from uYouPlus/uYouPlusExtra to YTLitePlus (optional) + +hello, this is here to show yall this tweak. I've been seeing the YTLitePlus tweak on reddit for quite some time now and decided to join in. before you download the tweak you must look at the Pros and Cons below before downloading because it lets you know more about the tweak. + +https://github.com/Balackburn/YTLitePlus/releases + +**Pros** + +- YTLitePlus is stable and more tweakable then uYouPlus/uYouPlusExtra. + +- YTLitePlus has more features in YTLite Settings that uYouPlusExtra doesn't have. + +- YTLitePlus has a lightweight Version of the App Version Spoofer which makes it easier to use. + +**Cons** + +- No Video Downloading in YTLitePlus. + +- Video Quality on WiFi not in YTLitePlus. +
diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..7a8e0cd --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,20 @@ +# Security Policy for uYouPlus Developers +If I verify a reported security vulnerability, my policy is: + +- the uYouPlusExtra Developer will patch the current main branch, as well as the immediate prior minor release branch. + +- the Contributors are allowed to patch the current main branch with custom features and the ability to add new & updated Localizable Strings. + +- After fully patching the main branch, the uYouPlusExtra Developer will issue a new release for the main branch along with LTS release branches. + +## Supported Versions + +these versions of the project are +currently being supported with security/feature updates. + +| Version | LTS Support of the uYouPlusExtra Tweak | YT Version Supported by Google | App Stability | +| ------- | -------------------------------------- | ------------------------------ | -------------------- | +| [latest](https://github.com/arichorn/uYouPlusExtra/releases/latest) | ✅ | ✅ | The latest version is stable! | +| [17.49.6-2.3.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v17.49.6-2.3.1-F4) | ✅ | ✅ | This version is Stable, this version may be unstable to some if using it on iOS 17 Beta. | +| [17.38.10-2.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/latest) | N/A | ✅ | This new LTS Release will soon to replace **16.42.3-2.1** next year. | +| [16.42.3-2.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v16.42.3-2.1-F19) | ❌ | ✅ until 2024+ | Unstable if you are using iOS 16 or later, Stage Manager won't work correctly when playing videos in the video player, The App Pivot Bar does not hide when playing videos in iOS 16+ due to iOS/iPadOS Changes but this version can still get new features from Google like for these new ones that were recently added in as an example --> (Shorts, Continue Watching Section, Watch It Again Section, Handles & etc.) so overrall this YouTube Version is still supported by Google. | diff --git a/Settings.xm b/Settings.xm index 7ff5dd9..ceb5237 100644 --- a/Settings.xm +++ b/Settings.xm @@ -12,6 +12,12 @@ static BOOL IsEnabled(NSString *key) { static int GetSelection(NSString *key) { return [[NSUserDefaults standardUserDefaults] integerForKey:key]; } +static int colorContrastMode() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcmColor"]; +} +static int appVersionSpoofer() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"]; +} static const NSInteger uYouPlusSection = 500; @interface YTSettingsSectionItemManager (uYouPlus) @@ -52,19 +58,29 @@ extern NSBundle *uYouPlusBundle(); accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { - return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/qnblackcat/uYouPlus/releases/latest"]]; + return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/arichorn/uYouPlusExtra/releases/latest"]]; }]; [sectionItems addObject:version]; # pragma mark - VideoPlayer YTSettingsSectionItem *videoPlayerGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_PLAYER_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable Portrait Fullscreen") + titleDescription:LOC(@"Enables Portrait Fullscreen on the iPhone YouTube App.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"portraitFullscreen_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"portraitFullscreen_enabled"]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_DOUBLE_TAP_TO_SEEK") titleDescription:LOC(@"DISABLE_DOUBLE_TAP_TO_SEEK_DESC") accessibilityIdentifier:nil - switchOn:IsEnabled(@"doubleTapToSeek_disabled") + switchOn:IsEnabled(@"disableDoubleTapToSkip_enabled") switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { - [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"doubleTapToSeek_disabled"]; + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableDoubleTapToSkip_enabled"]; return YES; } settingItemId:0], @@ -108,8 +124,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - - ]; + ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_PLAYER_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; @@ -119,6 +134,26 @@ extern NSBundle *uYouPlusBundle(); # pragma mark - Video Controls Overlay Options YTSettingsSectionItem *videoControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable Share Button") + titleDescription:LOC(@"Enable the Share Button in video controls overlay.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"enableShareButton_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableShareButton_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable 'Save To Playlist' Button") + titleDescription:LOC(@"Enable the 'Save To Playlist' Button in video controls overlay.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"enableSaveToButton_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableSaveToButton_enabled"]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_AUTOPLAY_SWITCH") titleDescription:LOC(@"HIDE_AUTOPLAY_SWITCH_DESC") accessibilityIdentifier:nil @@ -168,6 +203,16 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Shadow Overlay Buttons") + titleDescription:LOC(@"Hide the Shadow Overlay on the Play/Pause, Previous, Next, Forward & Rewind Buttons.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideVideoPlayerShadowOverlayButtons_enabled"]; + return YES; + } + settingItemId:0], [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON") titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC") @@ -218,7 +263,37 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - ]; + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Heatwaves") + titleDescription:LOC(@"Should hide the Heatwaves in the video player. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideHeatwaves_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHeatwaves_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Dark Overlay Background") + titleDescription:LOC(@"Hide video player's dark overlay background.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideOverlayDarkBackground_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideOverlayDarkBackground_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable YTSpeed") + titleDescription:LOC(@"Enable YTSpeed to have more Playback Speed Options. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"ytSpeed_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytSpeed_enabled"]; + return YES; + } + settingItemId:0] + ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; @@ -247,7 +322,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_RESUME_TO_SHORTS") titleDescription:LOC(@"DISABLE_RESUME_TO_SHORTS_DESC") accessibilityIdentifier:nil @@ -256,13 +331,1025 @@ extern NSBundle *uYouPlusBundle(); [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableResumeToShorts"]; return YES; } - settingItemId:0], - ]; + settingItemId:0] + ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"SHORTS_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; }]; [sectionItems addObject:shortsControlOverlayGroup]; + + # pragma mark - LowContrastMode + YTSettingsSectionItem *lowContrastModeSection = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Low contrast text color") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + switch (colorContrastMode()) { + case 1: + return LOC(@"Red UI"); + case 2: + return LOC(@"Blue UI"); + case 3: + return LOC(@"Green UI"); + case 4: + return LOC(@"Yellow UI"); + case 5: + return LOC(@"Orange UI"); + case 6: + return LOC(@"Purple UI"); + case 7: + return LOC(@"Violet UI"); + case 8: + return LOC(@"Pink UI"); + case 0: + default: + return LOC(@"Default UI"); + } + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Default UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Red UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Blue UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Green UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Yellow UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Orange UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Purple UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:6 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Violet UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:7 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Pink UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:8 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }] + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Low contrast text color") pickerSectionTitle:nil rows:rows selectedItemIndex:colorContrastMode() parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + +# pragma mark - VersionSpoofer + YTSettingsSectionItem *versionSpooferSection = [YTSettingsSectionItemClass itemWithTitle:@"Version Spoofer Picker" + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + switch (appVersionSpoofer()) { + case 1: + return @"v18.28.3"; + case 2: + return @"v18.27.3"; + case 3: + return @"v18.25.1"; + case 4: + return @"v18.23.3"; + case 5: + return @"v18.22.9"; + case 6: + return @"v18.21.3"; + case 7: + return @"v18.20.3"; + case 8: + return @"v18.19.1"; + case 9: + return @"v18.18.2"; + case 10: + return @"v18.17.2"; + case 11: + return @"v18.16.2"; + case 12: + return @"v18.15.1"; + case 13: + return @"v18.14.1"; + case 14: + return @"v18.13.4"; + case 15: + return @"v18.12.2"; + case 16: + return @"v18.11.2"; + case 17: + return @"v18.10.1"; + case 18: + return @"v18.09.4"; + case 19: + return @"v18.08.1"; + case 20: + return @"v18.07.5"; + case 21: + return @"v18.05.2"; + case 22: + return @"v18.04.3"; + case 23: + return @"v18.03.3"; + case 24: + return @"v18.02.03"; + case 25: + return @"v18.01.6"; + case 26: + return @"v18.01.4"; + case 27: + return @"v18.01.2"; + case 28: + return @"v17.49.6"; + case 29: + return @"v17.49.4"; + case 30: + return @"v17.46.4"; + case 31: + return @"v17.45.1"; + case 32: + return @"v17.44.4"; + case 33: + return @"v17.43.1"; + case 34: + return @"v17.42.7"; + case 35: + return @"v17.42.6"; + case 36: + return @"v17.41.2"; + case 37: + return @"v17.40.5"; + case 38: + return @"v17.39.4"; + case 39: + return @"v17.38.10"; + case 40: + return @"v17.38.9"; + case 41: + return @"v17.37.2"; + case 42: + return @"v17.36.4"; + case 43: + return @"v17.36.3"; + case 44: + return @"v17.35.3"; + case 45: + return @"v17.34.3"; + case 46: + return @"v17.33.2"; + case 47: + return @"v17.32.2"; + case 48: + return @"v17.31.4"; + case 49: + return @"v17.30.3"; + case 50: + return @"v17.30.1"; + case 51: + return @"v17.29.3"; + case 52: + return @"v17.29.2"; + case 53: + return @"v17.28.2"; + case 54: + return @"v17.26.2"; + case 55: + return @"v17.25.1"; + case 56: + return @"v17.24.4"; + case 57: + return @"v17.23.6"; + case 58: + return @"v17.22.3"; + case 59: + return @"v17.21.3"; + case 60: + return @"v17.20.3"; + case 61: + return @"v17.19.3"; + case 62: + return @"v17.19.2"; + case 63: + return @"v17.18.4"; + case 64: + return @"v17.17.4"; + case 65: + return @"v17.16.4"; + case 66: + return @"v17.15.2"; + case 67: + return @"v17.15.1"; + case 68: + return @"v17.14.2"; + case 69: + return @"v17.13.3"; + case 70: + return @"v17.12.5"; + case 71: + return @"v17.12.4"; + case 72: + return @"v17.11.2"; + case 73: + return @"v17.10.2"; + case 74: + return @"v17.09.1"; + case 75: + return @"v17.08.2"; + case 76: + return @"v17.07.2"; + case 77: + return @"v17.06.3"; + case 78: + return @"v17.05.2"; + case 79: + return @"v17.04.3"; + case 80: + return @"v17.03.3"; + case 81: + return @"v17.03.2"; + case 82: + return @"v17.01.4"; + case 83: + return @"v16.46.5"; + case 84: + return @"v16.46.4"; + case 85: + return @"v16.45.4"; + case 86: + return @"v16.44.5"; + case 87: + return @"v16.44.4"; + case 88: + return @"v16.43.2"; + case 89: + return @"v16.42.3"; + case 90: + return @"v16.41.2"; + case 91: + return @"v16.40.3"; + case 92: + return @"v16.39.6"; + case 93: + return @"v16.38.2"; + case 94: + return @"v16.37.3"; + case 95: + return @"v16.36.4"; + case 96: + return @"v16.35.5"; + case 97: + return @"v16.35.4"; + case 98: + return @"v16.34.7"; + case 99: + return @"v16.34.3"; + case 100: + return @"v16.33.3"; + case 101: + return @"v16.32.6"; + case 102: + return @"v16.31.4"; + case 103: + return @"v16.30.2"; + case 104: + return @"v16.29.4"; + case 105: + return @"v16.28.2"; + case 106: + return @"v16.27.3"; + case 107: + return @"v16.26.6"; + case 108: + return @"v16.25.2"; + case 109: + return @"v16.24.2"; + case 110: + return @"v16.23.3"; + case 111: + return @"v16.23.2"; + case 112: + return @"v16.22.5"; + case 113: + return @"v16.20.5"; + case 114: + return @"v16.19.6"; + case 115: + return @"v16.18.5"; + case 116: + return @"v16.17.4"; + case 117: + return @"v16.16.4"; + case 118: + return @"v16.16.3"; + case 119: + return @"v16.15.4"; + case 120: + return @"v16.14.2"; + case 121: + return @"v16.13.1"; + case 122: + return @"v16.12.3"; + case 123: + return @"v16.11.3"; + case 124: + return @"v16.10.3"; + case 125: + return @"v16.09.3"; + case 126: + return @"v16.09.2"; + case 127: + return @"v16.08.2"; + case 128: + return @"v16.05.9"; + case 129: + return @"v16.05.8"; + case 130: + return @"v16.05.7"; + case 0: + default: + return @"Latest Version"; + } + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"Latest Version" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.28.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.27.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.25.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.23.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.22.9" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.21.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:6 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.20.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:7 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.19.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:8 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.18.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:9 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.17.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:10 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.16.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:11 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.15.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:12 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.14.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:13 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.13.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:14 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.12.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:15 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.11.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:16 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.10.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:17 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.09.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:18 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.08.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:19 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.07.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:20 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.05.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:21 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.04.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:22 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.03.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:23 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.02.03" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:24 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.01.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:25 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.01.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:26 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.01.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:27 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.49.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:28 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.49.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:29 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.46.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:30 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.45.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:31 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.44.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:32 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.43.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:33 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.42.7" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:34 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.42.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:35 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.41.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:36 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.40.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:37 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.39.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:38 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.38.10" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:39 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.38.9" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:40 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.37.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:41 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.36.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:42 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.36.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:43 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.35.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:44 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.34.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:45 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.33.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:46 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.32.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:47 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.31.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:48 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.30.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:49 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.30.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:50 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.29.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:51 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.29.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:52 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.28.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:53 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.26.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:54 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.25.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:55 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.24.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:56 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.23.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:57 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.22.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:58 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.21.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:59 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.20.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:60 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.19.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:61 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.19.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:62 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.18.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:63 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.17.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:64 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.16.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:65 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.15.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:66 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.15.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:67 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.14.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:68 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.13.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:69 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.12.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:70 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.12.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:71 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.11.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:72 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.10.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:73 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.09.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:74 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.08.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:75 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.07.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:76 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.06.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:77 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.05.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:78 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.04.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:79 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.03.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:80 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.03.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:81 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.01.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:82 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.46.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:83 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.46.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:84 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.45.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:85 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.44.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:86 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.44.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:87 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.43.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:88 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.42.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:89 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.41.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:90 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.40.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:91 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.39.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:92 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.38.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:93 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.37.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:94 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.36.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:95 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.35.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:96 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.35.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:97 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.34.7" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:98 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.34.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:99 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.33.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:100 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.32.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:101 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.31.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:102 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.30.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:103 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.29.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:104 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.28.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:105 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.27.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:106 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.26.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:107 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.25.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:108 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.24.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:109 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.23.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:110 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.23.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:111 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.22.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:112 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.20.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:113 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.19.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:114 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.18.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:115 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.17.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:116 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.16.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:117 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.16.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:118 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.15.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:119 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.14.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:120 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.13.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:121 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.12.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:122 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.11.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:123 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.10.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:124 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.09.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:125 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.09.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:126 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.08.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:127 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.05.9" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:128 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.05.8" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:129 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.05.7" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:130 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }] + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Version Spoofer Picker") pickerSectionTitle:nil rows:rows selectedItemIndex:appVersionSpoofer() parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; # pragma mark - Theme YTSettingsSectionItem *themeGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"THEME_OPTIONS") @@ -304,8 +1391,17 @@ extern NSBundle *uYouPlusBundle(); [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"]; return YES; } - settingItemId:0] - ]; + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Low Contrast Mode") + titleDescription:LOC(@"this will Low Contrast texts and buttons just like how the old YouTube Interface did. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"lowContrastMode_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"lowContrastMode_enabled"]; + return YES; + } + settingItemId:0], lowContrastModeSection]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"THEME_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:GetSelection(@"appTheme") parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; @@ -335,16 +1431,6 @@ extern NSBundle *uYouPlusBundle(); } settingItemId:0], - [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_FLEX") - titleDescription:LOC(@"ENABLE_FLEX_DESC") - accessibilityIdentifier:nil - switchOn:IsEnabled(@"flex_enabled") - switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { - [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"flex_enabled"]; - return YES; - } - settingItemId:0], - [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_YT_STARTUP_ANIMATION") titleDescription:LOC(@"ENABLE_YT_STARTUP_ANIMATION_DESC") accessibilityIdentifier:nil @@ -355,6 +1441,56 @@ extern NSBundle *uYouPlusBundle(); } settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Remove Modern Interface (YTNoModernUI)") + titleDescription:LOC(@"Toggle this on to remove any Modern Element added to YouTube. Removes Ambient Mode, Rounded Design & More. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"ytNoModernUI_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytNoModernUI_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide 'Play next in queue'") + titleDescription:LOC(@"Hides 'Play Next In Queue' option from the menu. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hidePlayNextInQueue_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePlayNextInQueue_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide YouTube Logo") + titleDescription:LOC(@"Toggle this to hide the YouTube Logo in the YouTube App.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideYouTubeLogo_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideYouTubeLogo_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Stick Navigation Bar") + titleDescription:LOC(@"Enable to make the Navigation Bar stay on the App when scrolling.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"stickNavigationBar_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"stickNavigationBar_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide iSponsorBlock button in the Navigation bar") + titleDescription:LOC(@"") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideSponsorBlockButton_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSponsorBlockButton_enabled"]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CHIP_BAR") titleDescription:LOC(@"HIDE_CHIP_BAR_DESC") accessibilityIdentifier:nil @@ -364,7 +1500,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"IPHONE_LAYOUT") titleDescription:LOC(@"IPHONE_LAYOUT_DESC") accessibilityIdentifier:nil @@ -374,7 +1510,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"NEW_MINIPLAYER_STYLE") titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC") accessibilityIdentifier:nil @@ -384,6 +1520,16 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Disable Wifi Related Settings ") + titleDescription:LOC(@"This will disable the following sections which will be Autoplay, Purchases and memberships, Notifications, Connected apps, Manage all history, Privacy & Live chat.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"disableWifiRelatedSettings_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableWifiRelatedSettings_enabled"]; + return YES; + } + settingItemId:0], [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_RE_EXPLORE") titleDescription:LOC(@"YT_RE_EXPLORE_DESC") @@ -394,8 +1540,36 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - ]; - + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Subscriptions Notification Badge") + titleDescription:LOC(@"Hides the Red Notification Badge shown in the Pivot Bar of the Subscriptions Tab.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideSubscriptionsNotificationBadge_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSubscriptionsNotificationBadge_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_FLEX") + titleDescription:LOC(@"ENABLE_FLEX_DESC") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"flex_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"flex_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable App Version Spoofer") + titleDescription:LOC(@"Enable this to use the Version Spoofer and select your perferred version below. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"enableVersionSpoofer_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableVersionSpoofer_enabled"]; + return YES; + } + settingItemId:0], versionSpooferSection]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"MISCELLANEOUS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; diff --git a/Source/LowContrastMode.swift b/Source/LowContrastMode.swift new file mode 100644 index 0000000..aea9a72 --- /dev/null +++ b/Source/LowContrastMode.swift @@ -0,0 +1,43 @@ +import UIKit + +class ViewController: UIViewController { + + @IBOutlet weak var textField: UITextField! + @IBOutlet weak var colorButton: UIButton! + + var textColor: UIColor = (red: 0.56, green: 0.56, blue: 0.56, alpha: 1.00) + + override func viewDidLoad() { + super.viewDidLoad() + + // Configure Text Field + textField.placeholder = "YouTube" + + // Configure Color Button + colorButton.setTitleColor(textColor, for: .normal) + } + + @IBAction func onColorButtonTap(_ sender: Any) { + let colorPicker = UIColorPickerViewController() + colorPicker.delegate = self + present(colorPicker, animated: true, completion: nil) + } +} + +extension ViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } +} + +extension ViewController: UIColorPickerViewControllerDelegate { + + func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) { + textColor = viewController.selectedColor + colorButton.setTitleColor(textColor, for: .normal) + } + + func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { + dismiss diff --git a/Source/LowContrastMode.xm b/Source/LowContrastMode.xm new file mode 100644 index 0000000..eeeb725 --- /dev/null +++ b/Source/LowContrastMode.xm @@ -0,0 +1,1987 @@ +#import "../Header.h" + +// +static BOOL IsEnabled(NSString *key) { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} +static int colorContrastMode() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcmColor"]; +} +static BOOL defaultContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 0; +} +static BOOL redContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 1; +} +static BOOL blueContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 2; +} +static BOOL greenContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 3; +} +static BOOL yellowContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 4; +} +static BOOL orangeContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 5; +} +static BOOL purpleContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 6; +} +static BOOL violetContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 7; +} +static BOOL pinkContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 8; +} + +%group gLowContrastMode // Low Contrast Mode v1.4.0 (Compatible with only YouTube v16.05.7-v17.38.10) +%hook UIColor ++ (UIColor *)whiteColor { // Dark Theme Color + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} +// testing below ++ (UIColor *)systemTextColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)systemPlaceholderColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)systemLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)systemSecondaryLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)systemTertiaryLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)systemQuaternaryLabelColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)textSecondary { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)overlayTextPrimary { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)overlayTextSecondary { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)iconActive { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)iconActiveOther { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)brandIconActive { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)staticBrandWhite { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +- (UIColor *)overlayIconActiveOther { + return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; // Dark Theme +} +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gRedContrastMode // Red Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gBlueContrastMode // Blue Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gGreenContrastMode // Green Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gYellowContrastMode // Yellow Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gOrangeContrastMode // Orange Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gPurpleContrastMode // Purple Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gVioletContrastMode // Violet Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +%group gPinkContrastMode // Pink Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)darkTextColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)placeholderTextColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)labelColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)secondaryLabelColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)tertiaryLabelColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)quaternaryLabelColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} +%end +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayTextSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)iconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)brandIconActive { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)staticBrandWhite { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +- (UIColor *)overlayIconActiveOther { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Fallback Version + } +%end +%hook QTMColorGroup +- (UIColor *)tint100 { + return [UIColor whiteColor]; +} +- (UIColor *)tint300 { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnLighterColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnRegularColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnDarkerColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)bodyTextColorOnOnBrightAccentColor { + return [UIColor whiteColor]; +} +- (UIColor *)lightBodyTextColor { + return [UIColor whiteColor]; +} +- (UIColor *)buttonBackgroundColor { + return [UIColor whiteColor]; +} +%end +%hook YTQTMButton +- (void)setImage:(UIImage *)image { + UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + [self setTintColor:[UIColor whiteColor]]; + %orig(currentImage); +} +%end +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISearchBar +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end +%hook UISegmentedControl +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + color = [UIColor whiteColor]; + %orig(color, state); +} +%end +%hook UIBarButtonItem +- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + %orig(modifiedAttributes, state); +} +%end +%hook NSAttributedString +- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary *)attrs { + NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs]; + [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; + return %orig(str, modifiedAttributes); +} +%end +%hook CATextLayer +- (void)setTextColor:(CGColorRef)textColor { + %orig([UIColor whiteColor].CGColor); +} +%end +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + return newAttributedString; +} +%end +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end +%end + +# pragma mark - ctor +%ctor { + %init; + if (defaultContrastMode()) { + %init(gLowContrastMode); + } + if (redContrastMode()) { + %init(gRedContrastMode); + } + if (blueContrastMode()) { + %init(gBlueContrastMode); + } + if (greenContrastMode()) { + %init(gGreenContrastMode); + } + if (yellowContrastMode()) { + %init(gYellowContrastMode); + } + if (orangeContrastMode()) { + %init(gOrangeContrastMode); + } + if (purpleContrastMode()) { + %init(gPurpleContrastMode); + } + if (violetContrastMode()) { + %init(gVioletContrastMode); + } + if (pinkContrastMode()) { + %init(gPinkContrastMode); + } +} diff --git a/Source/Themes.xm b/Source/Themes.xm new file mode 100644 index 0000000..a92f983 --- /dev/null +++ b/Source/Themes.xm @@ -0,0 +1,1037 @@ +#import "../Header.h" + +static BOOL IsEnabled(NSString *key) { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} +static BOOL isDarkMode() { + return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1); +} +static BOOL defaultDarkTheme() { + return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 0); +} +static BOOL oledDarkTheme() { + return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 1); +} +static BOOL oldDarkTheme() { + return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 2); +} + +// Themes.xm - Theme Options +// Default Dark theme +%group gDefaultDarkTheme +UIColor *defaultColor = [UIColor colorWithRed: 0.06 green: 0.06 blue: 0.06 alpha: 1.00]; +%hook YTCommonColorPalette +- (UIColor *)baseBackground { + return self.pageStyle == 1 ? defaultColor : %orig; +} +%end +%hook YTPivotBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTSubheaderContainerView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTAppView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTCollectionView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTChannelListSubMenuView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTSettingsCell +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTSlideForActionsView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTPageView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTWatchView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTPlaylistMiniBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTEngagementPanelView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTEngagementPanelHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTPlaylistPanelControlsView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTHorizontalCardListView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTWatchMiniBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTCreateCommentAccessoryView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTCreateCommentTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTSearchView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTSearchBoxView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%hook YTTabTitlesView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(defaultColor) : %orig; +} +%end +%end + +// Old dark theme (gray) +%group gOldDarkTheme +UIColor *originalColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]; +%hook YTCommonColorPalette +- (UIColor *)background1 { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)background2 { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)background3 { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)baseBackground { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)brandBackgroundSolid { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)brandBackgroundPrimary { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)brandBackgroundSecondary { + return self.pageStyle == 1 ? [originalColor colorWithAlphaComponent:0.9] : %orig; +} +- (UIColor *)raisedBackground { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)staticBrandBlack { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)generalBackgroundA { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)generalBackgroundB { + return self.pageStyle == 1 ? originalColor : %orig; +} +- (UIColor *)menuBackground { + return self.pageStyle == 1 ? originalColor : %orig; +} +%end + +%hook SponsorBlockSettingsController +- (void)viewDidLoad { + if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { + %orig; + self.tableView.backgroundColor = originalColor; + } else { return %orig; } +} +%end + +%hook SponsorBlockViewController +- (void)viewDidLoad { + if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { + %orig; + self.view.backgroundColor = originalColor; + } else { return %orig; } +} +%end + +%hook ELMView +- (void)didMoveToWindow { + %orig; + self.subviews[0].backgroundColor = [UIColor clearColor]; +} +%end + +%hook YTAsyncCollectionView +- (void)layoutSubviews { + %orig(); + if ([self.nextResponder isKindOfClass:NSClassFromString(@"YTWatchNextResultsViewController")]) { + if (isDarkMode()) { + self.subviews[0].subviews[0].backgroundColor = originalColor; + } + } +} +%end + +%hook YTPivotBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTSubheaderContainerView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTAppView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTCollectionView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTChannelListSubMenuView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTSettingsCell +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTSlideForActionsView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTPageView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTWatchView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTPlaylistMiniBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTEngagementPanelView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTEngagementPanelHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTPlaylistPanelControlsView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTHorizontalCardListView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTWatchMiniBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTCreateCommentAccessoryView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTCreateCommentTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTSearchView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTSearchBoxView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTTabTitlesView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTPrivacyTosFooterView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTOfflineStorageUsageView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTInlineSignInView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTFeedChannelFilterHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YCHLiveChatView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YCHLiveChatActionPanelView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTEmojiTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTTopAlignedView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +- (void)layoutSubviews { + %orig(); + if (isDarkMode()) { + MSHookIvar(self, "_contentView").backgroundColor = originalColor; + } +} +%end + +%hook GOODialogView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTNavigationBar +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +- (void)setBarTintColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTChannelMobileHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTChannelSubMenuView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTWrapperSplitView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTReelShelfCell +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTReelShelfItemView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTReelShelfView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTCommentView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTChannelListSubMenuAvatarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTSearchBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTDialogContainerScrollView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTShareTitleView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTShareBusyView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTELMView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTActionSheetHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(originalColor) : %orig; +} +%end + +%hook YTShareMainView +- (void)layoutSubviews { + %orig(); + if (isDarkMode()) { + MSHookIvar(self, "_cancelButton").backgroundColor = originalColor; + MSHookIvar(self, "_safeArea").backgroundColor = originalColor; + } +} +%end + +%hook _ASDisplayView +- (void)layoutSubviews { + %orig; + if (isDarkMode()) { + UIResponder *responder = [self nextResponder]; + while (responder != nil) { + if ([responder isKindOfClass:NSClassFromString(@"YTActionSheetDialogViewController")]) { + self.backgroundColor = originalColor; + } + if ([responder isKindOfClass:NSClassFromString(@"YTPanelLoadingStrategyViewController")]) { + self.backgroundColor = originalColor; + } + if ([responder isKindOfClass:NSClassFromString(@"YTTabHeaderElementsViewController")]) { + self.backgroundColor = originalColor; + } + if ([responder isKindOfClass:NSClassFromString(@"YTEditSheetControllerElementsContentViewController")]) { + self.backgroundColor = originalColor; + } + responder = [responder nextResponder]; + } + } +} +- (void)didMoveToWindow { + %orig; + if (isDarkMode()) { + if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"brand.promo_view"]) { self.superview.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.superview.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = originalColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; } + } +} +%end +%end + +// OLED dark mode by @BandarHL and modified by @arichorn +UIColor* raisedColor = [UIColor blackColor]; +%group gOLED +%hook YTCommonColorPalette +- (UIColor *)background1 { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)background2 { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)background3 { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)baseBackground { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)brandBackgroundSolid { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)brandBackgroundPrimary { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)brandBackgroundSecondary { + return self.pageStyle == 1 ? [[UIColor blackColor] colorWithAlphaComponent:0.9] : %orig; +} +- (UIColor *)raisedBackground { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)staticBrandBlack { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)generalBackgroundA { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)generalBackgroundB { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +- (UIColor *)menuBackground { + return self.pageStyle == 1 ? [UIColor blackColor] : %orig; +} +%end + +%hook UITableViewCell +- (void)_layoutSystemBackgroundView { + %orig; + NSString *backgroundViewKey = class_getInstanceVariable(self.class, "_colorView") ? @"_colorView" : @"_backgroundView"; + ((UIView *)[[self valueForKey:@"_systemBackgroundView"] valueForKey:backgroundViewKey]).backgroundColor = [UIColor blackColor]; +} +- (void)_layoutSystemBackgroundView:(BOOL)arg1 { + %orig; + ((UIView *)[[self valueForKey:@"_systemBackgroundView"] valueForKey:@"_colorView"]).backgroundColor = [UIColor blackColor]; +} +%end + +%hook settingsReorderTable +- (void)viewDidLayoutSubviews { + %orig; + self.tableView.backgroundColor = [UIColor blackColor]; +} +%end + +%hook FRPSelectListTable +- (void)viewDidLayoutSubviews { + %orig; + self.tableView.backgroundColor = [UIColor blackColor]; +} +%end + +%hook FRPreferences +- (void)viewDidLayoutSubviews { + %orig; + self.tableView.backgroundColor = [UIColor blackColor]; +} +%end + +%hook SponsorBlockSettingsController +- (void)viewDidLoad { + if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { + %orig; + self.tableView.backgroundColor = [UIColor blackColor]; + } else { return %orig; } +} +%end + +%hook SponsorBlockViewController +- (void)viewDidLoad { + if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { + %orig; + self.view.backgroundColor = [UIColor blackColor]; + } else { return %orig; } +} +%end +%hook ELMView +- (void)didMoveToWindow { + %orig; + self.subviews[0].backgroundColor = [UIColor clearColor]; +} +%end + +%hook YTAsyncCollectionView +- (void)layoutSubviews { + %orig(); + if ([self.nextResponder isKindOfClass:NSClassFromString(@"YTWatchNextResultsViewController")]) { + if (isDarkMode()) { + self.subviews[0].subviews[0].backgroundColor = [UIColor blackColor]; + } + } +} +%end + +%hook YTPivotBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTSubheaderContainerView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTAppView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTCollectionView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTChannelListSubMenuView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTSettingsCell +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTSlideForActionsView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTPageView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTWatchView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTPlaylistMiniBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTEngagementPanelView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTEngagementPanelHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTPlaylistPanelControlsView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTHorizontalCardListView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTWatchMiniBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTCreateCommentAccessoryView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTCreateCommentTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTSearchView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTSearchBoxView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTTabTitlesView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTPrivacyTosFooterView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTOfflineStorageUsageView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTInlineSignInView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTFeedChannelFilterHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YCHLiveChatView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YCHLiveChatActionPanelView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTEmojiTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTTopAlignedView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +- (void)layoutSubviews { + %orig(); + if (isDarkMode()) { + MSHookIvar(self, "_contentView").backgroundColor = [UIColor blackColor]; + } +} +%end + +%hook GOODialogView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTNavigationBar +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +- (void)setBarTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTChannelMobileHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTChannelSubMenuView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTWrapperSplitView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTReelShelfCell +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTReelShelfItemView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTReelShelfView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTCommentView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTChannelListSubMenuAvatarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTSearchBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTDialogContainerScrollView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTShareTitleView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTShareBusyView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTELMView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTActionSheetHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor blackColor]) : %orig; +} +%end + +%hook YTShareMainView +- (void)layoutSubviews { + %orig(); + if (isDarkMode()) { + MSHookIvar(self, "_cancelButton").backgroundColor = [UIColor blackColor]; + MSHookIvar(self, "_safeArea").backgroundColor = [UIColor blackColor]; + } +} +%end + +%hook _ASDisplayView +- (void)layoutSubviews { + %orig; + if (isDarkMode()) { + UIResponder *responder = [self nextResponder]; + while (responder != nil) { + if ([responder isKindOfClass:NSClassFromString(@"YTActionSheetDialogViewController")]) { + self.backgroundColor = [UIColor blackColor]; + } + if ([responder isKindOfClass:NSClassFromString(@"YTPanelLoadingStrategyViewController")]) { + self.backgroundColor = [UIColor blackColor]; + } + if ([responder isKindOfClass:NSClassFromString(@"YTTabHeaderElementsViewController")]) { + self.backgroundColor = [UIColor blackColor]; + } + if ([responder isKindOfClass:NSClassFromString(@"YTEditSheetControllerElementsContentViewController")]) { + self.backgroundColor = [UIColor blackColor]; + } + responder = [responder nextResponder]; + } + } +} +- (void)didMoveToWindow { + %orig; + if (isDarkMode()) { + if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"brand.promo_view"]) { self.superview.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.superview.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; } + } +} +%end +%end + +// OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e +%group gOLEDKB +%hook UIPredictionViewController +- (void)loadView { + %orig; + [self.view setBackgroundColor:[UIColor blackColor]]; +} +%end + +%hook UICandidateViewController +- (void)loadView { + %orig; + [self.view setBackgroundColor:[UIColor blackColor]]; +} +%end + +%hook UIKeyboardDockView +- (void)didMoveToWindow { + %orig; + self.backgroundColor = [UIColor blackColor]; +} +%end + +%hook UIKeyboardLayoutStar +- (void)didMoveToWindow { + %orig; + self.backgroundColor = [UIColor blackColor]; +} +%end + +%hook UIKBRenderConfig // Prediction text color +- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); } +%end +%end + +# pragma mark - ctor +%ctor { + %init; + if (IsEnabled(@"oledKeyBoard_enabled")) { + %init(gOLEDKB); + } + if (oledDarkTheme()) { + %init(gOLED); + } + if (oldDarkTheme()) { + %init(gOldDarkTheme); + } + if (defaultDarkTheme()) { + %init(gDefaultDarkTheme); + } +} diff --git a/Source/VersionSpoofer.xm b/Source/VersionSpoofer.xm new file mode 100644 index 0000000..ab6c731 --- /dev/null +++ b/Source/VersionSpoofer.xm @@ -0,0 +1,1591 @@ +#import "../Header.h" + +// +static BOOL IsEnabled(NSString *key) { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} +static int appVersionSpoofer() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"]; +} +static BOOL version0() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 0; +} +static BOOL version1() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 1; +} +static BOOL version2() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 2; +} +static BOOL version3() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 3; +} +static BOOL version4() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 4; +} +static BOOL version5() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 5; +} +static BOOL version6() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 6; +} +static BOOL version7() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 7; +} +static BOOL version8() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 8; +} +static BOOL version9() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 9; +} +static BOOL version10() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 10; +} +static BOOL version11() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 11; +} +static BOOL version12() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 12; +} +static BOOL version13() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 13; +} +static BOOL version14() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 14; +} +static BOOL version15() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 15; +} +static BOOL version16() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 16; +} +static BOOL version17() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 17; +} +static BOOL version18() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 18; +} +static BOOL version19() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 19; +} +static BOOL version20() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 20; +} +static BOOL version21() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 21; +} +static BOOL version22() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 22; +} +static BOOL version23() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 23; +} +static BOOL version24() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 24; +} +static BOOL version25() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 25; +} +static BOOL version26() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 26; +} +static BOOL version27() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 27; +} +static BOOL version28() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 28; +} +static BOOL version29() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 29; +} +static BOOL version30() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 30; +} +static BOOL version31() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 31; +} +static BOOL version32() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 32; +} +static BOOL version33() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 33; +} +static BOOL version34() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 34; +} +static BOOL version35() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 35; +} +static BOOL version36() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 36; +} +static BOOL version37() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 37; +} +static BOOL version38() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 38; +} +static BOOL version39() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 39; +} +static BOOL version40() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 40; +} +static BOOL version41() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 41; +} +static BOOL version42() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 42; +} +static BOOL version43() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 43; +} +static BOOL version44() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 44; +} +static BOOL version45() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 45; +} +static BOOL version46() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 46; +} +static BOOL version47() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 47; +} +static BOOL version48() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 48; +} +static BOOL version49() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 49; +} +static BOOL version50() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 50; +} +static BOOL version51() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 51; +} +static BOOL version52() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 52; +} +static BOOL version53() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 53; +} +static BOOL version54() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 54; +} +static BOOL version55() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 55; +} +static BOOL version56() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 56; +} +static BOOL version57() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 57; +} +static BOOL version58() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 58; +} +static BOOL version59() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 59; +} +static BOOL version60() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 60; +} +static BOOL version61() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 61; +} +static BOOL version62() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 62; +} +static BOOL version63() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 63; +} +static BOOL version64() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 64; +} +static BOOL version65() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 65; +} +static BOOL version66() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 66; +} +static BOOL version67() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 67; +} +static BOOL version68() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 68; +} +static BOOL version69() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 69; +} +static BOOL version70() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 70; +} +static BOOL version71() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 71; +} +static BOOL version72() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 72; +} +static BOOL version73() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 73; +} +static BOOL version74() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 74; +} +static BOOL version75() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 75; +} +static BOOL version76() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 76; +} +static BOOL version77() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 77; +} +static BOOL version78() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 78; +} +static BOOL version79() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 79; +} +static BOOL version80() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 80; +} +static BOOL version81() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 81; +} +static BOOL version82() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 82; +} +static BOOL version83() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 83; +} +static BOOL version84() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 84; +} +static BOOL version85() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 85; +} +static BOOL version86() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 86; +} +static BOOL version87() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 87; +} +static BOOL version88() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 88; +} +static BOOL version89() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 89; +} +static BOOL version90() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 90; +} +static BOOL version91() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 91; +} +static BOOL version92() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 92; +} +static BOOL version93() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 93; +} +static BOOL version94() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 94; +} +static BOOL version95() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 95; +} +static BOOL version96() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 96; +} +static BOOL version97() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 97; +} +static BOOL version98() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 98; +} +static BOOL version99() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 99; +} +static BOOL version100() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 100; +} +static BOOL version101() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 101; +} +static BOOL version102() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 102; +} +static BOOL version103() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 103; +} +static BOOL version104() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 104; +} +static BOOL version105() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 105; +} +static BOOL version106() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 106; +} +static BOOL version107() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 107; +} +static BOOL version108() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 108; +} +static BOOL version109() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 109; +} +static BOOL version110() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 110; +} +static BOOL version111() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 111; +} +static BOOL version112() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 112; +} +static BOOL version113() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 113; +} +static BOOL version114() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 114; +} +static BOOL version115() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 115; +} +static BOOL version116() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 116; +} +static BOOL version117() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 117; +} +static BOOL version118() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 118; +} +static BOOL version119() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 119; +} +static BOOL version120() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 120; +} +static BOOL version121() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 121; +} +static BOOL version122() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 122; +} +static BOOL version123() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 123; +} +static BOOL version124() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 124; +} +static BOOL version125() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 125; +} +static BOOL version126() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 126; +} +static BOOL version127() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 127; +} +static BOOL version128() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 128; +} +static BOOL version129() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 129; +} +static BOOL version130() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 130; +} + +%group gVersion0 +%hook YTVersionUtils // 0 ++ (NSString *)appVersion { + NSURL *versionURL = [NSURL URLWithString:@"https://raw.githubusercontent.com/arichorn/YTAppVersionSpoofer-WIP/main/version.txt"]; + NSString *latestVersion = [NSString stringWithContentsOfURL:versionURL encoding:NSUTF8StringEncoding error:nil]; + + return latestVersion ?: @"18.29.1"; +} +%end +%end + +%group gVersion1 +%hook YTVersionUtils // 1 ++ (NSString *)appVersion { return @"18.28.3"; } +%end +%end + +%group gVersion2 +%hook YTVersionUtils // 2 ++ (NSString *)appVersion { return @"18.27.3"; } +%end +%end + +%group gVersion3 +%hook YTVersionUtils // 3 ++ (NSString *)appVersion { return @"18.25.1"; } +%end +%end + +%group gVersion4 +%hook YTVersionUtils // 4 ++ (NSString *)appVersion { return @"18.23.3"; } +%end +%end + +%group gVersion5 +%hook YTVersionUtils // 5 ++ (NSString *)appVersion { return @"18.22.9"; } +%end +%end + +%group gVersion6 +%hook YTVersionUtils // 6 ++ (NSString *)appVersion { return @"18.21.3"; } +%end +%end + +%group gVersion7 +%hook YTVersionUtils // 7 ++ (NSString *)appVersion { return @"18.20.3"; } +%end +%end + +%group gVersion8 +%hook YTVersionUtils // 8 ++ (NSString *)appVersion { return @"18.19.1"; } +%end +%end + +%group gVersion9 +%hook YTVersionUtils // 9 ++ (NSString *)appVersion { return @"18.18.2"; } +%end +%end + +%group gVersion10 +%hook YTVersionUtils // 10 ++ (NSString *)appVersion { return @"18.17.2"; } +%end +%end + +%group gVersion11 +%hook YTVersionUtils // 11 ++ (NSString *)appVersion { return @"18.16.2"; } +%end +%end + +%group gVersion12 +%hook YTVersionUtils // 12 ++ (NSString *)appVersion { return @"18.15.1"; } +%end +%end + +%group gVersion13 +%hook YTVersionUtils // 13 ++ (NSString *)appVersion { return @"18.14.1"; } +%end +%end + +%group gVersion14 +%hook YTVersionUtils // 14 ++ (NSString *)appVersion { return @"18.13.4"; } +%end +%end + +%group gVersion15 +%hook YTVersionUtils // 15 ++ (NSString *)appVersion { return @"18.12.2"; } +%end +%end + +%group gVersion16 +%hook YTVersionUtils // 16 ++ (NSString *)appVersion { return @"18.11.2"; } +%end +%end + +%group gVersion17 +%hook YTVersionUtils // 17 ++ (NSString *)appVersion { return @"18.10.1"; } +%end +%end + +%group gVersion18 +%hook YTVersionUtils // 18 ++ (NSString *)appVersion { return @"18.09.4"; } +%end +%end + +%group gVersion19 +%hook YTVersionUtils // 19 ++ (NSString *)appVersion { return @"18.08.1"; } +%end +%end + +%group gVersion20 +%hook YTVersionUtils // 20 ++ (NSString *)appVersion { return @"18.07.5"; } +%end +%end + +%group gVersion21 +%hook YTVersionUtils // 21 ++ (NSString *)appVersion { return @"18.05.2"; } +%end +%end + +%group gVersion22 +%hook YTVersionUtils // 22 ++ (NSString *)appVersion { return @"18.04.3"; } +%end +%end + +%group gVersion23 +%hook YTVersionUtils // 23 ++ (NSString *)appVersion { return @"18.03.3"; } +%end +%end + +%group gVersion24 +%hook YTVersionUtils // 24 ++ (NSString *)appVersion { return @"18.02.03"; } +%end +%end + +%group gVersion25 +%hook YTVersionUtils // 25 ++ (NSString *)appVersion { return @"18.01.6"; } +%end +%end + +%group gVersion26 +%hook YTVersionUtils // 26 ++ (NSString *)appVersion { return @"18.01.4"; } +%end +%end + +%group gVersion27 +%hook YTVersionUtils // 27 ++ (NSString *)appVersion { return @"18.01.2"; } +%end +%end + +%group gVersion28 +%hook YTVersionUtils // 28 ++ (NSString *)appVersion { return @"17.49.6"; } +%end +%end + +%group gVersion29 +%hook YTVersionUtils // 29 ++ (NSString *)appVersion { return @"17.49.4"; } +%end +%end + +%group gVersion30 +%hook YTVersionUtils // 30 ++ (NSString *)appVersion { return @"17.46.4"; } +%end +%end + +%group gVersion31 +%hook YTVersionUtils // 31 ++ (NSString *)appVersion { return @"17.45.1"; } +%end +%end + +%group gVersion32 +%hook YTVersionUtils // 32 ++ (NSString *)appVersion { return @"17.44.4"; } +%end +%end + +%group gVersion33 +%hook YTVersionUtils // 33 ++ (NSString *)appVersion { return @"17.43.1"; } +%end +%end + +%group gVersion34 +%hook YTVersionUtils // 34 ++ (NSString *)appVersion { return @"17.42.7"; } +%end +%end + +%group gVersion35 +%hook YTVersionUtils // 35 ++ (NSString *)appVersion { return @"17.42.6"; } +%end +%end + +%group gVersion36 +%hook YTVersionUtils // 36 ++ (NSString *)appVersion { return @"17.41.2"; } +%end +%end + +%group gVersion37 +%hook YTVersionUtils // 37 ++ (NSString *)appVersion { return @"17.40.5"; } +%end +%end + +%group gVersion38 +%hook YTVersionUtils // 38 ++ (NSString *)appVersion { return @"17.39.4"; } +%end +%end + +%group gVersion39 +%hook YTVersionUtils // 39 ++ (NSString *)appVersion { return @"17.38.10"; } +%end +%end + +%group gVersion40 +%hook YTVersionUtils // 40 ++ (NSString *)appVersion { return @"17.38.9"; } +%end +%end + +%group gVersion41 +%hook YTVersionUtils // 41 ++ (NSString *)appVersion { return @"17.37.3"; } +%end +%end + +%group gVersion42 +%hook YTVersionUtils // 42 ++ (NSString *)appVersion { return @"17.36.4"; } +%end +%end + +%group gVersion43 +%hook YTVersionUtils // 43 ++ (NSString *)appVersion { return @"17.36.3"; } +%end +%end + +%group gVersion44 +%hook YTVersionUtils // 44 ++ (NSString *)appVersion { return @"17.35.3"; } +%end +%end + +%group gVersion45 +%hook YTVersionUtils // 45 ++ (NSString *)appVersion { return @"17.34.3"; } +%end +%end + +%group gVersion46 +%hook YTVersionUtils // 46 ++ (NSString *)appVersion { return @"17.33.2"; } +%end +%end + +%group gVersion47 +%hook YTVersionUtils // 47 ++ (NSString *)appVersion { return @"17.32.2"; } +%end +%end + +%group gVersion48 +%hook YTVersionUtils // 48 ++ (NSString *)appVersion { return @"17.31.4"; } +%end +%end + +%group gVersion49 +%hook YTVersionUtils // 49 ++ (NSString *)appVersion { return @"17.30.3"; } +%end +%end + +%group gVersion50 +%hook YTVersionUtils // 50 ++ (NSString *)appVersion { return @"17.30.1"; } +%end +%end + +%group gVersion51 +%hook YTVersionUtils // 51 ++ (NSString *)appVersion { return @"17.29.3"; } +%end +%end + +%group gVersion52 +%hook YTVersionUtils // 52 ++ (NSString *)appVersion { return @"17.29.2"; } +%end +%end + +%group gVersion53 +%hook YTVersionUtils // 53 ++ (NSString *)appVersion { return @"17.28.2"; } +%end +%end + +%group gVersion54 +%hook YTVersionUtils // 54 ++ (NSString *)appVersion { return @"17.26.2"; } +%end +%end + +%group gVersion55 +%hook YTVersionUtils // 55 ++ (NSString *)appVersion { return @"17.25.1"; } +%end +%end + +%group gVersion56 +%hook YTVersionUtils // 56 ++ (NSString *)appVersion { return @"17.24.4"; } +%end +%end + +%group gVersion57 +%hook YTVersionUtils // 57 ++ (NSString *)appVersion { return @"17.23.6"; } +%end +%end + +%group gVersion58 +%hook YTVersionUtils // 58 ++ (NSString *)appVersion { return @"17.22.3"; } +%end +%end + +%group gVersion59 +%hook YTVersionUtils // 59 ++ (NSString *)appVersion { return @"17.21.3"; } +%end +%end + +%group gVersion60 +%hook YTVersionUtils // 60 ++ (NSString *)appVersion { return @"17.20.3"; } +%end +%end + +%group gVersion61 +%hook YTVersionUtils // 61 ++ (NSString *)appVersion { return @"17.19.3"; } +%end +%end + +%group gVersion62 +%hook YTVersionUtils // 62 ++ (NSString *)appVersion { return @"17.19.2"; } +%end +%end + +%group gVersion63 +%hook YTVersionUtils // 63 ++ (NSString *)appVersion { return @"17.18.4"; } +%end +%end + +%group gVersion64 +%hook YTVersionUtils // 64 ++ (NSString *)appVersion { return @"17.17.4"; } +%end +%end + +%group gVersion65 +%hook YTVersionUtils // 65 ++ (NSString *)appVersion { return @"17.16.4"; } +%end +%end + +%group gVersion66 +%hook YTVersionUtils // 66 ++ (NSString *)appVersion { return @"17.15.2"; } +%end +%end + +%group gVersion67 +%hook YTVersionUtils // 67 ++ (NSString *)appVersion { return @"17.15.1"; } +%end +%end + +%group gVersion68 +%hook YTVersionUtils // 68 ++ (NSString *)appVersion { return @"17.14.2"; } +%end +%end + +%group gVersion69 +%hook YTVersionUtils // 69 ++ (NSString *)appVersion { return @"17.13.3"; } +%end +%end + +%group gVersion70 +%hook YTVersionUtils // 70 ++ (NSString *)appVersion { return @"17.12.5"; } +%end +%end + +%group gVersion71 +%hook YTVersionUtils // 71 ++ (NSString *)appVersion { return @"17.12.4"; } +%end +%end + +%group gVersion72 +%hook YTVersionUtils // 72 ++ (NSString *)appVersion { return @"17.11.2"; } +%end +%end + +%group gVersion73 +%hook YTVersionUtils // 73 ++ (NSString *)appVersion { return @"17.10.2"; } +%end +%end + +%group gVersion74 +%hook YTVersionUtils // 74 ++ (NSString *)appVersion { return @"17.09.1"; } +%end +%end + +%group gVersion75 +%hook YTVersionUtils // 75 ++ (NSString *)appVersion { return @"17.08.2"; } +%end +%end + +%group gVersion76 +%hook YTVersionUtils // 76 ++ (NSString *)appVersion { return @"17.07.2"; } +%end +%end + +%group gVersion77 +%hook YTVersionUtils // 77 ++ (NSString *)appVersion { return @"17.06.3"; } +%end +%end + +%group gVersion78 +%hook YTVersionUtils // 78 ++ (NSString *)appVersion { return @"17.05.2"; } +%end +%end + +%group gVersion79 +%hook YTVersionUtils // 79 ++ (NSString *)appVersion { return @"17.04.3"; } +%end +%end + +%group gVersion80 +%hook YTVersionUtils // 80 ++ (NSString *)appVersion { return @"17.03.3"; } +%end +%end + +%group gVersion81 +%hook YTVersionUtils // 81 ++ (NSString *)appVersion { return @"17.03.2"; } +%end +%end + +%group gVersion82 +%hook YTVersionUtils // 82 ++ (NSString *)appVersion { return @"17.01.4"; } +%end +%end + +%group gVersion83 +%hook YTVersionUtils // 83 ++ (NSString *)appVersion { return @"16.46.5"; } +%end +%end + +%group gVersion84 +%hook YTVersionUtils // 84 ++ (NSString *)appVersion { return @"16.46.4"; } +%end +%end + +%group gVersion85 +%hook YTVersionUtils // 85 ++ (NSString *)appVersion { return @"16.45.4"; } +%end +%end + +%group gVersion86 +%hook YTVersionUtils // 86 ++ (NSString *)appVersion { return @"16.44.5"; } +%end +%end + +%group gVersion87 +%hook YTVersionUtils // 87 ++ (NSString *)appVersion { return @"16.44.4"; } +%end +%end + +%group gVersion88 +%hook YTVersionUtils // 88 ++ (NSString *)appVersion { return @"16.43.2"; } +%end +%end + +%group gVersion89 +%hook YTVersionUtils // 89 ++ (NSString *)appVersion { return @"16.42.3"; } +%end +%end + +%group gVersion90 +%hook YTVersionUtils // 90 ++ (NSString *)appVersion { return @"16.41.2"; } +%end +%end + +%group gVersion91 +%hook YTVersionUtils // 91 ++ (NSString *)appVersion { return @"16.40.3"; } +%end +%end + +%group gVersion92 +%hook YTVersionUtils // 92 ++ (NSString *)appVersion { return @"16.39.6"; } +%end +%end + +%group gVersion93 +%hook YTVersionUtils // 93 ++ (NSString *)appVersion { return @"16.38.2"; } +%end +%end + +%group gVersion94 +%hook YTVersionUtils // 94 ++ (NSString *)appVersion { return @"16.37.3"; } +%end +%end + +%group gVersion95 +%hook YTVersionUtils // 95 ++ (NSString *)appVersion { return @"16.36.4"; } +%end +%end + +%group gVersion96 +%hook YTVersionUtils // 96 ++ (NSString *)appVersion { return @"16.35.5"; } +%end +%end + +%group gVersion97 +%hook YTVersionUtils // 97 ++ (NSString *)appVersion { return @"16.35.4"; } +%end +%end + +%group gVersion98 +%hook YTVersionUtils // 98 ++ (NSString *)appVersion { return @"16.34.7"; } +%end +%end + +%group gVersion99 +%hook YTVersionUtils // 99 ++ (NSString *)appVersion { return @"16.34.3"; } +%end +%end + +%group gVersion100 +%hook YTVersionUtils // 100 ++ (NSString *)appVersion { return @"16.33.3"; } +%end +%end + +%group gVersion101 +%hook YTVersionUtils // 101 ++ (NSString *)appVersion { return @"16.32.6"; } +%end +%end + +%group gVersion102 +%hook YTVersionUtils // 102 ++ (NSString *)appVersion { return @"16.31.4"; } +%end +%end + +%group gVersion103 +%hook YTVersionUtils // 103 ++ (NSString *)appVersion { return @"16.30.2"; } +%end +%end + +%group gVersion104 +%hook YTVersionUtils // 104 ++ (NSString *)appVersion { return @"16.29.4"; } +%end +%end + +%group gVersion105 +%hook YTVersionUtils // 105 ++ (NSString *)appVersion { return @"16.28.2"; } +%end +%end + +%group gVersion106 +%hook YTVersionUtils // 106 ++ (NSString *)appVersion { return @"16.27.3"; } +%end +%end + +%group gVersion107 +%hook YTVersionUtils // 107 ++ (NSString *)appVersion { return @"16.26.6"; } +%end +%end + +%group gVersion108 +%hook YTVersionUtils // 108 ++ (NSString *)appVersion { return @"16.25.2"; } +%end +%end + +%group gVersion109 +%hook YTVersionUtils // 109 ++ (NSString *)appVersion { return @"16.24.2"; } +%end +%end + +%group gVersion110 +%hook YTVersionUtils // 110 ++ (NSString *)appVersion { return @"16.23.3"; } +%end +%end + +%group gVersion111 +%hook YTVersionUtils // 111 ++ (NSString *)appVersion { return @"16.23.2"; } +%end +%end + +%group gVersion112 +%hook YTVersionUtils // 112 ++ (NSString *)appVersion { return @"16.22.5"; } +%end +%end + +%group gVersion113 +%hook YTVersionUtils // 113 ++ (NSString *)appVersion { return @"16.20.5"; } +%end +%end + +%group gVersion114 +%hook YTVersionUtils // 114 ++ (NSString *)appVersion { return @"16.19.6"; } +%end +%end + +%group gVersion115 +%hook YTVersionUtils // 115 ++ (NSString *)appVersion { return @"16.18.5"; } +%end +%end + +%group gVersion116 +%hook YTVersionUtils // 116 ++ (NSString *)appVersion { return @"16.17.4"; } +%end +%end + +%group gVersion117 +%hook YTVersionUtils // 117 ++ (NSString *)appVersion { return @"16.16.4"; } +%end +%end + +%group gVersion118 +%hook YTVersionUtils // 118 ++ (NSString *)appVersion { return @"16.16.3"; } +%end +%end + +%group gVersion119 +%hook YTVersionUtils // 119 ++ (NSString *)appVersion { return @"16.15.4"; } +%end +%end + +%group gVersion120 +%hook YTVersionUtils // 120 ++ (NSString *)appVersion { return @"16.14.2"; } +%end +%end + +%group gVersion121 +%hook YTVersionUtils // 121 ++ (NSString *)appVersion { return @"16.13.1"; } +%end +%end + +%group gVersion122 +%hook YTVersionUtils // 122 ++ (NSString *)appVersion { return @"16.12.3"; } +%end +%end + +%group gVersion123 +%hook YTVersionUtils // 123 ++ (NSString *)appVersion { return @"16.11.3"; } +%end +%end + +%group gVersion124 +%hook YTVersionUtils // 124 ++ (NSString *)appVersion { return @"16.10.3"; } +%end +%end + +%group gVersion125 +%hook YTVersionUtils // 125 ++ (NSString *)appVersion { return @"16.09.3"; } +%end +%end + +%group gVersion126 +%hook YTVersionUtils // 126 ++ (NSString *)appVersion { return @"16.09.2"; } +%end +%end + +%group gVersion127 +%hook YTVersionUtils // 127 ++ (NSString *)appVersion { return @"16.08.2"; } +%end +%end + +%group gVersion128 +%hook YTVersionUtils // 128 ++ (NSString *)appVersion { return @"16.05.9"; } +%end +%end + +%group gVersion129 +%hook YTVersionUtils // 129 ++ (NSString *)appVersion { return @"16.05.8"; } +%end +%end + +%group gVersion130 +%hook YTVersionUtils // 130 ++ (NSString *)appVersion { return @"16.05.7"; } +%end +%end + +# pragma mark - ctor +%ctor { + %init; + if (version0()) { // 0 + %init(gVersion0); + } + if (version1()) { // 1 + %init(gVersion1); + } + if (version2()) { // 2 + %init(gVersion2); + } + if (version3()) { // 3 + %init(gVersion3); + } + if (version4()) { // 4 + %init(gVersion4); + } + if (version5()) { // 5 + %init(gVersion5); + } + if (version6()) { // 6 + %init(gVersion6); + } + if (version7()) { // 7 + %init(gVersion7); + } + if (version8()) { // 8 + %init(gVersion8); + } + if (version9()) { // 9 + %init(gVersion9); + } + if (version10()) { // 10 + %init(gVersion10); + } + if (version11()) { // 11 + %init(gVersion11); + } + if (version12()) { // 12 + %init(gVersion12); + } + if (version13()) { // 13 + %init(gVersion13); + } + if (version14()) { // 14 + %init(gVersion14); + } + if (version15()) { // 15 + %init(gVersion15); + } + if (version16()) { // 16 + %init(gVersion16); + } + if (version17()) { // 17 + %init(gVersion17); + } + if (version18()) { // 18 + %init(gVersion18); + } + if (version19()) { // 19 + %init(gVersion19); + } + if (version20()) { // 20 + %init(gVersion20); + } + if (version21()) { // 21 + %init(gVersion21); + } + if (version22()) { // 22 + %init(gVersion22); + } + if (version23()) { // 23 + %init(gVersion23); + } + if (version24()) { // 24 + %init(gVersion24); + } + if (version25()) { // 25 + %init(gVersion25); + } + if (version26()) { // 26 + %init(gVersion26); + } + if (version27()) { // 27 + %init(gVersion27); + } + if (version28()) { // 28 + %init(gVersion28); + } + if (version29()) { // 29 + %init(gVersion29); + } + if (version30()) { // 30 + %init(gVersion30); + } + if (version31()) { // 31 + %init(gVersion31); + } + if (version32()) { // 32 + %init(gVersion32); + } + if (version33()) { // 33 + %init(gVersion33); + } + if (version34()) { // 34 + %init(gVersion34); + } + if (version35()) { // 35 + %init(gVersion35); + } + if (version36()) { // 36 + %init(gVersion36); + } + if (version37()) { // 37 + %init(gVersion37); + } + if (version38()) { // 38 + %init(gVersion38); + } + if (version39()) { // 39 + %init(gVersion39); + } + if (version40()) { // 40 + %init(gVersion40); + } + if (version41()) { // 41 + %init(gVersion41); + } + if (version42()) { // 42 + %init(gVersion42); + } + if (version43()) { // 43 + %init(gVersion43); + } + if (version44()) { // 44 + %init(gVersion44); + } + if (version45()) { // 45 + %init(gVersion45); + } + if (version46()) { // 46 + %init(gVersion46); + } + if (version47()) { // 47 + %init(gVersion47); + } + if (version48()) { // 48 + %init(gVersion48); + } + if (version49()) { // 49 + %init(gVersion49); + } + if (version50()) { // 50 + %init(gVersion50); + } + if (version51()) { // 51 + %init(gVersion51); + } + if (version52()) { // 52 + %init(gVersion52); + } + if (version53()) { // 53 + %init(gVersion53); + } + if (version54()) { // 54 + %init(gVersion54); + } + if (version55()) { // 55 + %init(gVersion55); + } + if (version56()) { // 56 + %init(gVersion56); + } + if (version57()) { // 57 + %init(gVersion57); + } + if (version58()) { // 58 + %init(gVersion58); + } + if (version59()) { // 59 + %init(gVersion59); + } + if (version60()) { // 60 + %init(gVersion60); + } + if (version61()) { // 61 + %init(gVersion61); + } + if (version62()) { // 62 + %init(gVersion62); + } + if (version63()) { // 63 + %init(gVersion63); + } + if (version64()) { // 64 + %init(gVersion64); + } + if (version65()) { // 65 + %init(gVersion65); + } + if (version66()) { // 66 + %init(gVersion66); + } + if (version67()) { // 67 + %init(gVersion67); + } + if (version68()) { // 68 + %init(gVersion68); + } + if (version69()) { // 69 + %init(gVersion69); + } + if (version70()) { // 70 + %init(gVersion70); + } + if (version71()) { // 71 + %init(gVersion71); + } + if (version72()) { // 72 + %init(gVersion72); + } + if (version73()) { // 73 + %init(gVersion73); + } + if (version74()) { // 74 + %init(gVersion74); + } + if (version75()) { // 75 + %init(gVersion75); + } + if (version76()) { // 76 + %init(gVersion76); + } + if (version77()) { // 77 + %init(gVersion77); + } + if (version78()) { // 78 + %init(gVersion78); + } + if (version79()) { // 79 + %init(gVersion79); + } + if (version80()) { // 80 + %init(gVersion80); + } + if (version81()) { // 81 + %init(gVersion81); + } + if (version82()) { // 82 + %init(gVersion82); + } + if (version83()) { // 83 + %init(gVersion83); + } + if (version84()) { // 84 + %init(gVersion84); + } + if (version85()) { // 85 + %init(gVersion85); + } + if (version86()) { // 86 + %init(gVersion86); + } + if (version87()) { // 87 + %init(gVersion87); + } + if (version88()) { // 88 + %init(gVersion88); + } + if (version89()) { // 89 + %init(gVersion89); + } + if (version90()) { // 90 + %init(gVersion90); + } + if (version91()) { // 91 + %init(gVersion91); + } + if (version92()) { // 92 + %init(gVersion92); + } + if (version93()) { // 93 + %init(gVersion93); + } + if (version94()) { // 94 + %init(gVersion94); + } + if (version95()) { // 95 + %init(gVersion95); + } + if (version96()) { // 96 + %init(gVersion96); + } + if (version97()) { // 97 + %init(gVersion97); + } + if (version98()) { // 98 + %init(gVersion98); + } + if (version99()) { // 99 + %init(gVersion99); + } + if (version100()) { // 100 + %init(gVersion100); + } + if (version101()) { // 101 + %init(gVersion101); + } + if (version102()) { // 102 + %init(gVersion102); + } + if (version103()) { // 103 + %init(gVersion103); + } + if (version104()) { // 104 + %init(gVersion104); + } + if (version105()) { // 105 + %init(gVersion105); + } + if (version106()) { // 106 + %init(gVersion106); + } + if (version107()) { // 107 + %init(gVersion107); + } + if (version108()) { // 108 + %init(gVersion108); + } + if (version109()) { // 109 + %init(gVersion109); + } + if (version110()) { // 110 + %init(gVersion110); + } + if (version111()) { // 111 + %init(gVersion111); + } + if (version112()) { // 112 + %init(gVersion112); + } + if (version113()) { // 113 + %init(gVersion113); + } + if (version114()) { // 114 + %init(gVersion114); + } + if (version115()) { // 115 + %init(gVersion115); + } + if (version116()) { // 116 + %init(gVersion116); + } + if (version117()) { // 117 + %init(gVersion117); + } + if (version118()) { // 118 + %init(gVersion118); + } + if (version119()) { // 119 + %init(gVersion119); + } + if (version120()) { // 120 + %init(gVersion120); + } + if (version121()) { // 121 + %init(gVersion121); + } + if (version122()) { // 122 + %init(gVersion122); + } + if (version123()) { // 123 + %init(gVersion123); + } + if (version124()) { // 124 + %init(gVersion124); + } + if (version125()) { // 125 + %init(gVersion125); + } + if (version126()) { // 126 + %init(gVersion126); + } + if (version127()) { // 127 + %init(gVersion127); + } + if (version128()) { // 128 + %init(gVersion128); + } + if (version129()) { // 129 + %init(gVersion129); + } + if (version130()) { // 130 + %init(gVersion130); + } +} diff --git a/Source/update-submodules.txt b/Source/update-submodules.txt new file mode 100644 index 0000000..5823b70 --- /dev/null +++ b/Source/update-submodules.txt @@ -0,0 +1,86 @@ +// Template for whenever I refresh the main branch. and to re-add the submodules afterwards. + +name: Update Submodules + +on: + workflow_dispatch: + +jobs: + update-submodules: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3.5.3 + + - name: Set up Git + run: | + git config --global user.email "actions@github.com" + git config --global user.name "GitHub Actions" + + - name: Add uYouPlusExtra submodules + run: | + git submodule add https://github.com/michael-winay/YTNoCommunityPosts.git Tweaks/YTNoCommunityPosts +# git submodule add https://github.com/arichorn/YTHoldForSpeed.git Tweaks/YTHoldForSpeed + git add . + git commit -m "added uYouPlusExtra submodules" + git push origin + +# - name: Update submodules +# run: | +# git submodule update --init --recursive --remote +# git add . +# git commit -m "updated submodules" +# git push origin +# continue-on-error: true + + - name: Update submodules + run: | + git submodule update --init --recursive --remote Tweaks/Alderis + git add . + git submodule update --init --recursive --remote Tweaks/DontEatMyContent + git add . + git submodule update --init --recursive --remote Tweaks/PSHeader + git add . + git submodule update --init --recursive --remote Tweaks/Return-YouTube-Dislikes + git add . + git submodule update --init --recursive --remote Tweaks/YTABConfig + git add . + git submodule update --init --recursive --remote Tweaks/YTNoCommunityPosts + git add . + git submodule update --init --recursive --remote Tweaks/YTUHD + git add . + git submodule update --init --recursive --remote Tweaks/YTVideoOverlay + git add . + git submodule update --init --recursive --remote Tweaks/YouMute + git add . + git submodule update --init --recursive --remote Tweaks/YouPiP + git add . + git submodule update --init --recursive --remote Tweaks/YouQuality + git add . + git submodule update --init --recursive --remote Tweaks/YouTubeHeader + git add . + git submodule update --init --recursive --remote Tweaks/iSponsorBlock + git add . + git commit -m "updated submodules" + git push origin + continue-on-error: true + + - name: Make .bundle files + run: | + cd Bundles + ln -s ../Tweaks/YTVideoOverlay/layout/Library/Application\ Support/YTVideoOverlay.bundle YTVideoOverlay.bundle + ln -s ../Tweaks/YouMute/layout/Library/Application\ Support/YouMute.bundle YouMute.bundle + ln -s ../Tweaks/YouQuality/layout/Library/Application\ Support/YouQuality.bundle YouQuality.bundle + ln -s ../Tweaks/YTNoCommunityPosts/layout/Library/Application\ Support/YTNoCommunityPosts.bundle YTNoCommunityPosts.bundle + git add . + git commit -m "Added bundles" + git push origin + + - name: Check exit code + run: | + exit_code=$? + if [ $exit_code -ne 0 ]; then + echo "Submodule update failed with exit code $exit_code" + exit 1 + fi diff --git a/uYouPlus.xm b/uYouPlus.xm index 6f97767..5966028 100644 --- a/uYouPlus.xm +++ b/uYouPlus.xm @@ -19,15 +19,6 @@ NSBundle *tweakBundle = uYouPlusBundle(); static BOOL IsEnabled(NSString *key) { return [[NSUserDefaults standardUserDefaults] boolForKey:key]; } -static BOOL isDarkMode() { - return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1); -} -static BOOL oledDarkTheme() { - return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 1); -} -static BOOL oldDarkTheme() { - return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 2); -} // # pragma mark - uYou's patches @@ -51,33 +42,6 @@ static BOOL oldDarkTheme() { } %end -// Workaround for issue #54 -%hook YTMainAppVideoPlayerOverlayViewController -- (void)updateRelatedVideos { - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {} - else { return %orig; } -} -%end - -// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224 -%group iOS16 -%hook OBPrivacyLinkButton -%new -- (instancetype)initWithCaption:(NSString *)caption - buttonText:(NSString *)buttonText - image:(UIImage *)image - imageSize:(CGSize)imageSize - useLargeIcon:(BOOL)useLargeIcon { - return [self initWithCaption:caption - buttonText:buttonText - image:image - imageSize:imageSize - useLargeIcon:useLargeIcon - displayLanguage:[NSLocale currentLocale].languageCode]; -} -%end -%end - %hook YTAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { @@ -91,51 +55,55 @@ static BOOL oldDarkTheme() { } - (void)appWillResignActive:(id)arg1 { %orig; - if (IsEnabled(@"flex_enabled")) { + if (IsEnabled(@"flex_enabled")) { [[%c(FLEXManager) performSelector:@selector(sharedManager)] performSelector:@selector(showExplorer)]; } } %end # pragma mark - YouTube's patches -// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263 -%hook YTDataUtils -+ (NSMutableDictionary *)spamSignalsDictionary { - return nil; -} -+ (NSMutableDictionary *)spamSignalsDictionaryWithoutIDFA { - return nil; -} -%end - %hook YTHotConfig - (BOOL)disableAfmaIdfaCollection { return NO; } %end -// https://github.com/PoomSmart/YouTube-X/blob/1e62b68e9027fcb849a75f54a402a530385f2a51/Tweak.x#L27 -// %hook YTAdsInnerTubeContextDecorator -// - (void)decorateContext:(id)context {} -// %end - -// Hide YouTube annoying banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts -%hook YTAsyncCollectionView -- (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath { - UICollectionViewCell *cell = %orig; - if ([cell isKindOfClass:NSClassFromString(@"_ASCollectionViewCell")]) { - _ASCollectionViewCell *cell = %orig; - if ([cell respondsToSelector:@selector(node)]) { - if ([[[cell node] accessibilityIdentifier] isEqualToString:@"statement_banner.view"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; } - if ([[[cell node] accessibilityIdentifier] isEqualToString:@"compact.view"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; } - // if ([[[cell node] accessibilityIdentifier] isEqualToString:@"id.ui.video_metadata_carousel"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; } - } - } - return %orig; -} -%new -- (void)removeShortsAndFeaturesAdsAtIndexPath:(NSIndexPath *)indexPath { - [self deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; +// Remove “Play next in queue” from the menu (@PoomSmart) - qnblackcat/uYouPlus#1138 +%group gHidePlayNextInQueue +%hook YTMenuItemVisibilityHandler +- (BOOL)shouldShowServiceItemRenderer:(YTIMenuConditionalServiceItemRenderer *)renderer { + return renderer.icon.iconType == 251 ? NO : %orig; } %end +%end + +// Reposition "Create" Tab to the Center in the Pivot Bar - qnblackcat/uYouPlus#107 +/* +static void repositionCreateTab(YTIGuideResponse *response) { + NSMutableArray *renderers = [response itemsArray]; + for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) { + YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer]; + NSMutableArray *items = [pivotBarRenderer itemsArray]; + NSUInteger createIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:@"FEuploads"]; + }]; + if (createIndex != NSNotFound) { + YTIPivotBarSupportedRenderers *createTab = [items objectAtIndex:createIndex]; + [items removeObjectAtIndex:createIndex]; + NSUInteger centerIndex = items.count / 2; + [items insertObject:createTab atIndex:centerIndex]; // Reposition the "Create" tab at the center + } + } +} +%hook YTGuideServiceCoordinator +- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion { + repositionCreateTab(response); + %orig(response, completion); +} +- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion { + repositionCreateTab(response); + %orig(response, error, completion); +} +%end +*/ // Fix streched artwork in uYou's player view %hook ArtworkImageView @@ -152,13 +120,6 @@ static BOOL oldDarkTheme() { } %end -// Remove “Play next in queue” from the menu (@PoomSmart) - qnblackcat/uYouPlus#1138 -%hook YTMenuItemVisibilityHandler -- (BOOL)shouldShowServiceItemRenderer:(YTIMenuConditionalServiceItemRenderer *)renderer { - return renderer.icon.iconType == 251 ? NO : %orig; -} -%end - # pragma mark - Tweaks // IAmYouTube - https://github.com/PoomSmart/IAmYouTube/ %hook YTVersionUtils @@ -247,7 +208,7 @@ static BOOL oldDarkTheme() { } %end -//YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm +// YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm %hook MDXPlaybackRouteButtonController - (void)didPressButton:(id)arg1 { if (IsEnabled(@"castConfirm_enabled")) { @@ -264,15 +225,6 @@ static BOOL oldDarkTheme() { } %end -// Hide search ads by @PoomSmart - https://github.com/PoomSmart/YouTube-X -// %hook YTIElementRenderer -// - (NSData *)elementData { -// if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) -// return nil; -// return %orig; -// } -// %end - // %hook YTSectionListViewController // - (void)loadWithModel:(YTISectionListRenderer *)model { // NSMutableArray *contentsArray = model.contentsArray; @@ -287,13 +239,19 @@ static BOOL oldDarkTheme() { // %end // YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality -%hook YTVideoQualitySwitchControllerFactory -- (id)videoQualitySwitchControllerWithParentResponder:(id)responder { - Class originalClass = %c(YTVideoQualitySwitchOriginalController); - return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; -} +%hook YTIMediaQualitySettingsHotConfig // (works for YouTube 18.19.1-latest) + +%new(B@:) - (BOOL)enableQuickMenuVideoQualitySettings { return NO; } + %end +// %hook YTVideoQualitySwitchControllerFactory +// - (id)videoQualitySwitchControllerWithParentResponder:(id)responder { +// Class originalClass = %c(YTVideoQualitySwitchOriginalController); +// return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; +// } +// %end + // A/B flags %hook YTColdConfig - (BOOL)respectDeviceCaptionSetting { return NO; } // YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html @@ -327,6 +285,13 @@ static BOOL oldDarkTheme() { - (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {} %end +%hook YTIOfflineabilityFormat +%new +- (int)availabilityType { return 1; } +%new +- (BOOL)savedSettingShouldExpire { return NO; } +%end + // YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo %hook YTMainAppVideoPlayerOverlayViewController - (void)setPaidContentWithPlayerData:(id)data { @@ -346,6 +311,141 @@ static BOOL oldDarkTheme() { } %end +// Disable Wifi Related Settings - @arichorn +%group gDisableWifiRelatedSettings +%hook YTSettingsSectionItemManager +- (void)updatePremiumEarlyAccessSectionWithEntry:(id)arg1 {} // Try New Features +- (void)updateAutoplaySectionWithEntry:(id)arg1 {} // Autoplay +- (void)updateNotificationSectionWithEntry:(id)arg1 {} // Notifications +- (void)updateHistorySectionWithEntry:(id)arg1 {} // History +- (void)updatePrivacySectionWithEntry:(id)arg1 {} // Privacy +- (void)updateHistoryAndPrivacySectionWithEntry:(id)arg1 {} // History & Privacy +- (void)updateLiveChatSectionWithEntry:(id)arg1 {} // Live chat +%end +%end + +// YTNoModernUI - @arichorn +%group gYTNoModernUI +%hook YTVersionUtils // YTNoModernUI Original Version ++ (NSString *)appVersion { return @"17.38.10"; } +%end + +%hook YTSettingsCell // made by Dayanch96 +- (void)setDetailText:(id)arg1 { + NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; + NSString *appVersion = infoDictionary[@"CFBundleShortVersionString"]; + + if ([arg1 isEqualToString:@"17.38.10"]) { + arg1 = appVersion; + } %orig(arg1); +} +%end + +%hook YTInlinePlayerBarContainerView // Red Progress Bar - YTNoModernUI +- (id)quietProgressBarColor { + return [UIColor redColor]; +} +%end + +%hook YTSegmentableInlinePlayerBarView // Old Buffer Bar - YTNoModernUI +- (void)setBufferedProgressBarColor:(id)arg1 { + [UIColor colorWithRed:0.65 green:0.65 blue:0.65 alpha:0.60]; +} +%end + +%hook YTQTMButton +- (BOOL)buttonModernizationEnabled { return NO; } +%end + +%hook YTSearchBarView +- (BOOL)_roundedSearchBarEnabled { return NO; } +%end + +%hook YTColdConfig +// Disable Modern Content - YTNoModernUI +- (BOOL)creatorClientConfigEnableStudioModernizedMdeThumbnailPickerForClient { return NO; } +- (BOOL)cxClientEnableModernizedActionSheet { return NO; } +- (BOOL)enableClientShortsSheetsModernization { return NO; } +- (BOOL)enableTimestampModernizationForNative { return NO; } +- (BOOL)mainAppCoreClientIosEnableModernOssPage { return NO; } +- (BOOL)modernizeElementsTextColor { return NO; } +- (BOOL)modernizeElementsBgColor { return NO; } +- (BOOL)modernizeCollectionLockups { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableEpUxUpdates { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableModernButtonsForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableModernButtonsForNativeLongTail { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableModernTabsForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigIosEnableSnackbarModernization { return NO; } +// Disable Rounded Content - YTNoModernUI +- (BOOL)iosDownloadsPageRoundedThumbs { return NO; } +- (BOOL)iosRoundedSearchBarSuggestZeroPadding { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedThumbnailsForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedThumbnailsForNativeLongTail { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedTimestampForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedDialogForNative { return NO; } +// Disable Darker Dark Mode - YTNoModernUI +- (BOOL)enableDarkerDarkMode { return NO; } +- (BOOL)useDarkerPaletteBgColorForElements { return NO; } +- (BOOL)useDarkerPaletteTextColorForElements { return NO; } +- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteTextColorForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; } +// Disable Ambient Mode - YTNoModernUI +- (BOOL)disableCinematicForLowPowerMode { return NO; } +- (BOOL)enableCinematicContainer { return NO; } +- (BOOL)enableCinematicContainerOnClient { return NO; } +- (BOOL)enableCinematicContainerOnTablet { return NO; } +- (BOOL)iosCinematicContainerClientImprovement { return NO; } +- (BOOL)iosEnableGhostCardInlineTitleCinematicContainerFix { return NO; } +- (BOOL)iosUseFineScrubberMosaicStoreForCinematic { return NO; } +- (BOOL)mainAppCoreClientEnableClientCinematicPlaylists { return NO; } +- (BOOL)mainAppCoreClientEnableClientCinematicPlaylistsPostMvp { return NO; } +- (BOOL)mainAppCoreClientEnableClientCinematicTablets { return NO; } +// 16.42.3 Styled YouTube Channel Page Interface - YTNoModernUI +- (BOOL)channelsClientConfigIosChannelNavRestructuring { return NO; } +- (BOOL)channelsClientConfigIosMultiPartChannelHeader { return NO; } +// Disable Optional Content - YTNoModernUI +- (BOOL)elementsClientIosElementsEnableLayoutUpdateForIob { return NO; } +- (BOOL)supportElementsInMenuItemSupportedRenderers { return NO; } +- (BOOL)isNewRadioButtonStyleEnabled { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableButtonSentenceCasingForNative { return NO; } +%end + +%hook YTHotConfig +- (BOOL)liveChatIosUseModernRotationDetectiom { return NO; } // Disable Modern Content (YTHotConfig) +- (BOOL)iosShouldRepositionChannelBar { return NO; } +- (BOOL)enableElementRendererOnChannelCreation { return NO; } +%end +%end + +// Hide YouTube Logo +%group gHideYouTubeLogo +%hook YTHeaderLogoController +- (YTHeaderLogoController *)init { + return NULL; +} +%end +%end + +// Hide YouTube Heatwaves in Video Player (YouTube v17.19.2-latest) - @level3tjg - https://www.reddit.com/r/jailbreak/comments/v29yvk/ +%group gHideHeatwaves +%hook YTInlinePlayerBarContainerView +- (BOOL)canShowHeatwave { return NO; } +%end +%end + +# pragma mark - Hide Notification Button && SponsorBlock Button +%hook YTRightNavigationButtons +- (void)layoutSubviews { + %orig; + if (IsEnabled(@"hideNotificationButton_enabled")) { + self.notificationButton.hidden = YES; + } + if (IsEnabled(@"hideSponsorBlockButton_enabled")) { + self.sponsorBlockButton.hidden = YES; + } +} +%end + // YTReExplore: https://github.com/PoomSmart/YTReExplore/ %group gReExplore static void replaceTab(YTIGuideResponse *response) { @@ -381,6 +481,16 @@ static void replaceTab(YTIGuideResponse *response) { %end %end +// Hide Subscriptions Notification Badge +%group gHideSubscriptionsNotificationBadge +%hook YTPivotBarIndicatorView +- (void)didMoveToWindow { + [self setHidden:YES]; + %orig(); +} +%end +%end + // BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer %group Main %hook YTWatchMiniBarView @@ -407,12 +517,13 @@ static void replaceTab(YTIGuideResponse *response) { %end // YTSpeed - https://github.com/Lyvendia/YTSpeed +%group gYTSpeed %hook YTVarispeedSwitchController - (id)init { id result = %orig; - const int size = 12; - float speeds[] = {0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0}; + const int size = 17; + float speeds[] = {0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 5.0}; id varispeedSwitchControllerOptions[size]; for (int i = 0; i < size; ++i) { @@ -452,6 +563,7 @@ static void replaceTab(YTIGuideResponse *response) { %orig; } %end +%end # pragma mark - uYouPlus // Video Player Options @@ -460,6 +572,15 @@ static void replaceTab(YTIGuideResponse *response) { - (void)showConfirmAlert { [self confirmAlertDidPressConfirm]; } %end +// Portrait Fullscreen by Dayanch96 +%group gPortraitFullscreen +%hook YTWatchViewController +- (unsigned long long)allowedFullScreenOrientations { + return UIInterfaceOrientationMaskAllButUpsideDown; +} +%end +%end + // Disable snap to chapter %hook YTSegmentableInlinePlayerBarView - (void)didMoveToWindow { @@ -481,25 +602,26 @@ static void replaceTab(YTIGuideResponse *response) { %group gStockVolumeHUD %hook YTVolumeBarView - (void)volumeChanged:(id)arg1 { - %orig(nil); + %orig(nil); } %end %hook UIApplication - (void)setSystemVolumeHUDEnabled:(BOOL)arg1 forAudioCategory:(id)arg2 { - %orig(true, arg2); + %orig(true, arg2); } %end %end -%hook YTDoubleTapToSeekController -- (void)enableDoubleTapToSeek:(BOOL)arg1 { - return IsEnabled(@"doubleTapToSeek_disabled") ? %orig(NO) : %orig; +// Disable Double Tap to Seek +%hook YTMainAppVideoPlayerOverlayViewController +- (BOOL)allowDoubleTapToSeekGestureRecognizer { + return IsEnabled(@"disableDoubleTapToSkip_enabled") ? NO : %orig; } %end // Video Controls Overlay Options -// Hide CC / Autoplay switch +// Hide CC / Autoplay switch / Enable Share Button / Enable Save to Playlist Button %hook YTMainAppControlsOverlayView - (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { // hide CC button return IsEnabled(@"hideCC_enabled") ? %orig(NO) : %orig; @@ -508,6 +630,20 @@ static void replaceTab(YTIGuideResponse *response) { if (IsEnabled(@"hideAutoplaySwitch_enabled")) {} else { return %orig; } } +- (void)setShareButtonAvailable:(BOOL)arg1 { + if (IsEnabled(@"enableShareButton_enabled")) { + %orig(YES); + } else { + %orig(NO); + } +} +- (void)setAddToButtonAvailable:(BOOL)arg1 { + if (IsEnabled(@"enableSaveToButton_enabled")) { + %orig(YES); + } else { + %orig(NO); + } +} %end // Hide HUD Messages @@ -531,6 +667,27 @@ static void replaceTab(YTIGuideResponse *response) { - (BOOL)removeNextPaddleForSingletonVideos { return YES; } - (BOOL)removePreviousPaddleForSingletonVideos { return YES; } %end + +// %hook YTMainAppControlsOverlayView // this is only used for v16.42.3 (incompatible with YouTube v17.xx.x-newer) +// - (void)layoutSubviews { // hide Next & Previous legacy buttons +// %orig; +// if (IsEnabled(@"hidePreviousAndNextButton_enabled")) { +// MSHookIvar(self, "_nextButton").hidden = YES; +// MSHookIvar(self, "_previousButton").hidden = YES; +// MSHookIvar(self, "_nextButtonView").hidden = YES; +// MSHookIvar(self, "_previousButtonView").hidden = YES; +// } +// } +// %end +%end + +// Hide Dark Overlay Background +%group gHideOverlayDarkBackground +%hook YTMainAppVideoPlayerOverlayView +- (void)setBackgroundVisible:(BOOL)arg1 isGradientBackground:(BOOL)arg2 { + %orig(NO, arg2); +} +%end %end // Replace Next & Previous button with Fast forward & Rewind button @@ -541,13 +698,35 @@ static void replaceTab(YTIGuideResponse *response) { %end %end -// Bring back the red progress bar - Broken?! +// Hide Shadow Overlay Buttons (Play/Pause, Next, previous, Fast forward & Rewind buttons) +%group gHideVideoPlayerShadowOverlayButtons +%hook YTMainAppControlsOverlayView +- (void)layoutSubviews { + %orig(); + MSHookIvar(self, "_previousButtonView").backgroundColor = nil; + MSHookIvar(self, "_nextButtonView").backgroundColor = nil; + MSHookIvar(self, "_seekBackwardAccessibilityButtonView").backgroundColor = nil; + MSHookIvar(self, "_seekForwardAccessibilityButtonView").backgroundColor = nil; + MSHookIvar(self, "_playPauseButton").backgroundColor = nil; +} +%end +%end + +// Bring back the Red Progress Bar and Gray Buffer Progress +%group gRedProgressBar %hook YTInlinePlayerBarContainerView - (id)quietProgressBarColor { - return IsEnabled(@"redProgressBar_enabled") ? [UIColor redColor] : %orig; + return [UIColor redColor]; } %end +%hook YTSegmentableInlinePlayerBarView +- (void)setBufferedProgressBarColor:(id)arg1 { + [UIColor colorWithRed:1.00 green:1.00 blue:1.00 alpha:0.90]; +} +%end +%end + // Disable the right panel in fullscreen mode %hook YTColdConfig - (BOOL)isLandscapeEngagementPanelEnabled { @@ -578,334 +757,6 @@ static void replaceTab(YTIGuideResponse *response) { } %end -// Theme Options -// Old dark theme (gray) -%group gOldDarkTheme -%hook YTColdConfig -- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; } -- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteTextColorForNative { return NO; } -- (BOOL)enableCinematicContainerOnClient { return NO; } -%end - -%hook _ASDisplayView -- (void)didMoveToWindow { - %orig; - if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor clearColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor clearColor]; } -} -%end - -%hook ASCollectionView -- (void)didMoveToWindow { - %orig; - self.superview.backgroundColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]; -} -%end - -%hook YTFullscreenEngagementOverlayView -- (void)didMoveToWindow { - %orig; - self.subviews[0].backgroundColor = [UIColor clearColor]; -} -%end - -%hook YTRelatedVideosView -- (void)didMoveToWindow { - %orig; - self.subviews[0].backgroundColor = [UIColor clearColor]; -} -%end -%end - -// OLED dark mode by BandarHL -UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0]; -%group gOLED -%hook YTCommonColorPalette -- (UIColor *)baseBackground { - return self.pageStyle == 1 ? [UIColor blackColor] : %orig; -} -- (UIColor *)brandBackgroundSolid { - return self.pageStyle == 1 ? [UIColor blackColor] : %orig; -} -- (UIColor *)brandBackgroundPrimary { - return self.pageStyle == 1 ? [UIColor blackColor] : %orig; -} -- (UIColor *)brandBackgroundSecondary { - return self.pageStyle == 1 ? [[UIColor blackColor] colorWithAlphaComponent:0.9] : %orig; -} -- (UIColor *)raisedBackground { - return self.pageStyle == 1 ? [UIColor blackColor] : %orig; -} -- (UIColor *)staticBrandBlack { - return self.pageStyle == 1 ? [UIColor blackColor] : %orig; -} -- (UIColor *)generalBackgroundA { - return self.pageStyle == 1 ? [UIColor blackColor] : %orig; -} -%end - -// uYou settings -%hook UITableViewCell -- (void)_layoutSystemBackgroundView { - %orig; - NSString *backgroundViewKey = class_getInstanceVariable(self.class, "_colorView") ? @"_colorView" : @"_backgroundView"; - ((UIView *)[[self valueForKey:@"_systemBackgroundView"] valueForKey:backgroundViewKey]).backgroundColor = [UIColor blackColor]; -} -- (void)_layoutSystemBackgroundView:(BOOL)arg1 { - %orig; - ((UIView *)[[self valueForKey:@"_systemBackgroundView"] valueForKey:@"_colorView"]).backgroundColor = [UIColor blackColor]; -} -%end - -%hook settingsReorderTable -- (void)viewDidLayoutSubviews { - %orig; - self.tableView.backgroundColor = [UIColor blackColor]; -} -%end - -%hook FRPSelectListTable -- (void)viewDidLayoutSubviews { - %orig; - self.tableView.backgroundColor = [UIColor blackColor]; -} -%end - -%hook FRPreferences -- (void)viewDidLayoutSubviews { - %orig; - self.tableView.backgroundColor = [UIColor blackColor]; -} -%end - -%hook YTInnerTubeCollectionViewController -- (UIColor *)backgroundColor:(NSInteger)pageStyle { - return pageStyle == 1 ? [UIColor blackColor] : %orig; -} -%end - -// Explore -%hook ASScrollView -- (void)didMoveToWindow { - %orig; - if (isDarkMode()) { - self.backgroundColor = [UIColor clearColor]; - } -} -%end - -// Your videos -%hook ASCollectionView -- (void)didMoveToWindow { - %orig; - if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) { - self.superview.backgroundColor = [UIColor blackColor]; - } -} -%end - -// Sub menu? -%hook ELMView -- (void)didMoveToWindow { - %orig; - if (isDarkMode()) { - self.subviews[0].backgroundColor = [UIColor clearColor]; - } -} -%end - -// iSponsorBlock -%hook SponsorBlockSettingsController -- (void)viewDidLoad { - if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { - %orig; - self.tableView.backgroundColor = [UIColor blackColor]; - } else { return %orig; } -} -%end - -%hook SponsorBlockViewController -- (void)viewDidLoad { - if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { - %orig; - self.view.backgroundColor = [UIColor blackColor]; - } else { return %orig; } -} -%end - -// Search View -%hook YTSearchBarView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -// History Search view -%hook YTSearchBoxView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; - -} -%end - -// Comment view -%hook YTCommentView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -%hook YTCreateCommentAccessoryView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -%hook YTCreateCommentTextView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment - return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; -} -%end - -%hook YTCommentDetailHeaderCell -- (void)didMoveToWindow { - %orig; - if (isDarkMode()) { - self.subviews[2].backgroundColor = [UIColor blackColor]; - } -} -%end - -%hook YTFormattedStringLabel // YT is werid... -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor clearColor]) : %orig; -} -%end - -// Live chat comment -%hook YCHLiveChatActionPanelView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -%hook YTEmojiTextView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -%hook YCHLiveChatView -- (void)didMoveToWindow { - %orig; - if (isDarkMode()) { - self.subviews[1].backgroundColor = [UIColor blackColor]; - } -} -%end - -%hook YTCollectionView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -// -%hook YTBackstageCreateRepostDetailView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - -// Others -%hook _ASDisplayView -- (void)didMoveToWindow { - %orig; - if (isDarkMode()) { - if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"eml.live_chat_text_message"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; } - } -} -%end - -// Open link with... -%hook ASWAppSwitchingSheetHeaderView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig(raisedColor) : %orig; -} -%end - -%hook ASWAppSwitchingSheetFooterView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig(raisedColor) : %orig; -} -%end - -%hook ASWAppSwitcherCollectionViewCell -- (void)didMoveToWindow { - %orig; - if (isDarkMode()) { - self.backgroundColor = raisedColor; - self.subviews[1].backgroundColor = raisedColor; - self.superview.backgroundColor = raisedColor; - } -} -%end - -// Incompatibility with the new YT Dark theme -%hook YTColdConfig -- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; } -%end -%end - -// OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e -%group gOLEDKB -%hook UIPredictionViewController -- (void)loadView { - %orig; - [self.view setBackgroundColor:[UIColor blackColor]]; -} -%end - -%hook UICandidateViewController -- (void)loadView { - %orig; - [self.view setBackgroundColor:[UIColor blackColor]]; -} -%end - -%hook UIKeyboardDockView -- (void)didMoveToWindow { - %orig; - self.backgroundColor = [UIColor blackColor]; -} -%end - -%hook UIKeyboardLayoutStar -- (void)didMoveToWindow { - %orig; - self.backgroundColor = [UIColor blackColor]; -} -%end - -%hook UIKBRenderConfig // Prediction text color -- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); } -%end -%end - // Miscellaneous // Disable hints - https://github.com/LillieH001/YouTube-Reborn/blob/v4/ %group gDisableHints @@ -927,6 +778,13 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %end %end +// Stick Navigation bar +%group gStickNavigationBar +%hook YTHeaderView +- (BOOL)stickyNavHeaderEnabled { return YES; } +%end +%end + // Hide the Chip Bar (Upper Bar) in Home feed %group gHideChipBar %hook YTMySubsFilterHeaderView @@ -940,6 +798,14 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %hook YTHeaderContentComboView - (void)setFeedHeaderScrollMode:(int)arg1 { %orig(0); } %end + +// Hide the chip bar under the video player? +// %hook YTChipCloudCell // +// - (void)didMoveToWindow { +// %orig; +// self.hidden = YES; +// } +// %end %end %group giPhoneLayout @@ -955,12 +821,12 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %end %hook UIKBTree - (long long)nativeIdiom { - return YES; + return NO; } %end %hook UIKBRenderer - (long long)assetIdiom { - return YES; + return NO; } %end %end @@ -978,59 +844,83 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: // dlopen([[NSString stringWithFormat:@"%@/Frameworks/uYou.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY); %init; - if (@available(iOS 16, *)) { - %init(iOS16); - } if (IsEnabled(@"reExplore_enabled")) { %init(gReExplore); } if (IsEnabled(@"bigYTMiniPlayer_enabled") && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) { %init(Main); } + if (IsEnabled(@"hideSubscriptionsNotificationBadge_enabled")) { + %init(gHideSubscriptionsNotificationBadge); + } if (IsEnabled(@"hidePreviousAndNextButton_enabled")) { %init(gHidePreviousAndNextButton); } if (IsEnabled(@"replacePreviousAndNextButton_enabled")) { %init(gReplacePreviousAndNextButton); } - if (oledDarkTheme()) { - %init(gOLED); + if (IsEnabled(@"hideOverlayDarkBackground_enabled")) { + %init(gHideOverlayDarkBackground); } - if (oldDarkTheme()) { - %init(gOldDarkTheme) + if (IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled")) { + %init(gHideVideoPlayerShadowOverlayButtons); } - if (IsEnabled(@"oledKeyBoard_enabled")) { - %init(gOLEDKB); + if (IsEnabled(@"hidePlayNextInQueue_enabled")) { + %init(gHidePlayNextInQueue); + } + if (IsEnabled(@"disableWifiRelatedSettings_enabled")) { + %init(gDisableWifiRelatedSettings); } if (IsEnabled(@"disableHints_enabled")) { %init(gDisableHints); } + if (IsEnabled(@"redProgressBar_enabled")) { + %init(gRedProgressBar); + } + if (IsEnabled(@"stickNavigationBar_enabled")) { + %init(gStickNavigationBar); + } if (IsEnabled(@"hideChipBar_enabled")) { %init(gHideChipBar); } + if (IsEnabled(@"ytSpeed_enabled")) { + %init(gYTSpeed); + } + if (IsEnabled(@"portraitFullscreen_enabled")) { + %init(gPortraitFullscreen); + } if (IsEnabled(@"iPhoneLayout_enabled") && (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)) { %init(giPhoneLayout); } if (IsEnabled(@"stockVolumeHUD_enabled")) { %init(gStockVolumeHUD); } + if (IsEnabled(@"hideYouTubeLogo_enabled")) { + %init(gHideYouTubeLogo); + } + if (IsEnabled(@"hideHeatwaves_enabled")) { + %init(gHideHeatwaves); + } + if (IsEnabled(@"ytNoModernUI_enabled")) { + %init(gYTNoModernUI); + } // Disable updates [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"automaticallyCheckForUpdates"]; // Don't show uYou's welcome screen cuz it's currently broken (fix #1147) [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"showedWelcomeVC"]; - + // Disable broken options of uYou - [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"disableAgeRestriction"]; - + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"disableAgeRestriction"]; // Disable Age Restriction Disabled - Reason is the same as above. + // Change the default value of some options NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; if (![allKeys containsObject:@"relatedVideosAtTheEndOfYTVideos"]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"]; } if (![allKeys containsObject:@"shortsProgressBar"]) { - [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"shortsProgressBar"]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"shortsProgressBar"]; } if (![allKeys containsObject:@"RYD-ENABLED"]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"];