Browse Source

prefs, a shit ton

pull/1/head
Burrit0z 4 years ago
parent
commit
168bd6d3dc
13 changed files with 346 additions and 228 deletions
  1. +14
    -0
      DragonMake
  2. +5
    -0
      KAIBattery.h
  3. +8
    -6
      KAIBattery.mm
  4. +91
    -0
      Kai.h
  5. +5
    -40
      Kai.xm
  6. +0
    -181
      build.ninja
  7. +1
    -1
      control
  8. +24
    -0
      kaiprefs/KAIRootListController.h
  9. +122
    -0
      kaiprefs/KAIRootListController.m
  10. +24
    -0
      kaiprefs/Resources/Info.plist
  11. +31
    -0
      kaiprefs/Resources/Root.plist
  12. BIN
      kaiprefs/Resources/kai.png
  13. +21
    -0
      kaiprefs/entry.plist

+ 14
- 0
DragonMake View File

@@ -8,3 +8,17 @@ kai:
- Kai.xm
frameworks:
- BatteryCenter

kaiPrefs:
dir: kaiprefs
type: bundle
files:
- KAIRootListController.m
archs:
- arm64
- arm64e
frameworks:
- Preferences
stage:
- mkdir -p .dragon/_/Library/PreferenceLoader/Preferences/
- cp entry.plist .dragon/_/Library/PreferenceLoader/Preferences/$name.plist

+ 5
- 0
KAIBattery.h View File

@@ -11,6 +11,11 @@
@property (nonatomic, assign) NSInteger chargingState;
@end

@interface MTMaterialView : UIView
@property (nonatomic, assign) BOOL recipeDynamic;
-(id)_initWithRecipe:(NSInteger)arg1 configuration:(NSInteger)arg2 initialWeighting:(CGFloat)arg3 scaleAdjustment:(id)arg4;
@end

@interface BCBatteryDeviceController
@property (nonatomic, strong) NSArray *sortedDevices;
-(id)_sortedDevices;

+ 8
- 6
KAIBattery.mm View File

@@ -48,7 +48,7 @@ long long lastPercentage;

if(charging) {

UIVisualEffectView *blank;
/*UIVisualEffectView *blank;
if(@available(iOS 12.0, *)) {
if(self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
blank = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
@@ -57,7 +57,9 @@ long long lastPercentage;
}
} else {
blank = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
}
}*/
MTMaterialView *blank = [[[objc_getClass("MTMaterialView") class] alloc] _initWithRecipe:1 configuration:1 initialWeighting:1 scaleAdjustment:nil];
//blank.recipeDynamic = NO; //makes it stay light
blank.frame = CGRectMake(0, 0 + y, self.superview.bounds.size.width - 16, 80);
blank.layer.masksToBounds = YES;
blank.layer.cornerRadius = 13;
@@ -97,8 +99,8 @@ long long lastPercentage;

label.frame = CGRectMake(65.5,27.5 + y,275,25);
glyphView.frame = CGRectMake(20.5,18.5 + y,40,40);
battery.frame = CGRectMake(310,35 + y,20,10);
percentLabel.frame = CGRectMake(265,35 + y,36,12);
battery.frame = CGRectMake(self.superview.bounds.size.width - 16 - 49,35 + y,20,10);
percentLabel.frame = CGRectMake(self.superview.bounds.size.width - 16 - 94,35 + y,36,12);

y+=85;
self.number +=1;
@@ -123,7 +125,7 @@ long long lastPercentage;
}

