From 4534bd8c8937fd19a97f7a6f9917b48ae39324dc Mon Sep 17 00:00:00 2001 From: Lunatik Date: Thu, 19 Apr 2012 02:01:50 -0500 Subject: [PATCH] 1. Cleaned up Project 2. Redesigned Settings 3. Standardized Preferences 4. Added Alignment Options per icon 5. Other fun stuff --- .gitignore | 3 + Constants.h | 20 + Layout/DEBIAN/control | 9 - .../DynamicLibraries/OpenNotifier.dylib | Bin 13888 -> 0 bytes .../Preferences/OpenNotifier.plist | 19 - Makefile | 53 +- OpenNotifier.deb | Bin 43422 -> 0 bytes Preferences.h | 51 ++ Preferences.mm | 309 ++++++++++ Settings.h | 27 + Settings.mm | 566 ++++++++++++++++++ Tweak.h | 27 + Tweak.xm | 254 +++++--- include/AppList/ALApplicationList.h | 32 + .../AppList/ALApplicationTableDataSource.h | 41 ++ include/AppList/ALValueCell.h | 36 ++ include/AppList/AppList.h | 3 + .../LibStatusBar/LSStatusBarItem.h | 2 +- layout/DEBIAN/control | 9 + .../DynamicLibraries/OpenNotifier.plist | 0 .../OpenNotifier.bundle}/Info.plist | 0 .../OpenNotifier.bundle}/OpenNotifier.png | Bin .../OpenNotifier.bundle}/OpenNotifier@2x.png | Bin .../OpenNotifier.bundle}/OpenNotifierSettings | Bin .../OpenNotifierSettings.plist | 54 +- .../Preferences/OpenNotifier.plist | 12 + .../UIKit.framework/Black_ON_Envelope.png | Bin .../UIKit.framework/Black_ON_Envelope@2x.png | Bin .../Black_ON_Exclamation Point.png | Bin .../Black_ON_Exclamation Point@2x.png | Bin .../UIKit.framework/Black_ON_Handset.png | Bin .../UIKit.framework/Black_ON_Handset@2x.png | Bin .../UIKit.framework/Black_ON_Silent.png | Bin .../UIKit.framework/Black_ON_Silent@2x.png | Bin .../Black_ON_Speech Bubble.png | Bin .../Black_ON_Speech Bubble@2x.png | Bin .../UIKit.framework/Silver_ON_Envelope.png | Bin .../UIKit.framework/Silver_ON_Envelope@2x.png | Bin .../Silver_ON_Exclamation Point.png | Bin .../Silver_ON_Exclamation Point@2x.png | Bin .../UIKit.framework/Silver_ON_Handset.png | Bin .../UIKit.framework/Silver_ON_Handset@2x.png | Bin .../UIKit.framework/Silver_ON_Silent.png | Bin .../UIKit.framework/Silver_ON_Silent@2x.png | Bin .../Silver_ON_Speech Bubble.png | Bin .../Silver_ON_Speech Bubble@2x.png | Bin lib/libapplist.dylib | Bin 0 -> 37376 bytes libstatusbar.dylib => lib/libstatusbar.dylib | Bin obj/.stamp | 0 obj/OpenNotifier.dylib | Bin 13888 -> 0 bytes obj/Tweak.xm.o | Bin 10436 -> 0 bytes .../OpenNotifierSettings/Info.plist | 28 - .../OpenNotifierSettings/OpenNotifier.png | Bin 4358 -> 0 bytes .../OpenNotifierSettings/OpenNotifier@2x.png | Bin 6312 -> 0 bytes .../OpenNotifierSettings.plist | 79 --- opennotifiersettings/Makefile | 13 - opennotifiersettings/OpenNotifierSettings.mm | 16 - opennotifiersettings/Resources/Info.plist | 28 - .../Resources/OpenNotifierSettings.plist | 29 - opennotifiersettings/entry.plist | 10 - opennotifiersettings/theos | 1 - 61 files changed, 1381 insertions(+), 350 deletions(-) create mode 100755 .gitignore create mode 100644 Constants.h delete mode 100644 Layout/DEBIAN/control delete mode 100755 Layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.dylib delete mode 100755 Layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist delete mode 100644 OpenNotifier.deb create mode 100644 Preferences.h create mode 100644 Preferences.mm create mode 100644 Settings.h create mode 100644 Settings.mm create mode 100644 Tweak.h create mode 100644 include/AppList/ALApplicationList.h create mode 100644 include/AppList/ALApplicationTableDataSource.h create mode 100644 include/AppList/ALValueCell.h create mode 100644 include/AppList/AppList.h rename LSStatusBarItem.h => include/LibStatusBar/LSStatusBarItem.h (99%) create mode 100644 layout/DEBIAN/control rename {Layout => layout}/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.plist (100%) rename {Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle => layout/Library/PreferenceBundles/OpenNotifier.bundle}/Info.plist (100%) mode change 100755 => 100644 rename {Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle => layout/Library/PreferenceBundles/OpenNotifier.bundle}/OpenNotifier.png (100%) mode change 100755 => 100644 rename {Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle => layout/Library/PreferenceBundles/OpenNotifier.bundle}/OpenNotifier@2x.png (100%) mode change 100755 => 100644 rename {Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle => layout/Library/PreferenceBundles/OpenNotifier.bundle}/OpenNotifierSettings (100%) rename {Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle => layout/Library/PreferenceBundles/OpenNotifier.bundle}/OpenNotifierSettings.plist (75%) mode change 100755 => 100644 create mode 100644 layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Handset.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Handset@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Silent.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Silent@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent@2x.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble.png (100%) mode change 100755 => 100644 rename {Layout => layout}/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble@2x.png (100%) mode change 100755 => 100644 create mode 100755 lib/libapplist.dylib rename libstatusbar.dylib => lib/libstatusbar.dylib (100%) mode change 100644 => 100755 delete mode 100644 obj/.stamp delete mode 100755 obj/OpenNotifier.dylib delete mode 100644 obj/Tweak.xm.o delete mode 100644 opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/Info.plist delete mode 100644 opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifier.png delete mode 100644 opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifier@2x.png delete mode 100644 opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifierSettings.plist delete mode 100644 opennotifiersettings/Makefile delete mode 100644 opennotifiersettings/OpenNotifierSettings.mm delete mode 100644 opennotifiersettings/Resources/Info.plist delete mode 100644 opennotifiersettings/Resources/OpenNotifierSettings.plist delete mode 100644 opennotifiersettings/entry.plist delete mode 120000 opennotifiersettings/theos diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..ebe2daa --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build/ +obj/ +.theos/ diff --git a/Constants.h b/Constants.h new file mode 100644 index 0000000..cc6525a --- /dev/null +++ b/Constants.h @@ -0,0 +1,20 @@ + + +NSString* const ONAppIdentifierKey = @"ONAppIdentifier"; +NSString* const ONApplicationsKey = @"apps"; +NSString* const ONEnabledKey = @"ONEnabled"; +NSString* const ONIconsKey = @"icons"; +NSString* const ONIconAlignmentKey = @"IconAlignment"; +NSString* const ONIconNameKey = @"IconName"; +NSString* const ONIconsLeftKey = @"ONNotifIconsLeft"; +NSString* const ONPreferencesFile = @"/var/mobile/Library/Preferences/com.n00neimp0rtant.opennotifier.plist"; +NSString* const ONSchemaVersionKey = @"SchemaVersion"; +NSString* const ONSilentKey = @"Silent"; +NSString* const ONSilentIconLeftKey = @"ONSilentIconLeft"; +NSString* const ONSilentModeEnabledKey = @"ONSilentModeIcon"; + +NSString* const IconRegexPattern = @"(?:Silver|Black)_ON_(.*?)(?:@.*|)(?:~.*|).png"; +NSString* const SilverIconRegexPattern = @"Silver_ON_(.*?)(?:@.*|)(?:~.*|).png"; + +NSString* const IconSettingsChangedNotification = @"opennotifier.iconSettingsChanged"; +NSString* const SilentModeChangedNotification = @"opennotifier.silentModeChanged"; diff --git a/Layout/DEBIAN/control b/Layout/DEBIAN/control deleted file mode 100644 index 62b53b8..0000000 --- a/Layout/DEBIAN/control +++ /dev/null @@ -1,9 +0,0 @@ -Package: com.n00neimp0rtant.opennotifier -Name: OpenNotifier -Depends: mobilesubstrate, libstatusbar -Version: 1.1.2 -Architecture: iphoneos-arm -Description: Pseudobadges DON'T work yet -Maintainer: n00neimp0rtant -Author: n00neimp0rtant -Section: Tweaks diff --git a/Layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.dylib b/Layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.dylib deleted file mode 100755 index fc880891ada3c17f0dba4d25742a91a3bbe23652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13888 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 Id6g>l-_#B)h5!Hn diff --git a/Layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist b/Layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist deleted file mode 100755 index 8160c2c..0000000 --- a/Layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - entry - - bundle - OpenNotifierSettings - cell - PSLinkCell - icon - OpenNotifier.png - isController - - label - OpenNotifier - - - diff --git a/Makefile b/Makefile index 18c469e..f549e78 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,54 @@ -include theos/makefiles/common.mk +.PHONY: before-release after-release release debugrelease + +DEBUG = 1 +DEBUGFLAG = -ggdb +GO_EASY_ON_ME = 1 +TARGET = iphone:latest:3.2 +THEOS_BUILD_DIR = build +SHARED_CFLAGS = -Iinclude +ADDITIONAL_LDFLAGS = -L./lib TWEAK_NAME = OpenNotifier -OpenNotifier_FILES = Tweak.xm -OpenNotifier_LDFLAGS = -L./ -lstatusbar +OpenNotifier_FILES = Tweak.xm Preferences.mm +OpenNotifier_LIBRARIES = statusbar + +BUNDLE_NAME = OpenNotifierSettings +OpenNotifierSettings_BUNDLE_NAME = OpenNotifier +OpenNotifierSettings_FILES = Settings.mm Preferences.mm +OpenNotifierSettings_INSTALL_PATH = /Library/PreferenceBundles +OpenNotifierSettings_FRAMEWORKS = UIKit CoreGraphics +OpenNotifierSettings_PRIVATE_FRAMEWORKS = Preferences +OpenNotifierSettings_LIBRARIES = applist substrate + +ifeq ($(DEBUGPREFS),1) +DEBUGFLAG += -DDEBUGPREFS +endif +include theos/makefiles/common.mk +# THEOS_STAGING_DIR is here because of a bug +# theos needs to be fixed at some point +THEOS_STAGING_DIR = build/stage include $(THEOS_MAKE_PATH)/tweak.mk +include $(THEOS_MAKE_PATH)/bundle.mk + +clean:: + rm -rf $(THEOS_BUILD_DIR)/*.deb + rm -f ./*.deb + +ifneq ($(THEOS_DEVICE_IP),) + @install.exec "rm -rf com.n00neimp0rtant.opennotifier_*.deb" +endif + +release:: + @$(MAKE) clean before-release DEBUG="" MAKELEVEL=0 THEOS_SCHEMA="" SCHEMA="release" GO_EASY_ON_ME=0 + +beta:: + @$(MAKE) clean before-release MAKELEVEL=0 GO_EASY_ON_ME=0 PACKAGE_NAME="beta" + +before-release:: all + @$(EDITOR) layout/DEBIAN/control + @$(MAKE) after-release + +after-release:: stage before-package + @echo "Making Package $(THEOS_PACKAGE_NAME) Version: $(THEOS_PACKAGE_BASE_VERSION)" + @$(FAKEROOT) -r dpkg-deb -b $(THEOS_STAGING_DIR) "$(THEOS_BUILD_DIR)/$(THEOS_PACKAGE_NAME)_$(THEOS_PACKAGE_BASE_VERSION)$(if $(PACKAGE_BUILDNAME),"+"$(PACKAGE_BUILDNAME))_$(THEOS_PACKAGE_ARCH).deb" > /dev/null 2>&1 diff --git a/OpenNotifier.deb b/OpenNotifier.deb deleted file mode 100644 index bb3ba6748417a9234c8302f3843cccaee2b112c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43422 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 diff --git a/Preferences.h b/Preferences.h new file mode 100644 index 0000000..3879865 --- /dev/null +++ b/Preferences.h @@ -0,0 +1,51 @@ +#define ONSchemaVersion 1 + +enum +{ + ONIconAlignmentDefault = 0, + ONIconAlignmentLeft = 1, + ONIconAlignmentRight = 2 +}; +typedef NSUInteger ONIconAlignment; + +@interface ONApplicationIcon : NSObject +{ + NSMutableDictionary* _dictionary; +} +@property(assign, nonatomic) ONIconAlignment alignment; +-(NSMutableDictionary*)toDictionary; +@end + +@interface ONApplication : NSObject +{ + NSMutableDictionary* _dictionary; +} +@property(retain, nonatomic) NSMutableDictionary* icons; +-(NSMutableDictionary*)toDictionary; +-(bool)containsIcon:(NSString*)iconName; +@end + +@interface ONPreferences : NSObject +{ + NSMutableDictionary* _data; + NSMutableDictionary* _applications; +} +@property(readonly, nonatomic) NSMutableDictionary* applications; +@property(assign) bool enabled; +@property(assign) bool iconsOnLeft; +@property(assign) bool silentModeEnabled; +@property(assign) bool silentIconOnLeft; + ++(id)sharedInstance; + +-(ONApplication*)getApplication:(NSString*)identifer; +-(void)removeApplication:(NSString*)identifer; + +-(id)addIcon:(NSString*)iconName forApplication:(NSString*)identifer; +-(void)removeIcon:(NSString*)iconName fromApplication:(NSString*)identifer; +-(ONApplicationIcon*)getIcon:(NSString*)iconName forApplication:(NSString*)identifer; + +-(void)reload; +-(void)save; + +@end \ No newline at end of file diff --git a/Preferences.mm b/Preferences.mm new file mode 100644 index 0000000..ae035fa --- /dev/null +++ b/Preferences.mm @@ -0,0 +1,309 @@ +#import "Tweak.h" +#import "Preferences.h" + +#pragma mark #region [ ONApplicationIcon ] +@implementation ONApplicationIcon ++(id)createInstance { return [[ONApplicationIcon alloc] init]; } ++(id)createInstanceWithDictionary:(NSMutableDictionary*)aDictionary { return [[ONApplicationIcon alloc] initWithDictionary:aDictionary]; } + +-(id)init +{ + if (!(self = [super init])) return nil; + _dictionary = [[NSMutableDictionary dictionary] retain]; + return self; +} + +-(id)initWithDictionary:(NSMutableDictionary*)aDictionary +{ + if (![self init]) return nil; + _dictionary = [aDictionary retain]; + return self; +} + +-(void)dealloc +{ + [_dictionary release]; + [super dealloc]; +} + +-(ONIconAlignment)alignment +{ + return [_dictionary.allKeys containsObject:ONIconAlignmentKey] + ? (ONIconAlignment)[[_dictionary objectForKey:ONIconAlignmentKey] intValue] + : ONIconAlignmentDefault; +} + +-(void)setAlignment:(ONIconAlignment)value +{ + [_dictionary setObject:[NSNumber numberWithUnsignedInt:value] forKey:ONIconAlignmentKey]; +} + +-(NSMutableDictionary*)toDictionary { return _dictionary; } + +@end +#pragma mark #endregion + +#pragma mark #region [ ONApplication ] +@implementation ONApplication +@synthesize icons; + ++(id)createInstance +{ + return [[ONApplication alloc] init]; +} + +-(id)init +{ + if (!(self = [super init])) return nil; + self.icons = [NSMutableDictionary dictionary]; + return self; +} + +-(void)dealloc +{ + [self.icons release]; + [super dealloc]; +} + +-(NSMutableDictionary*)toDictionary +{ + NSMutableDictionary* value = [NSMutableDictionary dictionary]; + if (self.icons.allKeys.count > 0) + { + NSMutableDictionary* iconDict = [NSMutableDictionary dictionary]; + for (NSString* name in self.icons.allKeys) + { + ONApplicationIcon* icon = [self.icons objectForKey:name]; + if (icon) [iconDict setObject:[icon toDictionary] forKey:name]; + } + [value setObject:iconDict forKey:ONIconsKey]; + } + + return value; +} + +-(id)addIcon:(NSString*)iconName +{ + [self.icons setObject:[ONApplicationIcon createInstance] forKey:iconName]; + return [self.icons objectForKey:iconName]; +} + +-(void)removeIcon:(NSString*)iconName +{ + [self.icons removeObjectForKey:iconName]; +} + +-(bool)containsIcon:(NSString*)iconName +{ + return [self.icons.allKeys containsObject:iconName]; +} + +@end +#pragma mark #endregion + +#pragma mark #region [ ONPreferences ] +static ONPreferences* _instance; +@implementation ONPreferences + ++(id)sharedInstance +{ + return (_instance = [[ONPreferences alloc] init]); +} + +-(id)init +{ + if (_instance) { [self release]; return _instance; } + if (!(self = [super init])) return nil; + [self reload]; + return (_instance = self); +} + +-(void)dealloc +{ + [_data release]; + [super dealloc]; +} + +-(int)schemaVersion +{ + return [_data.allKeys containsObject:ONSchemaVersionKey] ? [[_data objectForKey:ONSchemaVersionKey] intValue] : 0; +} + +-(void)loadAppsVersion00 +{ + if (![_data.allKeys containsObject:ONApplicationsKey]) return; + + NSDictionary* appData = [_data objectForKey:ONApplicationsKey]; + for (NSString* identifer in appData.allKeys) + { + ONApplication* app = [ONApplication createInstance]; + NSArray* icons = [appData objectForKey:identifer]; + for (NSString* iconName in icons) + { + [app.icons setObject:[ONApplicationIcon createInstance] forKey:iconName]; + } + + [_applications setObject:app forKey:identifer]; + } +} + +-(void)loadAppsVersion01 +{ + if (![_data.allKeys containsObject:ONApplicationsKey]) return; + + NSDictionary* appData = [_data objectForKey:ONApplicationsKey]; + for (NSString* identifer in appData.allKeys) + { + ONApplication* app = [ONApplication createInstance]; + NSMutableDictionary* icons = [[appData objectForKey:identifer] objectForKey:ONIconsKey]; + for (NSString* iconName in icons.allKeys) + { + [app.icons setObject:[ONApplicationIcon createInstanceWithDictionary:[icons objectForKey:iconName]] forKey:iconName]; + } + [_applications setObject:app forKey:identifer]; + } +} + +-(NSMutableDictionary*)applications +{ + if (_applications) return _applications; + _applications = [[NSMutableDictionary dictionary] retain]; + + switch (self.schemaVersion) + { + case 0: [self loadAppsVersion00]; break; + default: [self loadAppsVersion01]; break; + } + + return _applications; +} + +-(ONApplication*)getApplication:(NSString*)identifer +{ + return [self.applications objectForKey:identifer]; +} + +-(void)setApplication:(ONApplication*)application named:(NSString*)identifer +{ + [self.applications setObject:application forKey:identifer]; +} + +-(void)removeApplication:(NSString*)identifer +{ + [self.applications removeObjectForKey:identifer]; +} + +-(id)addIcon:(NSString*)iconName forApplication:(NSString*)identifer +{ + ONApplication* app = [self getApplication:identifer]; + if (!app && !(app = [ONApplication createInstance])) + { + Log("Failed to get or create ONApplication"); + return nil; + } + [app addIcon:iconName]; + [self setApplication:app named:identifer]; + return [app.icons objectForKey:iconName]; +} + +-(void)removeIcon:(NSString*)iconName fromApplication:(NSString*)identifer; +{ + ONApplication* app = [self getApplication:identifer]; + if (!app) return; + [app removeIcon:iconName]; + if (app.icons.allKeys.count == 0) [self removeApplication:identifer]; +} + +-(ONApplicationIcon*)getIcon:(NSString*)iconName forApplication:(NSString*)identifer +{ + ONApplication* app = [self getApplication:identifer]; + if (!app) return nil; + return [app.icons objectForKey:iconName]; +} + +-(bool)iconsOnLeft +{ + return [_data.allKeys containsObject:ONIconsLeftKey] ? [[_data objectForKey:ONIconsLeftKey] boolValue] : false; +} + +-(void)setIconsOnLeft:(bool)value +{ + [_data setObject:NSBool(value) forKey:ONIconsLeftKey]; + [self save]; +} + +-(bool)enabled +{ + return [_data.allKeys containsObject:ONEnabledKey] ? [[_data objectForKey:ONEnabledKey] boolValue] : true; +} + +-(void)setEnabled:(bool)value +{ + [_data setObject:NSBool(value) forKey:ONEnabledKey]; + [self save]; +} + +-(void)reload +{ + if (_applications) + { + [_applications release]; + _applications = nil; + } + if (_data) [_data release]; + _data = [[NSMutableDictionary dictionaryWithContentsOfFile:ONPreferencesFile] retain]; + if (!_data) _data = [[NSMutableDictionary dictionary] retain]; // new setup +} + +-(void)saveWithNotification:(NSString*)notification +{ + [_data removeObjectForKey:@"pseudobadges"]; + + // Convert the objects back to a writeable dictionary + // to avoid having to use NSKeyArchiver + NSMutableDictionary* apps = [NSMutableDictionary dictionary]; + for (NSString* identifer in self.applications.allKeys) + { + [apps setObject:[[self getApplication:identifer] toDictionary] forKey:identifer]; + } + [_data setObject:apps forKey:ONApplicationsKey]; + + [_data setObject:[NSNumber numberWithUnsignedInt:ONSchemaVersion] forKey:ONSchemaVersionKey]; + + if (![_data writeToFile:ONPreferencesFile atomically:true]) + { + Log("Failed to save settings"); + return; + } + + PostNotification((CFStringRef)notification); +} + +-(void)save +{ + [self saveWithNotification:IconSettingsChangedNotification]; +} + +-(bool)silentModeEnabled +{ + return [_data.allKeys containsObject:ONSilentModeEnabledKey] ? [[_data objectForKey:ONSilentModeEnabledKey] boolValue] : true; +} + +-(void)setSilentModeEnabled:(bool)value +{ + [_data setObject:NSBool(value) forKey:ONSilentModeEnabledKey]; + [self saveWithNotification:SilentModeChangedNotification]; +} + +-(bool)silentIconOnLeft +{ + return [_data.allKeys containsObject:ONSilentIconLeftKey] ? [[_data objectForKey:ONSilentIconLeftKey] boolValue]: false; +} + +-(void)setSilentIconOnLeft:(bool)value +{ + [_data setObject:NSBool(value) forKey:ONSilentIconLeftKey]; + [self saveWithNotification:SilentModeChangedNotification]; +} +@end +#pragma mark #endregion \ No newline at end of file diff --git a/Settings.h b/Settings.h new file mode 100644 index 0000000..68db9a0 --- /dev/null +++ b/Settings.h @@ -0,0 +1,27 @@ +#import "Tweak.h" +#import "Preferences.h" +#import +#import + +@interface OpenNotifierSettingsRootController: PSListController +@end + +@interface OpenNotifierAppsController : PSViewController +{ + UITableView* _tableView; + ALApplicationTableDataSource* _dataSource; + UISearchBar* _searchBar; +} +@end + +@interface OpenNotifierIconsController : PSListController +{ + NSString* _appName; + NSString* _identifier; + ONApplication* _application; +} +-(id)initWithAppName:(NSString*)appName identifier:(NSString*)identifier; +@end + +@interface OpenNotifierIconSettingsController : PSListController +@end diff --git a/Settings.mm b/Settings.mm new file mode 100644 index 0000000..66cb97b --- /dev/null +++ b/Settings.mm @@ -0,0 +1,566 @@ +#import "Settings.h" +#import "Preferences.h" +#import +#import + +#pragma mark #region [ Preferences Keys ] +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2 +extern NSString* PSCellClassKey; // cellClass +extern NSString* PSIDKey; // id +extern NSString* PSIsRadioGroupKey; // isRadioGroup +extern NSString* PSRadioGroupCheckedSpecifierKey; // radioGroupCheckedSpecifier +extern NSString* PSDefaultValueKey; // default +extern NSString* PSValueKey; // value +#endif + +NSString* const ONAlignmentKey = @"alignment"; + +#pragma mark #endregion + +#pragma mark #region [ Variables & Constants ] +NSString* const iconPath = @"/System/Library/Frameworks/UIKit.framework"; +static ONPreferences* preferences; +static NSMutableDictionary* cachedIcons; +static UIImage* defaultIcon; +static NSMutableArray* statusIcons; + +SEL const SELGetPreferenceValue = @selector(readPreferenceValue:); +SEL const SELSetPreferenceValue = @selector(setPreferenceValue:specifier:); +#pragma mark #endregion + +#pragma mark #region [ ALLinkCell ] +@interface ALLinkCell : ALValueCell +@end + +@implementation ALLinkCell +-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier +{ + if (!(self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) return nil; + self.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + return self; +} +@end +#pragma mark #endregion + +#pragma mark #region [ONIconCell] +@interface ONIconCell : PSTableCell +@end + +@implementation ONIconCell + +-(UIImage*)getIconNamed:(NSString*)name +{ + UIImage* icon = [cachedIcons objectForKey:name]; + if (icon) return icon; // icon already cached so let's return it + + icon = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Silver_ON_%@.png", iconPath, name]]; + if (!icon) icon = defaultIcon; + + float maxWidth = 20.0f; + float maxHeight = 20.0f; + + CGSize size = CGSizeMake(maxWidth, maxHeight); + CGFloat scale = 1.0f; + + // the scale logic below was taken from + // http://developer.appcelerator.com/question/133826/detecting-new-ipad-3-dpi-and-retina + if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)]) + { + if ([UIScreen mainScreen].scale > 1.0f) scale = [[UIScreen mainScreen] scale]; + UIGraphicsBeginImageContextWithOptions(size, false, scale); + } + else UIGraphicsBeginImageContext(size); + + // Resize image to status bar size and center it + // make sure the icon fits within the bounds + CGFloat width = MIN(icon.size.width, maxWidth); + CGFloat height = MIN(icon.size.height, maxHeight); + + CGFloat left = MAX((maxWidth-width)/2, 0); + left = left > (maxWidth/2) ? maxWidth-(maxWidth/2) : left; + + CGFloat top = MAX((maxHeight-height)/2, 0); + top = top > (maxHeight/2) ? maxHeight-(maxHeight/2) : top; + + [icon drawInRect:CGRectMake(left, top, width, height)]; + icon = [UIGraphicsGetImageFromCurrentImageContext() retain]; + UIGraphicsEndImageContext(); + + [cachedIcons setObject:icon forKey:name]; + + return icon; +} + +-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)identifier specifier:(PSSpecifier*)specifier; +{ + if (!(self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier specifier:specifier])) return nil; + NSString* name = specifier.identifier; + [self setIcon:[self getIconNamed:name]]; + + ONApplication* app = [preferences getApplication:[specifier propertyForKey:ONAppIdentifierKey]]; + + bool enabled = app && [app.icons.allKeys containsObject:name]; + if (enabled) + { + NSMutableString* details = [NSMutableString stringWithString:@"Enabled"]; + ONApplicationIcon* icon = [app.icons objectForKey:name]; + if (icon) + { + switch (icon.alignment) + { + case ONIconAlignmentLeft: [details appendString:@" | Force Left"]; break; + case ONIconAlignmentRight: [details appendString:@" | Force Right"]; break; + } + } + + self.detailTextLabel.text = details; + } + return self; +} +@end +#pragma mark #endregion + +#pragma mark #region [ OpenNotifierSettingsRootController ] +@implementation OpenNotifierSettingsRootController +-(id)init +{ + if (!(self = [super init])) return nil; + preferences = [ONPreferences.sharedInstance retain]; + return self; +} + +-(void)dealloc +{ + if (cachedIcons) { [cachedIcons release]; cachedIcons = nil; } + if (statusIcons) { [statusIcons release]; statusIcons = nil; } + if (defaultIcon) { [defaultIcon release]; defaultIcon = nil; } + if (preferences) { [preferences release]; preferences = nil; } + [super dealloc]; +} + +-(id)specifiers +{ + return _specifiers ? _specifiers : (_specifiers = [[self loadSpecifiersFromPlistName:@"OpenNotifierSettings" target:self] retain]); +} + +-(id)readPreferenceValue:(PSSpecifier*)specifier +{ + NSString* key = specifier.identifier; + + if ([key isEqualToString:ONEnabledKey]) return NSBool(preferences.enabled); + if ([key isEqualToString:ONIconsLeftKey]) return NSBool(preferences.iconsOnLeft); + if ([key isEqualToString:ONSilentModeEnabledKey]) return NSBool(preferences.silentModeEnabled); + if ([key isEqualToString:ONSilentIconLeftKey]) return NSBool(preferences.silentIconOnLeft); + + return nil; +} + +-(void)setPreferenceValue:(id)value specifier:(PSSpecifier*)specifier +{ + NSString* key = specifier.identifier; + + if ([key isEqualToString:ONEnabledKey]) preferences.enabled = [value boolValue]; + if ([key isEqualToString:ONIconsLeftKey]) preferences.iconsOnLeft = [value boolValue]; + if ([key isEqualToString:ONSilentModeEnabledKey]) preferences.silentModeEnabled = [value boolValue]; + if ([key isEqualToString:ONSilentIconLeftKey]) preferences.silentIconOnLeft = [value boolValue]; +} + +@end +#pragma mark #endregion + +#pragma mark #region [ OpenNotifierAppsController ] +@implementation OpenNotifierAppsController + +#pragma mark #region [ Controller ] +-(void)updateDataSource:(NSString*)searchText +{ + NSNumber *iconSize = [NSNumber numberWithUnsignedInteger:ALApplicationIconSizeSmall]; + + NSString* filter = (searchText && searchText.length > 0) + ? [NSString stringWithFormat:@"not displayName in {'Setup'} and displayName beginsWith[cd] '%@'", searchText] + : nil; + + if (filter) + { + _dataSource.sectionDescriptors = [NSArray arrayWithObjects: + [NSDictionary dictionaryWithObjectsAndKeys: + @"ALLinkCell", ALSectionDescriptorCellClassNameKey, + iconSize, ALSectionDescriptorIconSizeKey, + NSTrue, ALSectionDescriptorSuppressHiddenAppsKey, + filter, ALSectionDescriptorPredicateKey + , nil] + , nil]; + } + else + { + _dataSource.sectionDescriptors = [NSArray arrayWithObjects: + [NSDictionary dictionaryWithObjectsAndKeys: + @"System Applications", ALSectionDescriptorTitleKey, + @"ALLinkCell", ALSectionDescriptorCellClassNameKey, + iconSize, ALSectionDescriptorIconSizeKey, + (id)kCFBooleanTrue, ALSectionDescriptorSuppressHiddenAppsKey, + + @"containerPath = '/Applications' " + "and bundleIdentifier matches 'com.apple.*' " + "and not displayName in {'Setup'} " + , ALSectionDescriptorPredicateKey + , nil], + [NSDictionary dictionaryWithObjectsAndKeys: + @"Cydia Applications", ALSectionDescriptorTitleKey, + @"ALLinkCell", ALSectionDescriptorCellClassNameKey, + iconSize, ALSectionDescriptorIconSizeKey, + (id)kCFBooleanTrue, ALSectionDescriptorSuppressHiddenAppsKey, + + @"containerPath = '/Applications' " + "and not bundleIdentifier matches 'com.apple.*' " + , ALSectionDescriptorPredicateKey + , nil], + [NSDictionary dictionaryWithObjectsAndKeys: + @"User Applications", ALSectionDescriptorTitleKey, + @"ALLinkCell", ALSectionDescriptorCellClassNameKey, + iconSize, ALSectionDescriptorIconSizeKey, + (id)kCFBooleanTrue, ALSectionDescriptorSuppressHiddenAppsKey, + @"containerPath != '/Applications'", ALSectionDescriptorPredicateKey + , nil] + , nil]; + } + [_tableView reloadData]; +} + +-(id)init +{ + if (!(self = [super init])) return nil; + + CGRect bounds = [[UIScreen mainScreen] bounds]; + + _dataSource = [[[ALApplicationTableDataSource alloc] init] retain]; + _tableView = [[[UITableView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height) style:UITableViewStyleGrouped] retain]; + _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + _tableView.delegate = self; + _tableView.dataSource = _dataSource; + _dataSource.tableView = _tableView; + [self updateDataSource:nil]; + + // Search Bar + _searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; + _searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth; + if ([_searchBar respondsToSelector:@selector(setUsesEmbeddedAppearance:)]) + [_searchBar setUsesEmbeddedAppearance:true]; + _searchBar.delegate = self; + + NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; + [nc addObserver:self selector:@selector(keyboardWillShowWithNotification:) name:UIKeyboardWillShowNotification object:nil]; + [nc addObserver:self selector:@selector(keyboardWillHideWithNotification:) name:UIKeyboardWillHideNotification object:nil]; + + return self; +} + +-(void)viewDidLoad +{ + self.navigationItem.title = @"Applications"; + + UIEdgeInsets insets = UIEdgeInsetsMake(44.0f, 0, 0, 0); + _tableView.contentInset = insets; + _tableView.contentOffset = CGPointMake(0, 12.0f); + insets.top = 0; + _tableView.scrollIndicatorInsets = insets; + _searchBar.frame = CGRectMake(0, -44.0f, _tableView.bounds.size.width, 44.0f); + + [_tableView addSubview:_searchBar]; + [self.view addSubview:_tableView]; + [super viewDidLoad]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + [_searchBar resignFirstResponder]; +} + +-(void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + _searchBar.delegate = nil; + _tableView.delegate = nil; + [_searchBar release]; + [_dataSource release]; // tableview will be released by dataSource + [super dealloc]; +} + +-(void)keyboardWillShowWithNotification:(NSNotification*)notification +{ + [UIView beginAnimations:nil context:nil]; + NSDictionary* userInfo = notification.userInfo; + [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; + [UIView setAnimationCurve:(UIViewAnimationCurve)[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]]; + CGRect keyboardFrame = CGRectZero; + [[userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame]; + UIEdgeInsets insets = UIEdgeInsetsMake(44.0f, 0, keyboardFrame.size.height, 0); + _tableView.contentInset = insets; + insets.top = 0; + _tableView.scrollIndicatorInsets = insets; + [UIView commitAnimations]; +} + +- (void)keyboardWillHideWithNotification:(NSNotification *)notification +{ + [UIView beginAnimations:nil context:nil]; + NSDictionary* userInfo = notification.userInfo; + [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; + [UIView setAnimationCurve:(UIViewAnimationCurve)[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]]; + UIEdgeInsets insets = UIEdgeInsetsMake(44.0f, 0, 0, 0); + _tableView.contentInset = insets; + insets.top = 0.0f; + _tableView.scrollIndicatorInsets = insets; + [UIView commitAnimations]; +} +#pragma mark #endregion [ Controller ] + +#pragma mark #region [ UISearchBar ] + +-(void)searchBarTextDidBeginEditing:(UISearchBar*)searchBar +{ + [_searchBar setShowsCancelButton:true animated:true]; +} + +-(void)searchBarTextDidEndEditing:(UISearchBar*)searchBar +{ + [_searchBar setShowsCancelButton:false animated:true]; +} + +-(void)searchBarSearchButtonClicked:(UISearchBar*)searchBar +{ + [_searchBar resignFirstResponder]; +} + +-(void)searchBarCancelButtonClicked:(UISearchBar*)searchBar +{ + _searchBar.text = nil; + [self updateDataSource:nil]; + [_searchBar resignFirstResponder]; + _tableView.contentOffset = CGPointMake(0, 12.0f); +} + +-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)searchText +{ + [self updateDataSource:searchText]; + _tableView.contentOffset = CGPointMake(0, -44.0f); +} + +#pragma mark #endregion [ UISearchBar ] + +#pragma mark #region [ UITableViewDelegate ] +-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath +{ + UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; + + // Need to mimic what PSListController does when it handles didSelectRowAtIndexPath + // otherwise the child controller won't load + OpenNotifierIconsController* controller = [[[OpenNotifierIconsController alloc] + initWithAppName:cell.textLabel.text + identifier:[_dataSource displayIdentifierForIndexPath:indexPath] + ] autorelease]; + + controller.rootController = self.rootController; + controller.parentController = self; + + [self pushController:controller]; + [tableView deselectRowAtIndexPath:indexPath animated:true]; +} +#pragma mark #endregion [ UITableViewDelegate ] + +@end +#pragma mark #endregion [ OpenNotifierAppsController ] + +#pragma mark #region [ OpenNotifierIconsController ] +@implementation OpenNotifierIconsController + +#pragma mark #region [ Controller ] +-(id)initWithAppName:(NSString*)appName identifier:(NSString*)identifier +{ + _appName = appName; + _identifier = identifier; + return [self init]; +} + +-(id)init +{ + if ((self = [super init]) == nil) return nil; + + if (!defaultIcon) defaultIcon = [[[ALApplicationList sharedApplicationList] iconOfSize:ALApplicationIconSizeSmall forDisplayIdentifier:@"com.apple.WebSheet"] retain]; + if (!cachedIcons) cachedIcons = [[NSMutableDictionary dictionary] retain]; + if (!statusIcons) + { + statusIcons = [[NSMutableArray array] retain]; + NSRegularExpression* regex = [[NSRegularExpression regularExpressionWithPattern:SilverIconRegexPattern + options:NSRegularExpressionCaseInsensitive error:nil] retain]; + + for (NSString* path in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:iconPath error:nil]) + { + NSTextCheckingResult* match = [regex firstMatchInString:path options:0 range:NSMakeRange(0, path.length)]; + if (!match) continue; + NSString* name = [path substringWithRange:[match rangeAtIndex:1]]; + if (![statusIcons containsObject:name]) [statusIcons addObject:name]; + } + [regex release]; + + [statusIcons sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; + } + + _application = [preferences.applications objectForKey:_identifier]; + + return self; +} + +-(void)viewDidLoad +{ + [super viewDidLoad]; + [self setTitle:_appName]; +} + +#pragma mark #endregion + +#pragma mark #region [ UITableViewDatasource ] + +-(id)specifiers +{ + if (_specifiers) return _specifiers; + + _specifiers = [[NSMutableArray array] retain]; + + for (NSString* name in statusIcons) + { + PSSpecifier* specifier = [PSSpecifier preferenceSpecifierNamed:name target:self set:nil get:nil + detail:[OpenNotifierIconSettingsController class] cell:PSLinkListCell edit:nil]; + + [specifier setProperty:name forKey:PSIDKey]; + + [specifier setProperty:[ONIconCell class] forKey:PSCellClassKey]; + [specifier setProperty:_identifier forKey:ONAppIdentifierKey]; + + [_specifiers addObject:specifier]; + } + + return _specifiers; +} + +#pragma mark #endregion + +@end +#pragma mark #endregion + +#pragma mark #region [ OpenNotifierIconSettingsController ] +@implementation OpenNotifierIconSettingsController + +-(id)readPreferenceValue:(PSSpecifier*)specifier +{ + NSString* key = specifier.identifier; + ONApplication* app = [preferences getApplication:[self.specifier propertyForKey:ONAppIdentifierKey]]; + if ([key isEqualToString:ONEnabledKey]) + { + return NSBool(app && [app containsIcon:[self.specifier propertyForKey:PSIDKey]]); + } + else if ([key isEqualToString:ONIconAlignmentKey]) + { + ONApplicationIcon* icon = [app.icons objectForKey:self.specifier.identifier]; + ONIconAlignment alignment = icon ? icon.alignment : ONIconAlignmentDefault; + return [NSNumber numberWithUnsignedInteger:alignment]; + } + + return nil; +} + +-(void)setPreferenceValue:(id)value specifier:(PSSpecifier*)specifier +{ + NSString* key = specifier.identifier; + NSString* identifier = [self.specifier propertyForKey:ONAppIdentifierKey]; + NSString* iconName = self.specifier.name; + + if ([key isEqualToString:ONEnabledKey]) + { + if (![value boolValue]) [preferences removeIcon:iconName fromApplication:identifier]; + else [preferences addIcon:iconName forApplication:identifier]; + [self reloadSpecifiers]; + } + else if ([key isEqualToString:ONIconAlignmentKey]) + { + ONApplicationIcon* icon = [preferences getIcon:iconName forApplication:identifier]; + if (icon) icon.alignment = [value intValue]; + } + + [preferences save]; + [(PSListController*)self.parentController reloadSpecifier:self.specifier animated:false]; +} + +-(void)processIconAlignmentGroup:(bool)enabled +{ + // Alignment Radio Group + if (enabled) + { + PSSpecifier* groupSpecifier = [PSSpecifier groupSpecifierWithName:@"Alignment"]; + [groupSpecifier setProperty:ONIconAlignmentKey forKey:PSKeyNameKey]; + [groupSpecifier setProperty:NSTrue forKey:PSIsRadioGroupKey]; + [_specifiers addObject:groupSpecifier]; + + NSNumber* alignment = [self readPreferenceValue:groupSpecifier]; + + for (uint i = 0; i < 3; i++) + { + NSString* title; + switch (i) + { + case 1: title = @"Force Left"; break; + case 2: title = @"Force Right"; break; + default: title = @"Default"; break; + } + + PSSpecifier* specifier = [PSSpecifier preferenceSpecifierNamed:title target:self set:nil get:nil detail:nil cell:PSListItemCell edit:nil]; + [specifier setProperty:ONIconAlignmentKey forKey:PSKeyNameKey]; + + NSNumber* value = [NSNumber numberWithUnsignedInteger:i]; + [specifier setProperty:value forKey:PSValueKey]; + + if ([value isEqual:alignment]) [groupSpecifier setProperty:specifier forKey:PSRadioGroupCheckedSpecifierKey]; + + [_specifiers addObject:specifier]; + } + } +} + +-(id)specifiers +{ + if (_specifiers) return _specifiers; + + ONApplication* app = [preferences getApplication:[self.specifier propertyForKey:ONAppIdentifierKey]]; + _specifiers = [[NSMutableArray array] retain]; + + PSSpecifier* specifier; + + // Enabled Switch + specifier = [PSSpecifier preferenceSpecifierNamed:@"Enabled" target:self + set:SELSetPreferenceValue + get:SELGetPreferenceValue + detail:nil cell:PSSwitchCell edit:nil + ]; + [specifier setProperty:ONEnabledKey forKey:PSIDKey]; + [_specifiers addObject:specifier]; + + bool enabled = app && [app containsIcon:[self.specifier propertyForKey:PSIDKey]]; + [self processIconAlignmentGroup:enabled]; + + return _specifiers; +} + +-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath +{ + [super tableView:tableView didSelectRowAtIndexPath:indexPath]; + + PSSpecifier* specifier = [self specifierAtIndex:[self indexForIndexPath:indexPath]]; + if (specifier && [[specifier propertyForKey:PSKeyNameKey] isEqualToString:ONIconAlignmentKey]) + { + [self setPreferenceValue:[specifier propertyForKey:PSValueKey] specifier:[self specifierForID:ONIconAlignmentKey]]; + } +} + +@end +#pragma mark #endregion \ No newline at end of file diff --git a/Tweak.h b/Tweak.h new file mode 100644 index 0000000..1a6f0da --- /dev/null +++ b/Tweak.h @@ -0,0 +1,27 @@ +#import +#import "Constants.h" + +#pragma mark #region [ NSLog Helper ] +#ifdef DEBUG + #define Log(s, ...) NSLog(@"[OpenNotifier] %s(%d): %@", __FUNCTION__, __LINE__, [NSString stringWithFormat:@s, ##__VA_ARGS__]) +#else + #define Log(s, ...) +#endif +#pragma mark #endregion + +#pragma mark #region [ Notifications Helper ] +#define AddObserver(notification, callback) \ + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)&callback, notification, NULL, \ + CFNotificationSuspensionBehaviorHold); + +#define PostNotification(notification) \ + CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDarwinNotifyCenter(), \ + notification, NULL, NULL, kCFNotificationDeliverImmediately) + +#pragma mark #endregion + +#pragma mark #region [ Boolean Helper ] +#define NSTrue ((id) kCFBooleanTrue) +#define NSFalse ((id) kCFBooleanFalse) +#define NSBool(x) ((x) ? NSTrue : NSFalse) +#pragma mark #endregion diff --git a/Tweak.xm b/Tweak.xm index 98433ce..26a578e 100644 --- a/Tweak.xm +++ b/Tweak.xm @@ -1,105 +1,201 @@ +#import "Tweak.h" +#import "Preferences.h" +#import #import -#import -#import "LSStatusBarItem.h" +#import +#import +#import -static NSDictionary* openNotifierPrefs; -static NSMutableDictionary* statusBarItems = [[NSMutableDictionary alloc] init]; -static NSMutableDictionary* currentIconSetList = [[NSMutableDictionary alloc] init]; +#pragma mark #region [ Private Variables ] +static ONPreferences* preferences; +static NSMutableDictionary* statusBarItems = [[NSMutableDictionary dictionary] retain]; +static NSMutableDictionary* currentIconSetList = [[NSMutableDictionary dictionary] retain]; +static NSMutableDictionary* trackedBadges = [[NSMutableDictionary dictionary] retain]; +static LSStatusBarItem* silentIconItem; +#pragma mark #endregion -%hook SpringBoard --(id)init +#pragma mark #region [ Global Functions ] + +static LSStatusBarItem* CreateStatusBarItem(NSString* uniqueName, NSString* iconName, bool onLeft) +{ + LSStatusBarItem* item = [[[%c(LSStatusBarItem) alloc] + initWithIdentifier:[NSString stringWithFormat:@"opennotifier.%@", uniqueName] + alignment:onLeft ? StatusBarAlignmentLeft : StatusBarAlignmentRight] autorelease]; + + item.imageName = [NSString stringWithFormat:@"ON_%@", iconName]; + return item; +} + +static void ProcessApplicationIcon(NSString* identifier) { - openNotifierPrefs = [[NSDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/com.n00neimp0rtant.opennotifier.plist"]; - NSMutableArray* imageNames = [NSMutableArray arrayWithArray:[[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/System/Library/Frameworks/UIKit.framework/" error:nil]]; - NSMutableSet* filteredNames = [NSMutableSet set]; - for(NSString* name in imageNames) + if (!preferences.enabled) return; + + ONApplication* app; + if (!(app = [preferences getApplication:identifier])) return; + bool shouldShow = [[trackedBadges objectForKey:identifier] boolValue]; + + for (NSString* name in app.icons.allKeys) { - if([name hasPrefix:@"Silver_ON_"] || [name hasPrefix:@"Black_ON_"]) + if (![currentIconSetList.allKeys containsObject:name]) continue; // icon doesn't exist + + ONApplicationIcon* icon = [app.icons objectForKey:name]; + bool onLeft; + switch (icon.alignment) { - NSMutableString* temp = [NSMutableString stringWithString:name]; - [temp replaceOccurrencesOfString:@"Silver_ON_" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [temp length])]; - [temp replaceOccurrencesOfString:@"Black_ON_" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [temp length])]; - [temp replaceOccurrencesOfString:@".png" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [temp length])]; - [temp replaceOccurrencesOfString:@"@2x" withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [temp length])]; - [filteredNames addObject:[NSString stringWithString:temp]]; + case ONIconAlignmentLeft: onLeft = true; break; + case ONIconAlignmentRight: onLeft = false; break; + default: onLeft = preferences.iconsOnLeft; break; } - } - for(NSString* name in filteredNames) - { - [currentIconSetList setObject:[NSMutableSet setWithCapacity:1] forKey:name]; - } - if([[openNotifierPrefs objectForKey:@"ONSilentModeIcon"] boolValue]) - { - uint64_t state; - int token; - notify_register_check("com.apple.springboard.ringerstate", &token); - notify_get_state(token, &state); - notify_cancel(token); - if(state == 0) + + // avoid colliding with another icon with the same name and alignment + NSString* uniqueName = [NSString stringWithFormat:@"%@~%d", name, onLeft]; + + // applications may be sharing name and alignment so lets + // track it properly before we readd or remove it + NSMutableDictionary* uniqueIcon = [statusBarItems objectForKey:uniqueName]; + if (!uniqueIcon) uniqueIcon = [NSMutableDictionary dictionary]; + + NSMutableArray* apps = [uniqueIcon objectForKey:ONApplicationsKey]; + if (!apps) apps = [NSMutableArray array]; + + if (!shouldShow) { - LSStatusBarItem* statusBarItem; - if([[openNotifierPrefs objectForKey:@"ONSilentIconLeft"] boolValue]) - statusBarItem = [[[objc_getClass("LSStatusBarItem") alloc] initWithIdentifier:@"opennotifier.Silent" alignment:StatusBarAlignmentLeft] autorelease]; - else - statusBarItem = [[[objc_getClass("LSStatusBarItem") alloc] initWithIdentifier:@"opennotifier.Silent" alignment:StatusBarAlignmentRight] autorelease]; - [statusBarItem setImageName:@"ON_Silent"]; - [statusBarItems setObject:statusBarItem forKey:@"Silent"]; + [apps removeObject:identifier]; + if (apps.count == 0) [statusBarItems removeObjectForKey:uniqueName]; } - } - return %orig; + else + { + [apps addObject:identifier]; + [uniqueIcon setObject:apps forKey:ONApplicationsKey]; + + if (![uniqueIcon.allKeys containsObject:ONIconNameKey]) + [uniqueIcon setObject:CreateStatusBarItem(uniqueName, name, onLeft) forKey:ONIconNameKey]; + + [statusBarItems setObject:uniqueIcon forKey:uniqueName]; + } + } } --(void)ringerChanged:(int)changed +static void ReloadSettings() { - %orig; - if([[openNotifierPrefs objectForKey:@"ONSilentModeIcon"] boolValue]) + if (!preferences) preferences = ONPreferences.sharedInstance; + else [preferences reload]; +} + +static void UpdateSilentIcon() +{ + if (silentIconItem) + { + [silentIconItem release]; + silentIconItem = nil; + } + + if (preferences.silentModeEnabled) { - if (changed == 1) + bool muted = false; + if (%c(SBMediaController) && [%c(SBMediaController) instancesRespondToSelector:@selector(isRingerMuted)]) { - [statusBarItems removeObjectForKey:@"Silent"]; + muted = [[%c(SBMediaController) sharedInstance] isRingerMuted]; } - if (changed == 0) + else { - LSStatusBarItem* statusBarItem; - if([[openNotifierPrefs objectForKey:@"ONSilentIconLeft"] boolValue]) - statusBarItem = [[[objc_getClass("LSStatusBarItem") alloc] initWithIdentifier:@"opennotifier.Silent" alignment:StatusBarAlignmentLeft] autorelease]; - else - statusBarItem = [[[objc_getClass("LSStatusBarItem") alloc] initWithIdentifier:@"opennotifier.Silent" alignment:StatusBarAlignmentRight] autorelease]; - [statusBarItem setImageName:@"ON_Silent"]; - [statusBarItems setObject:statusBarItem forKey:@"Silent"]; + // I'm not sure if this is needed or not but leaving it here just in case + // it needs to be backwards compatible + uint64_t state; + int token; + notify_register_check("com.apple.springboard.ringerstate", &token); + notify_get_state(token, &state); + notify_cancel(token); + muted = (!state); } + + if (muted) silentIconItem = [CreateStatusBarItem(ONSilentKey, ONSilentKey, preferences.silentIconOnLeft) retain]; } } + +static void SilentModeSettingsChanged() +{ + ReloadSettings(); + UpdateSilentIcon(); +} + +static void IconSettingsChanged() +{ + ReloadSettings(); + + [statusBarItems removeAllObjects]; + + if (!preferences.enabled) return; + + [trackedBadges.allKeys enumerateObjectsUsingBlock: ^(id key, NSUInteger index, BOOL* stop){ + ProcessApplicationIcon(key); + }]; +} +#pragma mark #endregion + +#pragma mark #region [ SpringBoard ] +%hook SpringBoard + +-(id)init +{ + ReloadSettings(); + NSMutableArray* imageNames = [NSMutableArray arrayWithArray:[[NSFileManager defaultManager] + contentsOfDirectoryAtPath:@"/System/Library/Frameworks/UIKit.framework/" error:nil] + ]; + + NSRegularExpression* regex = [[NSRegularExpression regularExpressionWithPattern:IconRegexPattern + options:NSRegularExpressionCaseInsensitive error:nil] retain]; + + for (NSString* name in imageNames) + { + NSTextCheckingResult* match = [regex firstMatchInString:name options:0 range:NSMakeRange(0, name.length)]; + if (!match) continue; + name = [name substringWithRange:[match rangeAtIndex:1]]; + [currentIconSetList setObject:[NSMutableSet setWithCapacity:1] forKey:name]; + } + [regex release]; + + return %orig; +} + +-(void)applicationDidFinishLaunching:(id)application +{ + %orig; + UpdateSilentIcon(); + + AddObserver((CFStringRef)IconSettingsChangedNotification, IconSettingsChanged); + AddObserver((CFStringRef)SilentModeChangedNotification, SilentModeSettingsChanged); + + #ifdef DEBUGPREFS + dispatch_queue_t queue = dispatch_get_main_queue(); + dispatch_async(queue, + ^{ + [[%c(SBUserAgent) sharedUserAgent] openURL:[NSURL URLWithString:@"prefs:root=OpenNotifier"] allowUnlock:true animated:true]; + dispatch_release(queue); + }); + #endif +} + +-(void)ringerChanged:(int)changed +{ + %orig; + UpdateSilentIcon(); +} %end +#pragma mark #endregion +#pragma mark #region [ SBApplicationIcon ] %hook SBApplicationIcon + -(void)setBadge:(id)badge { %orig; - NSArray* iconList = [[openNotifierPrefs objectForKey:@"apps"] objectForKey:[self leafIdentifier]]; - if(badge == 0 || badge == nil || [badge isEqual:@"0"] || [badge isEqual:[NSNumber numberWithInt:0]]) - { - for(NSString* name in iconList) - { - [[currentIconSetList objectForKey:name] removeObject:[self leafIdentifier]]; - if([[currentIconSetList objectForKey:name] count] == 0) - [statusBarItems removeObjectForKey:name]; - } - } - else - { - for(NSString* name in iconList) - { - LSStatusBarItem* statusBarItem; - if([[openNotifierPrefs objectForKey:@"ONNotifIconsLeft"] boolValue]) - statusBarItem = [[[objc_getClass("LSStatusBarItem") alloc] initWithIdentifier:[NSString stringWithFormat:@"opennotifier.%@", name] alignment:StatusBarAlignmentLeft] autorelease]; - else - statusBarItem = [[[objc_getClass("LSStatusBarItem") alloc] initWithIdentifier:[NSString stringWithFormat:@"opennotifier.%@", name] alignment:StatusBarAlignmentRight] autorelease]; - [statusBarItem setImageName:[NSString stringWithFormat:@"ON_%@", name]]; - [statusBarItems setObject:statusBarItem forKey:name]; - - [[currentIconSetList objectForKey:name] addObject:[self leafIdentifier]]; - } - } + + //Log("identifier = %@ badge = %@", self.leafIdentifier, badge); + + bool showBadge = !(badge == nil || [badge isEqual:@""] || [badge isEqual:@"0"] || [badge isEqual:[NSNumber numberWithInt:0]]); + [trackedBadges setObject:NSBool(showBadge) forKey:self.leafIdentifier]; + if (preferences.enabled) ProcessApplicationIcon(self.leafIdentifier); } -%end \ No newline at end of file +%end +#pragma mark #endregion diff --git a/include/AppList/ALApplicationList.h b/include/AppList/ALApplicationList.h new file mode 100644 index 0000000..d098f9c --- /dev/null +++ b/include/AppList/ALApplicationList.h @@ -0,0 +1,32 @@ +#import +#import +#import + +enum { + ALApplicationIconSizeSmall = 29, + ALApplicationIconSizeLarge = 59 +}; +typedef NSUInteger ALApplicationIconSize; + +@class CPDistributedMessagingCenter; + +@interface ALApplicationList : NSObject { +@private + CPDistributedMessagingCenter *messagingCenter; + NSMutableDictionary *cachedIcons; + OSSpinLock spinLock; +} ++ (ALApplicationList *)sharedApplicationList; + +@property (nonatomic, readonly) NSDictionary *applications; +- (NSDictionary *)applicationsFilteredUsingPredicate:(NSPredicate *)predicate; + +- (CGImageRef)copyIconOfSize:(ALApplicationIconSize)iconSize forDisplayIdentifier:(NSString *)displayIdentifier; +- (UIImage *)iconOfSize:(ALApplicationIconSize)iconSize forDisplayIdentifier:(NSString *)displayIdentifier; +- (BOOL)hasCachedIconOfSize:(ALApplicationIconSize)iconSize forDisplayIdentifier:(NSString *)displayIdentifier; + +@end + +extern NSString *const ALIconLoadedNotification; +extern NSString *const ALDisplayIdentifierKey; +extern NSString *const ALIconSizeKey; diff --git a/include/AppList/ALApplicationTableDataSource.h b/include/AppList/ALApplicationTableDataSource.h new file mode 100644 index 0000000..3fe091b --- /dev/null +++ b/include/AppList/ALApplicationTableDataSource.h @@ -0,0 +1,41 @@ +#import +#import + +@class ALApplicationList; + +@interface ALApplicationTableDataSource : NSObject { +@private + ALApplicationList *appList; + NSArray *_sectionDescriptors; + NSMutableArray *_displayIdentifiers; + NSMutableArray *_displayNames; + NSMutableArray *_iconsToLoad; + OSSpinLock spinLock; + UITableView *_tableView; + UIImage *_defaultImage; + NSBundle *_localizationBundle; +} + ++ (NSArray *)standardSectionDescriptors; + ++ (id)dataSource; +- (id)init; + +@property (nonatomic, copy) NSArray *sectionDescriptors; +@property (nonatomic, retain) UITableView *tableView; +@property (nonatomic, retain) NSBundle *localizationBundle; + +- (NSString *)displayIdentifierForIndexPath:(NSIndexPath *)indexPath; + +@end + +extern const NSString *ALSectionDescriptorTitleKey; +extern const NSString *ALSectionDescriptorFooterTitleKey; +extern const NSString *ALSectionDescriptorPredicateKey; +extern const NSString *ALSectionDescriptorCellClassNameKey; +extern const NSString *ALSectionDescriptorIconSizeKey; +extern const NSString *ALSectionDescriptorSuppressHiddenAppsKey; + +extern const NSString *ALItemDescriptorTextKey; +extern const NSString *ALItemDescriptorDetailTextKey; +extern const NSString *ALItemDescriptorImageKey; diff --git a/include/AppList/ALValueCell.h b/include/AppList/ALValueCell.h new file mode 100644 index 0000000..c36373a --- /dev/null +++ b/include/AppList/ALValueCell.h @@ -0,0 +1,36 @@ +#import + +@protocol ALValueCellDelegate; + +@interface ALValueCell : UITableViewCell { +@private + id _delegate; +} + +@property (nonatomic, assign) id delegate; + +- (void)loadValue:(id)value; + +- (void)didSelect; + +@end + +@protocol ALValueCellDelegate +@required +- (void)valueCell:(ALValueCell *)valueCell didChangeToValue:(id)newValue; +@end + +@interface ALSwitchCell : ALValueCell { +@private + UISwitch *switchView; +} + +@property (nonatomic, readonly) UISwitch *switchView; + +@end + +@interface ALCheckCell : ALValueCell { +} + +@end + diff --git a/include/AppList/AppList.h b/include/AppList/AppList.h new file mode 100644 index 0000000..73418fc --- /dev/null +++ b/include/AppList/AppList.h @@ -0,0 +1,3 @@ +#import "ALApplicationList.h" +#import "ALApplicationTableDataSource.h" +#import "ALValueCell.h" diff --git a/LSStatusBarItem.h b/include/LibStatusBar/LSStatusBarItem.h similarity index 99% rename from LSStatusBarItem.h rename to include/LibStatusBar/LSStatusBarItem.h index 345986d..e15c0a3 100644 --- a/LSStatusBarItem.h +++ b/include/LibStatusBar/LSStatusBarItem.h @@ -72,4 +72,4 @@ enum StatusBarAlignment + (void) _updateItems; - (void) _setProperties: (NSDictionary*) dict; -@end \ No newline at end of file +@end diff --git a/layout/DEBIAN/control b/layout/DEBIAN/control new file mode 100644 index 0000000..b83d441 --- /dev/null +++ b/layout/DEBIAN/control @@ -0,0 +1,9 @@ +Package: com.n00neimp0rtant.opennotifier +Name: OpenNotifier +Depends: Firmware (>=3.2), MobileSubstrate, libStatusBar, PreferenceLoader (>= 2.0), AppList +Version: 1.1.3 +Architecture: iphoneos-arm +Description: Show Notification Icons in the status bar +Maintainer: n00neimp0rtant +Author: n00neimp0rtant +Section: Tweaks diff --git a/Layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.plist b/layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.plist similarity index 100% rename from Layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.plist rename to layout/Library/MobileSubstrate/DynamicLibraries/OpenNotifier.plist diff --git a/Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/Info.plist b/layout/Library/PreferenceBundles/OpenNotifier.bundle/Info.plist old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/Info.plist rename to layout/Library/PreferenceBundles/OpenNotifier.bundle/Info.plist diff --git a/Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifier.png b/layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifier.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifier.png rename to layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifier.png diff --git a/Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifier@2x.png b/layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifier@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifier@2x.png rename to layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifier@2x.png diff --git a/Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifierSettings b/layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifierSettings similarity index 100% rename from Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifierSettings rename to layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifierSettings diff --git a/Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifierSettings.plist b/layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifierSettings.plist old mode 100755 new mode 100644 similarity index 75% rename from Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifierSettings.plist rename to layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifierSettings.plist index 2ae778a..94d0c34 --- a/Layout/System/Library/PreferenceBundles/OpenNotifierSettings.bundle/OpenNotifierSettings.plist +++ b/layout/Library/PreferenceBundles/OpenNotifier.bundle/OpenNotifierSettings.plist @@ -2,14 +2,10 @@ + title + OpenNotifier items - - cell - PSGroupCell - footerText - Respring to apply changes - cell PSGroupCell @@ -21,26 +17,22 @@ cell PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifier - key + id ONEnabled label - Enabled + Enabled + default + cell PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifier - key + id ONNotifIconsLeft label ↳ Align Left + default + cell @@ -51,28 +43,24 @@ cell PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifier - key + id ONSilentModeIcon label - Silent Mode Icon + Silent Mode Icon + default + cell PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifier - key + id ONSilentIconLeft label ↳ Align Left + default + - + cell PSGroupCell - label - Notifications footerText For support or feature suggestions, please mention @OpenNotifier on Twitter (or email n00neimp0rtant@me.com). @@ -98,12 +84,10 @@ cell PSLinkCell detail - OpenNotifierSettingsAppsController + OpenNotifierAppsController label Apps - title - OpenNotifier diff --git a/layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist b/layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist new file mode 100644 index 0000000..1bb50c2 --- /dev/null +++ b/layout/Library/PreferenceLoader/Preferences/OpenNotifier.plist @@ -0,0 +1,12 @@ +{ + entry = + { + bundle = OpenNotifier; + cell = PSLinkCell; + icon = OpenNotifier.png; + detail = OpenNotifierSettingsRootController; + isController = 1; + label = "OpenNotifier"; + }; +} + diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Envelope@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Exclamation Point@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Handset@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Silent@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Black_ON_Speech Bubble@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Envelope@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Exclamation Point@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Handset@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Silent@2x.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble.png diff --git a/Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble@2x.png b/layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble@2x.png old mode 100755 new mode 100644 similarity index 100% rename from Layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble@2x.png rename to layout/System/Library/Frameworks/UIKit.framework/Silver_ON_Speech Bubble@2x.png diff --git a/lib/libapplist.dylib b/lib/libapplist.dylib new file mode 100755 index 0000000000000000000000000000000000000000..cd99d5d24446082a203203ecffc04a89bbfbd00f GIT binary patch literal 37376 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 G@&5tZ8F}9T literal 0 HcmV?d00001 diff --git a/libstatusbar.dylib b/lib/libstatusbar.dylib old mode 100644 new mode 100755 similarity index 100% rename from libstatusbar.dylib rename to lib/libstatusbar.dylib diff --git a/obj/.stamp b/obj/.stamp deleted file mode 100644 index e69de29..0000000 diff --git a/obj/OpenNotifier.dylib b/obj/OpenNotifier.dylib deleted file mode 100755 index fc880891ada3c17f0dba4d25742a91a3bbe23652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13888 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 Id6g>l-_#B)h5!Hn diff --git a/obj/Tweak.xm.o b/obj/Tweak.xm.o deleted file mode 100644 index 4714604a61cc5ca2b891afe5f551c5a16c17fd81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10436 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 diff --git a/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/Info.plist b/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/Info.plist deleted file mode 100644 index 3aec5c8..0000000 --- a/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - OpenNotifierSettings - CFBundleIdentifier - com.n00neimp0rtant.opennotifiersettings - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - DTPlatformName - iphoneos - MinimumOSVersion - 3.0 - NSPrincipalClass - OpenNotifierSettingsRootController - - diff --git a/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifier.png b/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifier.png deleted file mode 100644 index f5a9647f01b1f3455dafc28d9f22995051d971c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4358 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 AOaK4? diff --git a/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifier@2x.png b/opennotifiersettings/Layout/System/Library/PreferenceBundles/OpenNotifierSettings/OpenNotifier@2x.png deleted file mode 100644 index 882afe6287a0e1b577679f630acd115595b5d2c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6312 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 eFz*GQ{~rJvfavEeQN^wR0000 - - - - items - - - cell - PSGroupCell - footerText - Respring to apply changes - - - cell - PSGroupCell - label - General - footerText - The silent mode icon toggle here is a temporary solution; it will be better integrated in a future release. - - - cell - PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifier - key - ONEnabled - label - Enabled - - - cell - PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifier - key - ONSilentModeIcon - label - Silent Mode Icon - - - cell - PSGroupCell - footerText - Some apps like Sportacular do not get badges for push notifications. You can enable them here. - - - cell - PSLinkCell - detail - OpenNotifierSettingsPseudoBadgesController - label - Pseudo-Badges - - - cell - PSGroupCell - label - Notifications - footerText - For support or feature suggestions, please mention @OpenNotifier on Twitter (or email n00neimp0rtant@me.com). - - - cell - PSLinkCell - detail - OpenNotifierSettingsAppsController - label - Apps - - - title - OpenNotifier - - diff --git a/opennotifiersettings/Makefile b/opennotifiersettings/Makefile deleted file mode 100644 index 1b09ef6..0000000 --- a/opennotifiersettings/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -include theos/makefiles/common.mk - -BUNDLE_NAME = OpenNotifierSettings -OpenNotifierSettings_FILES = OpenNotifierSettings.mm -OpenNotifierSettings_INSTALL_PATH = /Library/PreferenceBundles -OpenNotifierSettings_FRAMEWORKS = UIKit -OpenNotifierSettings_PRIVATE_FRAMEWORKS = Preferences - -include $(THEOS_MAKE_PATH)/bundle.mk - -internal-stage:: - $(ECHO_NOTHING)mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences$(ECHO_END) - $(ECHO_NOTHING)cp entry.plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/OpenNotifierSettings.plist$(ECHO_END) diff --git a/opennotifiersettings/OpenNotifierSettings.mm b/opennotifiersettings/OpenNotifierSettings.mm deleted file mode 100644 index 598bdaf..0000000 --- a/opennotifiersettings/OpenNotifierSettings.mm +++ /dev/null @@ -1,16 +0,0 @@ -#import - -@interface OpenNotifierSettingsListController: PSListController { -} -@end - -@implementation OpenNotifierSettingsListController -- (id)specifiers { - if(_specifiers == nil) { - _specifiers = [[self loadSpecifiersFromPlistName:@"OpenNotifierSettings" target:self] retain]; - } - return _specifiers; -} -@end - -// vim:ft=objc diff --git a/opennotifiersettings/Resources/Info.plist b/opennotifiersettings/Resources/Info.plist deleted file mode 100644 index ef5ca90..0000000 --- a/opennotifiersettings/Resources/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - OpenNotifierSettings - CFBundleIdentifier - com.n00neimp0rtant.opennotifiersettings - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - DTPlatformName - iphoneos - MinimumOSVersion - 3.0 - NSPrincipalClass - OpenNotifierSettingsListController - - diff --git a/opennotifiersettings/Resources/OpenNotifierSettings.plist b/opennotifiersettings/Resources/OpenNotifierSettings.plist deleted file mode 100644 index 407c888..0000000 --- a/opennotifiersettings/Resources/OpenNotifierSettings.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - items - - - cell - PSGroupCell - label - OpenNotifierSettings First Page - - - cell - PSSwitchCell - default - - defaults - com.n00neimp0rtant.opennotifiersettings - key - AwesomeSwitch1 - label - Awesome Switch 1 - - - title - OpenNotifierSettings - - diff --git a/opennotifiersettings/entry.plist b/opennotifiersettings/entry.plist deleted file mode 100644 index e7ccd39..0000000 --- a/opennotifiersettings/entry.plist +++ /dev/null @@ -1,10 +0,0 @@ -{ - entry = { - bundle = OpenNotifierSettings; - cell = PSLinkCell; - detail = OpenNotifierSettingsListController; - icon = OpenNotifierSettings.png; - isController = 1; - label = OpenNotifierSettings; - }; -} diff --git a/opennotifiersettings/theos b/opennotifiersettings/theos deleted file mode 120000 index e30945d..0000000 --- a/opennotifiersettings/theos +++ /dev/null @@ -1 +0,0 @@ -/opt/theos \ No newline at end of file