From ca57262430955361c53d7e14c2bbd420b4d4de59 Mon Sep 17 00:00:00 2001 From: qnblackcat Date: Mon, 18 Apr 2022 23:22:21 +0700 Subject: [PATCH] YTAutoFullScreen (PoomSmart), hide HUD messages, OLED Dark mode --- uYouPlus.x | 100 ------------ uYouPlus.xm | 440 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 440 insertions(+), 100 deletions(-) delete mode 100644 uYouPlus.x create mode 100644 uYouPlus.xm diff --git a/uYouPlus.x b/uYouPlus.x deleted file mode 100644 index 202bbd5..0000000 --- a/uYouPlus.x +++ /dev/null @@ -1,100 +0,0 @@ -#import -#import - -// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12 - -%hook YTAdsInnerTubeContextDecorator -- (void)decorateContext:(id)arg1 { - %orig(nil); -} -%end - - -// YouRememberCaption: https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/ - -%hook YTColdConfig -- (BOOL)respectDeviceCaptionSetting { - return NO; -} -%end - - -// YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality - -@interface YTVideoQualitySwitchOriginalController : NSObject -- (instancetype)initWithParentResponder:(id)responder; -@end - -%hook YTVideoQualitySwitchControllerFactory - -- (id)videoQualitySwitchControllerWithParentResponder:(id)responder { - Class originalClass = %c(YTVideoQualitySwitchOriginalController); - return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; -} -%end - - -// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html - -%hook YTHotConfig - -- (BOOL)isPromptForLocalNetworkPermissionsEnabled { - return NO; -} -%end - -// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards - -@interface YTCollectionViewCell : UICollectionViewCell -@end - -@interface YTSettingsCell : YTCollectionViewCell -@end - -@interface YTSettingsSectionItem : NSObject -@property BOOL hasSwitch; -@property BOOL switchVisible; -@property BOOL on; -@property BOOL (^switchBlock)(YTSettingsCell *, BOOL); -@property int settingItemId; -- (instancetype)initWithTitle:(NSString *)title titleDescription:(NSString *)titleDescription; -@end - -%hook YTSettingsViewController -- (void)setSectionItems:(NSMutableArray *)sectionItems forCategory:(NSInteger)category title:(NSString *)title titleDescription:(NSString *)titleDescription headerHidden:(BOOL)headerHidden { - if (category == 1) { - NSInteger appropriateIdx = [sectionItems indexOfObjectPassingTest:^BOOL(YTSettingsSectionItem *item, NSUInteger idx, BOOL *stop) { - return item.settingItemId == 294; - }]; - if (appropriateIdx != NSNotFound) { - YTSettingsSectionItem *hoverCardItem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Show End screens hover cards" titleDescription:@"Allows creator End screens (thumbnails) to appear at the end of videos"]; - hoverCardItem.hasSwitch = YES; - hoverCardItem.switchVisible = YES; - hoverCardItem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"]; - hoverCardItem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { - [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hover_cards_enabled"]; - return YES; - }; - [sectionItems insertObject:hoverCardItem atIndex:appropriateIdx + 1]; - } - } - %orig; -} -%end - -%hook YTCreatorEndscreenView -- (void)setHidden:(BOOL)hidden { - if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"]) - hidden = YES; - %orig; -} -%end - - -// YTSystemAppearance: https://poomsmart.github.io/repo/depictions/ytsystemappearance.html - -%hook YTColdConfig -- (BOOL)shouldUseAppThemeSetting { - return YES; -} -%end diff --git a/uYouPlus.xm b/uYouPlus.xm new file mode 100644 index 0000000..411fbee --- /dev/null +++ b/uYouPlus.xm @@ -0,0 +1,440 @@ +#import +#import +#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h" +#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h" +#import "Tweaks/YouTubeHeader/YTPlayerViewController.h" +#import "Tweaks/YouTubeHeader/YTWatchController.h" + +@interface YTAsyncCollectionView : UIView +@end +@interface YTPlayerViewController (YTAFS) +- (void)autoFullscreen; +@end + +UIColor* oledColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0]; + +BOOL hideHUD() { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"]; +} +BOOL oled() { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"]; +} +BOOL autoFullScreen() { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"autofull_enabled"]; +} +BOOL noHoverCard() { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"]; +} + +//Settings +%hook YTSettingsViewController +- (void)setSectionItems:(NSMutableArray *)sectionItems forCategory:(NSInteger)category title:(NSString *)title titleDescription:(NSString *)titleDescription headerHidden:(BOOL)headerHidden { + if (category == 1) { + NSUInteger statsForNerdsIndex = [sectionItems indexOfObjectPassingTest:^BOOL (YTSettingsSectionItem *item, NSUInteger idx, BOOL *stop) { + return item.settingItemId == 265; + }]; + if (statsForNerdsIndex != NSNotFound) { + // + YTSettingsSectionItem *hideHUD = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide HUD Messages" titleDescription:@"Example: CC is turned on/off, Video loop is on,... App restart is required."]; + hideHUD.hasSwitch = YES; + hideHUD.switchVisible = YES; + hideHUD.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"]; + hideHUD.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"]; + return YES; + }; + [sectionItems insertObject:hideHUD atIndex:statsForNerdsIndex]; + // + YTSettingsSectionItem *Oleditem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"OLED Dark mode (Experimental)" titleDescription:@"WARNING: You must set YouTube's appearance to Dark theme before enabling OLED dark mode (not tested on iPad yet). App restart is required."]; + Oleditem.hasSwitch = YES; + Oleditem.switchVisible = YES; + Oleditem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"]; + Oleditem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oled_enabled"]; + return YES; + }; + [sectionItems insertObject:Oleditem atIndex:statsForNerdsIndex - 11]; + // + YTSettingsSectionItem *autoFUll = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Auto Full Screen" titleDescription:@"Autoplay videos at full screen."]; + autoFUll.hasSwitch = YES; + autoFUll.switchVisible = YES; + autoFUll.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"autofull_enabled"]; + autoFUll.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autofull_enabled"]; + return YES; + }; + [sectionItems insertObject:autoFUll atIndex:statsForNerdsIndex + 1]; + // + YTSettingsSectionItem *hoverCardItem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Show End screens hover cards" titleDescription:@"Allows creator End screens (thumbnails) to appear at the end of videos."]; + hoverCardItem.hasSwitch = YES; + hoverCardItem.switchVisible = YES; + hoverCardItem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"]; + hoverCardItem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hover_cards_enabled"]; + return YES; + }; + [sectionItems insertObject:hoverCardItem atIndex:statsForNerdsIndex + 4]; + } + } + %orig; + } +%end + +// Hide HUD Messages +%hook YTHUDMessageView +- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { +if (hideHUD()) + return NULL; +else + return %orig; +} +%end + +// YTAutoFullScreen: https://github.com/PoomSmart/YTAutoFullScreen/ +%hook YTPlayerViewController +- (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 { +if (autoFullScreen()) { + %orig; + [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO]; + } else { return %orig; } +} +%new +- (void)autoFullscreen { + YTWatchController *watchController = [self valueForKey:@"_UIDelegate"]; + [watchController showFullScreen]; +} +%end + +// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards +%hook YTCreatorEndscreenView +- (void)setHidden:(BOOL)hidden { +if (!noHoverCard()) + hidden = YES; + %orig; +} +%end + +// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12 +%hook YTAdsInnerTubeContextDecorator +- (void)decorateContext:(id)arg1 { %orig(nil); } +%end + +// YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality +%hook YTVideoQualitySwitchControllerFactory +- (id)videoQualitySwitchControllerWithParentResponder:(id)responder { + Class originalClass = %c(YTVideoQualitySwitchOriginalController); + return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; +} +%end + +// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html +%hook YTHotConfig +- (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; } +%end + +// YTSystemAppearance: https://poomsmart.github.io/repo/depictions/ytsystemappearance.html +// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html +%hook YTColdConfig +- (BOOL)shouldUseAppThemeSetting { return YES; } +- (BOOL)respectDeviceCaptionSetting { return NO; } +%end + +// OLED Dark mode +// Thanks u/DGh0st for his very well explained comment - https://www.reddit.com/r/jailbreakdevelopers/comments/9uape7/comment/e94sq80/ +// Thanks sinfool for his flex patch which brings OLED Dark mode for YouTube - "Color Customizer (YouTube) OLED" +%group gOLED +%hook UIView +-(void)setBackgroundColor:(id)arg1 { + if ([self.nextResponder isKindOfClass:%c(DownloadedVC)]) //uYou + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(DownloadsPagerVC)]) //uYou + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTLinkCell)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTCommentsHeaderView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTSearchView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTSearchBoxView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTEngagementPanelHeaderView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTEngagementPanelView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTPivotBarView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTHUDMessageView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTChipCloudCell)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YCHLiveChatTextCell)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YCHLiveChatViewerEngagementCell)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTSlideForActionsView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTPlaylistHeaderView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTAsyncCollectionView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTFeedHeaderView)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTMessageCell)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(YTPlaylistPanelProminentThumbnailVideoCell)]) + arg1 = oledColor; + if ([self.nextResponder isKindOfClass:%c(ASWAppSwitcherCollectionViewCell)]) + arg1 = oledColor; + %orig; + } +%end + +%hook YTAsyncCollectionView +-(void)setBackgroundColor:(id)arg1 { + if([self.nextResponder isKindOfClass:%c(YTRelatedVideosCollectionViewController)]) { + arg1 = [oledColor colorWithAlphaComponent:0.0]; + } else if([self.nextResponder isKindOfClass:%c(YTFullscreenMetadataHighlightsCollectionViewController)]) { + arg1 = [oledColor colorWithAlphaComponent:0.0]; + } else { + arg1 = oledColor; + %orig; + } +} +%end + +%hook YTTopAlignedView // Example from Dune - https://github.com/Skittyblock/Dune/blob/9b1df9790230115b7553cc9dbadf36889018d7f9/Tweak.xm#L700 +-(void)layoutSubviews { + %orig; + MSHookIvar(self, "_contentView").backgroundColor = oledColor; +} +%end + +%hook MDXQueueView // Cast queue +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTChannelProfileEditorView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTChannelSubMenuView // +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTChannelListSubMenuView // sub - +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTCommentView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTCreateCommentAccessoryView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTCreateCommentTextView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YCHLiveChatActionPanelView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTEmojiTextView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTShareTitleView // Share sheet +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTNavigationBar +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +-(void)setBarTintColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTPrivacyTosFooterView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTWatchMiniBarView +-(void)setBackgroundColor:(id)arg1 { + arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9]; + %orig; +} +%end + +%hook YTPlaylistMiniBarView +-(void)setBackgroundColor:(id)arg1 { + arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9]; + %orig; +} +%end + +%hook YTEngagementPanelHeaderView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTChannelMobileHeaderView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTInlineSignInView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTHeaderView //Stt bar +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTTabTitlesView // Tab bar - mychannel +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTSettingsCell // Settings +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook GOODialogView // 3 dots menu +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTCollectionView //sharesheet +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook ASWAppSwitchingSheetFooterView // open link +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook ASWAppSwitchingSheetHeaderView // open link +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTCollectionSeparatorView +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +- (void)layoutSubviews {} +%end + +%hook YTSearchSuggestionCollectionViewCell +-(void)updateColors {} +%end + +%hook UISearchBarBackground +-(void)setBarTintColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +/* +%hook YTChannelProfileDescriptionEditorView // edit profile Description +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +%hook YTChannelProfileNameEditorView // edit profile Name +-(void)setBackgroundColor:(id)arg1 { + arg1 = oledColor; + %orig; +} +%end + +hook GOOTextField +-(void)setBackgroundColor:(id)arg1 { // edit profile Description + arg1 = oledColor; + %orig; +} +%end + +%hook GOOMultilineTextField// +-(void)setBackgroundColor:(id)arg1 { // edit profile Name + arg1 = oledColor; + %orig; +} +%end +*/ + +%end + +%ctor { + %init; + if (oled()) { + %init(gOLED); + } +}