-(void)darkLightMode {
for(UIVisualEffectView *view in self.subviews) {
/*for(UIVisualEffectView *view in self.subviews) {
if(@available(iOS 12.0, *)) {
if(self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
if([view respondsToSelector:@selector(setEffect:)]) view.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
@@ -132,7 +134,7 @@ long long lastPercentage;
if([view respondsToSelector:@selector(setEffect:)]) view.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
}
}
}
}*/
}

@end

+ 91
- 0
Kai.h View File

@@ -0,0 +1,91 @@
#include <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#include <stdio.h>
#import <objc/runtime.h>
#import <UIKit/UIKit.h>

#import "KAIBattery.mm"
#define KAISelf ((CSAdjunctListView *)self)

@interface UIApplication (Kai)
+(id)sharedApplication;
-(BOOL)launchApplicationWithIdentifier:(id)arg1 suspended:(BOOL)arg2;
@end

@interface CSAdjunctListView : UIView
@property (nonatomic, assign) BOOL hasKai;
-(UIStackView *)stackView;
-(void)setStackView:(UIStackView *)arg1;
-(void)KaiUpdate;
@end

@interface SBDashBoardAdjunctListView : UIView
@property (nonatomic, assign) BOOL hasKai;
-(UIStackView *)stackView;
-(void)setStackView:(UIStackView *)arg1;
-(void)KaiUpdate;
@end

@interface CSMainPageView : UIView
-(void)updateForPresentation:(id)arg1;
@end

@interface _CSSingleBatteryChargingView : UIView
@end

@interface NSLayoutConstraint (Kai)
+(id)constraintWithAnchor:(id)arg1 relatedBy:(long long)arg2 toAnchor:(id)arg3 multiplier:(double)arg4 constant:(double)arg5 ;
@end

//prefs
BOOL enabled;


#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);
}

+ 5
- 40
Kai.xm View File

@@ -1,41 +1,4 @@
#include <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#include <stdio.h>
#import <objc/runtime.h>
#import <UIKit/UIKit.h>

#import "KAIBattery.mm"
#define KAISelf ((CSAdjunctListView *)self)

@interface UIApplication (Kai)
+(id)sharedApplication;
-(BOOL)launchApplicationWithIdentifier:(id)arg1 suspended:(BOOL)arg2;
@end

@interface CSAdjunctListView : UIView
@property (nonatomic, assign) BOOL hasKai;
-(UIStackView *)stackView;
-(void)setStackView:(UIStackView *)arg1;
-(void)KaiUpdate;
@end

@interface SBDashBoardAdjunctListView : UIView
@property (nonatomic, assign) BOOL hasKai;
-(UIStackView *)stackView;
-(void)setStackView:(UIStackView *)arg1;
-(void)KaiUpdate;
@end

@interface CSMainPageView : UIView
-(void)updateForPresentation:(id)arg1;
@end

@interface _CSSingleBatteryChargingView : UIView
@end

@interface NSLayoutConstraint (Kai)
+(id)constraintWithAnchor:(id)arg1 relatedBy:(long long)arg2 toAnchor:(id)arg3 multiplier:(double)arg4 constant:(double)arg5 ;
@end
#import "Kai.h"


%hook KAITarget
@@ -113,7 +76,6 @@

- (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];
@@ -148,6 +110,9 @@
%end

%ctor {
preferencesChanged();
Class cls = kCFCoreFoundationVersionNumber > 1600 ? ([objc_getClass("CSAdjunctListView") class]) : ([objc_getClass("SBDashBoardAdjunctListView") class]);
%init(KAITarget = cls);
if(enabled) {
%init(KAITarget = cls);
}
}

+ 0
- 181
build.ninja View File

@@ -1,181 +0,0 @@
name = kai
lowername = kai

# Build file for kai
# Generated at 05/20/20 09:51:19

pdirname = .dragon

location = /Library/MobileSubstrate/DynamicLibraries/
resource_dir = Resources
target = $pdirname/_$location$name.dylib

stage2 = cp $name.plist $
.dragon/_/Library/MobileSubstrate/DynamicLibraries/$name.plist

builddir = $pdirname/build
objdir = $pdirname/obj
signdir = $pdirname/sign
signtarget = $signdir/$target.unsigned
symtarget = $signdir/$target.unsym

dragondir = $$DRAGONBUILD
pwd = .
sysroot = $dragondir/sdks/iPhoneOS.sdk

