From d42c91f80234bad9523ae92fca4c3bd4337bdffe Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 24 May 2012 13:12:00 +0200 Subject: [PATCH] In app settings WIP --- Classes/LinphoneAppDelegate.h | 11 +- Classes/LinphoneAppDelegate.m | 59 +- Classes/LinphoneCoreSettingsStore.h | 15 + Classes/LinphoneCoreSettingsStore.m | 61 ++ Classes/LinphoneUI/LinphoneManager.h | 5 +- Classes/LinphoneUI/LinphoneManager.m | 49 ++ .../IASKAppSettingsViewController.h | 84 ++ .../IASKAppSettingsViewController.m | 798 ++++++++++++++++++ .../IASKAppSettingsWebViewController.h | 30 + .../IASKAppSettingsWebViewController.m | 148 ++++ .../IASKSpecifierValuesViewController.h | 36 + .../IASKSpecifierValuesViewController.m | 195 +++++ .../Controllers/IASKViewController.h | 26 + InAppSettingsKit/Models/IASKSettingsReader.h | 149 ++++ InAppSettingsKit/Models/IASKSettingsReader.m | 278 ++++++ InAppSettingsKit/Models/IASKSettingsStore.h | 39 + InAppSettingsKit/Models/IASKSettingsStore.m | 68 ++ .../Models/IASKSettingsStoreFile.h | 28 + .../Models/IASKSettingsStoreFile.m | 54 ++ .../Models/IASKSettingsStoreUserDefaults.h | 25 + .../Models/IASKSettingsStoreUserDefaults.m | 67 ++ InAppSettingsKit/Models/IASKSpecifier.h | 59 ++ InAppSettingsKit/Models/IASKSpecifier.m | 240 ++++++ .../Views/IASKPSSliderSpecifierViewCell.h | 31 + .../Views/IASKPSSliderSpecifierViewCell.m | 72 ++ .../Views/IASKPSTextFieldSpecifierViewCell.h | 29 + .../Views/IASKPSTextFieldSpecifierViewCell.m | 52 ++ .../Views/IASKPSTitleValueSpecifierViewCell.h | 22 + .../Views/IASKPSTitleValueSpecifierViewCell.m | 57 ++ .../IASKPSToggleSwitchSpecifierViewCell.h | 29 + .../IASKPSToggleSwitchSpecifierViewCell.m | 62 ++ InAppSettingsKit/Views/IASKSlider.h | 26 + InAppSettingsKit/Views/IASKSlider.m | 30 + InAppSettingsKit/Views/IASKSwitch.h | 26 + InAppSettingsKit/Views/IASKSwitch.m | 31 + InAppSettingsKit/Views/IASKTextField.h | 26 + InAppSettingsKit/Views/IASKTextField.m | 30 + InAppSettingsKit/Xibs/IASKAppSettingsView.xib | 222 +++++ .../Xibs/IASKAppSettingsWebView.xib | 378 +++++++++ .../Xibs/IASKPSSliderSpecifierViewCell.xib | 251 ++++++ .../Xibs/IASKPSTextFieldSpecifierViewCell.xib | 254 ++++++ .../IASKPSToggleSwitchSpecifierViewCell.xib | 237 ++++++ .../Xibs/IASKSpecifierValuesView.xib | 255 ++++++ PhoneMainView.xib | 403 +++++++-- Settings.bundle/Root.plist | 10 + Settings.bundle/video.plist | 10 - linphone.xcodeproj/project.pbxproj | 214 +++++ submodules/linphone | 2 +- 48 files changed, 5146 insertions(+), 137 deletions(-) create mode 100644 Classes/LinphoneCoreSettingsStore.h create mode 100644 Classes/LinphoneCoreSettingsStore.m create mode 100644 InAppSettingsKit/Controllers/IASKAppSettingsViewController.h create mode 100644 InAppSettingsKit/Controllers/IASKAppSettingsViewController.m create mode 100644 InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h create mode 100644 InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m create mode 100644 InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h create mode 100644 InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m create mode 100644 InAppSettingsKit/Controllers/IASKViewController.h create mode 100644 InAppSettingsKit/Models/IASKSettingsReader.h create mode 100644 InAppSettingsKit/Models/IASKSettingsReader.m create mode 100644 InAppSettingsKit/Models/IASKSettingsStore.h create mode 100644 InAppSettingsKit/Models/IASKSettingsStore.m create mode 100644 InAppSettingsKit/Models/IASKSettingsStoreFile.h create mode 100644 InAppSettingsKit/Models/IASKSettingsStoreFile.m create mode 100644 InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h create mode 100644 InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m create mode 100644 InAppSettingsKit/Models/IASKSpecifier.h create mode 100644 InAppSettingsKit/Models/IASKSpecifier.m create mode 100644 InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h create mode 100644 InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m create mode 100644 InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h create mode 100644 InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m create mode 100644 InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h create mode 100644 InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m create mode 100644 InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h create mode 100644 InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m create mode 100644 InAppSettingsKit/Views/IASKSlider.h create mode 100644 InAppSettingsKit/Views/IASKSlider.m create mode 100644 InAppSettingsKit/Views/IASKSwitch.h create mode 100644 InAppSettingsKit/Views/IASKSwitch.m create mode 100644 InAppSettingsKit/Views/IASKTextField.h create mode 100644 InAppSettingsKit/Views/IASKTextField.m create mode 100644 InAppSettingsKit/Xibs/IASKAppSettingsView.xib create mode 100644 InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib create mode 100644 InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib create mode 100644 InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib create mode 100644 InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib create mode 100644 InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib diff --git a/Classes/LinphoneAppDelegate.h b/Classes/LinphoneAppDelegate.h index f5e9508a1..8c7b21827 100644 --- a/Classes/LinphoneAppDelegate.h +++ b/Classes/LinphoneAppDelegate.h @@ -21,11 +21,13 @@ #import #import #import "CoreTelephony/CTCallCenter.h" +#import "IASKAppSettingsViewController.h" +#define HISTORY_TAB_INDEX 0 #define DIALER_TAB_INDEX 1 #define CONTACTS_TAB_INDEX 2 -#define HISTORY_TAB_INDEX 0 -#define MORE_TAB_INDEX 3 +#define SETTINGS_TAB_INDEX 3 +#define MORE_TAB_INDEX 4 @class ContactPickerDelegate; @class IncallViewController; @@ -38,6 +40,8 @@ IBOutlet UITabBarController* myTabBarController; IBOutlet ABPeoplePickerNavigationController* myPeoplePickerController; IBOutlet PhoneViewController* myPhoneViewController; + IBOutlet UINavigationController* moreNavigationController; + IBOutlet IASKAppSettingsViewController* settingsController; CallHistoryTableViewController* myCallHistoryTableViewController; ContactPickerDelegate* myContactPickerDelegate; @@ -53,8 +57,9 @@ @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UITabBarController* myTabBarController; @property (nonatomic, retain) ABPeoplePickerNavigationController* myPeoplePickerController; +@property (nonatomic, retain) IBOutlet UINavigationController* moreNavigationController; @property (nonatomic, retain) IBOutlet PhoneViewController* myPhoneViewController; - +@property (nonatomic, retain) IBOutlet IASKAppSettingsViewController* settingsController; @end diff --git a/Classes/LinphoneAppDelegate.m b/Classes/LinphoneAppDelegate.m index 8162f851d..3807085f7 100644 --- a/Classes/LinphoneAppDelegate.m +++ b/Classes/LinphoneAppDelegate.m @@ -45,6 +45,8 @@ int __aeabi_idiv(int a, int b) { @synthesize myTabBarController; @synthesize myPeoplePickerController; @synthesize myPhoneViewController; +@synthesize moreNavigationController; +@synthesize settingsController; -(void) handleGSMCallInteration: (id) cCenter { CTCallCenter* ct = (CTCallCenter*) cCenter; @@ -167,43 +169,20 @@ int __aeabi_idiv(int a, int b) { } -(void) setupUI { - //as defined in PhoneMainView.xib - //dialer - myPhoneViewController = (PhoneViewController*) [myTabBarController.viewControllers objectAtIndex: DIALER_TAB_INDEX]; - myPhoneViewController.myTabBarController = myTabBarController; - //Call history - myCallHistoryTableViewController = [[CallHistoryTableViewController alloc] initWithNibName:@"CallHistoryTableViewController" - bundle:[NSBundle mainBundle]]; - UINavigationController *aCallHistNavigationController = [[UINavigationController alloc] initWithRootViewController:myCallHistoryTableViewController]; - aCallHistNavigationController.tabBarItem = [(UIViewController*)[myTabBarController.viewControllers objectAtIndex:HISTORY_TAB_INDEX] tabBarItem]; - - //people picker delegates + // Contacts myContactPickerDelegate = [[ContactPickerDelegate alloc] init]; - //people picker - myPeoplePickerController = [[[ABPeoplePickerNavigationController alloc] init] autorelease]; - [myPeoplePickerController setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]]; - [myPeoplePickerController setPeoplePickerDelegate:myContactPickerDelegate]; - //copy tab bar item - myPeoplePickerController.tabBarItem = [(UIViewController*)[myTabBarController.viewControllers objectAtIndex:CONTACTS_TAB_INDEX] tabBarItem]; - - //more tab - MoreViewController *moreViewController = [[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:[NSBundle mainBundle]]; - UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:moreViewController]; - [moreViewController release]; - //copy tab bar item - aNavigationController.tabBarItem = [(UIViewController*)[myTabBarController.viewControllers objectAtIndex:MORE_TAB_INDEX] tabBarItem]; - - //insert contact controller - NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.myTabBarController.viewControllers]; - [newArray replaceObjectAtIndex:CONTACTS_TAB_INDEX withObject:myPeoplePickerController]; - [newArray replaceObjectAtIndex:MORE_TAB_INDEX withObject:aNavigationController]; - [aNavigationController release]; - [newArray replaceObjectAtIndex:HISTORY_TAB_INDEX withObject:aCallHistNavigationController]; - [aCallHistNavigationController release]; - - [myTabBarController setSelectedIndex:DIALER_TAB_INDEX]; - [myTabBarController setViewControllers:newArray animated:NO]; - + //people picker + myPeoplePickerController = [[[ABPeoplePickerNavigationController alloc] init] autorelease]; + [myPeoplePickerController setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]]; + [myPeoplePickerController setPeoplePickerDelegate:myContactPickerDelegate]; + //copy tab bar item + myPeoplePickerController.tabBarItem = [(UIViewController*)[myTabBarController.viewControllers objectAtIndex:CONTACTS_TAB_INDEX] tabBarItem]; + + NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.myTabBarController.viewControllers]; + [newArray replaceObjectAtIndex:CONTACTS_TAB_INDEX withObject:myPeoplePickerController]; + [myTabBarController setViewControllers:newArray animated:NO]; + + [myTabBarController setSelectedIndex:DIALER_TAB_INDEX]; [window addSubview:myTabBarController.view]; [window makeKeyAndVisible]; @@ -257,6 +236,12 @@ int __aeabi_idiv(int a, int b) { [[LinphoneManager instance] startLibLinphone]; + // Settings, setup delegate + settingsController.delegate = [LinphoneManager instance]; + settingsController.settingsReader.delegate = [LinphoneManager instance]; + [settingsController.settingsReader init]; + + [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound]; [self setupGSMInteraction]; @@ -282,6 +267,4 @@ int __aeabi_idiv(int a, int b) { linphone_core_accept_call([LinphoneManager getLc], call); } - - @end diff --git a/Classes/LinphoneCoreSettingsStore.h b/Classes/LinphoneCoreSettingsStore.h new file mode 100644 index 000000000..bb9df882a --- /dev/null +++ b/Classes/LinphoneCoreSettingsStore.h @@ -0,0 +1,15 @@ +// +// LinphoneCoreSettingsStore.h +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 22/05/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import +#import "IASKSettingsStore.h" + +@interface LinphoneCoreSettingsStore : IASKAbstractSettingsStore { +} + +@end diff --git a/Classes/LinphoneCoreSettingsStore.m b/Classes/LinphoneCoreSettingsStore.m new file mode 100644 index 000000000..f9f9d8f62 --- /dev/null +++ b/Classes/LinphoneCoreSettingsStore.m @@ -0,0 +1,61 @@ +// +// LinphoneCoreSettingsStore.m +// linphone +// +// Created by Pierre-Eric Pelloux-Prayer on 22/05/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#import "LinphoneCoreSettingsStore.h" + + +debugenable_preference +transport_preference +username_preference +domain_preference +password_preference +check_config_disable_preference +outbound_proxy_preference +proxy_preference +prefix_preference +substitute_+_by_00_preference +wifi_only_preference + +silk_24k_preference +speex_16k_preference +speex_8k_preference +silk_16k_preference +amr_8k_preference +gsm_8k_preference +ilbc_preference +pcmu_preference +pcma_preference +g722_preferenceg +g729_preference + +mp4v-es_preference +h264_preference +vp8_preference + +enable_video_preference +enable_srtp_preference +stun_preference +start_video_preference +backgroundmode_preference + +@implementation LinphoneCoreSettingsStore + + +-(void) setObject:(id)value forKey:(NSString *)key { + + +} + +- (id)objectForKey:(NSString*)key { + return nil; +} +- (BOOL)synchronize { + return YES; +} + +@end diff --git a/Classes/LinphoneUI/LinphoneManager.h b/Classes/LinphoneUI/LinphoneManager.h index a52cff965..b2f4dfc3d 100644 --- a/Classes/LinphoneUI/LinphoneManager.h +++ b/Classes/LinphoneUI/LinphoneManager.h @@ -23,6 +23,8 @@ #include "linphonecore.h" #import "LogView.h" #import "LinphoneUIDelegates.h" +#import "IASKSettingsReader.h" +#import "IASKAppSettingsViewController.h" typedef enum _Connectivity { wifi, @@ -49,7 +51,7 @@ typedef struct _LinphoneCallAppData { } LinphoneCallAppData; -@interface LinphoneManager : NSObject { +@interface LinphoneManager : NSObject { @protected SCNetworkReachabilityRef proxyReachability; @private @@ -99,5 +101,6 @@ typedef struct _LinphoneCallAppData { @property Connectivity connectivity; @property (readonly) const char* frontCamId; @property (readonly) const char* backCamId; +@property (nonatomic) bool isbackgroundModeEnabled; @end diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 540ae63ec..50a632aee 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -56,6 +56,7 @@ extern void libmsbcg729_init(); @synthesize connectivity; @synthesize frontCamId; @synthesize backCamId; +@synthesize isbackgroundModeEnabled; -(id) init { assert (!theLinphoneManager); @@ -1069,5 +1070,53 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach ms_message("UI - '%s' pressed", name); } +-(void) settingsViewControllerDidEnd:(IASKAppSettingsViewController *)sender { + [self reconfigureLinphoneIfNeeded: currentSettings]; +} + +-(NSDictionary*) filterPreferenceSpecifier:(NSDictionary *)specifier { + if (!theLinphoneCore) { + // LinphoneCore not ready: do not filter + return specifier; + } + NSString* identifier = [specifier objectForKey:@"Identifier"]; + if (identifier == nil) { + identifier = [specifier objectForKey:@"Key"]; + } + if (!identifier) { + // child pane maybe + NSString* title = [specifier objectForKey:@"Title"]; + if ([title isEqualToString:@"Video"]) { + if (!linphone_core_video_enabled(theLinphoneCore)) + return nil; + } + return specifier; + } + // NSLog(@"Specifier received: %@", identifier); + if ([identifier isEqualToString:@"srtp_preference"]) { + if (!ortp_srtp_supported()) + return nil; + } else if ([identifier hasPrefix:@"silk"]) { + if ([identifier isEqualToString:@"speex_24k_preference"]) { + if (linphone_core_find_payload_type(theLinphoneCore, "SILK", 24000)) return nil; + } else if ([identifier isEqualToString:@"speex_16k_preference"]) { + if (linphone_core_find_payload_type(theLinphoneCore, "SILK", 16000)) return nil; + } else if ([identifier isEqualToString:@"speex_8k_preference"]) { + if (linphone_core_find_payload_type(theLinphoneCore, "SILK", 8000)) return nil; + } + } else if ([identifier isEqualToString:@"backgroundmode_preference"]) { + UIDevice* device = [UIDevice currentDevice]; + if ([device respondsToSelector:@selector(isMultitaskingSupported)]) { + if ([device isMultitaskingSupported]) { + return specifier; + } + } + // hide setting if bg mode not supported + return nil; + } + return specifier; +} + + @end diff --git a/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h b/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h new file mode 100644 index 000000000..2eaaa2ca0 --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h @@ -0,0 +1,84 @@ +// +// IASKAppSettingsViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import + +#import "IASKSettingsStore.h" +#import "IASKViewController.h" + +@class IASKSettingsReader; +@class IASKAppSettingsViewController; +@class IASKSpecifier; + +@protocol IASKSettingsDelegate +- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender; + +@optional +#pragma mark - UITableView header customization +- (CGFloat) settingsViewController:(id)settingsViewController + tableView:(UITableView *)tableView + heightForHeaderForSection:(NSInteger)section; +- (UIView *) settingsViewController:(id)settingsViewController + tableView:(UITableView *)tableView + viewForHeaderForSection:(NSInteger)section; + +#pragma mark - UITableView cell customization +- (CGFloat)tableView:(UITableView*)tableView heightForSpecifier:(IASKSpecifier*)specifier; +- (UITableViewCell*)tableView:(UITableView*)tableView cellForSpecifier:(IASKSpecifier*)specifier; + +#pragma mark - mail composing customization +- (NSString*) settingsViewController:(id)settingsViewController + mailComposeBodyForSpecifier:(IASKSpecifier*) specifier; + +- (UIViewController*) settingsViewController:(id)settingsViewController + viewControllerForMailComposeViewForSpecifier:(IASKSpecifier*) specifier; + +- (void) settingsViewController:(id) settingsViewController + mailComposeController:(MFMailComposeViewController*)controller + didFinishWithResult:(MFMailComposeResult)result + error:(NSError*)error; + +#pragma mark - respond to button taps +- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForKey:(NSString*)key; +- (void)settingsViewController:(IASKAppSettingsViewController*)sender tableView:(UITableView *)tableView didSelectCustomViewSpecifier:(IASKSpecifier*)specifier; +@end + + +@interface IASKAppSettingsViewController : UITableViewController { + id _delegate; + + NSMutableArray *_viewList; + + IASKSettingsReader *_settingsReader; + id _settingsStore; + NSString *_file; + + id _currentFirstResponder; + + BOOL _showCreditsFooter; + BOOL _showDoneButton; +} + +@property (nonatomic, assign) IBOutlet id delegate; +@property (nonatomic, copy) NSString *file; +@property (nonatomic, assign) BOOL showCreditsFooter; +@property (nonatomic, assign) BOOL showDoneButton; + +- (void)synchronizeSettings; +- (IBAction)dismiss:(id)sender; + +@end diff --git a/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m new file mode 100644 index 000000000..d3593e1b0 --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m @@ -0,0 +1,798 @@ +// +// IASKAppSettingsViewController.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009-2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + + +#import "IASKAppSettingsViewController.h" +#import "IASKSettingsReader.h" +#import "IASKSettingsStoreUserDefaults.h" +#import "IASKPSToggleSwitchSpecifierViewCell.h" +#import "IASKPSSliderSpecifierViewCell.h" +#import "IASKPSTextFieldSpecifierViewCell.h" +#import "IASKPSTitleValueSpecifierViewCell.h" +#import "IASKSwitch.h" +#import "IASKSlider.h" +#import "IASKSpecifier.h" +#import "IASKSpecifierValuesViewController.h" +#import "IASKTextField.h" + +static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; +static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; +static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; + +static NSString *kIASKCredits = @"Powered by InAppSettingsKit"; // Leave this as-is!!! + +#define kIASKSpecifierValuesViewControllerIndex 0 +#define kIASKSpecifierChildViewControllerIndex 1 + +#define kIASKCreditsViewWidth 285 + +CGRect IASKCGRectSwap(CGRect rect); + +@interface IASKAppSettingsViewController () +@property (nonatomic, retain) NSMutableArray *viewList; +@property (nonatomic, retain) id currentFirstResponder; + +- (void) setup; + +- (void)_textChanged:(id)sender; +- (void)synchronizeSettings; +- (void)userDefaultsDidChange; +- (void)reload; +@end + +@implementation IASKAppSettingsViewController + +@synthesize delegate = _delegate; +@synthesize viewList = _viewList; +@synthesize settingsReader = _settingsReader; +@synthesize file = _file; +@synthesize currentFirstResponder = _currentFirstResponder; +@synthesize showCreditsFooter = _showCreditsFooter; +@synthesize showDoneButton = _showDoneButton; +@synthesize settingsStore = _settingsStore; + +#pragma mark accessors +- (IASKSettingsReader*)settingsReader { + if (!_settingsReader) { + _settingsReader = [[IASKSettingsReader alloc] initWithFile:self.file]; + } + return _settingsReader; +} + +- (id)settingsStore { + if (!_settingsStore) { + _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; + } + return _settingsStore; +} + +- (NSString*)file { + if (!_file) { + return @"Root"; + } + return [[_file retain] autorelease]; +} + +- (void)setFile:(NSString *)file { + if (file != _file) { + + [_file release]; + _file = [file copy]; + } + + self.tableView.contentOffset = CGPointMake(0, 0); + self.settingsReader = nil; // automatically initializes itself + [self.tableView reloadData]; +} + +- (BOOL)isPad { + BOOL isPad = NO; +#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) + isPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; +#endif + return isPad; +} + +#pragma mark standard view controller methods +- (id)init { + return [self initWithNibName:@"IASKAppSettingsView" bundle:nil]; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { + // If set to YES, will add a DONE button at the right of the navigation bar + _showDoneButton = YES; + + [self setup]; + } + return self; +} + +- (void)awakeFromNib { + // If set to YES, will add a DONE button at the right of the navigation bar + // if loaded via NIB, it's likely we sit in a TabBar- or NavigationController + // and thus don't need the Done button + _showDoneButton = NO; + + [self setup]; +} + +//common (NIB & code based) initialization +- (void) setup { + // If set to YES, will display credits for InAppSettingsKit creators + _showCreditsFooter = YES; +} + +- (NSMutableArray *)viewList { + if (!_viewList) { + _viewList = [[NSMutableArray alloc] init]; + [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKSpecifierValuesView", @"ViewName",nil]]; + [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKAppSettingsView", @"ViewName",nil]]; + } + return _viewList; +} + +- (void) viewDidLoad { + [super viewDidLoad]; + if ([self isPad]) { + self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLineEtched; + } +} + +- (void)viewDidUnload { + [super viewDidUnload]; + + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + self.view = nil; + self.viewList = nil; +} + +- (void)viewWillAppear:(BOOL)animated { + // if there's something selected, the value might have changed + // so reload that row + NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; + if(selectedIndexPath) { + [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:selectedIndexPath] + withRowAnimation:UITableViewRowAnimationNone]; + // and reselect it, so we get the nice default deselect animation from UITableViewController + [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; + } + + self.navigationItem.rightBarButtonItem = nil; + self.navigationController.delegate = self; + if (_showDoneButton) { + UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(dismiss:)]; + self.navigationItem.rightBarButtonItem = buttonItem; + [buttonItem release]; + } + if (!self.title) { + self.title = NSLocalizedString(@"Settings", @""); + } + + if ([self.settingsStore isKindOfClass:[IASKSettingsStoreUserDefaults class]]) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(userDefaultsDidChange) + name:NSUserDefaultsDidChangeNotification + object:[NSUserDefaults standardUserDefaults]]; + [self userDefaultsDidChange]; // force update in case of changes while we were hidden + } + [super viewWillAppear:animated]; +} + +- (CGSize)contentSizeForViewInPopover { + return [[self view] sizeThatFits:CGSizeMake(320, 2000)]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + NSNotificationCenter *dc = [NSNotificationCenter defaultCenter]; + IASK_IF_IOS4_OR_GREATER([dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]];); + IASK_IF_IOS4_OR_GREATER([dc addObserver:self selector:@selector(reload) name:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]];); + [dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [super viewWillDisappear:animated]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + if (!self.navigationController.delegate) { + // hide the keyboard when we're popping from the navigation controller + [self.currentFirstResponder resignFirstResponder]; + } + [self dismiss:nil]; + [super viewDidDisappear:animated]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { + if (![viewController isKindOfClass:[IASKAppSettingsViewController class]] && ![viewController isKindOfClass:[IASKSpecifierValuesViewController class]]) { + [self dismiss:nil]; + } +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_viewList release], _viewList = nil; + [_file release], _file = nil; + [_currentFirstResponder release], _currentFirstResponder = nil; + [_settingsReader release], _settingsReader = nil; + [_settingsStore release], _settingsStore = nil; + + _delegate = nil; + + [super dealloc]; +} + + +#pragma mark - +#pragma mark Actions + +- (IBAction)dismiss:(id)sender { + [self.settingsStore synchronize]; + self.navigationController.delegate = nil; + + if (self.delegate && [self.delegate conformsToProtocol:@protocol(IASKSettingsDelegate)]) { + [self.delegate settingsViewControllerDidEnd:self]; + } + // reload + [self.settingsReader initWithFile:self.file]; + [self.tableView reloadData]; +} + +- (void)toggledValue:(id)sender { + IASKSwitch *toggle = (IASKSwitch*)sender; + IASKSpecifier *spec = [_settingsReader specifierForKey:[toggle key]]; + + if ([toggle isOn]) { + if ([spec trueValue] != nil) { + [self.settingsStore setObject:[spec trueValue] forKey:[toggle key]]; + } + else { + [self.settingsStore setBool:YES forKey:[toggle key]]; + } + } + else { + if ([spec falseValue] != nil) { + [self.settingsStore setObject:[spec falseValue] forKey:[toggle key]]; + } + else { + [self.settingsStore setBool:NO forKey:[toggle key]]; + } + } + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[toggle key] + userInfo:[NSDictionary dictionaryWithObject:[self.settingsStore objectForKey:[toggle key]] + forKey:[toggle key]]]; +} + +- (void)sliderChangedValue:(id)sender { + IASKSlider *slider = (IASKSlider*)sender; + [self.settingsStore setFloat:[slider value] forKey:[slider key]]; + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[slider key] + userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:[slider value]] + forKey:[slider key]]]; +} + + +#pragma mark - +#pragma mark UITableView Functions + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return [self.settingsReader numberOfSections]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [self.settingsReader numberOfRowsForSection:section]; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + if ([[specifier type] isEqualToString:kIASKCustomViewSpecifier]) { + if ([self.delegate respondsToSelector:@selector(tableView:heightForSpecifier:)]) { + return [self.delegate tableView:tableView heightForSpecifier:specifier]; + } else { + return 0; + } + } + return tableView.rowHeight; +} + +- (NSString *)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section { + NSString *header = [self.settingsReader titleForSection:section]; + if (0 == header.length) { + return nil; + } + return header; +} + +- (UIView *)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { + if ([self.delegate respondsToSelector:@selector(settingsViewController:tableView:viewForHeaderForSection:)]) { + return [self.delegate settingsViewController:self tableView:tableView viewForHeaderForSection:section]; + } else { + return nil; + } +} + +- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { + if ([self tableView:tableView viewForHeaderInSection:section] && [self.delegate respondsToSelector:@selector(settingsViewController:tableView:heightForHeaderForSection:)]) { + CGFloat result; + if ((result = [self.delegate settingsViewController:self tableView:tableView heightForHeaderForSection:section])) { + return result; + } + + } + NSString *title; + if ((title = [self tableView:tableView titleForHeaderInSection:section])) { + CGSize size = [title sizeWithFont:[UIFont boldSystemFontOfSize:[UIFont labelFontSize]] + constrainedToSize:CGSizeMake(tableView.frame.size.width - 2*kIASKHorizontalPaddingGroupTitles, INFINITY) + lineBreakMode:UILineBreakModeWordWrap]; + return size.height+kIASKVerticalPaddingGroupTitles; + } + return 0; +} + +- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section +{ + NSString *footerText = [self.settingsReader footerTextForSection:section]; + if (_showCreditsFooter && (section == [self.settingsReader numberOfSections]-1)) { + // show credits since this is the last section + if ((footerText == nil) || ([footerText length] == 0)) { + // show the credits on their own + return kIASKCredits; + } else { + // show the credits below the app's FooterText + return [NSString stringWithFormat:@"%@\n\n%@", footerText, kIASKCredits]; + } + } else { + if ([footerText length] == 0) { + return nil; + } + return [self.settingsReader footerTextForSection:section]; + } +} + +- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier { + UITableViewCell *cell = nil; + if ([identifier isEqualToString:kIASKPSToggleSwitchSpecifier]) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"IASKPSToggleSwitchSpecifierViewCell" + owner:self + options:nil] objectAtIndex:0]; + } + else if ([identifier isEqualToString:kIASKPSMultiValueSpecifier] || [identifier isEqualToString:kIASKPSTitleValueSpecifier]) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease]; + cell.accessoryType = [identifier isEqualToString:kIASKPSMultiValueSpecifier] ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; + } + else if ([identifier isEqualToString:kIASKPSTextFieldSpecifier]) { + cell = (IASKPSTextFieldSpecifierViewCell*) [[[NSBundle mainBundle] loadNibNamed:@"IASKPSTextFieldSpecifierViewCell" + owner:self + options:nil] objectAtIndex:0]; + } + else if ([identifier isEqualToString:kIASKPSSliderSpecifier]) { + cell = (IASKPSSliderSpecifierViewCell*) [[[NSBundle mainBundle] loadNibNamed:@"IASKPSSliderSpecifierViewCell" + owner:self + options:nil] objectAtIndex:0]; + } else if ([identifier isEqualToString:kIASKPSChildPaneSpecifier]) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + } else if ([identifier isEqualToString:kIASKButtonSpecifier]) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease]; + } else if ([identifier isEqualToString:kIASKMailComposeSpecifier]) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease]; + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; + } else { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease]; + } + return cell; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + if ([specifier.type isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(tableView:cellForSpecifier:)]) { + UITableViewCell* cell = [self.delegate tableView:tableView cellForSpecifier:specifier]; + assert(nil != cell && "delegate must return a UITableViewCell for custom cell types"); + return cell; + } + + UITableViewCell *cell = [self dequeueReusableCellWithIdentifier:specifier.type]; + + if ([specifier.type isEqualToString:kIASKPSToggleSwitchSpecifier]) { + ((IASKPSToggleSwitchSpecifierViewCell*)cell).label.text = specifier.title; + + id currentValue = [self.settingsStore objectForKey:specifier.key]; + BOOL toggleState; + if (currentValue) { + if ([currentValue isEqual:specifier.trueValue]) { + toggleState = YES; + } else if ([currentValue isEqual:specifier.falseValue]) { + toggleState = NO; + } else { + toggleState = [currentValue boolValue]; + } + } else { + toggleState = specifier.defaultBoolValue; + } + ((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle.on = toggleState; + + [((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle addTarget:self action:@selector(toggledValue:) forControlEvents:UIControlEventValueChanged]; + ((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle.key = specifier.key; + } + else if ([specifier.type isEqualToString:kIASKPSMultiValueSpecifier]) { + cell.textLabel.text = specifier.title; + cell.detailTextLabel.text = [[specifier titleForCurrentValue:[self.settingsStore objectForKey:specifier.key] != nil ? + [self.settingsStore objectForKey:specifier.key] : specifier.defaultValue] description]; + } + else if ([specifier.type isEqualToString:kIASKPSTitleValueSpecifier]) { + cell.textLabel.text = specifier.title; + id value = [self.settingsStore objectForKey:specifier.key] ? : specifier.defaultValue; + + NSString *stringValue; + if (specifier.multipleValues || specifier.multipleTitles) { + stringValue = [specifier titleForCurrentValue:value]; + } else { + stringValue = [value description]; + } + + cell.detailTextLabel.text = stringValue; + cell.userInteractionEnabled = NO; + } + else if ([specifier.type isEqualToString:kIASKPSTextFieldSpecifier]) { + ((IASKPSTextFieldSpecifierViewCell*)cell).label.text = specifier.title; + + NSString *textValue = [self.settingsStore objectForKey:specifier.key] != nil ? [self.settingsStore objectForKey:specifier.key] : specifier.defaultStringValue; + if (textValue && ![textValue isMemberOfClass:[NSString class]]) { + textValue = [NSString stringWithFormat:@"%@", textValue]; + } + IASKTextField *textField = ((IASKPSTextFieldSpecifierViewCell*)cell).textField; + textField.text = textValue; + textField.key = specifier.key; + textField.delegate = self; + textField.secureTextEntry = [specifier isSecure]; + textField.keyboardType = specifier.keyboardType; + textField.autocapitalizationType = specifier.autocapitalizationType; + [textField addTarget:self action:@selector(_textChanged:) forControlEvents:UIControlEventEditingChanged]; + if([specifier isSecure]){ + textField.autocorrectionType = UITextAutocorrectionTypeNo; + } else { + textField.autocorrectionType = specifier.autoCorrectionType; + } + [cell setNeedsLayout]; + } + else if ([specifier.type isEqualToString:kIASKPSSliderSpecifier]) { + if (specifier.minimumValueImage.length > 0) { + ((IASKPSSliderSpecifierViewCell*)cell).minImage.image = [UIImage imageWithContentsOfFile:[_settingsReader pathForImageNamed:specifier.minimumValueImage]]; + } + + if (specifier.maximumValueImage.length > 0) { + ((IASKPSSliderSpecifierViewCell*)cell).maxImage.image = [UIImage imageWithContentsOfFile:[_settingsReader pathForImageNamed:specifier.maximumValueImage]]; + } + + IASKSlider *slider = ((IASKPSSliderSpecifierViewCell*)cell).slider; + slider.minimumValue = specifier.minimumValue; + slider.maximumValue = specifier.maximumValue; + slider.value = [self.settingsStore objectForKey:specifier.key] != nil ? [[self.settingsStore objectForKey:specifier.key] floatValue] : [specifier.defaultValue floatValue]; + [slider addTarget:self action:@selector(sliderChangedValue:) forControlEvents:UIControlEventValueChanged]; + slider.key = specifier.key; + [cell setNeedsLayout]; + } + else if ([specifier.type isEqualToString:kIASKPSChildPaneSpecifier]) { + cell.textLabel.text = specifier.title; + } else if ([specifier.type isEqualToString:kIASKOpenURLSpecifier] || [specifier.type isEqualToString:kIASKMailComposeSpecifier]) { + cell.textLabel.text = specifier.title; + cell.detailTextLabel.text = [specifier.defaultValue description]; + } else if ([specifier.type isEqualToString:kIASKButtonSpecifier]) { + NSString *value = [self.settingsStore objectForKey:specifier.key]; + cell.textLabel.text = [value isKindOfClass:[NSString class]] ? [self.settingsReader titleForStringId:value] : specifier.title; + cell.textLabel.textAlignment = UITextAlignmentCenter; + } else { + cell.textLabel.text = specifier.title; + } + return cell; +} + +- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { + //create a set of specifier types that can't be selected + static NSSet* noSelectionTypes = nil; + if(nil == noSelectionTypes) { + noSelectionTypes = [[NSSet setWithObjects:kIASKPSToggleSwitchSpecifier, kIASKPSSliderSpecifier, nil] retain]; + } + + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + if([noSelectionTypes containsObject:specifier.type]) { + return nil; + } else { + return indexPath; + } +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + + //switches and sliders can't be selected (should be captured by tableView:willSelectRowAtIndexPath: delegate method) + assert(![[specifier type] isEqualToString:kIASKPSToggleSwitchSpecifier]); + assert(![[specifier type] isEqualToString:kIASKPSSliderSpecifier]); + + if ([[specifier type] isEqualToString:kIASKPSMultiValueSpecifier]) { + IASKSpecifierValuesViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex] objectForKey:@"viewController"]; + + if (targetViewController == nil) { + // the view controller has not been created yet, create it and set it to our viewList array + // create a new dictionary with the new view controller + NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; + [newItemDict addEntriesFromDictionary: [self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex]]; // copy the title and explain strings + + targetViewController = [[IASKSpecifierValuesViewController alloc] initWithNibName:@"IASKSpecifierValuesView" bundle:nil]; + // add the new view controller to the dictionary and then to the 'viewList' array + [newItemDict setObject:targetViewController forKey:@"viewController"]; + [self.viewList replaceObjectAtIndex:kIASKSpecifierValuesViewControllerIndex withObject:newItemDict]; + [targetViewController release]; + + // load the view controll back in to push it + targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex] objectForKey:@"viewController"]; + } + [targetViewController setCurrentSpecifier:specifier]; + targetViewController.settingsReader = self.settingsReader; + targetViewController.settingsStore = self.settingsStore; + [[self navigationController] pushViewController:targetViewController animated:YES]; + } + else if ([[specifier type] isEqualToString:kIASKPSTextFieldSpecifier]) { + IASKPSTextFieldSpecifierViewCell *textFieldCell = (id)[tableView cellForRowAtIndexPath:indexPath]; + [textFieldCell.textField becomeFirstResponder]; + } + else if ([[specifier type] isEqualToString:kIASKPSChildPaneSpecifier]) { + + + Class vcClass = [specifier viewControllerClass]; + if (vcClass) { + SEL initSelector = [specifier viewControllerSelector]; + if (!initSelector) { + initSelector = @selector(init); + } + UIViewController * vc = [vcClass performSelector:@selector(alloc)]; + [vc performSelector:initSelector withObject:[specifier file] withObject:[specifier key]]; + if ([vc respondsToSelector:@selector(setDelegate:)]) { + [vc performSelector:@selector(setDelegate:) withObject:self.delegate]; + } + if ([vc respondsToSelector:@selector(setSettingsStore:)]) { + [vc performSelector:@selector(setSettingsStore:) withObject:self.settingsStore]; + } + self.navigationController.delegate = nil; + [self.navigationController pushViewController:vc animated:YES]; + [vc performSelector:@selector(release)]; + return; + } + + if (nil == [specifier file]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + return; + } + + IASKAppSettingsViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; + + if (targetViewController == nil) { + // the view controller has not been created yet, create it and set it to our viewList array + // create a new dictionary with the new view controller + NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; + [newItemDict addEntriesFromDictionary: [self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex]]; // copy the title and explain strings + + targetViewController = [[[self class] alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil]; + targetViewController.showDoneButton = NO; + targetViewController.settingsStore = self.settingsStore; + targetViewController.delegate = self.delegate; + + // add the new view controller to the dictionary and then to the 'viewList' array + [newItemDict setObject:targetViewController forKey:@"viewController"]; + [self.viewList replaceObjectAtIndex:kIASKSpecifierChildViewControllerIndex withObject:newItemDict]; + [targetViewController release]; + + // load the view controll back in to push it + targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; + } + targetViewController.file = specifier.file; // changes settingsReader + targetViewController.settingsReader.delegate = self.settingsReader.delegate; + [targetViewController.settingsReader initWithFile:specifier.file]; + targetViewController.title = specifier.title; + targetViewController.showCreditsFooter = NO; + [[self navigationController] pushViewController:targetViewController animated:YES]; + } else if ([[specifier type] isEqualToString:kIASKOpenURLSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:specifier.file]]; + } else if ([[specifier type] isEqualToString:kIASKButtonSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if ([self.delegate respondsToSelector:@selector(settingsViewController:buttonTappedForKey:)]) { + [self.delegate settingsViewController:self buttonTappedForKey:[specifier key]]; + } else { + // legacy code, provided for backward compatibility + // the delegate mechanism above is much cleaner and doesn't leak + Class buttonClass = [specifier buttonClass]; + SEL buttonAction = [specifier buttonAction]; + if ([buttonClass respondsToSelector:buttonAction]) { + [buttonClass performSelector:buttonAction withObject:self withObject:[specifier key]]; + NSLog(@"InAppSettingsKit Warning: Using IASKButtonSpecifier without implementing the delegate method is deprecated"); + } + } + } else if ([[specifier type] isEqualToString:kIASKMailComposeSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if ([MFMailComposeViewController canSendMail]) { + MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; + mailViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle; + mailViewController.navigationBar.tintColor = self.navigationController.navigationBar.tintColor; + + if ([specifier localizedObjectForKey:kIASKMailComposeSubject]) { + [mailViewController setSubject:[specifier localizedObjectForKey:kIASKMailComposeSubject]]; + } + if ([[specifier specifierDict] objectForKey:kIASKMailComposeToRecipents]) { + [mailViewController setToRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeToRecipents]]; + } + if ([[specifier specifierDict] objectForKey:kIASKMailComposeCcRecipents]) { + [mailViewController setCcRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeCcRecipents]]; + } + if ([[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]) { + [mailViewController setBccRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]]; + } + if ([specifier localizedObjectForKey:kIASKMailComposeBody]) { + BOOL isHTML = NO; + if ([[specifier specifierDict] objectForKey:kIASKMailComposeBodyIsHTML]) { + isHTML = [[[specifier specifierDict] objectForKey:kIASKMailComposeBodyIsHTML] boolValue]; + } + + if ([self.delegate respondsToSelector:@selector(settingsViewController:mailComposeBodyForSpecifier:)]) { + [mailViewController setMessageBody:[self.delegate settingsViewController:self + mailComposeBodyForSpecifier:specifier] isHTML:isHTML]; + } + else { + [mailViewController setMessageBody:[specifier localizedObjectForKey:kIASKMailComposeBody] isHTML:isHTML]; + } + } + + UIViewController *vc = nil; + + if ([self.delegate respondsToSelector:@selector(settingsViewController:viewControllerForMailComposeViewForSpecifier:)]) { + vc = [self.delegate settingsViewController:self viewControllerForMailComposeViewForSpecifier:specifier]; + } + + if (vc == nil) { + vc = self; + } + + mailViewController.mailComposeDelegate = vc; + [vc presentModalViewController:mailViewController animated:YES]; + [mailViewController release]; + } else { + UIAlertView *alert = [[UIAlertView alloc] + initWithTitle:NSLocalizedString(@"Mail not configured", @"InAppSettingsKit") + message:NSLocalizedString(@"This device is not configured for sending Email. Please configure the Mail settings in the Settings app.", @"InAppSettingsKit") + delegate: nil + cancelButtonTitle:NSLocalizedString(@"OK", @"InAppSettingsKit") + otherButtonTitles:nil]; + [alert show]; + [alert release]; + } + + } else if ([[specifier type] isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(settingsViewController:tableView:didSelectCustomViewSpecifier:)]) { + [self.delegate settingsViewController:self tableView:tableView didSelectCustomViewSpecifier:specifier]; + } else { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + } +} + + +#pragma mark - +#pragma mark MFMailComposeViewControllerDelegate Function + +-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { + + // Forward the mail compose delegate + if ([self.delegate respondsToSelector:@selector(settingsViewController:mailComposeController:didFinishWithResult:error:)]) { + [self.delegate settingsViewController:self + mailComposeController:controller + didFinishWithResult:result + error:error]; + } + + // NOTE: No error handling is done here + [self dismissModalViewControllerAnimated:YES]; +} + +#pragma mark - +#pragma mark UITextFieldDelegate Functions + +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { + self.currentFirstResponder = textField; + return YES; +} + +- (void)_textChanged:(id)sender { + IASKTextField *text = (IASKTextField*)sender; + [_settingsStore setObject:[text text] forKey:[text key]]; + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[text key] + userInfo:[NSDictionary dictionaryWithObject:[text text] + forKey:[text key]]]; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField{ + [textField resignFirstResponder]; + self.currentFirstResponder = nil; + return YES; +} + + +#pragma mark Notifications + +- (void)synchronizeSettings { + [_settingsStore synchronize]; +} + +static NSDictionary *oldUserDefaults = nil; +- (void)userDefaultsDidChange { + NSDictionary *currentDict = [NSUserDefaults standardUserDefaults].dictionaryRepresentation; + NSMutableArray *indexPathsToUpdate = [NSMutableArray array]; + for (NSString *key in currentDict.allKeys) { + if (![[oldUserDefaults valueForKey:key] isEqual:[currentDict valueForKey:key]]) { + NSIndexPath *path = [self.settingsReader indexPathForKey:key]; + if (path && ![[self.settingsReader specifierForKey:key].type isEqualToString:kIASKCustomViewSpecifier]) { + [indexPathsToUpdate addObject:path]; + } + } + } + [oldUserDefaults release], oldUserDefaults = [currentDict retain]; + + + for (UITableViewCell *cell in self.tableView.visibleCells) { + if ([cell isKindOfClass:[IASKPSTextFieldSpecifierViewCell class]] && [((IASKPSTextFieldSpecifierViewCell*)cell).textField isFirstResponder]) { + [indexPathsToUpdate removeObject:[self.tableView indexPathForCell:cell]]; + } + } + if (indexPathsToUpdate.count) { + [self.tableView reloadRowsAtIndexPaths:indexPathsToUpdate withRowAnimation:UITableViewRowAnimationNone]; + } +} + +- (void)reload { + // wait 0.5 sec until UI is available after applicationWillEnterForeground + [self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5]; +} + +#pragma mark CGRect Utility function +CGRect IASKCGRectSwap(CGRect rect) { + CGRect newRect; + newRect.origin.x = rect.origin.y; + newRect.origin.y = rect.origin.x; + newRect.size.width = rect.size.height; + newRect.size.height = rect.size.width; + return newRect; +} +@end diff --git a/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h b/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h new file mode 100644 index 000000000..08b6ceb27 --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h @@ -0,0 +1,30 @@ +// +// IASKAppSettingsWebViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import + +@interface IASKAppSettingsWebViewController : UIViewController { + UIWebView *webView; + NSURL *url; +} + +- (id)initWithFile:(NSString*)htmlFileName key:(NSString*)key; + +@property (nonatomic, retain) IBOutlet UIWebView *webView; +@property (nonatomic, retain) NSURL *url; + +@end diff --git a/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m b/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m new file mode 100644 index 000000000..46429b3ce --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m @@ -0,0 +1,148 @@ +// +// IASKAppSettingsWebViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKAppSettingsWebViewController.h" + +@implementation IASKAppSettingsWebViewController + +@synthesize url; +@synthesize webView; + +- (id)initWithFile:(NSString*)urlString key:(NSString*)key { + if (!(self = [super initWithNibName:nil bundle:nil])) { + return nil; + } + + self.url = [NSURL URLWithString:urlString]; + if (!self.url || ![self.url scheme]) { + NSString *path = [[NSBundle mainBundle] pathForResource:[urlString stringByDeletingPathExtension] ofType:[urlString pathExtension]]; + if(path) + self.url = [NSURL fileURLWithPath:path]; + else + self.url = nil; + } + return self; +} + + +- (void)dealloc { + [webView release], webView = nil; + [url release], url = nil; + + [super dealloc]; +} + +- (void)viewWillAppear:(BOOL)animated { + [webView loadRequest:[NSURLRequest requestWithURL:self.url]]; +} + +- (void)viewDidUnload { + [super viewDidUnload]; + self.webView = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)webViewDidFinishLoad:(UIWebView *)webView { + self.navigationItem.title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]; +} + +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { + NSURL *newURL = [request URL]; + + // intercept mailto URL and send it to an in-app Mail compose view instead + if ([[newURL scheme] isEqualToString:@"mailto"]) { + + NSArray *rawURLparts = [[newURL resourceSpecifier] componentsSeparatedByString:@"?"]; + if (rawURLparts.count > 2) { + return NO; // invalid URL + } + + MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; + mailViewController.mailComposeDelegate = self; + + NSMutableArray *toRecipients = [NSMutableArray array]; + NSString *defaultRecipient = [rawURLparts objectAtIndex:0]; + if (defaultRecipient.length) { + [toRecipients addObject:defaultRecipient]; + } + + if (rawURLparts.count == 2) { + NSString *queryString = [rawURLparts objectAtIndex:1]; + + NSArray *params = [queryString componentsSeparatedByString:@"&"]; + for (NSString *param in params) { + NSArray *keyValue = [param componentsSeparatedByString:@"="]; + if (keyValue.count != 2) { + continue; + } + NSString *key = [[keyValue objectAtIndex:0] lowercaseString]; + NSString *value = [keyValue objectAtIndex:1]; + + value = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, + (CFStringRef)value, + CFSTR(""), + kCFStringEncodingUTF8); + [value autorelease]; + + if ([key isEqualToString:@"subject"]) { + [mailViewController setSubject:value]; + } + + if ([key isEqualToString:@"body"]) { + [mailViewController setMessageBody:value isHTML:NO]; + } + + if ([key isEqualToString:@"to"]) { + [toRecipients addObjectsFromArray:[value componentsSeparatedByString:@","]]; + } + + if ([key isEqualToString:@"cc"]) { + NSArray *recipients = [value componentsSeparatedByString:@","]; + [mailViewController setCcRecipients:recipients]; + } + + if ([key isEqualToString:@"bcc"]) { + NSArray *recipients = [value componentsSeparatedByString:@","]; + [mailViewController setBccRecipients:recipients]; + } + } + } + + [mailViewController setToRecipients:toRecipients]; + + [self presentModalViewController:mailViewController animated:YES]; + [mailViewController release]; + return NO; + } + + // open inline if host is the same, otherwise, pass to the system + if (![newURL host] || [[newURL host] isEqualToString:[self.url host]]) { + return YES; + } + [[UIApplication sharedApplication] openURL:newURL]; + return NO; +} + +- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { + [self dismissModalViewControllerAnimated:YES]; +} + + + +@end diff --git a/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h b/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h new file mode 100644 index 000000000..d2810d368 --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h @@ -0,0 +1,36 @@ +// +// IASKSpecifierValuesViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import "IASKSettingsStore.h" +#import "IASKViewController.h" +@class IASKSpecifier; +@class IASKSettingsReader; + +@interface IASKSpecifierValuesViewController : UIViewController { + UITableView *_tableView; + + IASKSpecifier *_currentSpecifier; + NSIndexPath *_checkedItem; + IASKSettingsReader *_settingsReader; + id _settingsStore; +} + +@property (nonatomic, retain) IBOutlet UITableView *tableView; +@property (nonatomic, retain) NSIndexPath *checkedItem; +@property (nonatomic, retain) IASKSpecifier *currentSpecifier; + +@end diff --git a/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m b/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m new file mode 100644 index 000000000..84236a755 --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m @@ -0,0 +1,195 @@ +// +// IASKSpecifierValuesViewController.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSpecifierValuesViewController.h" +#import "IASKSpecifier.h" +#import "IASKSettingsReader.h" +#import "IASKSettingsStoreUserDefaults.h" + +#define kCellValue @"kCellValue" + +@interface IASKSpecifierValuesViewController() +- (void)userDefaultsDidChange; +@end + +@implementation IASKSpecifierValuesViewController + +@synthesize tableView=_tableView; +@synthesize currentSpecifier=_currentSpecifier; +@synthesize checkedItem=_checkedItem; +@synthesize settingsReader = _settingsReader; +@synthesize settingsStore = _settingsStore; + +- (void) updateCheckedItem { + NSInteger index; + + // Find the currently checked item + if([self.settingsStore objectForKey:[_currentSpecifier key]]) { + index = [[_currentSpecifier multipleValues] indexOfObject:[self.settingsStore objectForKey:[_currentSpecifier key]]]; + } else { + index = [[_currentSpecifier multipleValues] indexOfObject:[_currentSpecifier defaultValue]]; + } + [self setCheckedItem:[NSIndexPath indexPathForRow:index inSection:0]]; +} + +- (id)settingsStore { + if(_settingsStore == nil) { + _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; + } + return _settingsStore; +} + +- (void)viewWillAppear:(BOOL)animated { + if (_currentSpecifier) { + [self setTitle:[_currentSpecifier title]]; + [self updateCheckedItem]; + } + + if (_tableView) { + [_tableView reloadData]; + + // Make sure the currently checked item is visible + [_tableView scrollToRowAtIndexPath:[self checkedItem] atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; + } + [super viewWillAppear:animated]; +} + +- (void)viewDidAppear:(BOOL)animated { + [_tableView flashScrollIndicators]; + [super viewDidAppear:animated]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(userDefaultsDidChange) + name:NSUserDefaultsDidChangeNotification + object:[NSUserDefaults standardUserDefaults]]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil]; + [super viewDidDisappear:animated]; +} + + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + self.tableView = nil; +} + + +- (void)dealloc { + [_currentSpecifier release], _currentSpecifier = nil; + [_checkedItem release], _checkedItem = nil; + [_settingsReader release], _settingsReader = nil; + [_settingsStore release], _settingsStore = nil; + [_tableView release], _tableView = nil; + [super dealloc]; +} + + +#pragma mark - +#pragma mark UITableView delegates + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [_currentSpecifier multipleValuesCount]; +} + +- (void)selectCell:(UITableViewCell *)cell { + [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; + [[cell textLabel] setTextColor:kIASKgrayBlueColor]; +} + +- (void)deselectCell:(UITableViewCell *)cell { + [cell setAccessoryType:UITableViewCellAccessoryNone]; + [[cell textLabel] setTextColor:[UIColor darkTextColor]]; +} + +- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { + return [_currentSpecifier footerText]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellValue]; + NSArray *titles = [_currentSpecifier multipleTitles]; + + if (!cell) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellValue] autorelease]; + } + + if ([indexPath isEqual:[self checkedItem]]) { + [self selectCell:cell]; + } else { + [self deselectCell:cell]; + } + + @try { + [[cell textLabel] setText:[self.settingsReader titleForStringId:[titles objectAtIndex:indexPath.row]]]; + } + @catch (NSException * e) {} + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + + if (indexPath == [self checkedItem]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + return; + } + + NSArray *values = [_currentSpecifier multipleValues]; + + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + [self deselectCell:[tableView cellForRowAtIndexPath:[self checkedItem]]]; + [self selectCell:[tableView cellForRowAtIndexPath:indexPath]]; + [self setCheckedItem:indexPath]; + + [self.settingsStore setObject:[values objectAtIndex:indexPath.row] forKey:[_currentSpecifier key]]; + [self.settingsStore synchronize]; + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[_currentSpecifier key] + userInfo:[NSDictionary dictionaryWithObject:[values objectAtIndex:indexPath.row] + forKey:[_currentSpecifier key]]]; +} + +#pragma mark Notifications + +- (void)userDefaultsDidChange { + NSIndexPath *oldCheckedItem = [[self.checkedItem retain] autorelease]; + if(_currentSpecifier) { + [self updateCheckedItem]; + } + + // only reload the table if it had changed; prevents animation cancellation + if (![self.checkedItem isEqual:oldCheckedItem]) { + [_tableView reloadData]; + } +} + +@end diff --git a/InAppSettingsKit/Controllers/IASKViewController.h b/InAppSettingsKit/Controllers/IASKViewController.h new file mode 100644 index 000000000..40e450415 --- /dev/null +++ b/InAppSettingsKit/Controllers/IASKViewController.h @@ -0,0 +1,26 @@ +// +// IASKAppSettingsViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +@class IASKSettingsReader; +@protocol IASKSettingsStore; + +// protocol all IASK view controllers implement +@protocol IASKViewController + +@property (nonatomic, retain) IASKSettingsReader* settingsReader; +@property (nonatomic, retain) id settingsStore; + +@end diff --git a/InAppSettingsKit/Models/IASKSettingsReader.h b/InAppSettingsKit/Models/IASKSettingsReader.h new file mode 100644 index 000000000..bbdd1a5b5 --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsReader.h @@ -0,0 +1,149 @@ +// +// IASKSettingsReader.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +#define kIASKPreferenceSpecifiers @"PreferenceSpecifiers" +#define kIASKType @"Type" +#define kIASKTitle @"Title" +#define kIASKFooterText @"FooterText" +#define kIASKKey @"Key" +#define kIASKFile @"File" +#define kIASKDefaultValue @"DefaultValue" +#define kIASKMinimumValue @"MinimumValue" +#define kIASKMaximumValue @"MaximumValue" +#define kIASKTrueValue @"TrueValue" +#define kIASKFalseValue @"FalseValue" +#define kIASKIsSecure @"IsSecure" +#define KIASKKeyboardType @"KeyboardType" +#define kIASKAutocapitalizationType @"AutocapitalizationType" +#define kIASKAutoCorrectionType @"AutocorrectionType" +#define kIASKValues @"Values" +#define kIASKTitles @"Titles" +#define kIASKViewControllerClass @"IASKViewControllerClass" +#define kIASKViewControllerSelector @"IASKViewControllerSelector" +#define kIASKButtonClass @"IASKButtonClass" +#define kIASKButtonAction @"IASKButtonAction" +#define kIASKMailComposeToRecipents @"IASKMailComposeToRecipents" +#define kIASKMailComposeCcRecipents @"IASKMailComposeCcRecipents" +#define kIASKMailComposeBccRecipents @"IASKMailComposeBccRecipents" +#define kIASKMailComposeSubject @"IASKMailComposeSubject" +#define kIASKMailComposeBody @"IASKMailComposeBody" +#define kIASKMailComposeBodyIsHTML @"IASKMailComposeBodyIsHTML" +#define kIASKKeyboardAlphabet @"Alphabet" +#define kIASKKeyboardNumbersAndPunctuation @"NumbersAndPunctuation" +#define kIASKKeyboardNumberPad @"NumberPad" +#define kIASKKeyboardDecimalPad @"DecimalPad" + +#define KIASKKeyboardURL @"URL" +#define kIASKKeyboardEmailAddress @"EmailAddress" +#define kIASKAutoCapNone @"None" +#define kIASKAutoCapSentences @"Sentences" +#define kIASKAutoCapWords @"Words" +#define kIASKAutoCapAllCharacters @"AllCharacters" +#define kIASKAutoCorrDefault @"Default" +#define kIASKAutoCorrNo @"No" +#define kIASKAutoCorrYes @"Yes" +#define kIASKMinimumValueImage @"MinimumValueImage" +#define kIASKMaximumValueImage @"MaximumValueImage" + +#define kIASKPSGroupSpecifier @"PSGroupSpecifier" +#define kIASKPSToggleSwitchSpecifier @"PSToggleSwitchSpecifier" +#define kIASKPSMultiValueSpecifier @"PSMultiValueSpecifier" +#define kIASKPSSliderSpecifier @"PSSliderSpecifier" +#define kIASKPSTitleValueSpecifier @"PSTitleValueSpecifier" +#define kIASKPSTextFieldSpecifier @"PSTextFieldSpecifier" +#define kIASKPSChildPaneSpecifier @"PSChildPaneSpecifier" +#define kIASKOpenURLSpecifier @"IASKOpenURLSpecifier" +#define kIASKButtonSpecifier @"IASKButtonSpecifier" +#define kIASKMailComposeSpecifier @"IASKMailComposeSpecifier" +#define kIASKCustomViewSpecifier @"IASKCustomViewSpecifier" + +#define kIASKBundleFolder @"Settings.bundle" +#define kIASKBundleFolderAlt @"InAppSettings.bundle" +#define kIASKBundleFilename @"Root.plist" +#define KIASKBundleLocaleFolderExtension @".lproj" + +#define kIASKAppSettingChanged @"kAppSettingChanged" + +#define kIASKSectionHeaderIndex 0 + +#define kIASKSliderNoImagesPadding 11 +#define kIASKSliderImagesPadding 43 + + +#define kIASKTableWidth 320 +#define kIASKSpacing 5 +#define kIASKMinLabelWidth 97 +#define kIASKMinValueWidth 35 +#define kIASKPaddingLeft 9 +#define kIASKPaddingRight 10 +#define kIASKHorizontalPaddingGroupTitles 19 +#define kIASKVerticalPaddingGroupTitles 15 + +#define kIASKLabelFontSize 17 +#define kIASKgrayBlueColor [UIColor colorWithRed:0.318 green:0.4 blue:0.569 alpha:1.0] + +#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_0 +#define kCFCoreFoundationVersionNumber_iPhoneOS_4_0 550.32 +#endif + +#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_1 +#define kCFCoreFoundationVersionNumber_iPhoneOS_4_1 550.38 +#endif + + +#define IASK_IF_IOS4_OR_GREATER(...) \ +if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_0) \ +{ \ +__VA_ARGS__ \ +} + +@class IASKSpecifier; + +@protocol IASKSettingsReaderFilterDelegate +- (NSDictionary*) filterPreferenceSpecifier:(NSDictionary*)specifier; +@end + +@interface IASKSettingsReader : NSObject { + NSString *_path; + NSString *_localizationTable; + NSString *_bundlePath; + NSDictionary *_settingsBundle; + NSArray *_dataSource; + NSBundle *_bundle; + id delegate; +} + +- (id)initWithFile:(NSString*)file; +- (NSInteger)numberOfSections; +- (NSInteger)numberOfRowsForSection:(NSInteger)section; +- (IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath; +- (NSIndexPath*)indexPathForKey:(NSString*)key; +- (IASKSpecifier*)specifierForKey:(NSString*)key; +- (NSString*)titleForSection:(NSInteger)section; +- (NSString*)keyForSection:(NSInteger)section; +- (NSString*)footerTextForSection:(NSInteger)section; +- (NSString*)titleForStringId:(NSString*)stringId; +- (NSString*)pathForImageNamed:(NSString*)image; + +@property (nonatomic, retain) NSString *path; +@property (nonatomic, retain) NSString *localizationTable; +@property (nonatomic, retain) NSString *bundlePath; +@property (nonatomic, retain) NSDictionary *settingsBundle; +@property (nonatomic, retain) NSArray *dataSource; +@property (nonatomic, retain) id delegate; +@end diff --git a/InAppSettingsKit/Models/IASKSettingsReader.m b/InAppSettingsKit/Models/IASKSettingsReader.m new file mode 100644 index 000000000..dd82ce72b --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsReader.m @@ -0,0 +1,278 @@ +// +// IASKSettingsReader.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsReader.h" +#import "IASKSpecifier.h" + +@interface IASKSettingsReader (private) +- (void)_reinterpretBundle:(NSDictionary*)settingsBundle; +- (BOOL)_sectionHasHeading:(NSInteger)section; +- (NSString *)platformSuffix; +- (NSString *)locateSettingsFile:(NSString *)file; + +@end + +@implementation IASKSettingsReader + +@synthesize path=_path, +localizationTable=_localizationTable, +bundlePath=_bundlePath, +settingsBundle=_settingsBundle, +dataSource=_dataSource; +@synthesize delegate; + +- (id)init { + return [self initWithFile:@"Root"]; +} + +- (id)initWithFile:(NSString*)file { + if ((self=[super init])) { + + + self.path = [self locateSettingsFile: file]; + [self setSettingsBundle:[NSDictionary dictionaryWithContentsOfFile:self.path]]; + self.bundlePath = [self.path stringByDeletingLastPathComponent]; + _bundle = [[NSBundle bundleWithPath:[self bundlePath]] retain]; + + // Look for localization file + self.localizationTable = [self.settingsBundle objectForKey:@"StringsTable"]; + if (!self.localizationTable) + { + // Look for localization file using filename + self.localizationTable = [[[[self.path stringByDeletingPathExtension] // removes '.plist' + stringByDeletingPathExtension] // removes potential '.inApp' + lastPathComponent] // strip absolute path + stringByReplacingOccurrencesOfString:[self platformSuffix] withString:@""]; // removes potential '~device' (~ipad, ~iphone) + if([_bundle pathForResource:self.localizationTable ofType:@"strings"] == nil){ + // Could not find the specified localization: use default + self.localizationTable = @"Root"; + } + } + + if (_settingsBundle) { + [self _reinterpretBundle:_settingsBundle]; + } + } + return self; +} + +- (void)dealloc { + [_path release], _path = nil; + [_localizationTable release], _localizationTable = nil; + [_bundlePath release], _bundlePath = nil; + [_settingsBundle release], _settingsBundle = nil; + [_dataSource release], _dataSource = nil; + [_bundle release], _bundle = nil; + + [super dealloc]; +} + +- (void)_reinterpretBundle:(NSDictionary*)settingsBundle { + NSArray *preferenceSpecifiers = [settingsBundle objectForKey:kIASKPreferenceSpecifiers]; + NSInteger sectionCount = -1; + NSMutableArray *dataSource = [[[NSMutableArray alloc] init] autorelease]; + + for (NSDictionary *specifier in preferenceSpecifiers) { + if (delegate != nil) { + specifier = [delegate filterPreferenceSpecifier:specifier]; + if (specifier == nil) { + // skip + continue; + } + } + if ([(NSString*)[specifier objectForKey:kIASKType] isEqualToString:kIASKPSGroupSpecifier]) { + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + + [newArray addObject:specifier]; + [dataSource addObject:newArray]; + [newArray release]; + sectionCount++; + } + else { + if (sectionCount == -1) { + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + [dataSource addObject:newArray]; + [newArray release]; + sectionCount++; + } + + IASKSpecifier *newSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifier]; + [(NSMutableArray*)[dataSource objectAtIndex:sectionCount] addObject:newSpecifier]; + [newSpecifier release]; + } + } + [self setDataSource:dataSource]; +} + +- (BOOL)_sectionHasHeading:(NSInteger)section { + return [[[[self dataSource] objectAtIndex:section] objectAtIndex:0] isKindOfClass:[NSDictionary class]]; +} + +- (NSInteger)numberOfSections { + return [[self dataSource] count]; +} + +- (NSInteger)numberOfRowsForSection:(NSInteger)section { + int headingCorrection = [self _sectionHasHeading:section] ? 1 : 0; + return [(NSArray*)[[self dataSource] objectAtIndex:section] count] - headingCorrection; +} + +- (IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath { + int headingCorrection = [self _sectionHasHeading:indexPath.section] ? 1 : 0; + + IASKSpecifier *specifier = [[[self dataSource] objectAtIndex:indexPath.section] objectAtIndex:(indexPath.row+headingCorrection)]; + specifier.settingsReader = self; + return specifier; +} + +- (NSIndexPath*)indexPathForKey:(NSString *)key { + for (NSUInteger sectionIndex = 0; sectionIndex < self.dataSource.count; sectionIndex++) { + NSArray *section = [self.dataSource objectAtIndex:sectionIndex]; + for (NSUInteger rowIndex = 0; rowIndex < section.count; rowIndex++) { + IASKSpecifier *specifier = (IASKSpecifier*)[section objectAtIndex:rowIndex]; + if ([specifier isKindOfClass:[IASKSpecifier class]] && [specifier.key isEqualToString:key]) { + NSUInteger correctedRowIndex = rowIndex - [self _sectionHasHeading:sectionIndex]; + return [NSIndexPath indexPathForRow:correctedRowIndex inSection:sectionIndex]; + } + } + } + return nil; +} + +- (IASKSpecifier*)specifierForKey:(NSString*)key { + for (NSArray *specifiers in _dataSource) { + for (id sp in specifiers) { + if ([sp isKindOfClass:[IASKSpecifier class]]) { + if ([[sp key] isEqualToString:key]) { + return sp; + } + } + } + } + return nil; +} + +- (NSString*)titleForSection:(NSInteger)section { + if ([self _sectionHasHeading:section]) { + NSDictionary *dict = [[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex]; + return [self titleForStringId:[dict objectForKey:kIASKTitle]]; + } + return nil; +} + +- (NSString*)keyForSection:(NSInteger)section { + if ([self _sectionHasHeading:section]) { + return [[[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex] objectForKey:kIASKKey]; + } + return nil; +} + +- (NSString*)footerTextForSection:(NSInteger)section { + if ([self _sectionHasHeading:section]) { + NSDictionary *dict = [[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex]; + return [self titleForStringId:[dict objectForKey:kIASKFooterText]]; + } + return nil; +} + +- (NSString*)titleForStringId:(NSString*)stringId { + return [_bundle localizedStringForKey:stringId value:stringId table:self.localizationTable]; +} + +- (NSString*)pathForImageNamed:(NSString*)image { + return [[self bundlePath] stringByAppendingPathComponent:image]; +} + +- (NSString *)platformSuffix { + BOOL isPad = NO; +#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) + isPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; +#endif + return isPad ? @"~ipad" : @"~iphone"; +} + +- (NSString *)file:(NSString *)file + withBundle:(NSString *)bundle + suffix:(NSString *)suffix + extension:(NSString *)extension { + + NSString *appBundle = [[NSBundle mainBundle] bundlePath]; + bundle = [appBundle stringByAppendingPathComponent:bundle]; + file = [file stringByAppendingFormat:@"%@%@", suffix, extension]; + return [bundle stringByAppendingPathComponent:file]; + +} + +- (NSString *)locateSettingsFile: (NSString *)file { + + // The file is searched in the following order: + // + // InAppSettings.bundle/FILE~DEVICE.inApp.plist + // InAppSettings.bundle/FILE.inApp.plist + // InAppSettings.bundle/FILE~DEVICE.plist + // InAppSettings.bundle/FILE.plist + // Settings.bundle/FILE~DEVICE.inApp.plist + // Settings.bundle/FILE.inApp.plist + // Settings.bundle/FILE~DEVICE.plist + // Settings.bundle/FILE.plist + // + // where DEVICE is either "iphone" or "ipad" depending on the current + // interface idiom. + // + // Settings.app uses the ~DEVICE suffixes since iOS 4.0. There are some + // differences from this implementation: + // - For an iPhone-only app running on iPad, Settings.app will not use the + // ~iphone suffix. There is no point in using these suffixes outside + // of universal apps anyway. + // - This implementation uses the device suffixes on iOS 3.x as well. + // - also check current locale (short only) + + NSArray *bundles = + [NSArray arrayWithObjects:kIASKBundleFolderAlt, kIASKBundleFolder, nil]; + + NSArray *extensions = + [NSArray arrayWithObjects:@".inApp.plist", @".plist", nil]; + + NSArray *suffixes = + [NSArray arrayWithObjects:[self platformSuffix], @"", nil]; + + NSArray *languages = + [NSArray arrayWithObjects:[[[NSLocale preferredLanguages] objectAtIndex:0] stringByAppendingString:KIASKBundleLocaleFolderExtension], @"", nil]; + + NSString *path = nil; + NSFileManager *fileManager = [NSFileManager defaultManager]; + + for (NSString *bundle in bundles) { + for (NSString *extension in extensions) { + for (NSString *suffix in suffixes) { + for (NSString *language in languages) { + path = [self file:file + withBundle:[bundle stringByAppendingPathComponent:language] + suffix:suffix + extension:extension]; + if ([fileManager fileExistsAtPath:path]) { + goto exitFromNestedLoop; + } + } + } + } + } + +exitFromNestedLoop: + return path; +} + +@end diff --git a/InAppSettingsKit/Models/IASKSettingsStore.h b/InAppSettingsKit/Models/IASKSettingsStore.h new file mode 100644 index 000000000..c1b53ba2b --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsStore.h @@ -0,0 +1,39 @@ +// +// IASKSettingsStore.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@protocol IASKSettingsStore +@required +- (void)setBool:(BOOL)value forKey:(NSString*)key; +- (void)setFloat:(float)value forKey:(NSString*)key; +- (void)setDouble:(double)value forKey:(NSString*)key; +- (void)setInteger:(int)value forKey:(NSString*)key; +- (void)setObject:(id)value forKey:(NSString*)key; +- (BOOL)boolForKey:(NSString*)key; +- (float)floatForKey:(NSString*)key; +- (double)doubleForKey:(NSString*)key; +- (int)integerForKey:(NSString*)key; +- (id)objectForKey:(NSString*)key; +- (BOOL)synchronize; // Write settings to a permanant storage. Returns YES on success, NO otherwise +@end + + +@interface IASKAbstractSettingsStore : NSObject { +} + +@end diff --git a/InAppSettingsKit/Models/IASKSettingsStore.m b/InAppSettingsKit/Models/IASKSettingsStore.m new file mode 100644 index 000000000..8efbe7da2 --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsStore.m @@ -0,0 +1,68 @@ +// +// IASKSettingsStore.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsStore.h" + +@implementation IASKAbstractSettingsStore + +- (void)setObject:(id)value forKey:(NSString*)key { + [NSException raise:@"Unimplemented" + format:@"setObject:forKey: must be implemented in subclasses of IASKAbstractSettingsStore"]; +} + +- (id)objectForKey:(NSString*)key { + [NSException raise:@"Unimplemented" + format:@"objectForKey: must be implemented in subclasses of IASKAbstractSettingsStore"]; + return nil; +} + +- (void)setBool:(BOOL)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithBool:value] forKey:key]; +} + +- (void)setFloat:(float)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithFloat:value] forKey:key]; +} + +- (void)setInteger:(int)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithInt:value] forKey:key]; +} + +- (void)setDouble:(double)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithDouble:value] forKey:key]; +} + +- (BOOL)boolForKey:(NSString*)key { + return [[self objectForKey:key] boolValue]; +} + +- (float)floatForKey:(NSString*)key { + return [[self objectForKey:key] floatValue]; +} +- (int)integerForKey:(NSString*)key { + return [[self objectForKey:key] intValue]; +} + +- (double)doubleForKey:(NSString*)key { + return [[self objectForKey:key] doubleValue]; +} + +- (BOOL)synchronize { + return NO; +} + +@end \ No newline at end of file diff --git a/InAppSettingsKit/Models/IASKSettingsStoreFile.h b/InAppSettingsKit/Models/IASKSettingsStoreFile.h new file mode 100644 index 000000000..6d4fe2993 --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsStoreFile.h @@ -0,0 +1,28 @@ +// +// IASKSettingsStoreFile.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import "IASKSettingsStore.h" + +@interface IASKSettingsStoreFile : IASKAbstractSettingsStore { + NSString * _filePath; + NSMutableDictionary * _dict; +} + +- (id)initWithPath:(NSString*)path; + +@end diff --git a/InAppSettingsKit/Models/IASKSettingsStoreFile.m b/InAppSettingsKit/Models/IASKSettingsStoreFile.m new file mode 100644 index 000000000..104642d7e --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsStoreFile.m @@ -0,0 +1,54 @@ +// +// IASKSettingsStoreFile.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsStoreFile.h" + + +@implementation IASKSettingsStoreFile + +- (id)initWithPath:(NSString*)path { + if((self = [super init])) { + _filePath = [path retain]; + _dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; + if(_dict == nil) { + _dict = [[NSMutableDictionary alloc] init]; + } + } + return self; +} + +- (void)dealloc { + [_dict release], _dict = nil; + [_filePath release], _filePath = nil; + + [super dealloc]; +} + + +- (void)setObject:(id)value forKey:(NSString *)key { + [_dict setObject:value forKey:key]; +} + +- (id)objectForKey:(NSString *)key { + return [_dict objectForKey:key]; +} + +- (BOOL)synchronize { + return [_dict writeToFile:_filePath atomically:YES]; +} + +@end diff --git a/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h b/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h new file mode 100644 index 000000000..3731f5e3b --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h @@ -0,0 +1,25 @@ +// +// IASKSettingsStoreUserDefaults.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import "IASKSettingsStore.h" + +@interface IASKSettingsStoreUserDefaults : IASKAbstractSettingsStore { + +} + +@end diff --git a/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m b/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m new file mode 100644 index 000000000..fd24bf097 --- /dev/null +++ b/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m @@ -0,0 +1,67 @@ +// +// IASKSettingsStoreUserDefaults.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsStoreUserDefaults.h" + + +@implementation IASKSettingsStoreUserDefaults + +- (void)setBool:(BOOL)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setBool:value forKey:key]; +} + +- (void)setFloat:(float)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setFloat:value forKey:key]; +} + +- (void)setDouble:(double)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setDouble:value forKey:key]; +} + +- (void)setInteger:(int)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setInteger:value forKey:key]; +} + +- (void)setObject:(id)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; +} + +- (BOOL)boolForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} + +- (float)floatForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] floatForKey:key]; +} + +- (double)doubleForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] doubleForKey:key]; +} + +- (int)integerForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] integerForKey:key]; +} + +- (id)objectForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] objectForKey:key]; +} + +- (BOOL)synchronize { + return [[NSUserDefaults standardUserDefaults] synchronize]; +} + +@end diff --git a/InAppSettingsKit/Models/IASKSpecifier.h b/InAppSettingsKit/Models/IASKSpecifier.h new file mode 100644 index 000000000..1e47d1ec8 --- /dev/null +++ b/InAppSettingsKit/Models/IASKSpecifier.h @@ -0,0 +1,59 @@ +// +// IASKSpecifier.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import + +@class IASKSettingsReader; + +@interface IASKSpecifier : NSObject { + NSDictionary *_specifierDict; + NSDictionary *_multipleValuesDict; + IASKSettingsReader *_settingsReader; +} +@property (nonatomic, retain) NSDictionary *specifierDict; +@property (nonatomic, assign) IASKSettingsReader *settingsReader; + +- (id)initWithSpecifier:(NSDictionary*)specifier; +- (NSString*)localizedObjectForKey:(NSString*)key; +- (NSString*)title; +- (NSString*)key; +- (NSString*)type; +- (NSString*)titleForCurrentValue:(id)currentValue; +- (NSInteger)multipleValuesCount; +- (NSArray*)multipleValues; +- (NSArray*)multipleTitles; +- (NSString*)file; +- (id)defaultValue; +- (id)defaultStringValue; +- (BOOL)defaultBoolValue; +- (id)trueValue; +- (id)falseValue; +- (float)minimumValue; +- (float)maximumValue; +- (NSString*)minimumValueImage; +- (NSString*)maximumValueImage; +- (BOOL)isSecure; +- (UIKeyboardType)keyboardType; +- (UITextAutocapitalizationType)autocapitalizationType; +- (UITextAutocorrectionType)autoCorrectionType; +- (NSString*)footerText; +- (Class)viewControllerClass; +- (SEL)viewControllerSelector; +-(Class)buttonClass; +-(SEL)buttonAction; + +@end diff --git a/InAppSettingsKit/Models/IASKSpecifier.m b/InAppSettingsKit/Models/IASKSpecifier.m new file mode 100644 index 000000000..ebb38ac01 --- /dev/null +++ b/InAppSettingsKit/Models/IASKSpecifier.m @@ -0,0 +1,240 @@ +// +// IASKSpecifier.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSpecifier.h" +#import "IASKSettingsReader.h" + +@interface IASKSpecifier () +@property (nonatomic, retain) NSDictionary *multipleValuesDict; +- (void)_reinterpretValues:(NSDictionary*)specifierDict; +@end + +@implementation IASKSpecifier + +@synthesize specifierDict=_specifierDict; +@synthesize multipleValuesDict=_multipleValuesDict; +@synthesize settingsReader = _settingsReader; + +- (id)initWithSpecifier:(NSDictionary*)specifier { + if ((self = [super init])) { + [self setSpecifierDict:specifier]; + + if ([[self type] isEqualToString:kIASKPSMultiValueSpecifier] || + [[self type] isEqualToString:kIASKPSTitleValueSpecifier]) { + [self _reinterpretValues:[self specifierDict]]; + } + } + return self; +} + +- (void)dealloc { + [_specifierDict release], _specifierDict = nil; + [_multipleValuesDict release], _multipleValuesDict = nil; + + _settingsReader = nil; + + [super dealloc]; +} + +- (void)_reinterpretValues:(NSDictionary*)specifierDict { + NSArray *values = [_specifierDict objectForKey:kIASKValues]; + NSArray *titles = [_specifierDict objectForKey:kIASKTitles]; + + NSMutableDictionary *multipleValuesDict = [[[NSMutableDictionary alloc] init] autorelease]; + + if (values) { + [multipleValuesDict setObject:values forKey:kIASKValues]; + } + + if (titles) { + [multipleValuesDict setObject:titles forKey:kIASKTitles]; + } + + [self setMultipleValuesDict:multipleValuesDict]; +} +- (NSString*)localizedObjectForKey:(NSString*)key { + return [self.settingsReader titleForStringId:[_specifierDict objectForKey:key]]; +} + +- (NSString*)title { + return [self localizedObjectForKey:kIASKTitle]; +} + +- (NSString*)footerText { + return [self localizedObjectForKey:kIASKFooterText]; +} + +-(Class) viewControllerClass { + return NSClassFromString([_specifierDict objectForKey:kIASKViewControllerClass]); +} + +-(SEL) viewControllerSelector { + return NSSelectorFromString([_specifierDict objectForKey:kIASKViewControllerSelector]); +} + +-(Class)buttonClass { + return NSClassFromString([_specifierDict objectForKey:kIASKButtonClass]); +} + +-(SEL)buttonAction { + return NSSelectorFromString([_specifierDict objectForKey:kIASKButtonAction]); +} + +- (NSString*)key { + return [_specifierDict objectForKey:kIASKKey]; +} + +- (NSString*)type { + return [_specifierDict objectForKey:kIASKType]; +} + +- (NSString*)titleForCurrentValue:(id)currentValue { + NSArray *values = [self multipleValues]; + NSArray *titles = [self multipleTitles]; + if (values.count != titles.count) { + return nil; + } + NSInteger keyIndex = [values indexOfObject:currentValue]; + if (keyIndex == NSNotFound) { + return nil; + } + @try { + return [self.settingsReader titleForStringId:[titles objectAtIndex:keyIndex]]; + } + @catch (NSException * e) {} + return nil; +} + +- (NSInteger)multipleValuesCount { + return [[_multipleValuesDict objectForKey:kIASKValues] count]; +} + +- (NSArray*)multipleValues { + return [_multipleValuesDict objectForKey:kIASKValues]; +} + +- (NSArray*)multipleTitles { + return [_multipleValuesDict objectForKey:kIASKTitles]; +} + +- (NSString*)file { + return [_specifierDict objectForKey:kIASKFile]; +} + +- (id)defaultValue { + return [_specifierDict objectForKey:kIASKDefaultValue]; +} + +- (id)defaultStringValue { + return [[_specifierDict objectForKey:kIASKDefaultValue] description]; +} + +- (BOOL)defaultBoolValue { + id defaultValue = [self defaultValue]; + if ([defaultValue isEqual:[self trueValue]]) { + return YES; + } + if ([defaultValue isEqual:[self falseValue]]) { + return NO; + } + return [defaultValue boolValue]; +} + +- (id)trueValue { + return [_specifierDict objectForKey:kIASKTrueValue]; +} + +- (id)falseValue { + return [_specifierDict objectForKey:kIASKFalseValue]; +} + +- (float)minimumValue { + return [[_specifierDict objectForKey:kIASKMinimumValue] floatValue]; +} + +- (float)maximumValue { + return [[_specifierDict objectForKey:kIASKMaximumValue] floatValue]; +} + +- (NSString*)minimumValueImage { + return [_specifierDict objectForKey:kIASKMinimumValueImage]; +} + +- (NSString*)maximumValueImage { + return [_specifierDict objectForKey:kIASKMaximumValueImage]; +} + +- (BOOL)isSecure { + return [[_specifierDict objectForKey:kIASKIsSecure] boolValue]; +} + +- (UIKeyboardType)keyboardType { + if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardAlphabet]) { + return UIKeyboardTypeDefault; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumbersAndPunctuation]) { + return UIKeyboardTypeNumbersAndPunctuation; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumberPad]) { + return UIKeyboardTypeNumberPad; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardDecimalPad]) { + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_1) { + return UIKeyboardTypeDecimalPad; + } + else { + return UIKeyboardTypeNumbersAndPunctuation; + } + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:KIASKKeyboardURL]) { + return UIKeyboardTypeURL; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardEmailAddress]) { + return UIKeyboardTypeEmailAddress; + } + return UIKeyboardTypeDefault; +} + +- (UITextAutocapitalizationType)autocapitalizationType { + if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapNone]) { + return UITextAutocapitalizationTypeNone; + } + else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapSentences]) { + return UITextAutocapitalizationTypeSentences; + } + else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapWords]) { + return UITextAutocapitalizationTypeWords; + } + else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapAllCharacters]) { + return UITextAutocapitalizationTypeAllCharacters; + } + return UITextAutocapitalizationTypeNone; +} + +- (UITextAutocorrectionType)autoCorrectionType { + if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrDefault]) { + return UITextAutocorrectionTypeDefault; + } + else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrNo]) { + return UITextAutocorrectionTypeNo; + } + else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrYes]) { + return UITextAutocorrectionTypeYes; + } + return UITextAutocorrectionTypeDefault; +} + +@end diff --git a/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h b/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h new file mode 100644 index 000000000..7cc943b0a --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h @@ -0,0 +1,31 @@ +// +// IASKPSSliderSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@class IASKSlider; + +@interface IASKPSSliderSpecifierViewCell : UITableViewCell { + IASKSlider *_slider; + UIImageView *_minImage; + UIImageView *_maxImage; +} + +@property (nonatomic, assign) IBOutlet IASKSlider *slider; +@property (nonatomic, assign) IBOutlet UIImageView *minImage; +@property (nonatomic, assign) IBOutlet UIImageView *maxImage; + +@end diff --git a/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m b/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m new file mode 100644 index 000000000..cbdca0279 --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m @@ -0,0 +1,72 @@ +// +// IASKPSSliderSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009-2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSSliderSpecifierViewCell.h" +#import "IASKSlider.h" +#import "IASKSettingsReader.h" + +@implementation IASKPSSliderSpecifierViewCell + +@synthesize slider=_slider, + minImage=_minImage, + maxImage=_maxImage; + +- (void)layoutSubviews { + [super layoutSubviews]; + CGRect sliderBounds = _slider.bounds; + CGPoint sliderCenter = _slider.center; + const double superViewWidth = _slider.superview.frame.size.width; + + sliderCenter.x = superViewWidth / 2; + sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding * 2; + _minImage.hidden = YES; + _maxImage.hidden = YES; + + // Check if there are min and max images. If so, change the layout accordingly. + if (_minImage.image && _maxImage.image) { + // Both images + _minImage.hidden = NO; + _maxImage.hidden = NO; + sliderBounds.size.width = superViewWidth - kIASKSliderImagesPadding * 2; + } + else if (_minImage.image) { + // Min image + _minImage.hidden = NO; + sliderCenter.x += (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding) / 2; + sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding - kIASKSliderImagesPadding; + } + else if (_maxImage.image) { + // Max image + _maxImage.hidden = NO; + sliderCenter.x -= (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding) / 2; + sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding - kIASKSliderImagesPadding; + } + + _slider.bounds = sliderBounds; + _slider.center = sliderCenter; +} + +- (void)dealloc { + _minImage.image = nil; + _maxImage.image = nil; + [super dealloc]; +} + +- (void)prepareForReuse { + _minImage.image = nil; + _maxImage.image = nil; +} +@end diff --git a/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h b/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h new file mode 100644 index 000000000..b4d70c8ad --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h @@ -0,0 +1,29 @@ +// +// IASKPSTextFieldSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@class IASKTextField; + +@interface IASKPSTextFieldSpecifierViewCell : UITableViewCell { + UILabel *_label; + IASKTextField *_textField; +} + +@property (nonatomic, assign) IBOutlet UILabel *label; +@property (nonatomic, assign) IBOutlet IASKTextField *textField; + +@end diff --git a/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m b/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m new file mode 100644 index 000000000..cf7486eea --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m @@ -0,0 +1,52 @@ +// +// IASKPSTextFieldSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009-2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSTextFieldSpecifierViewCell.h" +#import "IASKTextField.h" +#import "IASKSettingsReader.h" + +@implementation IASKPSTextFieldSpecifierViewCell + +@synthesize label=_label, + textField=_textField; + +- (void)layoutSubviews { + [super layoutSubviews]; + CGSize labelSize = [_label sizeThatFits:CGSizeZero]; + labelSize.width = MIN(labelSize.width, _label.bounds.size.width); + + CGRect textFieldFrame = _textField.frame; + textFieldFrame.origin.x = _label.frame.origin.x + MAX(kIASKMinLabelWidth, labelSize.width) + kIASKSpacing; + if (!_label.text.length) + textFieldFrame.origin.x = _label.frame.origin.x; + textFieldFrame.size.width = _textField.superview.frame.size.width - textFieldFrame.origin.x - _label.frame.origin.x; + _textField.frame = textFieldFrame; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h b/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h new file mode 100644 index 000000000..b3185b410 --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h @@ -0,0 +1,22 @@ +// +// IASKPSTitleValueSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKPSTitleValueSpecifierViewCell : UITableViewCell + +@end diff --git a/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m b/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m new file mode 100644 index 000000000..c1d5aaa55 --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m @@ -0,0 +1,57 @@ +// +// IASKPSTitleValueSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSTitleValueSpecifierViewCell.h" +#import "IASKSettingsReader.h" + + +@implementation IASKPSTitleValueSpecifierViewCell + +- (void)layoutSubviews { + // left align the value if the title is empty + if (!self.textLabel.text.length) { + self.textLabel.text = self.detailTextLabel.text; + self.detailTextLabel.text = nil; + if ([self.reuseIdentifier isEqualToString:kIASKPSMultiValueSpecifier]) { + self.textLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]]; + self.textLabel.textColor = self.detailTextLabel.textColor; + } + } + [super layoutSubviews]; + + CGSize viewSize = [self.textLabel superview].frame.size; + + //if there's an image, make room for it + CGFloat imageOffset = self.imageView.image ? self.imageView.bounds.size.width + self.imageView.frame.origin.x : 0; + + // set the left title label frame + CGFloat labelWidth = [self.textLabel sizeThatFits:CGSizeZero].width; + CGFloat minValueWidth = (self.detailTextLabel.text.length) ? kIASKMinValueWidth + kIASKSpacing : 0; + labelWidth = MIN(labelWidth, viewSize.width - minValueWidth - kIASKPaddingLeft -kIASKPaddingRight - imageOffset); + CGRect labelFrame = CGRectMake(kIASKPaddingLeft + imageOffset, 0, labelWidth, viewSize.height -2); + self.textLabel.frame = labelFrame; + + // set the right value label frame + if (self.detailTextLabel.text.length) { + CGRect valueFrame = CGRectMake(kIASKPaddingLeft + labelWidth + kIASKSpacing + imageOffset, + 0, + viewSize.width - (kIASKPaddingLeft + labelWidth + kIASKSpacing + imageOffset) - kIASKPaddingRight, + viewSize.height -2); + self.detailTextLabel.frame = valueFrame; + } +} + +@end diff --git a/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h b/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h new file mode 100644 index 000000000..a6d2864bc --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h @@ -0,0 +1,29 @@ +// +// IASKPSToggleSwitchSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@class IASKSwitch; + +@interface IASKPSToggleSwitchSpecifierViewCell : UITableViewCell { + UILabel *_label; + IASKSwitch *_toggle; +} + +@property (nonatomic, assign) IBOutlet UILabel *label; +@property (nonatomic, assign) IBOutlet IASKSwitch *toggle; + +@end diff --git a/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m b/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m new file mode 100644 index 000000000..13c66e285 --- /dev/null +++ b/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m @@ -0,0 +1,62 @@ +// +// IASKPSToggleSwitchSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSToggleSwitchSpecifierViewCell.h" +#import "IASKSwitch.h" +#import "IASKSettingsReader.h" + +@implementation IASKPSToggleSwitchSpecifierViewCell + +@synthesize label=_label, + toggle=_toggle; + +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { + // Initialization code + } + return self; +} + + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + + +- (void)dealloc { + [super dealloc]; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + if(self.imageView.image) { + //resize the label to make room for the image + self.label.frame = CGRectMake(CGRectGetWidth(self.imageView.bounds) + self.imageView.frame.origin.x + kIASKSpacing, + self.label.frame.origin.y, + self.toggle.frame.origin.x - CGRectGetWidth(self.imageView.bounds) - 2.f * kIASKSpacing, + self.label.frame.size.height); + } else { + self.label.frame = CGRectMake(kIASKPaddingLeft, + self.label.frame.origin.y, + self.toggle.frame.origin.x - kIASKSpacing - kIASKPaddingLeft, + self.label.frame.size.height); + } +} + +@end diff --git a/InAppSettingsKit/Views/IASKSlider.h b/InAppSettingsKit/Views/IASKSlider.h new file mode 100644 index 000000000..34c5ecbbe --- /dev/null +++ b/InAppSettingsKit/Views/IASKSlider.h @@ -0,0 +1,26 @@ +// +// IASKSlider.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKSlider : UISlider { + NSString *_key; +} + +@property (nonatomic, retain) NSString *key; + +@end diff --git a/InAppSettingsKit/Views/IASKSlider.m b/InAppSettingsKit/Views/IASKSlider.m new file mode 100644 index 000000000..d591ff298 --- /dev/null +++ b/InAppSettingsKit/Views/IASKSlider.m @@ -0,0 +1,30 @@ +// +// IASKSlider.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSlider.h" + + +@implementation IASKSlider + +@synthesize key=_key; + +- (void)dealloc { + [_key release], _key = nil; + + [super dealloc]; +} + +@end diff --git a/InAppSettingsKit/Views/IASKSwitch.h b/InAppSettingsKit/Views/IASKSwitch.h new file mode 100644 index 000000000..b1439bd1c --- /dev/null +++ b/InAppSettingsKit/Views/IASKSwitch.h @@ -0,0 +1,26 @@ +// +// IASKSwitch.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKSwitch : UISwitch { + NSString *_key; +} + +@property (nonatomic, retain) NSString *key; + +@end diff --git a/InAppSettingsKit/Views/IASKSwitch.m b/InAppSettingsKit/Views/IASKSwitch.m new file mode 100644 index 000000000..f32aba4d3 --- /dev/null +++ b/InAppSettingsKit/Views/IASKSwitch.m @@ -0,0 +1,31 @@ +// +// IASKSwitch.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSwitch.h" + + +@implementation IASKSwitch + +@synthesize key=_key; + +- (void)dealloc { + [_key release], _key = nil; + + [super dealloc]; +} + + +@end diff --git a/InAppSettingsKit/Views/IASKTextField.h b/InAppSettingsKit/Views/IASKTextField.h new file mode 100644 index 000000000..47c9be375 --- /dev/null +++ b/InAppSettingsKit/Views/IASKTextField.h @@ -0,0 +1,26 @@ +// +// IASKTextField.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKTextField : UITextField { + NSString *_key; +} + +@property (nonatomic, retain) NSString *key; + +@end diff --git a/InAppSettingsKit/Views/IASKTextField.m b/InAppSettingsKit/Views/IASKTextField.m new file mode 100644 index 000000000..9056896f4 --- /dev/null +++ b/InAppSettingsKit/Views/IASKTextField.m @@ -0,0 +1,30 @@ +// +// IASKTextField.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKTextField.h" + + +@implementation IASKTextField + +@synthesize key=_key; + +- (void)dealloc { + [_key release], _key = nil; + + [super dealloc]; +} + +@end diff --git a/InAppSettingsKit/Xibs/IASKAppSettingsView.xib b/InAppSettingsKit/Xibs/IASKAppSettingsView.xib new file mode 100644 index 000000000..74720fae3 --- /dev/null +++ b/InAppSettingsKit/Xibs/IASKAppSettingsView.xib @@ -0,0 +1,222 @@ + + + + 1280 + 11B26 + 1934 + 1138 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 931 + + + YES + IBProxyObject + IBUITableView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {320, 460} + + + + 10 + + 549453824 + {512, 1} + + YES + + YES + + + + TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA +AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA +AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI +AAgACAAIAAEAAQABAAE + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + NO + YES + NO + IBCocoaTouchFramework + NO + 1 + 1 + 0 + YES + 44 + 10 + 10 + + + + + YES + + + view + + + + 10 + + + + dataSource + + + + 6 + + + + delegate + + + + 7 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 4.IBPluginDependency + + + YES + IASKAppSettingsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 10 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 931 + + diff --git a/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib b/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib new file mode 100644 index 000000000..b814f05fc --- /dev/null +++ b/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib @@ -0,0 +1,378 @@ + + + + 1024 + 10F569 + 804 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 123 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 274 + {320, 460} + + + 3 + MQA + + IBCocoaTouchFramework + + + {320, 460} + + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + webView + + + + 5 + + + + delegate + + + + 6 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 4.IBPluginDependency + + + YES + IASKAppSettingsWebViewController + UIResponder + {{354, 412}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 6 + + + + YES + + IASKAppSettingsWebViewController + UIViewController + + webView + UIWebView + + + webView + + webView + UIWebView + + + + IBProjectSource + ../InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWebView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWebView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../InAppSettingsKitSampleApp.xcodeproj + 3 + 123 + + diff --git a/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib b/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib new file mode 100644 index 000000000..67750384e --- /dev/null +++ b/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib @@ -0,0 +1,251 @@ + + + + 1296 + 11D50 + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + YES + IBUISlider + IBUITableViewCell + IBUIImageView + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 290 + + YES + + + 256 + + YES + + + 290 + {{52, 12}, {216, 23}} + + + NO + YES + YES + IBCocoaTouchFramework + 0 + 0 + 0.5 + NO + + + + 289 + {{289, 13}, {21, 21}} + + + NO + NO + 8 + NO + IBCocoaTouchFramework + + + + 292 + {{10, 13}, {21, 21}} + + + NO + NO + 7 + NO + IBCocoaTouchFramework + + + {320, 43} + + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + 1 + MC45Njg2Mjc0NTEgMC45Njg2Mjc0NTEgMC45Njg2Mjc0NTEAA + + YES + NO + IBCocoaTouchFramework + 0 + + PSSliderSpecifier + + + + + YES + + + slider + + + + 12 + + + + maxImage + + + + 13 + + + + minImage + + + + 14 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + 3 + + + + + 6 + + + + + 9 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 2.CustomClassName + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + 6.IBPluginDependency + 9.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKPSSliderSpecifierViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKSlider + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 14 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 1179 + + diff --git a/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib b/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib new file mode 100644 index 000000000..43a553b9c --- /dev/null +++ b/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib @@ -0,0 +1,254 @@ + + + + 1296 + 11D50 + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + YES + IBUITableViewCell + IBUILabel + IBUITextField + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 290 + + YES + + + 256 + + YES + + + 294 + {{9, 11}, {240, 21}} + + NO + YES + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 1 + 10 + + Helvetica-Bold + Helvetica + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + + 291 + {{100, 11}, {201, 21}} + + NO + NO + IBCocoaTouchFramework + hello + + 1 + MC4yNzQ1MDk4MiAwLjM3NjQ3MDYgMC41MjE1Njg2NgA + + YES + 10 + + 9 + IBCocoaTouchFramework + + + Helvetica + Helvetica + 0 + 17 + + + Helvetica + 17 + 16 + + + + {320, 43} + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + 1 + MC45Njg2Mjc0NTEgMC45Njg2Mjc0NTEgMC45Njg2Mjc0NTEAA + + YES + NO + IBCocoaTouchFramework + 0 + + PSTextFieldSpecifier + + + + + YES + + + label + + + + 8 + + + + textField + + + + 9 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + 3 + + + + + 4 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 2.CustomClassName + 2.IBPluginDependency + 3.IBPluginDependency + 4.CustomClassName + 4.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKPSTextFieldSpecifierViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKTextField + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 9 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 1179 + + diff --git a/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib b/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib new file mode 100644 index 000000000..2e5803f2e --- /dev/null +++ b/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib @@ -0,0 +1,237 @@ + + + + 1296 + 11D50 + 2182 + 1138.32 + 568.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1179 + + + YES + IBUITableViewCell + IBUISwitch + IBUILabel + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 290 + + YES + + + 256 + + YES + + + 294 + {{9, 10}, {200, 21}} + + NO + YES + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 1 + 10 + + Helvetica-Bold + Helvetica + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + + 289 + {{218, 8}, {94, 27}} + + NO + YES + YES + IBCocoaTouchFramework + 0 + 0 + YES + + + {320, 43} + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + 1 + MC45Njg2Mjc0NTEgMC45Njg2Mjc0NTEgMC45Njg2Mjc0NTEAA + + YES + NO + IBCocoaTouchFramework + 0 + + PSToggleSwitchSpecifier + + + + + YES + + + toggle + + + + 8 + + + + label + + + + 9 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + Toggle Switch Specifier View Cell - PSToggleSwitchSpecifier + + + 3 + + + + + 4 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 2.CustomClassName + 2.IBPluginDependency + 3.IBPluginDependency + 4.CustomClassName + 4.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKPSToggleSwitchSpecifierViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKSwitch + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 9 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 1179 + + diff --git a/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib b/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib new file mode 100644 index 000000000..9c7ff86e6 --- /dev/null +++ b/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib @@ -0,0 +1,255 @@ + + + + 768 + 10J567 + 1294 + 1038.35 + 462.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 294 + + + YES + IBProxyObject + IBUIView + IBUITableView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + 274 + {320, 460} + + + + + 10 + + 549453824 + {84, 1} + + YES + + YES + + + + TU0AKgAAAVjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P8ADQEAAAMAAAABAFQAAAEB +AAMAAAABAAEAAAECAAMAAAAEAAAB+gEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAAEAAAEXAAQAAAABAAABUAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + NO + YES + NO + IBCocoaTouchFramework + NO + 1 + 1 + 0 + YES + 44 + 10 + 10 + + + {320, 460} + + + + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + dataSource + + + + 5 + + + + delegate + + + + 6 + + + + _tableView + + + + 7 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 4.IBPluginDependency + + + YES + IASKSpecifierValuesViewController + UIResponder + {{556, 432}, {320, 460}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 7 + + + + YES + + IASKSpecifierValuesViewController + UIViewController + + _tableView + UITableView + + + _tableView + + _tableView + UITableView + + + + IBProjectSource + ./Classes/IASKSpecifierValuesViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 294 + + diff --git a/PhoneMainView.xib b/PhoneMainView.xib index 8cc1896dd..0052d5e1c 100644 --- a/PhoneMainView.xib +++ b/PhoneMainView.xib @@ -2,13 +2,13 @@ 784 - 11D50b - 2182 - 1138.32 - 568.00 + 11C74 + 1938 + 1138.23 + 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1181 + 933 YES @@ -19,6 +19,9 @@ IBUITabBarController IBUIWindow IBUITabBar + IBUINavigationController + IBUINavigationBar + IBUINavigationItem YES @@ -42,11 +45,10 @@ IBCocoaTouchFramework - + 1316 {320, 480} - 1 MSAxIDEAA @@ -65,15 +67,10 @@ IBCocoaTouchFramework NO - - History - - History - - NSImage - history-orange.png - + + IBCocoaTouchFramework + 0 @@ -81,12 +78,87 @@ 1 1 + YES IBCocoaTouchFramework NO + + + 256 + {0, 0} + _NS:451 + NO + YES + YES + IBCocoaTouchFramework + + + YES + + Informations + + Information + IBCocoaTouchFramework + + + MoreViewController + + 1 + 1 + + IBCocoaTouchFramework + NO + + YES - + + Call logs + + History + + NSImage + history-orange.png + + IBCocoaTouchFramework + + + + + 1 + 1 + + YES + IBCocoaTouchFramework + NO + + + 256 + {0, 0} + _NS:451 + NO + YES + YES + IBCocoaTouchFramework + + + YES + + Call logs + + Call logs + IBCocoaTouchFramework + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + Dialer @@ -106,26 +178,12 @@ IBCocoaTouchFramework NO - - + + IBCocoaTouchFramework 5 - - 1 - 1 - - IBCocoaTouchFramework - NO - - - - - IBCocoaTouchFramework - 0 - - 1 @@ -134,12 +192,59 @@ IBCocoaTouchFramework NO + + + Settings + + NSImage + 20-gear2.png + + IBCocoaTouchFramework + + + + + 1 + 1 + + YES + IBCocoaTouchFramework + NO + + + 256 + {0, 0} + _NS:451 + NO + YES + YES + IBCocoaTouchFramework + + + YES + + + Root View Controller + IBCocoaTouchFramework + + + + 1 + 1 + + IBCocoaTouchFramework + NO + + + + 266 {{0, 431}, {320, 49}} + 3 MCAwAA @@ -176,6 +281,38 @@ 14 + + + myPhoneViewController + + + + 51 + + + + moreNavigationController + + + + 58 + + + + settingsController + + + + 74 + + + + myTabBarController + + + + 59 + @@ -216,10 +353,11 @@ YES - - - + + + + @@ -228,21 +366,6 @@ - - 11 - - - YES - - - - Contacts - - - 12 - - - 38 @@ -259,34 +382,124 @@ - 41 - + 53 + YES - + + + - history - 42 - - + 54 + + - 43 - + 55 + YES - + - - more + - 44 - - + 56 + + + + + 57 + + + + + 66 + + + YES + + + + dummy-contact-replaced-in-code + + + 67 + + + + + 69 + + + YES + + + + + + + + 70 + + + + + 71 + + + YES + + + + + + 72 + + + + + 73 + + + + + 75 + + + YES + + + + + + + + 76 + + + + + 77 + + + YES + + + + + + 78 + + + + + 79 + + @@ -298,8 +511,6 @@ -1.IBPluginDependency -2.CustomClassName -2.IBPluginDependency - 11.IBPluginDependency - 12.IBPluginDependency 2.IBAttributePlaceholdersKey 2.IBPluginDependency 38.CustomClassName @@ -307,23 +518,35 @@ 39.IBPluginDependency 4.CustomClassName 4.IBPluginDependency - 41.CustomClassName - 41.IBPluginDependency - 42.IBPluginDependency - 43.CustomClassName - 43.IBPluginDependency - 44.IBPluginDependency + 53.IBPluginDependency + 54.IBPluginDependency + 55.CustomClassName + 55.IBPluginDependency + 56.IBPluginDependency + 57.IBPluginDependency + 66.IBPluginDependency + 67.IBPluginDependency + 69.IBPluginDependency + 70.IBPluginDependency + 71.CustomClassName + 71.IBPluginDependency + 72.IBPluginDependency + 73.IBPluginDependency + 75.IBPluginDependency + 76.IBPluginDependency + 77.CustomClassName + 77.IBPluginDependency + 78.IBPluginDependency + 79.IBPluginDependency 8.IBPluginDependency 9.IBPluginDependency - + YES UIApplication com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin YES @@ -335,7 +558,6 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin linphoneAppDelegate com.apple.InterfaceBuilder.IBCocoaTouchPlugin - CallHistoryTableViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin MoreViewController @@ -343,6 +565,21 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKAppSettingsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + CallHistoryTableViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -357,7 +594,7 @@ - 48 + 79 0 @@ -366,10 +603,6 @@ com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 @@ -380,15 +613,17 @@ YES YES + 20-gear2.png dialer-orange.png history-orange.png - + YES + {26, 28} {25, 24} {25, 23} - 1181 + 933 diff --git a/Settings.bundle/Root.plist b/Settings.bundle/Root.plist index 4b6332f8e..bd5c9216c 100644 --- a/Settings.bundle/Root.plist +++ b/Settings.bundle/Root.plist @@ -94,6 +94,16 @@ Type PSToggleSwitchSpecifier + + Type + PSToggleSwitchSpecifier + Title + Enable video + Key + enable_video_preference + DefaultValue + + Title diff --git a/Settings.bundle/video.plist b/Settings.bundle/video.plist index 440f5ad90..56af43866 100644 --- a/Settings.bundle/video.plist +++ b/Settings.bundle/video.plist @@ -4,16 +4,6 @@ PreferenceSpecifiers - - Type - PSToggleSwitchSpecifier - Title - Enable video - Key - enable_video_preference - DefaultValue - - Type PSToggleSwitchSpecifier diff --git a/linphone.xcodeproj/project.pbxproj b/linphone.xcodeproj/project.pbxproj index b59ceb3c1..806364d34 100755 --- a/linphone.xcodeproj/project.pbxproj +++ b/linphone.xcodeproj/project.pbxproj @@ -220,6 +220,52 @@ 340751E8150F38FD00B89C47 /* UIToggleVideoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 340751E6150F38FD00B89C47 /* UIToggleVideoButton.m */; }; 340A75B014C0670B006AA708 /* ConferenceCallDetailView-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */; }; 340A75B114C0670B006AA708 /* ConferenceCallDetailView-ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */; }; + 34151FE01563A8D800205A0E /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FB91563A8D800205A0E /* IASKAppSettingsViewController.m */; }; + 34151FE11563A8D800205A0E /* IASKAppSettingsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FBB1563A8D800205A0E /* IASKAppSettingsWebViewController.m */; }; + 34151FE21563A8D800205A0E /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FBD1563A8D800205A0E /* IASKSpecifierValuesViewController.m */; }; + 34151FE31563A8D800205A0E /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC11563A8D800205A0E /* IASKSettingsReader.m */; }; + 34151FE41563A8D800205A0E /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC31563A8D800205A0E /* IASKSettingsStore.m */; }; + 34151FE51563A8D800205A0E /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC51563A8D800205A0E /* IASKSettingsStoreFile.m */; }; + 34151FE61563A8D800205A0E /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC71563A8D800205A0E /* IASKSettingsStoreUserDefaults.m */; }; + 34151FE71563A8D800205A0E /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC91563A8D800205A0E /* IASKSpecifier.m */; }; + 34151FE81563A8D800205A0E /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FCC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.m */; }; + 34151FE91563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FCE1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.m */; }; + 34151FEA1563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD01563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.m */; }; + 34151FEB1563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD21563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.m */; }; + 34151FEC1563A8D800205A0E /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD41563A8D800205A0E /* IASKSlider.m */; }; + 34151FED1563A8D800205A0E /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD61563A8D800205A0E /* IASKSwitch.m */; }; + 34151FEE1563A8D800205A0E /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD81563A8D800205A0E /* IASKTextField.m */; }; + 34151FEF1563A8D800205A0E /* IASKAppSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDA1563A8D800205A0E /* IASKAppSettingsView.xib */; }; + 34151FF01563A8D800205A0E /* IASKAppSettingsWebView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDB1563A8D800205A0E /* IASKAppSettingsWebView.xib */; }; + 34151FF11563A8D800205A0E /* IASKPSSliderSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.xib */; }; + 34151FF21563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDD1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.xib */; }; + 34151FF31563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDE1563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib */; }; + 34151FF41563A8D800205A0E /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDF1563A8D800205A0E /* IASKSpecifierValuesView.xib */; }; + 34151FF61563A92100205A0E /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FB91563A8D800205A0E /* IASKAppSettingsViewController.m */; }; + 34151FF71563A92100205A0E /* IASKAppSettingsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FBB1563A8D800205A0E /* IASKAppSettingsWebViewController.m */; }; + 34151FF81563A92100205A0E /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FBD1563A8D800205A0E /* IASKSpecifierValuesViewController.m */; }; + 34151FF91563A92900205A0E /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC11563A8D800205A0E /* IASKSettingsReader.m */; }; + 34151FFA1563A92900205A0E /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC31563A8D800205A0E /* IASKSettingsStore.m */; }; + 34151FFB1563A92900205A0E /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC51563A8D800205A0E /* IASKSettingsStoreFile.m */; }; + 34151FFC1563A92900205A0E /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC71563A8D800205A0E /* IASKSettingsStoreUserDefaults.m */; }; + 34151FFD1563A92900205A0E /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FC91563A8D800205A0E /* IASKSpecifier.m */; }; + 34151FFE1563A93400205A0E /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FCC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.m */; }; + 34151FFF1563A93400205A0E /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FCE1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.m */; }; + 341520001563A93400205A0E /* IASKPSTitleValueSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD01563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.m */; }; + 341520011563A93400205A0E /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD21563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.m */; }; + 341520021563A93400205A0E /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD41563A8D800205A0E /* IASKSlider.m */; }; + 341520031563A93400205A0E /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD61563A8D800205A0E /* IASKSwitch.m */; }; + 341520041563A93400205A0E /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 34151FD81563A8D800205A0E /* IASKTextField.m */; }; + 341520051563A93B00205A0E /* IASKAppSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDA1563A8D800205A0E /* IASKAppSettingsView.xib */; }; + 341520061563A93B00205A0E /* IASKAppSettingsWebView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDB1563A8D800205A0E /* IASKAppSettingsWebView.xib */; }; + 341520071563A93B00205A0E /* IASKPSSliderSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.xib */; }; + 341520081563A93B00205A0E /* IASKPSTextFieldSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDD1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.xib */; }; + 341520091563A93B00205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDE1563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib */; }; + 3415200A1563A93B00205A0E /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34151FDF1563A8D800205A0E /* IASKSpecifierValuesView.xib */; }; + 3415205A1563AA8F00205A0E /* 20-gear2.png in Resources */ = {isa = PBXBuildFile; fileRef = 341520591563AA8F00205A0E /* 20-gear2.png */; }; + 3415205C1563ABEB00205A0E /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3415205B1563ABEB00205A0E /* MessageUI.framework */; }; + 3415207B156BBEC000205A0E /* LinphoneCoreSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3415207A156BBEC000205A0E /* LinphoneCoreSettingsStore.m */; }; + 3415207C156BBEC000205A0E /* LinphoneCoreSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 3415207A156BBEC000205A0E /* LinphoneCoreSettingsStore.m */; }; 3418843714C58BB100EA48C7 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 3418843614C58BB100EA48C7 /* nowebcamCIF.jpg */; }; 3418843814C58BB100EA48C7 /* nowebcamCIF.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 3418843614C58BB100EA48C7 /* nowebcamCIF.jpg */; }; 3418844814C6CAD300EA48C7 /* StatusSubViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3418844614C6CAD300EA48C7 /* StatusSubViewController.m */; }; @@ -622,6 +668,47 @@ 340751E5150F38FC00B89C47 /* UIToggleVideoButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIToggleVideoButton.h; sourceTree = ""; }; 340751E6150F38FD00B89C47 /* UIToggleVideoButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIToggleVideoButton.m; sourceTree = ""; }; 340A75AF14C0670A006AA708 /* ConferenceCallDetailView-ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "ConferenceCallDetailView-ipad.xib"; sourceTree = ""; }; + 34151FB81563A8D800205A0E /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsViewController.h; sourceTree = ""; }; + 34151FB91563A8D800205A0E /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsViewController.m; sourceTree = ""; }; + 34151FBA1563A8D800205A0E /* IASKAppSettingsWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsWebViewController.h; sourceTree = ""; }; + 34151FBB1563A8D800205A0E /* IASKAppSettingsWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsWebViewController.m; sourceTree = ""; }; + 34151FBC1563A8D800205A0E /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifierValuesViewController.h; sourceTree = ""; }; + 34151FBD1563A8D800205A0E /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifierValuesViewController.m; sourceTree = ""; }; + 34151FBE1563A8D800205A0E /* IASKViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKViewController.h; sourceTree = ""; }; + 34151FC01563A8D800205A0E /* IASKSettingsReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsReader.h; sourceTree = ""; }; + 34151FC11563A8D800205A0E /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsReader.m; sourceTree = ""; }; + 34151FC21563A8D800205A0E /* IASKSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStore.h; sourceTree = ""; }; + 34151FC31563A8D800205A0E /* IASKSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStore.m; sourceTree = ""; }; + 34151FC41563A8D800205A0E /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreFile.h; sourceTree = ""; }; + 34151FC51563A8D800205A0E /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreFile.m; sourceTree = ""; }; + 34151FC61563A8D800205A0E /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; + 34151FC71563A8D800205A0E /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; + 34151FC81563A8D800205A0E /* IASKSpecifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifier.h; sourceTree = ""; }; + 34151FC91563A8D800205A0E /* IASKSpecifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifier.m; sourceTree = ""; }; + 34151FCB1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSSliderSpecifierViewCell.h; sourceTree = ""; }; + 34151FCC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSSliderSpecifierViewCell.m; sourceTree = ""; }; + 34151FCD1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTextFieldSpecifierViewCell.h; sourceTree = ""; }; + 34151FCE1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTextFieldSpecifierViewCell.m; sourceTree = ""; }; + 34151FCF1563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTitleValueSpecifierViewCell.h; sourceTree = ""; }; + 34151FD01563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTitleValueSpecifierViewCell.m; sourceTree = ""; }; + 34151FD11563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSToggleSwitchSpecifierViewCell.h; sourceTree = ""; }; + 34151FD21563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSToggleSwitchSpecifierViewCell.m; sourceTree = ""; }; + 34151FD31563A8D800205A0E /* IASKSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSlider.h; sourceTree = ""; }; + 34151FD41563A8D800205A0E /* IASKSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSlider.m; sourceTree = ""; }; + 34151FD51563A8D800205A0E /* IASKSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSwitch.h; sourceTree = ""; }; + 34151FD61563A8D800205A0E /* IASKSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSwitch.m; sourceTree = ""; }; + 34151FD71563A8D800205A0E /* IASKTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKTextField.h; sourceTree = ""; }; + 34151FD81563A8D800205A0E /* IASKTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKTextField.m; sourceTree = ""; }; + 34151FDA1563A8D800205A0E /* IASKAppSettingsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKAppSettingsView.xib; sourceTree = ""; }; + 34151FDB1563A8D800205A0E /* IASKAppSettingsWebView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKAppSettingsWebView.xib; sourceTree = ""; }; + 34151FDC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSSliderSpecifierViewCell.xib; sourceTree = ""; }; + 34151FDD1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSTextFieldSpecifierViewCell.xib; sourceTree = ""; }; + 34151FDE1563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSToggleSwitchSpecifierViewCell.xib; sourceTree = ""; }; + 34151FDF1563A8D800205A0E /* IASKSpecifierValuesView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKSpecifierValuesView.xib; sourceTree = ""; }; + 341520591563AA8F00205A0E /* 20-gear2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "20-gear2.png"; path = "Resources/20-gear2.png"; sourceTree = ""; }; + 3415205B1563ABEB00205A0E /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; + 34152079156BBEC000205A0E /* LinphoneCoreSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinphoneCoreSettingsStore.h; sourceTree = ""; }; + 3415207A156BBEC000205A0E /* LinphoneCoreSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LinphoneCoreSettingsStore.m; sourceTree = ""; }; 3418843614C58BB100EA48C7 /* nowebcamCIF.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = nowebcamCIF.jpg; path = submodules/linphone/mediastreamer2/src/nowebcamCIF.jpg; sourceTree = ""; }; 3418844514C6CAD300EA48C7 /* StatusSubViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatusSubViewController.h; sourceTree = ""; }; 3418844614C6CAD300EA48C7 /* StatusSubViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatusSubViewController.m; sourceTree = ""; }; @@ -667,6 +754,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3415205C1563ABEB00205A0E /* MessageUI.framework in Frameworks */, 340751971506459A00B89C47 /* CoreTelephony.framework in Frameworks */, 226CDADF14E2D0B800513B67 /* libbcg729.a in Frameworks */, 226CDAE014E2D0B800513B67 /* libmsbcg729.a in Frameworks */, @@ -809,6 +897,8 @@ 3418844714C6CAD300EA48C7 /* StatusSubViewController.xib */, 34216F3E1547EBCD00EA9777 /* VideoZoomHandler.h */, 34216F3F1547EBCD00EA9777 /* VideoZoomHandler.m */, + 34152079156BBEC000205A0E /* LinphoneCoreSettingsStore.h */, + 3415207A156BBEC000205A0E /* LinphoneCoreSettingsStore.m */, ); path = Classes; sourceTree = ""; @@ -1135,6 +1225,8 @@ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( + 3415205B1563ABEB00205A0E /* MessageUI.framework */, + 34151FB61563A8D800205A0E /* InAppSettingsKit */, 340751961506459A00B89C47 /* CoreTelephony.framework */, 226CDADD14E2D0B800513B67 /* libbcg729.a */, 226CDADE14E2D0B800513B67 /* libmsbcg729.a */, @@ -1209,6 +1301,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 341520591563AA8F00205A0E /* 20-gear2.png */, 3485649D152C423F003FE041 /* in_call_video.png */, 3485649E152C423F003FE041 /* out_call_video.png */, 34A6ECEA14CF13CB00460C04 /* icone-linphone-72.png */, @@ -1272,6 +1365,82 @@ name = Frameworks; sourceTree = ""; }; + 34151FB61563A8D800205A0E /* InAppSettingsKit */ = { + isa = PBXGroup; + children = ( + 34151FB71563A8D800205A0E /* Controllers */, + 34151FBF1563A8D800205A0E /* Models */, + 34151FCA1563A8D800205A0E /* Views */, + 34151FD91563A8D800205A0E /* Xibs */, + ); + path = InAppSettingsKit; + sourceTree = ""; + }; + 34151FB71563A8D800205A0E /* Controllers */ = { + isa = PBXGroup; + children = ( + 34151FB81563A8D800205A0E /* IASKAppSettingsViewController.h */, + 34151FB91563A8D800205A0E /* IASKAppSettingsViewController.m */, + 34151FBA1563A8D800205A0E /* IASKAppSettingsWebViewController.h */, + 34151FBB1563A8D800205A0E /* IASKAppSettingsWebViewController.m */, + 34151FBC1563A8D800205A0E /* IASKSpecifierValuesViewController.h */, + 34151FBD1563A8D800205A0E /* IASKSpecifierValuesViewController.m */, + 34151FBE1563A8D800205A0E /* IASKViewController.h */, + ); + path = Controllers; + sourceTree = ""; + }; + 34151FBF1563A8D800205A0E /* Models */ = { + isa = PBXGroup; + children = ( + 34151FC01563A8D800205A0E /* IASKSettingsReader.h */, + 34151FC11563A8D800205A0E /* IASKSettingsReader.m */, + 34151FC21563A8D800205A0E /* IASKSettingsStore.h */, + 34151FC31563A8D800205A0E /* IASKSettingsStore.m */, + 34151FC41563A8D800205A0E /* IASKSettingsStoreFile.h */, + 34151FC51563A8D800205A0E /* IASKSettingsStoreFile.m */, + 34151FC61563A8D800205A0E /* IASKSettingsStoreUserDefaults.h */, + 34151FC71563A8D800205A0E /* IASKSettingsStoreUserDefaults.m */, + 34151FC81563A8D800205A0E /* IASKSpecifier.h */, + 34151FC91563A8D800205A0E /* IASKSpecifier.m */, + ); + path = Models; + sourceTree = ""; + }; + 34151FCA1563A8D800205A0E /* Views */ = { + isa = PBXGroup; + children = ( + 34151FCB1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.h */, + 34151FCC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.m */, + 34151FCD1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.h */, + 34151FCE1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.m */, + 34151FCF1563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.h */, + 34151FD01563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.m */, + 34151FD11563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.h */, + 34151FD21563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.m */, + 34151FD31563A8D800205A0E /* IASKSlider.h */, + 34151FD41563A8D800205A0E /* IASKSlider.m */, + 34151FD51563A8D800205A0E /* IASKSwitch.h */, + 34151FD61563A8D800205A0E /* IASKSwitch.m */, + 34151FD71563A8D800205A0E /* IASKTextField.h */, + 34151FD81563A8D800205A0E /* IASKTextField.m */, + ); + path = Views; + sourceTree = ""; + }; + 34151FD91563A8D800205A0E /* Xibs */ = { + isa = PBXGroup; + children = ( + 34151FDA1563A8D800205A0E /* IASKAppSettingsView.xib */, + 34151FDB1563A8D800205A0E /* IASKAppSettingsWebView.xib */, + 34151FDC1563A8D800205A0E /* IASKPSSliderSpecifierViewCell.xib */, + 34151FDD1563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.xib */, + 34151FDE1563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib */, + 34151FDF1563A8D800205A0E /* IASKSpecifierValuesView.xib */, + ); + path = Xibs; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1413,6 +1582,13 @@ 34A6ECEB14CF13CB00460C04 /* icone-linphone-72.png in Resources */, 3485649F152C423F003FE041 /* in_call_video.png in Resources */, 348564A0152C423F003FE041 /* out_call_video.png in Resources */, + 34151FEF1563A8D800205A0E /* IASKAppSettingsView.xib in Resources */, + 34151FF01563A8D800205A0E /* IASKAppSettingsWebView.xib in Resources */, + 34151FF11563A8D800205A0E /* IASKPSSliderSpecifierViewCell.xib in Resources */, + 34151FF21563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.xib in Resources */, + 34151FF31563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */, + 34151FF41563A8D800205A0E /* IASKSpecifierValuesView.xib in Resources */, + 3415205A1563AA8F00205A0E /* 20-gear2.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1483,6 +1659,12 @@ 3418845D14C7077400EA48C7 /* status_gray.png in Resources */, 57282931154AF1460076F540 /* history-orange.png in Resources */, 57282933154AF14D0076F540 /* dialer-orange.png in Resources */, + 341520051563A93B00205A0E /* IASKAppSettingsView.xib in Resources */, + 341520061563A93B00205A0E /* IASKAppSettingsWebView.xib in Resources */, + 341520071563A93B00205A0E /* IASKPSSliderSpecifierViewCell.xib in Resources */, + 341520081563A93B00205A0E /* IASKPSTextFieldSpecifierViewCell.xib in Resources */, + 341520091563A93B00205A0E /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */, + 3415200A1563A93B00205A0E /* IASKSpecifierValuesView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1522,6 +1704,22 @@ 3418844814C6CAD300EA48C7 /* StatusSubViewController.m in Sources */, 340751E7150F38FD00B89C47 /* UIToggleVideoButton.m in Sources */, 34216F401547EBCD00EA9777 /* VideoZoomHandler.m in Sources */, + 34151FE01563A8D800205A0E /* IASKAppSettingsViewController.m in Sources */, + 34151FE11563A8D800205A0E /* IASKAppSettingsWebViewController.m in Sources */, + 34151FE21563A8D800205A0E /* IASKSpecifierValuesViewController.m in Sources */, + 34151FE31563A8D800205A0E /* IASKSettingsReader.m in Sources */, + 34151FE41563A8D800205A0E /* IASKSettingsStore.m in Sources */, + 34151FE51563A8D800205A0E /* IASKSettingsStoreFile.m in Sources */, + 34151FE61563A8D800205A0E /* IASKSettingsStoreUserDefaults.m in Sources */, + 34151FE71563A8D800205A0E /* IASKSpecifier.m in Sources */, + 34151FE81563A8D800205A0E /* IASKPSSliderSpecifierViewCell.m in Sources */, + 34151FE91563A8D800205A0E /* IASKPSTextFieldSpecifierViewCell.m in Sources */, + 34151FEA1563A8D800205A0E /* IASKPSTitleValueSpecifierViewCell.m in Sources */, + 34151FEB1563A8D800205A0E /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, + 34151FEC1563A8D800205A0E /* IASKSlider.m in Sources */, + 34151FED1563A8D800205A0E /* IASKSwitch.m in Sources */, + 34151FEE1563A8D800205A0E /* IASKTextField.m in Sources */, + 3415207B156BBEC000205A0E /* LinphoneCoreSettingsStore.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1558,6 +1756,22 @@ 3418844914C6CAD300EA48C7 /* StatusSubViewController.m in Sources */, 340751E8150F38FD00B89C47 /* UIToggleVideoButton.m in Sources */, 34216F411547EBCD00EA9777 /* VideoZoomHandler.m in Sources */, + 34151FF61563A92100205A0E /* IASKAppSettingsViewController.m in Sources */, + 34151FF71563A92100205A0E /* IASKAppSettingsWebViewController.m in Sources */, + 34151FF81563A92100205A0E /* IASKSpecifierValuesViewController.m in Sources */, + 34151FF91563A92900205A0E /* IASKSettingsReader.m in Sources */, + 34151FFA1563A92900205A0E /* IASKSettingsStore.m in Sources */, + 34151FFB1563A92900205A0E /* IASKSettingsStoreFile.m in Sources */, + 34151FFC1563A92900205A0E /* IASKSettingsStoreUserDefaults.m in Sources */, + 34151FFD1563A92900205A0E /* IASKSpecifier.m in Sources */, + 34151FFE1563A93400205A0E /* IASKPSSliderSpecifierViewCell.m in Sources */, + 34151FFF1563A93400205A0E /* IASKPSTextFieldSpecifierViewCell.m in Sources */, + 341520001563A93400205A0E /* IASKPSTitleValueSpecifierViewCell.m in Sources */, + 341520011563A93400205A0E /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, + 341520021563A93400205A0E /* IASKSlider.m in Sources */, + 341520031563A93400205A0E /* IASKSwitch.m in Sources */, + 341520041563A93400205A0E /* IASKTextField.m in Sources */, + 3415207C156BBEC000205A0E /* LinphoneCoreSettingsStore.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/submodules/linphone b/submodules/linphone index 04fa4d457..d0ced93c2 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 04fa4d457b3b584eae8c5964a48a97ec4040c94a +Subproject commit d0ced93c25f088c04a9f92b82aa41c5b1f271e23