mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-10-30 12:33:57 -04:00
368 lines
19 KiB
Objective-C
368 lines
19 KiB
Objective-C
#import "Headers/SponsorBlockSettingsController.h"
|
|
#import "Headers/Localization.h"
|
|
|
|
@implementation SponsorBlockTableCell
|
|
- (void)colorPicker:(id)colorPicker didSelectColor:(UIColor *)color {
|
|
self.colorWell.color = color;
|
|
NSString *hexString = hexFromUIColor(color);
|
|
|
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
|
NSString *documentsDirectory = [paths objectAtIndex:0];
|
|
NSString *settingsPath = [documentsDirectory stringByAppendingPathComponent:@"iSponsorBlock.plist"];
|
|
NSMutableDictionary *settings = [NSMutableDictionary dictionary];
|
|
[settings addEntriesFromDictionary:[NSDictionary dictionaryWithContentsOfFile:settingsPath]];
|
|
NSDictionary *categorySettings = [settings objectForKey:@"categorySettings"];
|
|
|
|
[categorySettings setValue:hexString forKey:[NSString stringWithFormat:@"%@Color", self.category]];
|
|
[settings setValue:categorySettings forKey:@"categorySettings"];
|
|
[settings writeToURL:[NSURL fileURLWithPath:settingsPath isDirectory:NO] error:nil];
|
|
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.galacticdev.isponsorblockprefs.changed"), NULL, NULL, YES);
|
|
}
|
|
|
|
- (void)presentColorPicker:(UITableViewCell *)sender {
|
|
HBColorPickerViewController *viewController = [[objc_getClass("HBColorPickerViewController") alloc] init];
|
|
viewController.delegate = self;
|
|
viewController.popoverPresentationController.sourceView = self;
|
|
|
|
HBColorPickerConfiguration *configuration = [[objc_getClass("HBColorPickerConfiguration") alloc] initWithColor:self.colorWell.color];
|
|
configuration.supportsAlpha = NO;
|
|
viewController.configuration = configuration;
|
|
|
|
UIViewController *rootViewController = self._viewControllerForAncestor;
|
|
[rootViewController presentViewController:viewController animated:YES completion:nil];
|
|
|
|
//fixes the bottom of the color picker from getting cut off
|
|
viewController.view.frame = CGRectMake(0,-50, viewController.view.frame.size.width, viewController.view.frame.size.height);
|
|
}
|
|
@end
|
|
|
|
@implementation SponsorBlockSettingsController
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
UIBarButtonItem *dismissButton;
|
|
|
|
dismissButton = [[UIBarButtonItem alloc] initWithImage:[UIImage systemImageNamed:@"xmark"]
|
|
style:UIBarButtonItemStylePlain
|
|
target:self
|
|
action:@selector(dismissButtonTapped:)];
|
|
|
|
dismissButton.tintColor = [UIColor blackColor];
|
|
self.navigationItem.leftBarButtonItem = dismissButton;
|
|
|
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
|
NSString *documentsDirectory = [paths objectAtIndex:0];
|
|
self.settingsPath = [documentsDirectory stringByAppendingPathComponent:@"iSponsorBlock.plist"];
|
|
self.settings = [NSMutableDictionary dictionary];
|
|
[self.settings addEntriesFromDictionary:[NSDictionary dictionaryWithContentsOfFile:self.settingsPath]];
|
|
|
|
self.view.backgroundColor = UIColor.systemBackgroundColor;
|
|
|
|
//detects if device is an se gen 1 or not, crude fix for text getting cut off
|
|
if ([UIScreen mainScreen].bounds.size.width > 320) {
|
|
self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleInsetGrouped];
|
|
}
|
|
else {
|
|
self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped];
|
|
}
|
|
|
|
[self.view addSubview:self.tableView];
|
|
self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[self.tableView.heightAnchor constraintEqualToAnchor:self.view.heightAnchor].active = YES;
|
|
[self.tableView.widthAnchor constraintEqualToAnchor:self.view.widthAnchor].active = YES;
|
|
self.tableView.delegate = self;
|
|
self.tableView.dataSource = self;
|
|
|
|
NSBundle *tweakBundle = iSponsorBlockBundle();
|
|
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[tweakBundle pathForResource:@"LogoSponsorBlocker128px" ofType:@"png"]]];
|
|
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,0,0)];
|
|
label.text = @"iSponsorBlock";
|
|
label.font = [UIFont boldSystemFontOfSize:48];
|
|
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,200)];
|
|
[self.tableView.tableHeaderView addSubview:imageView];
|
|
[self.tableView.tableHeaderView addSubview:label];
|
|
|
|
self.tweakTitle = label.text;
|
|
|
|
imageView.translatesAutoresizingMaskIntoConstraints = NO;
|
|
label.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[imageView.centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor].active = YES;
|
|
[imageView.topAnchor constraintEqualToAnchor:self.tableView.tableHeaderView.topAnchor constant:5].active = YES;
|
|
[label.centerXAnchor constraintEqualToAnchor:imageView.centerXAnchor].active = YES;
|
|
[label.topAnchor constraintEqualToAnchor:imageView.bottomAnchor constant:5].active = YES;
|
|
|
|
//for dismissing num pad when tapping anywhere on the string
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)];
|
|
tap.cancelsTouchesInView = NO;
|
|
[self.view addGestureRecognizer:tap];
|
|
|
|
self.sectionTitles = @[LOC(@"Sponsor"), LOC(@"Intermission/IntroAnimation"), LOC(@"Endcards/Credits"), LOC(@"InteractionReminder"), LOC(@"Unpaid/SelfPromotion"), LOC(@"Non-MusicSection"), LOC(@"SponsorBlockUserID"), LOC(@"SponsorBlockAPIInstance")];
|
|
}
|
|
|
|
//Add iSponsorBlock text to Navbar label if header text out of screen
|
|
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
|
|
CGRect labelCellRect = [self.tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
|
|
CGRect visibleRect = CGRectMake(self.tableView.contentOffset.x,
|
|
self.tableView.contentOffset.y + self.navigationController.navigationBar.frame.size.height,
|
|
self.tableView.bounds.size.width,
|
|
self.tableView.bounds.size.height - self.navigationController.navigationBar.frame.size.height);
|
|
|
|
if (!CGRectContainsRect(visibleRect, labelCellRect)) {
|
|
self.title = self.tweakTitle;
|
|
[UIView animateWithDuration:0.3 animations:^{
|
|
self.navigationItem.titleView.alpha = 1.0;
|
|
}];
|
|
} else {
|
|
self.title = nil;
|
|
[UIView animateWithDuration:0.3 animations:^{
|
|
self.navigationItem.titleView.alpha = 0.0;
|
|
}];
|
|
}
|
|
}
|
|
|
|
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
|
|
return 18;
|
|
}
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
|
if (section == 0) return 1;
|
|
else if (section <= 6 || section == 17) return 2;
|
|
return 1;
|
|
}
|
|
|
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SponsorBlockCell"];
|
|
if (!cell) {
|
|
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SponsorBlocKCell"];
|
|
}
|
|
|
|
if (indexPath.section == 0) {
|
|
cell.textLabel.text = LOC(@"Enabled");
|
|
UISwitch *enabledSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0,0,51,31)];
|
|
cell.accessoryView = enabledSwitch;
|
|
[enabledSwitch addTarget:self action:@selector(enabledSwitchToggled:) forControlEvents:UIControlEventValueChanged];
|
|
if ([self.settings valueForKey:@"enabled"]) {
|
|
[enabledSwitch setOn:[[self.settings valueForKey:@"enabled"] boolValue] animated:NO];
|
|
}
|
|
else {
|
|
[enabledSwitch setOn:YES animated:NO];
|
|
[self enabledSwitchToggled:enabledSwitch];
|
|
}
|
|
return cell;
|
|
}
|
|
|
|
if (indexPath.section <= 6) {
|
|
SponsorBlockTableCell *tableCell = [[SponsorBlockTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SponsorBlockCell2"];
|
|
NSDictionary *categorySettings = [self.settings objectForKey:@"categorySettings"];
|
|
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:@[LOC(@"Disable"), LOC(@"AutoSkip"), LOC(@"ShowInSeekBar"), LOC(@"ManualSkip")]];
|
|
|
|
//make it so "Show in Seek Bar" text won't be cut off on certain devices
|
|
NSMutableArray *segments = [segmentedControl valueForKey:@"_segments"];
|
|
UISegment *segment = segments[2];
|
|
UILabel *label = [segment valueForKey:@"_info"];
|
|
label.adjustsFontSizeToFitWidth = YES;
|
|
|
|
switch (indexPath.section) {
|
|
case 1:
|
|
segmentedControl.selectedSegmentIndex = [[categorySettings objectForKey:@"sponsor"] intValue];
|
|
tableCell.category = @"sponsor";
|
|
break;
|
|
case 2:
|
|
segmentedControl.selectedSegmentIndex = [[categorySettings objectForKey:@"intro"] intValue];
|
|
tableCell.category = @"intro";
|
|
break;
|
|
case 3:
|
|
segmentedControl.selectedSegmentIndex = [[categorySettings objectForKey:@"outro"] intValue];
|
|
tableCell.category = @"outro";
|
|
break;
|
|
case 4:
|
|
segmentedControl.selectedSegmentIndex = [[categorySettings objectForKey:@"interaction"] intValue];
|
|
tableCell.category = @"interaction";
|
|
break;
|
|
case 5:
|
|
segmentedControl.selectedSegmentIndex = [[categorySettings objectForKey:@"selfpromo"] intValue];
|
|
tableCell.category = @"selfpromo";
|
|
break;
|
|
case 6:
|
|
segmentedControl.selectedSegmentIndex = [[categorySettings objectForKey:@"music_offtopic"] intValue];
|
|
tableCell.category = @"music_offtopic";
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
if (indexPath.row == 0) {
|
|
[segmentedControl addTarget:self action:@selector(categorySegmentSelected:) forControlEvents:UIControlEventValueChanged];
|
|
segmentedControl.apportionsSegmentWidthsByContent = YES;
|
|
[tableCell.contentView addSubview:segmentedControl];
|
|
segmentedControl.translatesAutoresizingMaskIntoConstraints = NO;
|
|
[segmentedControl.centerYAnchor constraintEqualToAnchor:tableCell.contentView.centerYAnchor].active = YES;
|
|
[segmentedControl.widthAnchor constraintEqualToAnchor:tableCell.contentView.widthAnchor].active = YES;
|
|
}
|
|
else {
|
|
tableCell.textLabel.text = LOC(@"SetColorToShowInSeekBar");
|
|
tableCell.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
HBColorWell *colorWell = [[objc_getClass("HBColorWell") alloc] initWithFrame:CGRectMake(0,0,32,32)];
|
|
[colorWell addTarget:tableCell action:@selector(presentColorPicker:) forControlEvents:UIControlEventTouchUpInside];
|
|
[colorWell addTarget:tableCell action:@selector(colorWellValueChanged:) forControlEvents:UIControlEventValueChanged];
|
|
UIColor *color = colorWithHexString([categorySettings objectForKey:[NSString stringWithFormat:@"%@Color", tableCell.category]]);
|
|
colorWell.color = color;
|
|
tableCell.accessoryView = colorWell;
|
|
tableCell.colorWell = colorWell;
|
|
}
|
|
return tableCell;
|
|
}
|
|
if (indexPath.section == 7) {
|
|
UITableViewCell *textCell = [[UITableViewCell alloc] initWithStyle:1000 reuseIdentifier:@"SponsorBlockTextCell"];
|
|
textCell.textLabel.text = LOC(@"UserID");
|
|
textCell.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
[textCell editableTextField].text = [self.settings valueForKey:@"userID"];
|
|
[textCell editableTextField].delegate = self;
|
|
return textCell;
|
|
}
|
|
if (indexPath.section == 8) {
|
|
UITableViewCell *textCell = [[UITableViewCell alloc] initWithStyle:1000 reuseIdentifier:@"SponsorBlockTextCell"];
|
|
textCell.textLabel.text = LOC(@"API_URL");
|
|
textCell.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
[textCell editableTextField].text = [self.settings valueForKey:@"apiInstance"];
|
|
[textCell editableTextField].delegate = self;
|
|
return textCell;
|
|
}
|
|
if (indexPath.section == 9) {
|
|
UITableViewCell *textCell = [[UITableViewCell alloc] initWithStyle:1000 reuseIdentifier:@"SponsorBlockTextCell"];
|
|
textCell.textLabel.text = LOC(@"MinimumSegmentDuration");
|
|
textCell.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
[textCell editableTextField].text = [NSString stringWithFormat:@"%.1f", [[self.settings valueForKey:@"minimumDuration"] floatValue]];
|
|
[textCell editableTextField].keyboardType = UIKeyboardTypeDecimalPad;
|
|
[textCell editableTextField].delegate = self;
|
|
return textCell;
|
|
}
|
|
if (indexPath.section == 10) {
|
|
UITableViewCell *textCell = [[UITableViewCell alloc] initWithStyle:1000 reuseIdentifier:@"SponsorBlockTextCell"];
|
|
textCell.textLabel.text = LOC(@"HowLongNoticeWillAppear");
|
|
textCell.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
[textCell editableTextField].text = [NSString stringWithFormat:@"%.1f", [[self.settings valueForKey:@"skipNoticeDuration"] floatValue]];
|
|
[textCell editableTextField].keyboardType = UIKeyboardTypeDecimalPad;
|
|
[textCell editableTextField].delegate = self;
|
|
return textCell;
|
|
}
|
|
if (indexPath.section >= 11 && indexPath.section < 17) {
|
|
NSArray *titles = @[LOC(@"ShowSkipNotice"), LOC(@"ShowButtonsInPlayer"), LOC(@"HideStartEndButtonInPlayer"), LOC(@"ShowModifiedTime"), LOC(@"AudioNotificationOnSkip"), LOC(@"EnableSkipCountTracking")];
|
|
NSArray *titlesNames = @[@"showSkipNotice", @"showButtonsInPlayer", @"hideStartEndButtonInPlayer", @"showModifiedTime", @"skipAudioNotification", @"enableSkipCountTracking"];
|
|
UITableViewCell *tableCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SponsorBlockCell3"];
|
|
|
|
tableCell.textLabel.text = titles[indexPath.section-11];
|
|
tableCell.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
|
|
UISwitch *toggleSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0,0,51,31)];
|
|
tableCell.accessoryView = toggleSwitch;
|
|
[toggleSwitch addTarget:self action:@selector(switchToggled:) forControlEvents:UIControlEventValueChanged];
|
|
if ([self.settings valueForKey:titlesNames[indexPath.section-11]]) {
|
|
[toggleSwitch setOn:[[self.settings valueForKey:titlesNames[indexPath.section-11]] boolValue] animated:NO];
|
|
} else {
|
|
[toggleSwitch setOn:YES animated:NO];
|
|
[self switchToggled:toggleSwitch];
|
|
}
|
|
return tableCell;
|
|
}
|
|
if (indexPath.section == 17) {
|
|
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SponsorBlockDonationCell"];
|
|
cell.textLabel.text = indexPath.row == 0 ? LOC(@"DonateOnVenmo") : LOC(@"DonateOnPayPal");
|
|
cell.imageView.image = [UIImage systemImageNamed:@"dollarsign.circle.fill"];
|
|
return cell;
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
|
|
if (section == 0) return nil;
|
|
if (section <= 8) return self.sectionTitles[section-1];
|
|
return nil;
|
|
}
|
|
|
|
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
|
|
if (section == 0) return LOC(@"RestartFooter");
|
|
if (section == 7) return LOC(@"UserIDFooter");
|
|
if (section == 8) return LOC(@"APIFooter");
|
|
if (section == 15) return LOC(@"AudioFooter");
|
|
return nil;
|
|
}
|
|
|
|
//To allow highlights only for certain sections
|
|
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
if (indexPath.section == 17) {
|
|
return YES;
|
|
} else {
|
|
return NO;
|
|
}
|
|
}
|
|
|
|
- (void)dismissButtonTapped:(id)sender {
|
|
[self dismissViewControllerAnimated:YES completion:nil];
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
if (indexPath.section == 17) {
|
|
if (indexPath.row == 0) {
|
|
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"venmo://"]]) {
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"venmo://venmo.com/code?user_id=3178620965093376215"] options:@{} completionHandler:nil];
|
|
} else {
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://venmo.com/code?user_id=3178620965093376215"] options:@{} completionHandler:nil];
|
|
}
|
|
|
|
} else {
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://paypal.me/DBrett684"] options:@{} completionHandler:nil];
|
|
}
|
|
}
|
|
[tableView deselectRowAtIndexPath:indexPath animated:YES]; //To prevent highlight sticking after pressing on buttons
|
|
}
|
|
|
|
- (void)enabledSwitchToggled:(UISwitch *)sender {
|
|
[self.settings setValue:@(sender.on) forKey:@"enabled"];
|
|
[self writeSettings];
|
|
}
|
|
|
|
- (void)switchToggled:(UISwitch *)sender {
|
|
UITableViewCell *cell = (UITableViewCell *)sender.superview;
|
|
NSArray *titlesNames = @[@"showSkipNotice", @"showButtonsInPlayer", @"hideStartEndButtonInPlayer", @"showModifiedTime", @"skipAudioNotification", @"enableSkipCountTracking"];
|
|
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
|
|
[self.settings setValue:@(sender.on) forKey:titlesNames[indexPath.section-11]];
|
|
[self writeSettings];
|
|
}
|
|
|
|
- (void)categorySegmentSelected:(UISegmentedControl *)segmentedControl {
|
|
NSMutableDictionary *categorySettings = [self.settings valueForKey:@"categorySettings"];
|
|
[categorySettings setValue:@(segmentedControl.selectedSegmentIndex) forKey:[(SponsorBlockTableCell *)segmentedControl.superview.superview category]];
|
|
|
|
[self.settings setValue:categorySettings forKey:@"categorySettings"];
|
|
[self writeSettings];
|
|
}
|
|
|
|
- (void)textFieldDidEndEditing:(UITextField *)textField {
|
|
UITableViewCell *cell = (UITableViewCell *)textField.superview.superview;
|
|
NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
|
|
f.numberStyle = NSNumberFormatterDecimalStyle;
|
|
|
|
NSString *minimumDurationTitle = LOC(@"MinimumSegmentDuration");
|
|
NSString *skipNoticeDurationTitle = LOC(@"HowLongNoticeWillAppear");
|
|
NSString *userIDTitle = LOC(@"UserID");
|
|
NSString *apiURLTitle = LOC(@"API_URL");
|
|
|
|
if ([cell.textLabel.text isEqualToString:minimumDurationTitle]) {
|
|
[self.settings setValue:[f numberFromString:textField.text] forKey:@"minimumDuration"];
|
|
} else if ([cell.textLabel.text isEqualToString:skipNoticeDurationTitle]) {
|
|
[self.settings setValue:[f numberFromString:textField.text] forKey:@"skipNoticeDuration"];
|
|
} else if ([cell.textLabel.text isEqualToString:userIDTitle]) {
|
|
[self.settings setValue:textField.text forKey:@"userID"];
|
|
} else if ([cell.textLabel.text isEqualToString:apiURLTitle]) {
|
|
[self.settings setValue:textField.text forKey:@"apiInstance"];
|
|
}
|
|
[self writeSettings];
|
|
}
|
|
|
|
- (void)writeSettings {
|
|
[self.settings writeToURL:[NSURL fileURLWithPath:self.settingsPath isDirectory:NO] error:nil];
|
|
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.galacticdev.isponsorblockprefs.changed"), NULL, NULL, YES);
|
|
}
|
|
@end
|