1
0
mirror of https://github.com/Burrit0z/kai synced 2025-07-01 20:46:48 +00:00
This commit is contained in:
ren7995
2021-05-16 16:38:00 -04:00
parent df58fc48a7
commit ded80ae5a6
7 changed files with 271 additions and 190 deletions

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2021 Burrit0z Copyright (c) 2021 ren7995
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,10 +1,10 @@
Package: com.burritoz.kai Package: com.burritoz.kai
Name: Kai Name: Kai
Version: 1.5.0 Version: 1.5.1
Architecture: iphoneos-arm Architecture: iphoneos-arm
Description: Device battery indicators on your lock screen! Description: Device battery indicators on your lock screen!
Maintainer: burrit0z Maintainer: ren7995
Author: burrit0z Author: ren7995
Section: Tweaks Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000), preferenceloader, ws.hbang.common (>=1.14) Depends: mobilesubstrate (>= 0.9.5000), preferenceloader, ws.hbang.common (>=1.14)
Icon: https://chariz.com/cdn/icon/kai/icon@3x.png Icon: https://chariz.com/cdn/icon/kai/icon@3x.png

View File

@ -1,4 +1,5 @@
# kai # kai
Oh my gosh this code is so bad
## All Your Batteries, at a Glance ## All Your Batteries, at a Glance
kai will show any Bluetooth device that provides battery information, meaning you can check the battery of your iPhone, your Apple Watch, your AirPods, and your AirPods case, all from the lockscreen. Quickly and easily. kai will show any Bluetooth device that provides battery information, meaning you can check the battery of your iPhone, your Apple Watch, your AirPods, and your AirPods case, all from the lockscreen. Quickly and easily.
@ -47,4 +48,4 @@ kai offers two main options for displaying battery information. (a) Vertical mod
Special thanks to my amazing beta testers in the server I co-own with Thomz. I could not have tested kai so extensively and brought it to where it is today without them. Thanks to Thomz (@Thomzi07 on Twitter) for making kai's icon, and depiction screenshots, and Thenatis (@thenatis1 on Twitter) for helping with design, and for making the banner for kai. Additionally, kai is inspired by LaughingQuoll's Maple tweak series and Apple's AirPower design. kai was built with inspiration from this. However, the main reason I made kai is because the Maple series does not work with notification grouping tweaks like Axon and Grupi. Additionally, kai features a wider range of customization options. Special thanks to my amazing beta testers in the server I co-own with Thomz. I could not have tested kai so extensively and brought it to where it is today without them. Thanks to Thomz (@Thomzi07 on Twitter) for making kai's icon, and depiction screenshots, and Thenatis (@thenatis1 on Twitter) for helping with design, and for making the banner for kai. Additionally, kai is inspired by LaughingQuoll's Maple tweak series and Apple's AirPower design. kai was built with inspiration from this. However, the main reason I made kai is because the Maple series does not work with notification grouping tweaks like Axon and Grupi. Additionally, kai features a wider range of customization options.
## Socials and Support ## Socials and Support
If you are encountering issues, or simply wish to reach out, you can contact me at my email (burrit0ztweaks@gmail.com) or join the discord server I co-own with Thomz to get support. Discord server invite link: https://discord.gg/NQ3uXtJ If you are encountering issues, or simply wish to reach out, you can contact me at my email (lau7995ren@gmail.com) or join the discord server I co-own with Thomz to get support. Discord server invite link: https://discord.gg/NQ3uXtJ

View File

