miroir de
https://github.com/Burrit0z/kai
synchronisé 2025-07-05 17:16:46 +00:00
274 lignes
7.3 KiB
Plaintext
Fichiers exécutables
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);
|
|
}
|