#include #import #include #import #import #import "KAIBattery.mm" @interface UIApplication (Kai) +(id)sharedApplication; -(BOOL)launchApplicationWithIdentifier:(id)arg1 suspended:(BOOL)arg2; @end @interface CSCoverSheetViewBase : UIView @property (nonatomic, strong) KAIBattery *battery; -(void)KaiUpdate; -(void)KaiInit; @end @interface SBCoverSheetPrimarySlidingViewController -(void)KaiUpdate; @end @interface CSMainPageView : UIView -(void)updateForPresentation:(id)arg1; @end @interface _CSSingleBatteryChargingView : UIView @end @interface NCNotificationListView : UIView @property (nonatomic, assign) BOOL hasKai; @property (nonatomic, assign) NSInteger previousKaiCount; @end BOOL setFrame = NO; NCNotificationListView *batteryWidgetController; KAIBattery *batteryWidget; CSCoverSheetViewBase *base; CGRect original; CGRect originalBattery; /* - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context*/ /* %hook BCBatterDeviceController +(id)sharedInstance { [%orig addObserver:self forKeyPath:@"sortedDevices" options:NSKeyValueObservingOptionNew context:nil]; return %orig; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"sortedDevices"]) { [[UIApplication sharedApplication] launchApplicationWithIdentifier:@"com.apple.weather" suspended:NO]; } } %end*/ %hook CSMainPageView -(void)updateForPresentation:(id)arg1 { if(!setFrame) { if([self.subviews count] > 0) { CSCoverSheetViewBase *base = [self.subviews objectAtIndex:0]; [base KaiInit]; } } //[base KaiUpdate]; } %end %hook SBCoverSheetPrimarySlidingViewController -(void)viewWillAppear:(BOOL)arg1 { %orig; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(KaiUpdate) name:@"KaiInfoChanged" object:nil]; //[self KaiUpdate]; } %new -(void)KaiUpdate { [batteryWidget updateBattery]; [base KaiUpdate]; } %end %hook CSCoverSheetViewBase %property (nonatomic, strong) KAIBattery *battery; -(void)traitCollectionDidChange:(id)arg1 { %orig; [batteryWidget darkLightMode]; } -(void)setNeedsLayout { %orig; //[self KaiUpdate]; } %new -(void)KaiInit { if(!setFrame) { NCNotificationListView *scroller; if([self.subviews count] > 1) { UIView *temp = [self.subviews objectAtIndex:1]; if([temp.subviews count] > 0) { scroller = [[temp.subviews objectAtIndex:0].subviews objectAtIndex:0]; base = self; } } /*UIView *notiView; if([self.subviews count] > 0) { notiView = [self.subviews objectAtIndex:0]; }*/ original = scroller.frame; KAIBattery *battery = [[KAIBattery alloc] initWithFrame:CGRectMake(8, 0, self.frame.size.width - 16, self.frame.size.height)]; originalBattery = battery.frame; [scroller addSubview:battery]; setFrame = YES; batteryWidgetController = scroller; batteryWidget = battery; batteryWidgetController.previousKaiCount = 0; } [self KaiUpdate]; [batteryWidget darkLightMode]; } %new -(void)KaiUpdate { dispatch_async(dispatch_get_main_queue(), ^{ [UIView animateWithDuration:0.3 animations:^{ /*UIView *notiView; if([self.subviews count] > 0) { notiView = [self.subviews objectAtIndex:0]; }*/ batteryWidgetController.translatesAutoresizingMaskIntoConstraints = NO; /*for(UIView *view in batteryWidgetController.subviews) { view.bounds = CGRectMake( view.bounds.origin.x, view.bounds.origin.y - (batteryWidget.number * 85) + (batteryWidgetController.previousKaiCount * 85), view.bounds.size.width, view.bounds.size.height ); } batteryWidgetController.previousKaiCount = batteryWidget.number;*/ [batteryWidgetController.topAnchor constraintEqualToAnchor:batteryWidgetController.superview.topAnchor constant:(batteryWidget.number * 85)].active = YES; batteryWidget.frame = CGRectMake( originalBattery.origin.x, originalBattery.origin.y - (batteryWidget.number * 85), originalBattery.size.width, originalBattery.size.height ); }]; [batteryWidget darkLightMode]; }); } %end %hook NCNotificationListView %property (nonatomic, assign) BOOL hasKai; %property (nonatomic, assign) NSInteger previousKaiCount; //-(void)setBounds:(CGRect)arg1 { /*if(batteryWidgetController==self) { arg1 = (CGRectMake( original.origin.x, original.origin.y - (batteryWidget.number * 85), original.size.width, original.size.height )); batteryWidget.frame = CGRectMake( originalBattery.origin.x, originalBattery.origin.y - (batteryWidget.number * 85), originalBattery.size.width, originalBattery.size.height ); [batteryWidget darkLightMode]; }*/ // %orig; //} %end %hook BCBatteryDevice - (id)initWithIdentifier:(id)arg1 vendor:(long long)arg2 productIdentifier:(long long)arg3 parts:(unsigned long long)arg4 matchIdentifier:(id)arg5 { [self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"charging" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"powerSourceState" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"batterySaverModeActive" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"percentCharge" options:NSKeyValueObservingOptionNew context:nil]; //[self setValue:@"crash" forKeyPath:@"euhidehuud"]; return %orig; } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"KaiInfoChanged" object:nil userInfo:nil]; }); } %end %hook _CSSingleBatteryChargingView -(void)initWithFrame:(CGRect)arg1 { %orig; [self removeFromSuperview]; } -(CGFloat)desiredVisibilityDuration { return 0; } -(void)setBatteryVisible:(BOOL)arg1 { %orig(NO); } %end