|
|
|
|
|
|
|
|
KAIRootListController *controller; |
|
|
KAIRootListController *controller; |
|
|
NSBundle *tweakBundle; |
|
|
NSBundle *tweakBundle; |
|
|
|
|
|
|
|
|
//thank god for renai |
|
|
|
|
|
|
|
|
// thank god for renai |
|
|
static inline NSString *getPackageVersion() { |
|
|
static inline NSString *getPackageVersion() { |
|
|
NSString *packageVersion = [NSString stringWithFormat:@"${%@}", @"Version"]; |
|
|
|
|
|
int status; |
|
|
|
|
|
|
|
|
|
|
|
NSMutableArray<NSString *> *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"; |
|
|
|
|
|
|
|
|
NSString *packageVersion = [NSString stringWithFormat:@"${%@}", @"Version"]; |
|
|
|
|
|
int status; |
|
|
|
|
|
|
|
|
|
|
|
NSMutableArray<NSString *> *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() { |
|
|
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]; |
|
|
|
|
|
|
|
|
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() { |
|
|
static void applyPrefs() { |
|
|
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.burritoz.kaiprefs/reload"), nil, nil, true); |
|
|
|
|
|
|
|
|
CFNotificationCenterPostNotification( |
|
|
|
|
|
CFNotificationCenterGetDarwinNotifyCenter(), |
|
|
|
|
|
CFSTR("com.burritoz.kaiprefs/reload"), nil, nil, true); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@implementation KAIRootListController |
|
|
@implementation KAIRootListController |
|
|
|
|
|
|
|
|
- (NSArray *)specifiers { |
|
|
- (NSArray *)specifiers { |
|
|
if (!_specifiers) { |
|
|
|
|
|
_specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self]; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (!_specifiers) { |
|
|
|
|
|
_specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self]; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return _specifiers; |
|
|
|
|
|
|
|
|
return _specifiers; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
- (void)viewWillAppear:(BOOL)arg1 { |
|
|
- (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]]; |
|
|
|
|
|
|
|
|
[[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 { |
|
|
- (void)viewWillDisappear:(BOOL)arg1 { |
|
|
[super viewWillDisappear:arg1]; |
|
|
|
|
|
|
|
|
[super viewWillDisappear:arg1]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
- (void)viewDidLoad { |
|
|
- (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; |
|
|
|
|
|
|
|
|
[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 { |
|
|
- (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]; |
|
|
|
|
|
|
|
|
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 { |
|
|
- (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; |
|
|
|
|
|
}]; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
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)followMeRen { |
|
|
|
|
|
[[UIApplication sharedApplication] |
|
|
|
|
|
openURL:[NSURL URLWithString:@"https://twitter.com/ren7995"]]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
- (void)followMeOnTwitterThomz { |
|
|
- (void)followMeOnTwitterThomz { |
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://twitter.com/thomzi07"]]; |
|
|
|
|
|
|
|
|
[[UIApplication sharedApplication] |
|
|
|
|
|
openURL:[NSURL URLWithString:@"https://twitter.com/thomzi07"]]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@end |
|
|
@end |
|
|
|
|
|
|
|
|
@implementation KaiHeaderCell // Header Cell |
|
|
@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)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 { |
|
|
- (instancetype)initWithSpecifier:(PSSpecifier *)specifier { |
|
|
return [self initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"KaiHeaderCell" specifier:specifier]; |
|
|
|
|
|
|
|
|
return [self initWithStyle:UITableViewCellStyleDefault |
|
|
|
|
|
reuseIdentifier:@"KaiHeaderCell" |
|
|
|
|
|
specifier:specifier]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
- (void)setFrame:(CGRect)frame { |
|
|
- (void)setFrame:(CGRect)frame { |
|
|
frame.origin.x = 0; |
|
|
|
|
|
[super setFrame:frame]; |
|
|
|
|
|
|
|
|
frame.origin.x = 0; |
|
|
|
|
|
[super setFrame:frame]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
- (CGFloat)preferredHeightForWidth:(CGFloat)arg1 { |
|
|
- (CGFloat)preferredHeightForWidth:(CGFloat)arg1 { |
|
|
return 140.0f; |
|
|
|
|
|
|
|
|
return 140.0f; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@end |
|
|
@end |
|
|
|
|
|
|
|
|
@implementation Thomz_TwitterCell // lil copy of HBTwitterCell from Cephei |
|
|
@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; |
|
|
|
|
|
|
|
|
- (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 |
|
|
@end |