fwSearch = -F$sysroot/System/Library/Frameworks $
-F$sysroot/System/Library/PrivateFrameworks -F$dragondir/frameworks
libSearch = -L$dragondir/lib -L.

cc = clang++
ccpp = clang++
ld = clang++
ldid = ldid
dsym = dsymutil
logos = $dragondir/bin/logos.pl
plutil = plutil
stage = true;

targetios = 10.0

frameworks = -framework BatteryCenter -framework CoreFoundation -framework $
Foundation -framework UIKit -framework CoreGraphics -framework $
QuartzCore -framework CoreImage -framework AudioToolbox

libs = -lsubstrate -lobjc -lc++

arc = -fobjc-arc
btarg = -DTARGET_IPHONE=1
warnings = -Wall
optim = -O0
debug = -fcolor-diagnostics

header_includes =
cinclude = -I$dragondir/include -I$dragondir/vendor/include $
-I$dragondir/include/_fallback -I$DRAGONBUILD/headers/ -I$pwd

usrCflags =
usrLDflags =
usrLDIDFlags = -S

lopt = -dynamiclib -ggdb -Xlinker -segalign -Xlinker 4000
typeldflags = -install_name $location$name

cflags = $cinclude -fmodules -fcxx-modules -fmodule-name=$name $
-fbuild-session-file=.dragon/modules/ -fmodules-prune-after=345600 $
-fmodules-prune-interval=86400 $
-fmodules-validate-once-per-build-session $arc $fwSearch $
-miphoneos-version-min=$targetios -isysroot $sysroot $btarg $warnings $
$optim $debug $usrCflags $header_includes

lflags = $cflags $typeldflags $frameworks $libs $lopt $libSearch $usrLDflags

ldflags = $usrLDFlags

pool solo
depth = 1

rule prelogos
command = cat $in | python3 $$DRAGONBUILD/bin/prelogos.py > $out
description = Processing $in with Pre/Logos

rule logos
command = $logos $in > $out
description = Processing $in with Logos

rule compilearm64
command = $cc -arch arm64 $cflags -c $in -o $out
description = Compiling $in for arm64

rule compilexxarm64
command = $cxx -arch arm64 $cflags -c $in -o $out
description = Compiling $in for arm64

rule linkarm64
command = $ld -arch arm64 $lflags -o $out $in
description = Linking $name for arm64

rule compilearm64e
command = $cc -arch arm64e $cflags -c $in -o $out
description = Compiling $in for arm64e

rule compilexxarm64e
command = $cxx -arch arm64e $cflags -c $in -o $out
description = Compiling $in for arm64e

rule linkarm64e
command = $ld -arch arm64e $lflags -o $out $in
description = Linking $name for arm64e

rule compilearmv7
command = $cc -arch armv7 $cflags -c $in -o $out
description = Compiling $in for armv7

rule compilexxarmv7
command = $cxx -arch armv7 $cflags -c $in -o $out
description = Compiling $in for armv7

rule linkarmv7
command = $ld -arch armv7 $lflags -o $out $in
description = Linking $name for armv7

rule compilex86_64
command = $cc -arch x86_64 $cflags -c $in -o $out
description = Compiling $in for x86_64

rule compilexxx86_64
command = $cxx -arch x86_64 $cflags -c $in -o $out
description = Compiling $in for x86_64

rule linkx86_64
command = $ld -arch x86_64 $lflags -o $out $in
description = Linking $name for x86_64

rule lipo
command = lipo -create $in -output $out
description = Merging architectures

rule bundle
command = mkdir -p ".dragon/_$location/" && cp -r "$resource_dir/" $
".dragon/_$location" && cp $in $out
description = Copying Bundle Resources
pool = solo

rule plist
command = $plutil -convert binary1 $in -o $out
description = Converting $in

rule debug
command = $dsym "$in" 2&> /dev/null; cp $in $out
description = Generating Debug Symbols for $name

rule sign
command = $ldid $usrLDIDFlags $in && cp $in $target
description = Signing $name