@ -9,14 +9,24 @@ static inline NSString *getPackageVersion() {
int status; int status;
NSMutableArray<NSString *> *argsv0 = [NSMutableArray array]; NSMutableArray<NSString *> *argsv0 = [NSMutableArray array];
for (NSString *string in @[ @"/usr/bin/dpkg-query", @"-Wf", packageVersion, @"com.burritoz.kai" ]) { for (NSString *string in @[
@"/usr/bin/dpkg-query", @"-Wf", packageVersion, @"com.burritoz.kai"
]) {
[argsv0 [argsv0
addObject:[NSString stringWithFormat:@"'%@'", addObject:
[string stringByReplacingOccurrencesOfString:@"'" [NSString
stringWithFormat:
@"'%@'",
[string
stringByReplacingOccurrencesOfString:@"'"
withString:@"\\'" withString:@"\\'"
options:NSRegularExpressionSearch options:
range:NSMakeRange( NSRegularExpressionSearch
0, string.length)]]]; range:
NSMakeRange(
0,
string
.length)]]];
} }
NSString *argsv1 = [argsv0 componentsJoinedByString:@" "]; NSString *argsv1 = [argsv0 componentsJoinedByString:@" "];
@ -45,16 +55,20 @@ static inline NSString *getPackageVersion() {
//////// ////////
static void respringNeeded() { static void respringNeeded() {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Respring" UIAlertController *alert = [UIAlertController
message:@"Changing this requires a respring for it to take effect. Would you like to respring now?" alertControllerWithTitle:@"Respring"
message:@"Changing this requires a respring for it to "
@"take effect. Would you like to respring now?"
preferredStyle:UIAlertControllerStyleActionSheet]; preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"No" UIAlertAction *defaultAction =
[UIAlertAction actionWithTitle:@"No"
style:UIAlertActionStyleCancel style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action){ handler:^(UIAlertAction *action){
}]; }];
UIAlertAction *yes = [UIAlertAction actionWithTitle:@"Respring" UIAlertAction *yes = [UIAlertAction
actionWithTitle:@"Respring"
style:UIAlertActionStyleDestructive style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) { handler:^(UIAlertAction *action) {
NSTask *t = [[NSTask alloc] init]; NSTask *t = [[NSTask alloc] init];
@ -69,7 +83,9 @@ static void respringNeeded() {
} }
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
@ -83,9 +99,16 @@ static void applyPrefs() {
} }
- (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]]; [[UISegmentedControl
[[UISwitch appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setOnTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]]; appearanceWhenContainedInInstancesOfClasses:@[ self.class ]]
[[UISlider appearanceWhenContainedInInstancesOfClasses:@[ self.class ]] setTintColor:[UIColor colorWithRed:0.00 green:0.82 blue:1.00 alpha:1.00]]; 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 {
@ -106,52 +129,79 @@ static void applyPrefs() {
self.iconView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; self.iconView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
self.iconView.contentMode = UIViewContentModeScaleAspectFit; self.iconView.contentMode = UIViewContentModeScaleAspectFit;
self.iconView.image = [UIImage imageWithContentsOfFile:@"/Library/PreferenceBundles/kaiPrefs.bundle/icon.png"]; self.iconView.image =
[UIImage imageWithContentsOfFile:
@"/Library/PreferenceBundles/kaiPrefs.bundle/icon.png"];
self.iconView.translatesAutoresizingMaskIntoConstraints = NO; self.iconView.translatesAutoresizingMaskIntoConstraints = NO;
self.iconView.alpha = 1.0; self.iconView.alpha = 1.0;
[self.navigationItem.titleView addSubview:self.iconView]; [self.navigationItem.titleView addSubview:self.iconView];
[NSLayoutConstraint activateConstraints:@[ [NSLayoutConstraint activateConstraints:@[
[self.titleLabel.topAnchor constraintEqualToAnchor:self.navigationItem.titleView.topAnchor], [self.titleLabel.topAnchor
[self.titleLabel.leadingAnchor constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor], constraintEqualToAnchor:self.navigationItem.titleView.topAnchor],
[self.titleLabel.trailingAnchor constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor], [self.titleLabel.leadingAnchor
[self.titleLabel.bottomAnchor constraintEqualToAnchor:self.navigationItem.titleView.bottomAnchor], constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor],
[self.iconView.topAnchor constraintEqualToAnchor:self.navigationItem.titleView.topAnchor], [self.titleLabel.trailingAnchor
[self.iconView.leadingAnchor constraintEqualToAnchor:self.navigationItem.titleView.leadingAnchor], constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor],
[self.iconView.trailingAnchor constraintEqualToAnchor:self.navigationItem.titleView.trailingAnchor], [self.titleLabel.bottomAnchor
[self.iconView.bottomAnchor constraintEqualToAnchor:self.navigationItem.titleView.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 :(" UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"Pirated :("
message:@"Please install kai from Chariz repository." message:@"Please install kai from Chariz repository."
preferredStyle:UIAlertControllerStyleAlert]; 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"]) { if ([[NSFileManager defaultManager]
fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.list"] &&
[[NSFileManager defaultManager]
fileExistsAtPath:@"/var/lib/dpkg/info/com.burritoz.kai.md5sums"]) {
// nothing // nothing
} else { } else {
[self presentViewController:alert animated:YES completion:nil]; [self presentViewController:alert animated:YES completion:nil];
} }
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)respringNeeded, CFSTR("com.burritoz.kaiprefs.respringneeded"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(
CFNotificationCenterGetDarwinNotifyCenter(), NULL,
(CFNotificationCallback)respringNeeded,
CFSTR("com.burritoz.kaiprefs.respringneeded"), NULL,
CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)applyPrefs, CFSTR("com.burritoz.kaiprefs.apply"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately); CFNotificationCenterAddObserver(
CFNotificationCenterGetDarwinNotifyCenter(), NULL,
(CFNotificationCallback)applyPrefs, CFSTR("com.burritoz.kaiprefs.apply"),
NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
controller = self; controller = self;
} }
- (void)resetPrefs:(id)sender { - (void)resetPrefs:(id)sender {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Reset Preferences" UIAlertController *alert = [UIAlertController
message:@"Are you sure you want to reset all of your preferences? This action CANNOT be undone! Your device will respring." 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]; preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"No" UIAlertAction *defaultAction =
[UIAlertAction actionWithTitle:@"No"
style:UIAlertActionStyleDefault style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action){ handler:^(UIAlertAction *action){
}]; }];
UIAlertAction *yes = [UIAlertAction actionWithTitle:@"Yes" UIAlertAction *yes = [UIAlertAction
actionWithTitle:@"Yes"
style:UIAlertActionStyleDestructive style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) { handler:^(UIAlertAction *action) {
NSUserDefaults *prefs = [[NSUserDefaults standardUserDefaults] init]; NSUserDefaults *prefs =
[[NSUserDefaults standardUserDefaults] init];
[prefs removePersistentDomainForName:@"com.burritoz.kaiprefs"]; [prefs removePersistentDomainForName:@"com.burritoz.kaiprefs"];
NSTask *f = [[NSTask alloc] init]; NSTask *f = [[NSTask alloc] init];
@ -183,45 +233,62 @@ static void applyPrefs() {
} }
} }
- (void)followMeBurritoz { - (void)followMeRen {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://twitter.com/burrit0ztweaks"]]; [[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 { - (instancetype)initWithStyle:(UITableViewCellStyle)style
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier]; reuseIdentifier:(id)reuseIdentifier
specifier:(id)specifier {
self = [super initWithStyle:style
reuseIdentifier:reuseIdentifier
specifier:specifier];
if (self) { if (self) {
UILabel *tweakLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 30, self.contentView.bounds.size.width + 30, 50)]; UILabel *tweakLabel = [[UILabel alloc]
initWithFrame:CGRectMake(20, 30,
self.contentView.bounds.size.width + 30, 50)];
[tweakLabel setTextAlignment:NSTextAlignmentLeft]; [tweakLabel setTextAlignment:NSTextAlignmentLeft];
[tweakLabel setFont:[UIFont systemFontOfSize:50 weight:UIFontWeightRegular]]; [tweakLabel setFont:[UIFont systemFontOfSize:50
weight:UIFontWeightRegular]];
tweakLabel.text = @"kai"; tweakLabel.text = @"kai";
UILabel *devLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 70, self.contentView.bounds.size.width + 30, 50)]; UILabel *devLabel = [[UILabel alloc]
initWithFrame:CGRectMake(20, 70,
self.contentView.bounds.size.width + 30, 50)];
[devLabel setTextAlignment:NSTextAlignmentLeft]; [devLabel setTextAlignment:NSTextAlignmentLeft];
[devLabel setFont:[UIFont systemFontOfSize:20 weight:UIFontWeightMedium]]; [devLabel setFont:[UIFont systemFontOfSize:20 weight:UIFontWeightMedium]];
devLabel.alpha = 0.8; devLabel.alpha = 0.8;
devLabel.text = getPackageVersion(); devLabel.text = getPackageVersion();
NSBundle *bundle = [[NSBundle alloc] initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"]; NSBundle *bundle = [[NSBundle alloc]
UIImage *logo = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"iconFullSize" ofType:@"png"]]; initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"];
UIImage *logo =
[UIImage imageWithContentsOfFile:[bundle pathForResource:@"iconFullSize"
ofType:@"png"]];
UIImageView *icon = [[UIImageView alloc] initWithImage:logo]; UIImageView *icon = [[UIImageView alloc] initWithImage:logo];
icon.frame = CGRectMake(self.contentView.bounds.size.width - 35, 35, 70, 70); icon.frame =
CGRectMake(self.contentView.bounds.size.width - 35, 35, 70, 70);
icon.translatesAutoresizingMaskIntoConstraints = NO; icon.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:tweakLabel]; [self addSubview:tweakLabel];
[self addSubview:devLabel]; [self addSubview:devLabel];
[self addSubview:icon]; [self addSubview:icon];
[icon.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:-20].active = YES; [icon.rightAnchor constraintEqualToAnchor:self.rightAnchor constant:-20]
[icon.centerYAnchor constraintEqualToAnchor:self.centerYAnchor].active = YES; .active = YES;
[icon.centerYAnchor constraintEqualToAnchor:self.centerYAnchor].active =
YES;
[icon.widthAnchor constraintEqualToConstant:70].active = YES; [icon.widthAnchor constraintEqualToConstant:70].active = YES;
[icon.heightAnchor constraintEqualToConstant:70].active = YES; [icon.heightAnchor constraintEqualToConstant:70].active = YES;
@ -233,7 +300,9 @@ static void applyPrefs() {
} }
- (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 {
@ -248,23 +317,34 @@ static void applyPrefs() {
@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 { - (instancetype)initWithStyle:(UITableViewCellStyle)style
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier]; reuseIdentifier:(NSString *)reuseIdentifier
specifier:(PSSpecifier *)specifier {
self = [super initWithStyle:style
reuseIdentifier:reuseIdentifier
specifier:specifier];
if (self) { if (self) {
UILabel *User = [[UILabel alloc] initWithFrame:CGRectMake(70, 15, 200, 20)]; UILabel *User = [[UILabel alloc] initWithFrame:CGRectMake(70, 15, 200, 20)];
[User setText:specifier.properties[@"user"]]; [User setText:specifier.properties[@"user"]];
[User setFont:[User.font fontWithSize:15]]; [User setFont:[User.font fontWithSize:15]];
UILabel *Description = [[UILabel alloc] initWithFrame:CGRectMake(70, 35, 200, 20)]; UILabel *Description =
[[UILabel alloc] initWithFrame:CGRectMake(70, 35, 200, 20)];
[Description setText:specifier.properties[@"description"]]; [Description setText:specifier.properties[@"description"]];
[Description setFont:[Description.font fontWithSize:10]]; [Description setFont:[Description.font fontWithSize:10]];
NSBundle *bundle = [[NSBundle alloc] initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"]; NSBundle *bundle = [[NSBundle alloc]
initWithPath:@"/Library/PreferenceBundles/kaiPrefs.bundle"];
UIImage *profilePicture; UIImage *profilePicture;
profilePicture = [UIImage imageWithContentsOfFile:[bundle pathForResource:specifier.properties[@"image"] ofType:@"jpg"]]; profilePicture = [UIImage
UIImageView *profilePictureView = [[UIImageView alloc] initWithImage:profilePicture]; imageWithContentsOfFile:[bundle
pathForResource:specifier
.properties[@"image"]
ofType:@"jpg"]];
UIImageView *profilePictureView =
[[UIImageView alloc] initWithImage:profilePicture];
[profilePictureView.layer setMasksToBounds:YES]; [profilePictureView.layer setMasksToBounds:YES];
[profilePictureView.layer setCornerRadius:20]; [profilePictureView.layer setCornerRadius:20];
[profilePictureView setFrame:CGRectMake(15, 15, 40, 40)]; [profilePictureView setFrame:CGRectMake(15, 15, 40, 40)];

View File

@ -18,15 +18,15 @@
<key>cellClass</key> <key>cellClass</key>
<string>Thomz_TwitterCell</string> <string>Thomz_TwitterCell</string>
<key>user</key> <key>user</key>
<string>Burrit0z</string> <string>ren7995</string>
<key>description</key> <key>description</key>
<string>Developer</string> <string>Developer</string>
<key>height</key> <key>height</key>
<integer>70</integer> <integer>70</integer>
<key>image</key> <key>image</key>
<string>burritoz</string> <string>ren7995</string>
<key>action</key> <key>action</key>
<string>followMeBurritoz</string> <string>followMeRen</string>
</dict> </dict>
<dict> <dict>
<key>cell</key> <key>cell</key>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB