Files
YTLitePlus/Tweaks/iSponsorBlock/SponsorBlockSettingsController.m
2023-06-27 09:54:41 +02:00

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