rule stage
command = $stage $stage2
description = Running Stage for $name

build $builddir/logos/Kai.xm.mm: logos Kai.xm

build $builddir/armv7/Kai.xm.mm.o: compilearmv7 $builddir/logos/Kai.xm.mm

build $builddir/$name.armv7: linkarmv7 $builddir/armv7/Kai.xm.mm.o
build $builddir/arm64/Kai.xm.mm.o: compilearm64 $builddir/logos/Kai.xm.mm

build $builddir/$name.arm64: linkarm64 $builddir/arm64/Kai.xm.mm.o
build $builddir/arm64e/Kai.xm.mm.o: compilearm64e $builddir/logos/Kai.xm.mm

build $builddir/$name.arm64e: linkarm64e $builddir/arm64e/Kai.xm.mm.o
build $builddir/trash/stage: stage $target

build $symtarget: lipo $builddir/$name.armv7 $builddir/$name.arm64 $
$builddir/$name.arm64e

build $signtarget: debug $symtarget

build $target: sign $signtarget

default $target $builddir/trash/stage


+ 1
- 1
control View File

@@ -1,6 +1,6 @@
Package: com.burritoz.kai
Name: Kai
Version: 0.0.3
Version: 0.0.4
Architecture: iphoneos-arm
Description: An awesome MobileSubstrate tweak!
Maintainer: burrit0z

+ 24
- 0
kaiprefs/KAIRootListController.h View File

@@ -0,0 +1,24 @@
#import <Preferences/PSListController.h>
#import <Preferences/PSTableCell.h>
#import <Preferences/PSSpecifier.h>
#import <Preferences/PSListItemsController.h>
#import <Foundation/NSUserDefaults.h>

@interface PSListController (kai)
-(void)setFrame:(CGRect)frame;
@end

@interface KAIRootListController : PSListController
@end

@protocol PreferencesTableCustomView
- (id)initWithSpecifier:(id)arg1;
@end

@interface KaiHeaderCell : PSTableCell <PreferencesTableCustomView> {
UIView *bgView;
UILabel *packageNameLabel;
UILabel *developerLabel;
UILabel *versionLabel;
}
@end

+ 122
- 0
kaiprefs/KAIRootListController.m View File

@@ -0,0 +1,122 @@
#include "KAIRootListController.h"

NSBundle *tweakBundle;

@implementation KAIRootListController

- (NSArray *)specifiers {
if (!_specifiers) {
_specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self];
}

return _specifiers;
}

-(void)viewWillAppear:(BOOL)arg1 {
self.navigationController.navigationController.navigationBar.barTintColor = [UIColor colorWithRed: 0.00 green: 0.77 blue: 0.95 alpha: 1.00];
[self.navigationController.navigationController.navigationBar setShadowImage: [UIImage new]];
self.navigationController.navigationController.navigationBar.tintColor = [UIColor whiteColor];
self.navigationController.navigationController.navigationBar.translucent = NO;

[[UISegmentedControl appearanceWhenContainedInInstancesOfClasses:@[self.class]] 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)animated {

[super viewWillDisappear:animated];

[self.navigationController.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blackColor]}];

}

@end

@implementation KaiHeaderCell // Header Cell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(id)reuseIdentifier specifier:(id)specifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier specifier:specifier];

if (self) {
packageNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,90,self.contentView.bounds.size.width+30,50)];
[packageNameLabel setTextAlignment:NSTextAlignmentRight];
[packageNameLabel setFont:[UIFont systemFontOfSize:50 weight: UIFontWeightSemibold] ];
packageNameLabel.textColor = [UIColor whiteColor];
packageNameLabel.text = @"kai";
developerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,50,self.contentView.bounds.size.width+30,50)];
[developerLabel setTextAlignment:NSTextAlignmentRight];
[developerLabel setFont:[UIFont systemFontOfSize:22.5 weight: UIFontWeightMedium] ];
developerLabel.textColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.85];
developerLabel.alpha = 0.8;
developerLabel.text = @"Burrit0z";
versionLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,130,self.contentView.bounds.size.width+30,50)];
[versionLabel setTextAlignment:NSTextAlignmentRight];
[versionLabel setFont:[UIFont systemFontOfSize:22 weight: UIFontWeightMedium] ];
versionLabel.textColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8];
versionLabel.alpha = 0.8;
versionLabel.text = @"alpha";

