#include "KAIRootListController.h" KAIRootListController *controller; NSBundle *tweakBundle; //thank god for renai static inline NSString *getPackageVersion() { NSString *packageVersion = [NSString stringWithFormat:@"${%@}", @"Version"]; int status; NSMutableArray *argsv0 = [NSMutableArray array]; for (NSString *string in @[ @"/usr/bin/dpkg-query", @"-Wf", packageVersion, @"com.burritoz.kai" ]) { [argsv0 addObject:[NSString stringWithFormat:@"'%@'", [string stringByReplacingOccurrencesOfString:@"'" withString:@"\\'" options:NSRegularExpressionSearch range:NSMakeRange( 0, string.length)]]]; } NSString *argsv1 = [argsv0 componentsJoinedByString:@" "]; FILE *file = popen(argsv1.UTF8String, "r"); if (!file) { return nil; } char data[1024]; NSMutableString *output = [NSMutableString string]; while (fgets(data, 1024, file) != NULL) { [output appendString:[NSString stringWithUTF8String:data]]; } int result = pclose(file); status = result; if (status == 0) { return output ?: @"🏴‍☠️ Pirated"; } return @"🏴‍☠️ Pirated"; } //////// static void respringNeeded() { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Respring" message:@"Changing this requires a respring for it to take effect. Would you like to respring now?" preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){ }]; UIAlertAction *yes = [UIAlertAction actionWithTitle:@"Respring" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { NSTask *t = [[NSTask alloc] init]; [t setLaunchPath:@"usr/bin/killall"]; [t setArguments:[NSArray arrayWithObjects:@"backboardd", nil]]; [t launch]; }]; [alert addAction:defaultAction]; [alert addAction:yes]; [controller presentViewController:alert animated:YES completion:nil]; } static void applyPrefs() { CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.burritoz.kaiprefs/reload"), nil, nil, true); } @implementation KAIRootListController - (NSArray *)specifiers { if (!_specifiers) { _specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self]; } return _specifiers; } - (void)viewWillAppear:(BOOL)arg1 { [[UISegmentedControl appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]]; [[UISwitch appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setOnTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]]; [[UISlider appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]]; } - (void)viewWillDisappear:(BOOL)arg1 { [super viewWillDisappear:arg1]; } - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.titleView = [UIView new]; self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; self.titleLabel.font = [UIFont systemFontOfSize:17.5]; self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO; self.titleLabel.text = @"kai"; self.titleLabel.alpha = 0.0; self.titleLabel.textAlignment = NSTextAlignmentCenter; [self.navigationItem.titleView addSubview:self.titleLabel]; self.iconView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; self.iconView.contentMode = UIViewContentModeScaleAspectFit; self.iconView.image = [UIImage imageWithContentsOfFile:@"/Library/PreferenceBundles/kaiPrefs.bundle/icon.png"]; self.iconView.translatesAutoresizingMaskIntoConstraints = NO; self.iconView.alpha = 1.0; [self.navigationItem.titleView addSubview:self.iconView]; [NSLayoutConstraint activateConstraints:@[ [self.titleLabel.topAnchor constraintEqualToAnchor:self.navigationItem.titleView.topAnchor], [self.titleLabel.leadingAnchor constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor], [self.titleLabel.trailingAnchor constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor], [self.titleLabel.bottomAnchor constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor], [self.iconView.topAnchor constraintEqualToAnchor:self.navigationItem.titleView.topAnchor], [self.iconView.leadingAnchor constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor], [self.iconView.trailingAnchor constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor], [self.iconView.bottomAnchor constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor], ]]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Pirated :(" message:@"Please install kai from Chariz repository." preferredStyle:UIAlertControllerStyleAlert]; if ([[NSFileManager defaultManager] fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.list"] && [[NSFileManager defaultManager] fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.md5sums"]) { // nothing } else { [self presentViewController:alert animated:YES completion:nil]; } CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)respringNeeded, CFSTR("com.burritoz.kaiprefs.respringneeded"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)applyPrefs, CFSTR("com.burritoz.kaiprefs.apply"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); controller = self; } - (void)resetPrefs:(id)sender { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Reset Preferences" message:@"Are you sure you want to reset all of your preferences? This action CANNOT be undone! Your device will respring." preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ }]; UIAlertAction *yes = [UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { NSUserDefaults *prefs = [[NSUserDefaults standardUserDefaults] init]; [prefs removePersistentDomainForName:@"com.burritoz.kaiprefs"]; NSTask *f = [[NSTask alloc] init]; [f setLaunchPath:@"/usr/bin/killall"]; [f setArguments:[NSArray arrayWithObjects:@"backboardd", nil]]; [f launch]; }]; [alert addAction:defaultAction]; [alert addAction:yes]; [self presentViewController:alert animated:YES completion:nil]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat offsetY = scrollView.contentOffset.y; if (offsetY > 120) { [UIView animateWithDuration:0.2 animations:^{ self.iconView.alpha = 1.0; self.titleLabel.alpha = 0.0; }]; } else { [UIView animateWithDuration:0.2 animations:^{ self.iconView.alpha = 0.0; self.titleLabel.alpha = 1.0; }]; } } - (void)followMeBurritoz { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://twitter.com/burrit0ztweaks"]]; } - (void)followMeOnTwitterThomz { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://twitter.com/thomzi07"]]; } @end @implementation KaiHeaderCell // Header Cell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(id)reuseIdentifier specifier:(id)specifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier]; if (self) { UILabel *tweakLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 30, self.contentView.bounds.size.width + 30, 50)]; [tweakLabel setTextAlignment:NSTextAlignmentLeft]; [tweakLabel setFont:[UIFont systemFontOfSize:50 weight:UIFontWeightRegular]]; tweakLabel.text = @"kai"; UILabel *devLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 70, self.contentView.bounds.size.width + 30, 50)]; [devLabel setTextAlignment:NSTextAlignmentLeft]; [devLabel setFont:[UIFont systemFontOfSize:20 weight:UIFontWeightMedium]]; devLabel.alpha = 0.8; devLabel.text = getPackageVersion(); NSBundle *bundle = [[NSBundle alloc] initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"]; UIImage *logo = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"iconFullSize" ofType:@"png"]]; UIImageView *icon = [[UIImageView alloc] initWithImage:logo]; icon.frame = CGRectMake(self.contentView.bounds.size.width - 35, 35, 70, 70); icon.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:tweakLabel]; [self addSubview:devLabel]; [self addSubview:icon]; [icon.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:-20].active = YES; [icon.centerYAnchor constraintEqualToAnchor:self.centerYAnchor].active = YES; [icon.widthAnchor constraintEqualToConstant:70].active = YES; [icon.heightAnchor constraintEqualToConstant:70].active = YES; icon.layer.masksToBounds = YES; icon.layer.cornerRadius = 15; } return self; } - (instancetype)initWithSpecifier:(PSSpecifier *)specifier { return [self initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"KaiHeaderCell" specifier:specifier]; } - (void)setFrame:(CGRect)frame { frame.origin.x = 0; [super setFrame:frame]; } - (CGFloat)preferredHeightForWidth:(CGFloat)arg1 { return 140.0f; } @end @implementation Thomz_TwitterCell // lil copy of HBTwitterCell from Cephei - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier specifier:(PSSpecifier *)specifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier]; if (self) { UILabel *User = [[UILabel alloc] initWithFrame:CGRectMake(70, 15, 200, 20)]; [User setText:specifier.properties[@"user"]]; [User setFont:[User.font fontWithSize:15]]; UILabel *Description = [[UILabel alloc] initWithFrame:CGRectMake(70, 35, 200, 20)]; [Description setText:specifier.properties[@"description"]]; [Description setFont:[Description.font fontWithSize:10]]; NSBundle *bundle = [[NSBundle alloc] initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"]; UIImage *profilePicture; profilePicture = [UIImage imageWithContentsOfFile:[bundle pathForResource:specifier.properties[@"image"] ofType:@"jpg"]]; UIImageView *profilePictureView = [[UIImageView alloc] initWithImage:profilePicture]; [profilePictureView.layer setMasksToBounds:YES]; [profilePictureView.layer setCornerRadius:20]; [profilePictureView setFrame:CGRectMake(15, 15, 40, 40)]; [self addSubview:User]; [self addSubview:Description]; [self addSubview:profilePictureView]; } return self; } @end