1
0
miroir de https://github.com/Burrit0z/kai synchronisé 2025-07-05 17:16:46 +00:00
Fichiers
kai/Kai.xm
2020-12-25 11:07:05 -05:00

274 lignes
7.3 KiB
Plaintext
Fichiers exécutables

#import "Kai.h"
CSAdjunctListView *list;
%group main
%hook SBMediaController
- (BOOL)isPlaying {
Class cls = kCFCoreFoundationVersionNumber > 1600 ? ([objc_getClass("CSAdjunctListView") class]) : ([objc_getClass("SBDashBoardAdjunctListView") class]);
BOOL playing = %orig;
if(!removeForMedia) {
[cls reorderKai];
return playing;
}
// if removeForMedia
if(self.nowPlayingApplication && shouldBeAdded) {
// a valid playing app, and it was shown
shouldBeAdded = NO;
[[KAIBatteryPlatter sharedInstance] removeFromSuperview];
[[[cls sharedListViewForKai] stackView] removeArrangedSubview:[KAIBatteryPlatter sharedInstance]];
[[cls sharedListViewForKai] _layoutStackView];
return playing;
} else if(!playing && self.nowPlayingApplication == nil) {
// not playing and the app is nil
shouldBeAdded = YES;
// if we don't want to hide kai, fix its order
[cls reorderKai];
}
return playing;
}
%end
%hook KAITarget // This class is defined in %ctor, KAITarget is not a class name.
%property (nonatomic, assign) BOOL hasKai;
- (void)setClipsToBounds:(BOOL)arg1 {
%orig(YES);
}
- (void)setStackView:(UIStackView *)arg1 {
KAISelf.clipsToBounds = YES;
if(!KAISelf.hasKai) {
list = self;
KAIBatteryPlatter *battery = [[KAIBatteryPlatter alloc] initWithFrame:[self stackView].frame];
// Add noti observer
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(KaiInfo)
name:@"KaiInfoChanged"
object:nil];
KAISelf.hasKai = YES;
if(![arg1.subviews containsObject:battery]) { // if not added
// add kai to the stack view
[self performReorder];
}
[battery updateBattery];
// send the adjusted stackview as arg1
%orig(arg1);
}
}
%new
- (void)KaiInfo {
if(!isUpdating) {
isUpdating = YES;
dispatch_async(dispatch_get_main_queue(), ^{
[[KAIBatteryPlatter sharedInstance] updateBattery];
if([KAIBatteryPlatter sharedInstance].number == 0) {
[[KAIBatteryPlatter sharedInstance] removeFromSuperview];
[[self stackView] removeArrangedSubview:[KAIBatteryPlatter sharedInstance]];
} else if(![[self stackView].subviews containsObject:[KAIBatteryPlatter sharedInstance]] && shouldBeAdded) {
[[self stackView] addSubview:[KAIBatteryPlatter sharedInstance]];
[[self stackView] addArrangedSubview:[KAIBatteryPlatter sharedInstance]];
}
if([KAISelf.superview respondsToSelector:@selector(fixComplicationsViewFrame)]) {
[KAISelf.superview performSelector:@selector(fixComplicationsViewFrame) withObject:KAISelf.superview afterDelay:0.35];
}
isUpdating = NO;
});
}
}
%new
- (NSInteger)getMediaIndexForClass:(Class)cls {
UIView *mediaPlayer;
int index = 0;
for(UIView *subview in [self stackView].subviews) {
if([subview isKindOfClass:cls]) {
return index;
}
index++;
}
return NSNotFound;
}
%new
- (void)performReorder {
UIStackView *stack = [self stackView];
if(placement == 1) { //top
BOOL isAperio = NO;
@try {
isAperio = [stack.subviews[0] isKindOfClass:%c(APEPlatter)];
// index 0 would be the platter, 1 would be placeholder
} @catch(NSException *exc) {}
[stack removeArrangedSubview:[KAIBatteryPlatter sharedInstance]];
[stack insertArrangedSubview:[KAIBatteryPlatter sharedInstance] atIndex:isAperio];
// so, 0 if not aperio, 1 if aperio
} else if(placement == 2) { //after media
Class mediaClass = kCFCoreFoundationVersionNumber > 1600 ? %c(CSAdjunctItemView) : %c(SBDashBoardAdjunctItemView);
NSInteger mediaIndex = [self getMediaIndexForClass:mediaClass];
if(mediaIndex == NSNotFound) mediaIndex = 0;
[stack removeArrangedSubview:[KAIBatteryPlatter sharedInstance]];
[stack insertArrangedSubview:[KAIBatteryPlatter sharedInstance] atIndex:mediaIndex];
} else if(placement == 3) { // bottom
[stack removeArrangedSubview:[KAIBatteryPlatter sharedInstance]];
[stack addArrangedSubview:[KAIBatteryPlatter sharedInstance]];
}
[self _layoutStackView];
}
%new
+ (id)sharedListViewForKai {
return list;
}
%new
+ (void)reorderKai {
NSLog(@"[Kai]: Reordering kai");
[[self sharedListViewForKai] performReorder];
}
%end
%hook SBCoverSheetPrimarySlidingViewController
- (void)viewDidDisappear:(BOOL)animated {
if(reAlignSelf)
[[NSNotificationCenter defaultCenter] postNotificationName:@"KaiResetOffset" object:nil userInfo:nil];
%orig;
}
- (void)viewDidAppear:(BOOL)animated {
if(reAlignSelf)
[[NSNotificationCenter defaultCenter] postNotificationName:@"KaiResetOffset" object:nil userInfo:nil];
%orig;
}
%end
%hook BCBatteryDevice
%property (nonatomic, strong) KAIBatteryCell *kaiCell;
- (void)setCharging:(BOOL)arg1 {
// sends the noti to update battery info
[[NSNotificationCenter defaultCenter] postNotificationName:@"KaiInfoChanged" object:nil userInfo:nil];
%orig;
}
- (void)setBatterySaverModeActive:(BOOL)arg1 {
// sends the noti to update battery info
[[NSNotificationCenter defaultCenter] postNotificationName:@"KaiInfoChanged" object:nil userInfo:nil];
%orig;
}
- (void)setPercentCharge:(NSInteger)arg1 {
// sends the noti to update battery info
if(arg1 != 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"KaiInfoChanged" object:nil userInfo:nil];
}
%orig;
}
- (void)dealloc {
%orig;
[[NSNotificationCenter defaultCenter] postNotificationName:@"KaiInfoChanged" object:nil userInfo:nil];
}
%new
- (id)kaiCellForDevice {
if(self && self.kaiCell == nil) {
self.kaiCell = [[KAIBatteryCell alloc] initWithFrame:CGRectMake(0,0,[KAIBatteryPlatter sharedInstance].frame.size.width,0) device:self]; }
((KAIBatteryCell *)self.kaiCell).translatesAutoresizingMaskIntoConstraints = NO;
[(KAIBatteryCell *)self.kaiCell updateInfo];
return self.kaiCell;
}
%new
- (void)resetKaiCellForNewPrefs {
self.kaiCell = [[KAIBatteryCell alloc] initWithFrame:CGRectMake(0,0,[KAIBatteryPlatter sharedInstance].frame.size.width,0) device:self];
((KAIBatteryCell *)self.kaiCell).translatesAutoresizingMaskIntoConstraints = NO;
[(KAIBatteryCell *)self.kaiCell updateInfo];
}
%end
%hook KAICSTarget // Again, not a class
- (void)_transitionChargingViewToVisible:(BOOL)arg1 showBattery:(BOOL)arg2 animated:(BOOL)arg3 {
if(hideChargingAnimation) {
// Yeah bro this just makes the method never call to show the charging thing
%orig(NO,NO,NO);
} else {
%orig(arg1, arg2, arg3);
}
}
- (void)_transitionChargingViewToVisible:(BOOL)arg1 showBattery:(BOOL)arg2 animated:(BOOL)arg3 force:(BOOL)arg4 { // might just be ios12
if(hideChargingAnimation) {
// Same idea
%orig(NO,NO,NO,NO);
} else {
%orig(arg1, arg2, arg3, arg4);
}
}
%end
%end
%ctor {
preferencesChanged();
CFNotificationCenterAddObserver(
CFNotificationCenterGetDarwinNotifyCenter(),
&observer,
(CFNotificationCallback)applyPrefs,
kSettingsChangedNotification,
NULL,
CFNotificationSuspensionBehaviorDeliverImmediately
);
// Bro Muirey helped me figure out a logical way to do this because iOS 12-13 classes have changed
Class cls = kCFCoreFoundationVersionNumber > 1600 ? %c(CSAdjunctListView) : %c(SBDashBoardAdjunctListView);
Class CSCls = kCFCoreFoundationVersionNumber > 1600 ? %c(CSCoverSheetViewController) : %c(SBDashBoardViewController);
if(kCFCoreFoundationVersionNumber < 1740) {
ios13 = YES; // wow very pog version you have
}
if(enabled) {
%init(main, KAITarget = cls, KAICSTarget = CSCls); // BIG BRAIN BRO!!
}
NSLog(@"[kai]: loaded into %@", [NSBundle mainBundle].bundleIdentifier);
}