#include #import #include #import #import #import "MobileGestalt.h" #import "NSTask.h" #define KAISelf ((CSAdjunctListView *)self) //for use when calling self in KAITarget //#define KAIBatteryStack UHDUEIHGCEBCHYDEICVKEVSAGJKBCXAHJGKVXHAS //lmao //#define KAIBatteryCell HDEIUOGEUBGUYOEXHNOPUSZIOJIGECEXIUSHXJXBE //very good @interface CSAdjunctListView : UIView @property (nonatomic, assign) BOOL hasKai; -(UIStackView *)stackView; -(void)setStackView:(UIStackView *)arg1; @end @interface CALayer (kai) @property (nonatomic, assign) BOOL continuousCorners; @end @interface SBIconController : UIViewController @end @interface SBCoverSheetPrimarySlidingViewController : UIViewController @end @interface UIDevice (kai) -(id)sf_udidString; -(id)_currentProduct; @end BOOL isUpdating = NO; //prefs BOOL enabled; BOOL disableGlyphs; BOOL hidePercent; BOOL showAll; BOOL belowMusic; BOOL hideDeviceLabel; BOOL hideChargingAnimation; NSInteger bannerStyle; NSInteger bannerAlign; NSInteger textColor; double spacing; double glyphSize; double bannerHeight; double cornerRadius; double bannerWidthFactor; double horizontalOffset; //by importing here, I can use vars in the .mm files #import "KAIBatteryCell.mm" #import "KAIBatteryStack.mm" #define PLIST_PATH @"/User/Library/Preferences/com.burritoz.kaiprefs.plist" #define kIdentifier @"com.burritoz.kaiprefs" #define kSettingsChangedNotification (CFStringRef)@"com.burritoz.kaiprefs/reload" #define kSettingsPath @"/var/mobile/Library/Preferences/com.burritoz.kaiprefs.plist" NSDictionary *prefs = nil; static void *observer = NULL; static void reloadPrefs() { if ([NSHomeDirectory() isEqualToString:@"/var/mobile"]) { CFArrayRef keyList = CFPreferencesCopyKeyList((CFStringRef)kIdentifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); if (keyList) { prefs = (NSDictionary *)CFBridgingRelease(CFPreferencesCopyMultiple(keyList, (CFStringRef)kIdentifier, kCFPreferencesCurrentUser, kCFPreferencesAnyHost)); if (!prefs) { prefs = [NSDictionary new]; } CFRelease(keyList); } } else { prefs = [NSDictionary dictionaryWithContentsOfFile:kSettingsPath]; } } static BOOL boolValueForKey(NSString *key, BOOL defaultValue) { return (prefs && [prefs objectForKey:key] ? [[prefs objectForKey:key] boolValue] : defaultValue); } static double numberForValue(NSString *key, double defaultValue) { return (prefs && [prefs objectForKey:key] ? [[prefs objectForKey:key] doubleValue] : defaultValue); } static void preferencesChanged() { CFPreferencesAppSynchronize((CFStringRef)kIdentifier); reloadPrefs(); enabled = boolValueForKey(@"enabled", YES); spacing = numberForValue(@"spacing", 5); glyphSize = numberForValue(@"glyphSize", 30); bannerHeight = numberForValue(@"bannerHeight", 80); cornerRadius = numberForValue(@"cornerRadius", 13); disableGlyphs = boolValueForKey(@"disableGlyphs", NO); hidePercent = boolValueForKey(@"hidePercent", NO); bannerStyle = numberForValue(@"bannerStyle", 1); showAll = boolValueForKey(@"showAll", NO); bannerWidthFactor = numberForValue(@"bannerWidthFactor", 0); hideDeviceLabel = boolValueForKey(@"hideDeviceLabel", NO); bannerAlign = numberForValue(@"bannerAlign", 2); horizontalOffset = numberForValue(@"horizontalOffset", 0); belowMusic = boolValueForKey(@"belowMusic", NO); hideChargingAnimation = boolValueForKey(@"hideChargingAnimation", YES); textColor = numberForValue(@"textColor", 0); if(disableGlyphs) { glyphSize = 0; } } static void applyPrefs() { preferencesChanged(); isUpdating = YES; [[KAIBatteryStack sharedInstance] refreshForPrefs]; //so hard (not) isUpdating = NO; }