NSBundle *bundle = [[NSBundle alloc]initWithPath:@"/Library/PreferenceBundles/KaiPrefs.bundle"];
UIImage *phone = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"kai" ofType:@"png"]];
UIImageView *phoneImage = [[UIImageView alloc]initWithImage:phone];
[phoneImage setFrame:self.frame];
bgView.backgroundColor = [UIColor colorWithRed: 0.00 green: 0.82 blue: 1.00 alpha: 1.00];
[self addSubview:packageNameLabel];
[self addSubview:developerLabel];
[self addSubview:versionLabel];
[self addSubview:phoneImage];

}
return self;

}

- (instancetype)initWithSpecifier:(PSSpecifier *)specifier {
return [self initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"KaiHeaderCell" specifier:specifier];
}

- (void)setFrame:(CGRect)frame {
frame.origin.x = 0;
//frame.origin.y = 43;
[super setFrame:frame];
}

- (CGFloat)preferredHeightForWidth:(CGFloat)arg1{
return 200.0f;
}


-(void)layoutSubviews{
[super layoutSubviews];

bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.contentView.bounds.size.width, 200)];

UIColor *topColor = [UIColor colorWithRed: 0.00 green: 0.82 blue: 1.00 alpha: 1.00];
UIColor *bottomColor = [UIColor colorWithRed: 0.23 green: 0.48 blue: 0.84 alpha: 1.00];

CAGradientLayer *theViewGradient = [CAGradientLayer layer];
theViewGradient.colors = [NSArray arrayWithObjects: (id)topColor.CGColor, (id)bottomColor.CGColor, nil];
theViewGradient.startPoint = CGPointMake(0.5, 0.0);
theViewGradient.endPoint = CGPointMake(0.5, 1.0);
theViewGradient.frame = bgView.bounds;

//Add gradient to view
[bgView.layer insertSublayer:theViewGradient atIndex:0];
[self insertSubview:bgView atIndex:0];

}


- (CGFloat)preferredHeightForWidth:(CGFloat)width inTableView:(id)tableView {
return [self preferredHeightForWidth:width];
}

@end

+ 24
- 0
kaiprefs/Resources/Info.plist View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>kaiPrefs</string>
<key>CFBundleIdentifier</key>
<string>com.burritoz.kaiprefs</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>NSPrincipalClass</key>
<string>KAIRootListController</string>
</dict>
</plist>

+ 31
- 0
kaiprefs/Resources/Root.plist View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>cell</key>
<string>PSGroupCell</string>
<key>headerCellClass</key>
<string>KaiHeaderCell</string>
<key>height</key>
<integer>175</integer>
</dict>
<dict>
<key>cell</key>
<string>PSSwitchCell</string>
<key>default</key>
<true/>
<key>defaults</key>
<string>com.burritoz.kaiprefs</string>
<key>key</key>
<string>enabled</string>
<key>label</key>
<string>Enable</string>
</dict>
</array>
<key>title</key>
<string>kai</string>
</dict>
</plist>

BIN
kaiprefs/Resources/kai.png View File

Before After
Width: 400  |  Height: 96  |  Size: 3.7KB

+ 21
- 0
kaiprefs/entry.plist View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>entry</key>
<dict>
<key>bundle</key>
<string>kaiPrefs</string>
<key>cell</key>
<string>PSLinkCell</string>
<key>detail</key>
<string>KAIRootListController</string>
<key>icon</key>
<string>icon.png</string>
<key>isController</key>
<true/>
<key>label</key>
<string>kai</string>
</dict>
</dict>
</plist>

Loading…
Cancel
Save