From 8a1f535c3dbc624b70ba85078ab058f4b4f97f1f Mon Sep 17 00:00:00 2001 From: Siqi LIU Date: Mon, 9 Sep 2013 14:34:37 +0200 Subject: concentrate all config into one place Make use of InAppSettingKit, which allows both in-app setting and system-wide setting pane. Introduced more customization like default count-down timer duration & vibration & auto_start & default timing widget options Change-Id: Ida60b3b3f87a674795ee3ebddf14c71265196264 --- .../Controllers/IASKAppSettingsViewController.h | 84 +++ .../Controllers/IASKAppSettingsViewController.m | 796 +++++++++++++++++++++ .../Controllers/IASKAppSettingsWebViewController.h | 30 + .../Controllers/IASKAppSettingsWebViewController.m | 144 ++++ .../IASKSpecifierValuesViewController.h | 36 + .../IASKSpecifierValuesViewController.m | 202 ++++++ .../Controllers/IASKViewController.h | 26 + .../InAppSettingsKit/Models/IASKSettingsReader.h | 144 ++++ .../InAppSettingsKit/Models/IASKSettingsReader.m | 266 +++++++ .../InAppSettingsKit/Models/IASKSettingsStore.h | 39 + .../InAppSettingsKit/Models/IASKSettingsStore.m | 68 ++ .../Models/IASKSettingsStoreFile.h | 28 + .../Models/IASKSettingsStoreFile.m | 53 ++ .../Models/IASKSettingsStoreUserDefaults.h | 25 + .../Models/IASKSettingsStoreUserDefaults.m | 67 ++ .../InAppSettingsKit/Models/IASKSpecifier.h | 59 ++ .../InAppSettingsKit/Models/IASKSpecifier.m | 239 +++++++ .../Views/IASKPSSliderSpecifierViewCell.h | 31 + .../Views/IASKPSSliderSpecifierViewCell.m | 71 ++ .../Views/IASKPSTextFieldSpecifierViewCell.h | 29 + .../Views/IASKPSTextFieldSpecifierViewCell.m | 49 ++ .../Views/IASKPSTitleValueSpecifierViewCell.h | 22 + .../Views/IASKPSTitleValueSpecifierViewCell.m | 57 ++ .../Views/IASKPSToggleSwitchSpecifierViewCell.h | 29 + .../Views/IASKPSToggleSwitchSpecifierViewCell.m | 59 ++ ios/iosremote/InAppSettingsKit/Views/IASKSlider.h | 26 + ios/iosremote/InAppSettingsKit/Views/IASKSlider.m | 29 + ios/iosremote/InAppSettingsKit/Views/IASKSwitch.h | 26 + ios/iosremote/InAppSettingsKit/Views/IASKSwitch.m | 30 + .../InAppSettingsKit/Views/IASKTextField.h | 26 + .../InAppSettingsKit/Views/IASKTextField.m | 29 + .../InAppSettingsKit/Xibs/IASKAppSettingsView.xib | 222 ++++++ .../Xibs/IASKAppSettingsWebView.xib | 378 ++++++++++ .../Xibs/IASKPSSliderSpecifierViewCell.xib | 251 +++++++ .../Xibs/IASKPSTextFieldSpecifierViewCell.xib | 254 +++++++ .../Xibs/IASKPSToggleSwitchSpecifierViewCell.xib | 237 ++++++ .../Xibs/IASKSpecifierValuesView.xib | 255 +++++++ ios/iosremote/Settings.bundle/Root.plist | 109 +++ .../Settings.bundle/en.lproj/Root.strings | Bin 0 -> 546 bytes ios/iosremote/UserDefaults.plist | 4 - ios/iosremote/en.lproj/iPad_autosize.storyboard | 180 +++-- ios/iosremote/en.lproj/iPad_autosize.strings | Bin 3990 -> 4466 bytes .../en.lproj/iPad_autosize_old.storyboard | 180 +++-- ios/iosremote/fr.lproj/iPad_autosize.storyboard | 180 +++-- ios/iosremote/fr.lproj/iPad_autosize.strings | Bin 3994 -> 4526 bytes .../fr.lproj/iPad_autosize_old.storyboard | 182 +++-- ios/iosremote/iosremote.xcodeproj/project.pbxproj | 166 +++++ ios/iosremote/iosremote/AppDelegate.h | 3 - ios/iosremote/iosremote/AppDelegate.m | 13 +- .../iosremote/BasePresentationViewController.h | 2 + .../iosremote/BasePresentationViewController.m | 51 +- ios/iosremote/iosremote/Communication/Client.m | 2 - .../iosremote/Communication/CommunicationManager.m | 3 - ios/iosremote/iosremote/ControlVariables.h | 3 + ios/iosremote/iosremote/HorizontalSlideCell.m | 1 - ios/iosremote/iosremote/Timer.m | 2 +- .../iosremote/UIViewController+LibOStyling.m | 1 - .../iosremote/en.lproj/iPhone_autoSize.storyboard | 226 +++--- .../iosremote/en.lproj/iPhone_autoSize.strings | Bin 3162 -> 3638 bytes .../en.lproj/iPhone_autoSize_old.storyboard | 226 +++--- .../iosremote/fr.lproj/iPhone_autoSize.storyboard | 226 +++--- .../iosremote/fr.lproj/iPhone_autoSize.strings | Bin 3394 -> 3150 bytes .../fr.lproj/iPhone_autoSize_old.storyboard | 226 +++--- ios/iosremote/iosremote/iosremote-Prefix.pch | 1 + ios/iosremote/iosremote/serverList_vc.m | 1 - ios/iosremote/iosremote/slideShowPreviewTable_vc.h | 16 +- ios/iosremote/iosremote/slideShowPreviewTable_vc.m | 119 +-- .../iosremote/slideShowPreviewTable_vc_ipad.h | 1 - .../iosremote/slideShowPreviewTable_vc_ipad.m | 7 - .../iosremote/slideShowPreviewTable_vc_iphone.h | 1 - .../iosremote/slideShowPreviewTable_vc_iphone.m | 1 - .../iosremote/slideShowSwipeInList_ipad.m | 8 +- .../iosremote/slideShowSwipeInList_iphone.m | 18 +- ios/iosremote/iosremote/slideShow_vc_iphone.h | 1 - ios/iosremote/iosremote/slideShow_vc_iphone.m | 143 +--- .../zh-Hans.lproj/iPhone_autoSize.storyboard | 226 +++--- .../zh-Hans.lproj/iPhone_autoSize.strings | Bin 3026 -> 2826 bytes .../zh-Hans.lproj/iPhone_autoSize_old.storyboard | 226 +++--- .../zh-Hans.lproj/iPad_autosize.storyboard | 176 +++-- ios/iosremote/zh-Hans.lproj/iPad_autosize.strings | Bin 3718 -> 4294 bytes .../zh-Hans.lproj/iPad_autosize_old.storyboard | 178 +++-- 81 files changed, 6158 insertions(+), 1367 deletions(-) create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m create mode 100755 ios/iosremote/InAppSettingsKit/Controllers/IASKViewController.h create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.h create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.m create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsStore.h create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsStore.m create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.h create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.m create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.h create mode 100755 ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKSlider.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKSlider.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKSwitch.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKSwitch.m create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKTextField.h create mode 100755 ios/iosremote/InAppSettingsKit/Views/IASKTextField.m create mode 100755 ios/iosremote/InAppSettingsKit/Xibs/IASKAppSettingsView.xib create mode 100755 ios/iosremote/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib create mode 100755 ios/iosremote/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib create mode 100755 ios/iosremote/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib create mode 100755 ios/iosremote/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib create mode 100755 ios/iosremote/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib create mode 100644 ios/iosremote/Settings.bundle/Root.plist create mode 100644 ios/iosremote/Settings.bundle/en.lproj/Root.strings (limited to 'ios') diff --git a/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h new file mode 100755 index 000000000000..e2d5b99201d0 --- /dev/null +++ b/ios/iosremote/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 __unsafe_unretained _delegate; + + NSMutableArray *_viewList; + + IASKSettingsReader *_settingsReader; + id _settingsStore; + NSString *_file; + + id _currentFirstResponder; + + BOOL _showCreditsFooter; + BOOL _showDoneButton; +} + +@property (nonatomic, unsafe_unretained) 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/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m new file mode 100755 index 000000000000..afaa28e309f9 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m @@ -0,0 +1,796 @@ +// +// 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, strong) NSMutableArray *viewList; +@property (nonatomic, strong) 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; +} + +- (void)setFile:(NSString *)file { + if (file != _file) { + + _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; + } + + UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)]; + [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + self.navigationItem.leftBarButtonItem = backButton; +} + +- (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; + } + 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]; + } + + [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 = nil; + _file = nil; + _currentFirstResponder = nil; + _settingsReader = nil; + _settingsStore = nil; + + _delegate = nil; + +} + + +#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]; + } +} + +- (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]; + 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]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + } else if ([identifier isEqualToString:kIASKButtonSpecifier]) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; + } else if ([identifier isEqualToString:kIASKMailComposeSpecifier]) { + cell = [[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier]; + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; + } else { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; + } + 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]; + } + + 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]; + + // 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 alloc]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [vc performSelector:initSelector withObject:[specifier file] withObject:[specifier key]]; +#pragma clang diagnostic pop + 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]; + + 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]; + + // load the view controll back in to push it + targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; + } + targetViewController.file = 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]) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [buttonClass performSelector:buttonAction withObject:self withObject:[specifier key]]; +#pragma clang diagnostic pop + 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]; + } 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]; + } + + } 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 = currentDict; + + + 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/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h new file mode 100755 index 000000000000..c13c30edccbc --- /dev/null +++ b/ios/iosremote/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, strong) IBOutlet UIWebView *webView; +@property (nonatomic, strong) NSURL *url; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m new file mode 100755 index 000000000000..99ecd449430e --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m @@ -0,0 +1,144 @@ +// +// 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 = nil; + url = nil; + +} + +- (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 = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, + (__bridge CFStringRef)value, + CFSTR(""), + kCFStringEncodingUTF8); + 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]; + 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/ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h b/ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h new file mode 100755 index 000000000000..d733d4d3fd3d --- /dev/null +++ b/ios/iosremote/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, strong) IBOutlet UITableView *tableView; +@property (nonatomic, strong) NSIndexPath *checkedItem; +@property (nonatomic, strong) IASKSpecifier *currentSpecifier; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m b/ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m new file mode 100755 index 000000000000..52531c0c2bdb --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m @@ -0,0 +1,202 @@ +// +// 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)viewDidLoad +{ + [super viewDidLoad]; + UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)]; + [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; + self.navigationItem.leftBarButtonItem = backButton; +} + +- (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 = nil; + _checkedItem = nil; + _settingsReader = nil; + _settingsStore = nil; + _tableView = nil; +} + + +#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]; + } + + 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; + 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/ios/iosremote/InAppSettingsKit/Controllers/IASKViewController.h b/ios/iosremote/InAppSettingsKit/Controllers/IASKViewController.h new file mode 100755 index 000000000000..2ab89a6ff943 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.h b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.h new file mode 100755 index 000000000000..2af1fc9e8ad7 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.h @@ -0,0 +1,144 @@ +// +// 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; + +@interface IASKSettingsReader : NSObject { + NSString *_path; + NSString *_localizationTable; + NSString *_bundlePath; + NSDictionary *_settingsBundle; + NSArray *_dataSource; + NSBundle *_bundle; +} + +- (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, strong) NSString *path; +@property (nonatomic, strong) NSString *localizationTable; +@property (nonatomic, strong) NSString *bundlePath; +@property (nonatomic, strong) NSDictionary *settingsBundle; +@property (nonatomic, strong) NSArray *dataSource; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.m b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.m new file mode 100755 index 000000000000..3f730919a702 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsReader.m @@ -0,0 +1,266 @@ +// +// 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; + +- (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]]; + + // 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 = nil; + _localizationTable = nil; + _bundlePath = nil; + _settingsBundle = nil; + _dataSource = nil; + _bundle = nil; + +} + +- (void)_reinterpretBundle:(NSDictionary*)settingsBundle { + NSArray *preferenceSpecifiers = [settingsBundle objectForKey:kIASKPreferenceSpecifiers]; + NSInteger sectionCount = -1; + NSMutableArray *dataSource = [[NSMutableArray alloc] init]; + + for (NSDictionary *specifier in preferenceSpecifiers) { + if ([(NSString*)[specifier objectForKey:kIASKType] isEqualToString:kIASKPSGroupSpecifier]) { + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + + [newArray addObject:specifier]; + [dataSource addObject:newArray]; + sectionCount++; + } + else { + if (sectionCount == -1) { + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + [dataSource addObject:newArray]; + sectionCount++; + } + + IASKSpecifier *newSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifier]; + [(NSMutableArray*)[dataSource objectAtIndex:sectionCount] addObject:newSpecifier]; + } + } + [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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStore.h b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStore.h new file mode 100755 index 000000000000..79639acbe252 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStore.m b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStore.m new file mode 100755 index 000000000000..89484591f8cf --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.h b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.h new file mode 100755 index 000000000000..54331ed979ca --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.m b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.m new file mode 100755 index 000000000000..3192650f3aae --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreFile.m @@ -0,0 +1,53 @@ +// +// 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; + _dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; + if(_dict == nil) { + _dict = [[NSMutableDictionary alloc] init]; + } + } + return self; +} + +- (void)dealloc { + _dict = nil; + _filePath = nil; + +} + + +- (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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h new file mode 100755 index 000000000000..c1d2fce3cf1c --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m b/ios/iosremote/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m new file mode 100755 index 000000000000..c5979f80b356 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.h b/ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.h new file mode 100755 index 000000000000..5053c4052d0c --- /dev/null +++ b/ios/iosremote/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 *__unsafe_unretained _settingsReader; +} +@property (nonatomic, strong) NSDictionary *specifierDict; +@property (nonatomic, unsafe_unretained) 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/ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.m b/ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.m new file mode 100755 index 000000000000..2ca65b2816e3 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Models/IASKSpecifier.m @@ -0,0 +1,239 @@ +// +// 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, strong) 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 = nil; + _multipleValuesDict = nil; + + _settingsReader = nil; + +} + +- (void)_reinterpretValues:(NSDictionary*)specifierDict { + NSArray *values = [_specifierDict objectForKey:kIASKValues]; + NSArray *titles = [_specifierDict objectForKey:kIASKTitles]; + + NSMutableDictionary *multipleValuesDict = [[NSMutableDictionary alloc] init]; + + 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/ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h b/ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h new file mode 100755 index 000000000000..9a1f0f2318bf --- /dev/null +++ b/ios/iosremote/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 *__unsafe_unretained _slider; + UIImageView *__unsafe_unretained _minImage; + UIImageView *__unsafe_unretained _maxImage; +} + +@property (nonatomic, unsafe_unretained) IBOutlet IASKSlider *slider; +@property (nonatomic, unsafe_unretained) IBOutlet UIImageView *minImage; +@property (nonatomic, unsafe_unretained) IBOutlet UIImageView *maxImage; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m b/ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m new file mode 100755 index 000000000000..69187e96a233 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m @@ -0,0 +1,71 @@ +// +// 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; +} + +- (void)prepareForReuse { + _minImage.image = nil; + _maxImage.image = nil; +} +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h b/ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h new file mode 100755 index 000000000000..2d6be581309e --- /dev/null +++ b/ios/iosremote/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 *__unsafe_unretained _label; + IASKTextField *__unsafe_unretained _textField; +} + +@property (nonatomic, unsafe_unretained) IBOutlet UILabel *label; +@property (nonatomic, unsafe_unretained) IBOutlet IASKTextField *textField; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m b/ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m new file mode 100755 index 000000000000..39648c2f6d48 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m @@ -0,0 +1,49 @@ +// +// 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 +} + + + + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h b/ios/iosremote/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h new file mode 100755 index 000000000000..63d57f8d72a8 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m b/ios/iosremote/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m new file mode 100755 index 000000000000..b14175de701d --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h b/ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h new file mode 100755 index 000000000000..0617293cef75 --- /dev/null +++ b/ios/iosremote/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 *__unsafe_unretained _label; + IASKSwitch *__unsafe_unretained _toggle; +} + +@property (nonatomic, unsafe_unretained) IBOutlet UILabel *label; +@property (nonatomic, unsafe_unretained) IBOutlet IASKSwitch *toggle; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m b/ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m new file mode 100755 index 000000000000..6a997ccee844 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m @@ -0,0 +1,59 @@ +// +// 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)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/ios/iosremote/InAppSettingsKit/Views/IASKSlider.h b/ios/iosremote/InAppSettingsKit/Views/IASKSlider.h new file mode 100755 index 000000000000..57ecd234b8e9 --- /dev/null +++ b/ios/iosremote/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, strong) NSString *key; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKSlider.m b/ios/iosremote/InAppSettingsKit/Views/IASKSlider.m new file mode 100755 index 000000000000..e6addff98951 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Views/IASKSlider.m @@ -0,0 +1,29 @@ +// +// 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 = nil; + +} + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKSwitch.h b/ios/iosremote/InAppSettingsKit/Views/IASKSwitch.h new file mode 100755 index 000000000000..e183f297ed2e --- /dev/null +++ b/ios/iosremote/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, strong) NSString *key; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKSwitch.m b/ios/iosremote/InAppSettingsKit/Views/IASKSwitch.m new file mode 100755 index 000000000000..9d24ad8326c0 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Views/IASKSwitch.m @@ -0,0 +1,30 @@ +// +// 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 = nil; + +} + + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKTextField.h b/ios/iosremote/InAppSettingsKit/Views/IASKTextField.h new file mode 100755 index 000000000000..73f5c5b393f8 --- /dev/null +++ b/ios/iosremote/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, strong) NSString *key; + +@end diff --git a/ios/iosremote/InAppSettingsKit/Views/IASKTextField.m b/ios/iosremote/InAppSettingsKit/Views/IASKTextField.m new file mode 100755 index 000000000000..2b3cc7f6fb62 --- /dev/null +++ b/ios/iosremote/InAppSettingsKit/Views/IASKTextField.m @@ -0,0 +1,29 @@ +// +// 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 = nil; + +} + +@end diff --git a/ios/iosremote/InAppSettingsKit/Xibs/IASKAppSettingsView.xib b/ios/iosremote/InAppSettingsKit/Xibs/IASKAppSettingsView.xib new file mode 100755 index 000000000000..74720fae37a5 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib b/ios/iosremote/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib new file mode 100755 index 000000000000..b814f05fcbe4 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib b/ios/iosremote/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib new file mode 100755 index 000000000000..67750384e20e --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib b/ios/iosremote/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib new file mode 100755 index 000000000000..43a553b9c963 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib b/ios/iosremote/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib new file mode 100755 index 000000000000..2e5803f2e35f --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib b/ios/iosremote/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib new file mode 100755 index 000000000000..9c7ff86e6ea2 --- /dev/null +++ b/ios/iosremote/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/ios/iosremote/Settings.bundle/Root.plist b/ios/iosremote/Settings.bundle/Root.plist new file mode 100644 index 000000000000..12eb920d9b57 --- /dev/null +++ b/ios/iosremote/Settings.bundle/Root.plist @@ -0,0 +1,109 @@ + + + + + PreferenceSpecifiers + + + Title + General + Type + PSGroupSpecifier + + + Values + + 0 + 1 + + Type + PSMultiValueSpecifier + Title + Default Timing Widget + Key + DEFAULT_TIMING_WIDGET + DefaultValue + 0 + Titles + + Stopwatch + Countdown Timer + + + + Type + PSGroupSpecifier + Title + Stopwatch + + + Type + PSToggleSwitchSpecifier + Title + Auto-Start + Key + STOPWATCH_AUTO_START + DefaultValue + + + + Type + PSGroupSpecifier + Title + Countdown Timer + + + Values + + 3 + 5 + 10 + 15 + 20 + 30 + 40 + + Titles + + 3 + 5 + 10 + 15 + 20 + 30 + 40 + + Type + PSMultiValueSpecifier + Title + Default Duration (mins) + Key + TIMER_DEFAULT_DURATION + DefaultValue + 10 + + + Type + PSToggleSwitchSpecifier + Title + Auto-Start + Key + TIMER_AUTO_START + DefaultValue + + + + Type + PSToggleSwitchSpecifier + Title + Vibration + Key + TIMER_VIBRATION + DefaultValue + + + + StringsTable + Root + + diff --git a/ios/iosremote/Settings.bundle/en.lproj/Root.strings b/ios/iosremote/Settings.bundle/en.lproj/Root.strings new file mode 100644 index 000000000000..8cd87b9d6b20 Binary files /dev/null and b/ios/iosremote/Settings.bundle/en.lproj/Root.strings differ diff --git a/ios/iosremote/UserDefaults.plist b/ios/iosremote/UserDefaults.plist index a1048659f22e..7ff0a5cb199d 100644 --- a/ios/iosremote/UserDefaults.plist +++ b/ios/iosremote/UserDefaults.plist @@ -4,9 +4,5 @@ HOWTO_GUIDE_SEEN - TOUCH_POINTER_ENABLED - - TIMER_AUTOSTART_ENABLED - diff --git a/ios/iosremote/en.lproj/iPad_autosize.storyboard b/ios/iosremote/en.lproj/iPad_autosize.storyboard index d257bf74b584..2265ebeb89e8 100644 --- a/ios/iosremote/en.lproj/iPad_autosize.storyboard +++ b/ios/iosremote/en.lproj/iPad_autosize.storyboard @@ -15,20 +15,20 @@ - + - + + - - + + + - - + + - + @@ -541,22 +530,18 @@ - + - @@ -615,6 +600,7 @@ + @@ -693,18 +679,18 @@ - + + - + + + - - - @@ -717,6 +703,6 @@ - + \ No newline at end of file diff --git a/ios/iosremote/en.lproj/iPad_autosize.strings b/ios/iosremote/en.lproj/iPad_autosize.strings index 1ed9cbdeaa13..ad30821d3a19 100644 Binary files a/ios/iosremote/en.lproj/iPad_autosize.strings and b/ios/iosremote/en.lproj/iPad_autosize.strings differ diff --git a/ios/iosremote/en.lproj/iPad_autosize_old.storyboard b/ios/iosremote/en.lproj/iPad_autosize_old.storyboard index d257bf74b584..2265ebeb89e8 100644 --- a/ios/iosremote/en.lproj/iPad_autosize_old.storyboard +++ b/ios/iosremote/en.lproj/iPad_autosize_old.storyboard @@ -15,20 +15,20 @@ - + - + @@ -119,19 +119,19 @@ - + - + - + - + @@ -158,81 +158,70 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + + - - + + - + @@ -541,22 +530,18 @@ - + - @@ -615,6 +600,7 @@ + @@ -693,18 +679,18 @@ - + + - + + + - - - @@ -717,6 +703,6 @@ - + \ No newline at end of file diff --git a/ios/iosremote/fr.lproj/iPad_autosize.storyboard b/ios/iosremote/fr.lproj/iPad_autosize.storyboard index 462be6a40de1..68de0c7a781d 100644 --- a/ios/iosremote/fr.lproj/iPad_autosize.storyboard +++ b/ios/iosremote/fr.lproj/iPad_autosize.storyboard @@ -15,20 +15,20 @@ - + - + @@ -119,19 +119,19 @@ - + - + - + - + @@ -158,81 +158,70 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + + - - + + - + @@ -541,22 +530,18 @@ - + - @@ -615,6 +600,7 @@ + @@ -693,18 +679,18 @@ - + + - + + + - - - @@ -717,6 +703,6 @@ - + \ No newline at end of file diff --git a/ios/iosremote/fr.lproj/iPad_autosize.strings b/ios/iosremote/fr.lproj/iPad_autosize.strings index 4f924d49312c..71f37a85b7b6 100644 Binary files a/ios/iosremote/fr.lproj/iPad_autosize.strings and b/ios/iosremote/fr.lproj/iPad_autosize.strings differ diff --git a/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard b/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard index 6c9451e51931..68de0c7a781d 100644 --- a/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard +++ b/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard @@ -15,20 +15,20 @@ - + - + @@ -119,19 +119,19 @@ - + - + - + - + @@ -158,81 +158,70 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + + - - + + - + @@ -345,7 +334,7 @@ - + @@ -541,22 +530,18 @@ - + - @@ -615,6 +600,7 @@ + @@ -693,18 +679,18 @@ - + + - + + + - - - @@ -717,6 +703,6 @@ - + \ No newline at end of file diff --git a/ios/iosremote/iosremote.xcodeproj/project.pbxproj b/ios/iosremote/iosremote.xcodeproj/project.pbxproj index b8793aa6d4a6..a8781fbb6430 100644 --- a/ios/iosremote/iosremote.xcodeproj/project.pbxproj +++ b/ios/iosremote/iosremote.xcodeproj/project.pbxproj @@ -114,6 +114,29 @@ 8CAF3DE017D0DFFD00F931E5 /* WTcontrol~iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CAF3DDE17D0DFFD00F931E5 /* WTcontrol~iphone.png */; }; 8CAF3DE317D1D5D700F931E5 /* more_ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CAF3DE117D1D5D600F931E5 /* more_ipad.png */; }; 8CAF3DE417D1D5D700F931E5 /* more_ipad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8CAF3DE217D1D5D700F931E5 /* more_ipad@2x.png */; }; + 8CBF9DEB17DDBFA70044D949 /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DC417DDBFA70044D949 /* IASKAppSettingsViewController.m */; }; + 8CBF9DEC17DDBFA70044D949 /* IASKAppSettingsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DC617DDBFA70044D949 /* IASKAppSettingsWebViewController.m */; }; + 8CBF9DED17DDBFA70044D949 /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DC817DDBFA70044D949 /* IASKSpecifierValuesViewController.m */; }; + 8CBF9DEE17DDBFA70044D949 /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DCC17DDBFA70044D949 /* IASKSettingsReader.m */; }; + 8CBF9DEF17DDBFA70044D949 /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DCE17DDBFA70044D949 /* IASKSettingsStore.m */; }; + 8CBF9DF017DDBFA70044D949 /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DD017DDBFA70044D949 /* IASKSettingsStoreFile.m */; }; + 8CBF9DF117DDBFA70044D949 /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DD217DDBFA70044D949 /* IASKSettingsStoreUserDefaults.m */; }; + 8CBF9DF217DDBFA70044D949 /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DD417DDBFA70044D949 /* IASKSpecifier.m */; }; + 8CBF9DF317DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DD717DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.m */; }; + 8CBF9DF417DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DD917DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.m */; }; + 8CBF9DF517DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DDB17DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.m */; }; + 8CBF9DF617DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DDD17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.m */; }; + 8CBF9DF717DDBFA70044D949 /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DDF17DDBFA70044D949 /* IASKSlider.m */; }; + 8CBF9DF817DDBFA70044D949 /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE117DDBFA70044D949 /* IASKSwitch.m */; }; + 8CBF9DF917DDBFA70044D949 /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE317DDBFA70044D949 /* IASKTextField.m */; }; + 8CBF9DFA17DDBFA70044D949 /* IASKAppSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE517DDBFA70044D949 /* IASKAppSettingsView.xib */; }; + 8CBF9DFB17DDBFA70044D949 /* IASKAppSettingsWebView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE617DDBFA70044D949 /* IASKAppSettingsWebView.xib */; }; + 8CBF9DFC17DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE717DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.xib */; }; + 8CBF9DFD17DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE817DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.xib */; }; + 8CBF9DFE17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9DE917DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.xib */; }; + 8CBF9DFF17DDBFA70044D949 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9DEA17DDBFA70044D949 /* IASKSpecifierValuesView.xib */; }; + 8CBF9E0117DDC1A80044D949 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CBF9E0017DDC1A80044D949 /* MessageUI.framework */; }; + 8CBF9E0317DDD2230044D949 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8CBF9E0217DDD2230044D949 /* Settings.bundle */; }; 8CD6EC6817CBBAF40071827A /* WalkThroughPageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD6EC6617CBBAF40071827A /* WalkThroughPageViewController.m */; }; 8CD6EC6917CBBAF40071827A /* WalkThroughPageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8CD6EC6717CBBAF40071827A /* WalkThroughPageViewController.xib */; }; 8CD6EC7017CC3FA00071827A /* WalkThroughContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD6EC6F17CC3FA00071827A /* WalkThroughContainerViewController.m */; }; @@ -291,6 +314,45 @@ 8CAF3DDE17D0DFFD00F931E5 /* WTcontrol~iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "WTcontrol~iphone.png"; path = "iosremote/WTcontrol~iphone.png"; sourceTree = ""; }; 8CAF3DE117D1D5D600F931E5 /* more_ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = more_ipad.png; path = iosremote/more_ipad.png; sourceTree = ""; }; 8CAF3DE217D1D5D700F931E5 /* more_ipad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "more_ipad@2x.png"; path = "iosremote/more_ipad@2x.png"; sourceTree = ""; }; + 8CBF9DC317DDBFA70044D949 /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsViewController.h; sourceTree = ""; }; + 8CBF9DC417DDBFA70044D949 /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsViewController.m; sourceTree = ""; }; + 8CBF9DC517DDBFA70044D949 /* IASKAppSettingsWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsWebViewController.h; sourceTree = ""; }; + 8CBF9DC617DDBFA70044D949 /* IASKAppSettingsWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsWebViewController.m; sourceTree = ""; }; + 8CBF9DC717DDBFA70044D949 /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifierValuesViewController.h; sourceTree = ""; }; + 8CBF9DC817DDBFA70044D949 /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifierValuesViewController.m; sourceTree = ""; }; + 8CBF9DC917DDBFA70044D949 /* IASKViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKViewController.h; sourceTree = ""; }; + 8CBF9DCB17DDBFA70044D949 /* IASKSettingsReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsReader.h; sourceTree = ""; }; + 8CBF9DCC17DDBFA70044D949 /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsReader.m; sourceTree = ""; }; + 8CBF9DCD17DDBFA70044D949 /* IASKSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStore.h; sourceTree = ""; }; + 8CBF9DCE17DDBFA70044D949 /* IASKSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStore.m; sourceTree = ""; }; + 8CBF9DCF17DDBFA70044D949 /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreFile.h; sourceTree = ""; }; + 8CBF9DD017DDBFA70044D949 /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreFile.m; sourceTree = ""; }; + 8CBF9DD117DDBFA70044D949 /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; + 8CBF9DD217DDBFA70044D949 /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; + 8CBF9DD317DDBFA70044D949 /* IASKSpecifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifier.h; sourceTree = ""; }; + 8CBF9DD417DDBFA70044D949 /* IASKSpecifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifier.m; sourceTree = ""; }; + 8CBF9DD617DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSSliderSpecifierViewCell.h; sourceTree = ""; }; + 8CBF9DD717DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSSliderSpecifierViewCell.m; sourceTree = ""; }; + 8CBF9DD817DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTextFieldSpecifierViewCell.h; sourceTree = ""; }; + 8CBF9DD917DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTextFieldSpecifierViewCell.m; sourceTree = ""; }; + 8CBF9DDA17DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTitleValueSpecifierViewCell.h; sourceTree = ""; }; + 8CBF9DDB17DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTitleValueSpecifierViewCell.m; sourceTree = ""; }; + 8CBF9DDC17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSToggleSwitchSpecifierViewCell.h; sourceTree = ""; }; + 8CBF9DDD17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSToggleSwitchSpecifierViewCell.m; sourceTree = ""; }; + 8CBF9DDE17DDBFA70044D949 /* IASKSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSlider.h; sourceTree = ""; }; + 8CBF9DDF17DDBFA70044D949 /* IASKSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSlider.m; sourceTree = ""; }; + 8CBF9DE017DDBFA70044D949 /* IASKSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSwitch.h; sourceTree = ""; }; + 8CBF9DE117DDBFA70044D949 /* IASKSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSwitch.m; sourceTree = ""; }; + 8CBF9DE217DDBFA70044D949 /* IASKTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKTextField.h; sourceTree = ""; }; + 8CBF9DE317DDBFA70044D949 /* IASKTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKTextField.m; sourceTree = ""; }; + 8CBF9DE517DDBFA70044D949 /* IASKAppSettingsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKAppSettingsView.xib; sourceTree = ""; }; + 8CBF9DE617DDBFA70044D949 /* IASKAppSettingsWebView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKAppSettingsWebView.xib; sourceTree = ""; }; + 8CBF9DE717DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSSliderSpecifierViewCell.xib; sourceTree = ""; }; + 8CBF9DE817DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSTextFieldSpecifierViewCell.xib; sourceTree = ""; }; + 8CBF9DE917DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSToggleSwitchSpecifierViewCell.xib; sourceTree = ""; }; + 8CBF9DEA17DDBFA70044D949 /* IASKSpecifierValuesView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKSpecifierValuesView.xib; sourceTree = ""; }; + 8CBF9E0017DDC1A80044D949 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; + 8CBF9E0217DDD2230044D949 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; 8CD6EC6517CBBAF40071827A /* WalkThroughPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WalkThroughPageViewController.h; path = iosremote/WalkThroughPageViewController.h; sourceTree = ""; }; 8CD6EC6617CBBAF40071827A /* WalkThroughPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WalkThroughPageViewController.m; path = iosremote/WalkThroughPageViewController.m; sourceTree = ""; }; 8CD6EC6717CBBAF40071827A /* WalkThroughPageViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = WalkThroughPageViewController.xib; path = iosremote/WalkThroughPageViewController.xib; sourceTree = ""; }; @@ -313,6 +375,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 8CBF9E0117DDC1A80044D949 /* MessageUI.framework in Frameworks */, 8C19F41F17B02A8A005BDB61 /* QuartzCore.framework in Frameworks */, 8C19F41D17B00899005BDB61 /* SystemConfiguration.framework in Frameworks */, 571102701794128E007D343B /* libz.dylib in Frameworks */, @@ -382,6 +445,8 @@ 57C6E3E6175E06E800E8BC5F = { isa = PBXGroup; children = ( + 8CBF9E0217DDD2230044D949 /* Settings.bundle */, + 8CBF9E0017DDC1A80044D949 /* MessageUI.framework */, 8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */, 8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */, 8C1A170217A28AB900B4BB3C /* Shared */, @@ -523,8 +588,10 @@ 8C1A170417A28AFD00B4BB3C /* Controllers */, 8C1A170317A28AC900B4BB3C /* Application */, ); + indentWidth = 4; name = Shared; sourceTree = ""; + tabWidth = 4; }; 8C1A170317A28AC900B4BB3C /* Application */ = { isa = PBXGroup; @@ -557,6 +624,7 @@ 8C1A170517A28B0E00B4BB3C /* Library */ = { isa = PBXGroup; children = ( + 8CBF9DC117DDBFA70044D949 /* InAppSettingsKit */, BE9EBD061765BF0800283FD2 /* CoreImage.framework */, 57DC7006178D84490050FC58 /* CoreMotion.framework */, 8C26E5C417A52607007DA4B7 /* MGSplitViewController */, @@ -689,6 +757,82 @@ name = Controllers; sourceTree = ""; }; + 8CBF9DC117DDBFA70044D949 /* InAppSettingsKit */ = { + isa = PBXGroup; + children = ( + 8CBF9DC217DDBFA70044D949 /* Controllers */, + 8CBF9DCA17DDBFA70044D949 /* Models */, + 8CBF9DD517DDBFA70044D949 /* Views */, + 8CBF9DE417DDBFA70044D949 /* Xibs */, + ); + path = InAppSettingsKit; + sourceTree = ""; + }; + 8CBF9DC217DDBFA70044D949 /* Controllers */ = { + isa = PBXGroup; + children = ( + 8CBF9DC317DDBFA70044D949 /* IASKAppSettingsViewController.h */, + 8CBF9DC417DDBFA70044D949 /* IASKAppSettingsViewController.m */, + 8CBF9DC517DDBFA70044D949 /* IASKAppSettingsWebViewController.h */, + 8CBF9DC617DDBFA70044D949 /* IASKAppSettingsWebViewController.m */, + 8CBF9DC717DDBFA70044D949 /* IASKSpecifierValuesViewController.h */, + 8CBF9DC817DDBFA70044D949 /* IASKSpecifierValuesViewController.m */, + 8CBF9DC917DDBFA70044D949 /* IASKViewController.h */, + ); + path = Controllers; + sourceTree = ""; + }; + 8CBF9DCA17DDBFA70044D949 /* Models */ = { + isa = PBXGroup; + children = ( + 8CBF9DCB17DDBFA70044D949 /* IASKSettingsReader.h */, + 8CBF9DCC17DDBFA70044D949 /* IASKSettingsReader.m */, + 8CBF9DCD17DDBFA70044D949 /* IASKSettingsStore.h */, + 8CBF9DCE17DDBFA70044D949 /* IASKSettingsStore.m */, + 8CBF9DCF17DDBFA70044D949 /* IASKSettingsStoreFile.h */, + 8CBF9DD017DDBFA70044D949 /* IASKSettingsStoreFile.m */, + 8CBF9DD117DDBFA70044D949 /* IASKSettingsStoreUserDefaults.h */, + 8CBF9DD217DDBFA70044D949 /* IASKSettingsStoreUserDefaults.m */, + 8CBF9DD317DDBFA70044D949 /* IASKSpecifier.h */, + 8CBF9DD417DDBFA70044D949 /* IASKSpecifier.m */, + ); + path = Models; + sourceTree = ""; + }; + 8CBF9DD517DDBFA70044D949 /* Views */ = { + isa = PBXGroup; + children = ( + 8CBF9DD617DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.h */, + 8CBF9DD717DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.m */, + 8CBF9DD817DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.h */, + 8CBF9DD917DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.m */, + 8CBF9DDA17DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.h */, + 8CBF9DDB17DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.m */, + 8CBF9DDC17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.h */, + 8CBF9DDD17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.m */, + 8CBF9DDE17DDBFA70044D949 /* IASKSlider.h */, + 8CBF9DDF17DDBFA70044D949 /* IASKSlider.m */, + 8CBF9DE017DDBFA70044D949 /* IASKSwitch.h */, + 8CBF9DE117DDBFA70044D949 /* IASKSwitch.m */, + 8CBF9DE217DDBFA70044D949 /* IASKTextField.h */, + 8CBF9DE317DDBFA70044D949 /* IASKTextField.m */, + ); + path = Views; + sourceTree = ""; + }; + 8CBF9DE417DDBFA70044D949 /* Xibs */ = { + isa = PBXGroup; + children = ( + 8CBF9DE517DDBFA70044D949 /* IASKAppSettingsView.xib */, + 8CBF9DE617DDBFA70044D949 /* IASKAppSettingsWebView.xib */, + 8CBF9DE717DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.xib */, + 8CBF9DE817DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.xib */, + 8CBF9DE917DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.xib */, + 8CBF9DEA17DDBFA70044D949 /* IASKSpecifierValuesView.xib */, + ); + path = Xibs; + sourceTree = ""; + }; 8CD6EC6A17CBBAFF0071827A /* Views */ = { isa = PBXGroup; children = ( @@ -826,6 +970,13 @@ 8C3A648C17DCBE9E004A77D9 /* timer_settime_btn_dark.png in Resources */, 8C3A648D17DCBE9E004A77D9 /* timer_settime_btn_dark@2x.png in Resources */, 8C3A648E17DCBE9E004A77D9 /* timer_start_btn_dark.png in Resources */, + 8CBF9DFA17DDBFA70044D949 /* IASKAppSettingsView.xib in Resources */, + 8CBF9DFB17DDBFA70044D949 /* IASKAppSettingsWebView.xib in Resources */, + 8CBF9DFC17DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.xib in Resources */, + 8CBF9DFD17DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.xib in Resources */, + 8CBF9DFE17DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */, + 8CBF9DFF17DDBFA70044D949 /* IASKSpecifierValuesView.xib in Resources */, + 8CBF9E0317DDD2230044D949 /* Settings.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -890,6 +1041,21 @@ 8CD6EC7017CC3FA00071827A /* WalkThroughContainerViewController.m in Sources */, 8C23B46917DA158C00FB4DE6 /* UIView+Shadowing.m in Sources */, 8C23B47017DB419300FB4DE6 /* Timer.m in Sources */, + 8CBF9DEB17DDBFA70044D949 /* IASKAppSettingsViewController.m in Sources */, + 8CBF9DEC17DDBFA70044D949 /* IASKAppSettingsWebViewController.m in Sources */, + 8CBF9DED17DDBFA70044D949 /* IASKSpecifierValuesViewController.m in Sources */, + 8CBF9DEE17DDBFA70044D949 /* IASKSettingsReader.m in Sources */, + 8CBF9DEF17DDBFA70044D949 /* IASKSettingsStore.m in Sources */, + 8CBF9DF017DDBFA70044D949 /* IASKSettingsStoreFile.m in Sources */, + 8CBF9DF117DDBFA70044D949 /* IASKSettingsStoreUserDefaults.m in Sources */, + 8CBF9DF217DDBFA70044D949 /* IASKSpecifier.m in Sources */, + 8CBF9DF317DDBFA70044D949 /* IASKPSSliderSpecifierViewCell.m in Sources */, + 8CBF9DF417DDBFA70044D949 /* IASKPSTextFieldSpecifierViewCell.m in Sources */, + 8CBF9DF517DDBFA70044D949 /* IASKPSTitleValueSpecifierViewCell.m in Sources */, + 8CBF9DF617DDBFA70044D949 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, + 8CBF9DF717DDBFA70044D949 /* IASKSlider.m in Sources */, + 8CBF9DF817DDBFA70044D949 /* IASKSwitch.m in Sources */, + 8CBF9DF917DDBFA70044D949 /* IASKTextField.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/iosremote/iosremote/AppDelegate.h b/ios/iosremote/iosremote/AppDelegate.h index 5a1573434a75..ff1dd19e7bdc 100644 --- a/ios/iosremote/iosremote/AppDelegate.h +++ b/ios/iosremote/iosremote/AppDelegate.h @@ -12,11 +12,8 @@ @class ViewController; @interface AppDelegate : UIResponder { - // make sure we instanciate only once motionManager - CMMotionManager *motionManager; } -@property (readonly) CMMotionManager *motionManager; @property (strong, nonatomic) UIWindow *window; @end diff --git a/ios/iosremote/iosremote/AppDelegate.m b/ios/iosremote/iosremote/AppDelegate.m index 8e4e12feb8e7..6eeb1243639a 100644 --- a/ios/iosremote/iosremote/AppDelegate.m +++ b/ios/iosremote/iosremote/AppDelegate.m @@ -7,7 +7,6 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. #import "AppDelegate.h" -#import "ControlVariables.h" #import "UINavigationController+Theme.h" #define UIColorFromRGB(rgbValue) [UIColor \ @@ -56,13 +55,19 @@ blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] pageControl.pageIndicatorTintColor = UIColorFromRGB(0x2980b9); pageControl.currentPageIndicatorTintColor = UIColorFromRGB(0x1abc9c); } + + [self reconfigure]; + return YES; } -- (CMMotionManager *)motionManager +- (void) reconfigure { - if (!motionManager) motionManager = [[CMMotionManager alloc] init]; - return motionManager; + kDefaultTimerWidget = [[NSUserDefaults standardUserDefaults] integerForKey:@"DEFAULT_TIMING_WIDGET"]; + kCountDownTimerDefaultDuration = [[NSUserDefaults standardUserDefaults] integerForKey:@"TIMER_DEFAULT_DURATION"]; + kStopwatchAutoStart = [[NSUserDefaults standardUserDefaults] boolForKey:@"STOPWATCH_AUTO_START"]; + kCountDownTimerAutoStart = [[NSUserDefaults standardUserDefaults] boolForKey:@"TIMER_AUTO_START"]; + kCountDownTimerVibration = [[NSUserDefaults standardUserDefaults] boolForKey:@"TIMER_VIBRATION"]; } - (void)applicationWillResignActive:(UIApplication *)application diff --git a/ios/iosremote/iosremote/BasePresentationViewController.h b/ios/iosremote/iosremote/BasePresentationViewController.h index 8374ebf80711..05a9819d78fc 100644 --- a/ios/iosremote/iosremote/BasePresentationViewController.h +++ b/ios/iosremote/iosremote/BasePresentationViewController.h @@ -21,6 +21,8 @@ @property (weak, nonatomic) IBOutlet UIButton *previousButton; @property (weak, nonatomic) IBOutlet UIButton *nextButton; +@property (strong, nonatomic) UIViewController * initialNavController; + // Split view controller - (void) hideMaster:(BOOL)hideState; @property BOOL masterIsHiddenWhenLandscape; diff --git a/ios/iosremote/iosremote/BasePresentationViewController.m b/ios/iosremote/iosremote/BasePresentationViewController.m index 742ab66e0fba..d4ad6bd0576c 100644 --- a/ios/iosremote/iosremote/BasePresentationViewController.m +++ b/ios/iosremote/iosremote/BasePresentationViewController.m @@ -18,7 +18,8 @@ #import "Timer.h" #import "PopoverView.h" #import "UIView+Shadowing.h" -#import "ControlVariables.h" +#import "LibONavigationController.h" +#import "AppDelegate.h" #import #import @@ -79,7 +80,8 @@ [cell setTag:-indexPath.row - 1]; [cell.thumbnail setTag:1]; - NSLog(@"cell at Tag %d created", cell.tag); + + [cell.thumbnail setShadow]; [self.comManager.interpreter.slideShow getContentAtIndex:indexPath.row forView:cell]; @@ -210,6 +212,7 @@ UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"iPad_autosize" bundle: nil]; server_list_vc_ipad * slvc = [mainStoryboard instantiateViewControllerWithIdentifier:@"serverList"]; + self.initialNavController = slvc; slvc.modalPresentationStyle = UIModalPresentationFormSheet; slvc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentViewController:slvc animated:YES completion:^{}]; @@ -258,11 +261,9 @@ 794.0, /*self.NotesView.frame.size.height + self.horizontalTableView.frame.size.height*/ 303.0); self.horizontalTableView.bounds = CGRectMake(0, 0, 129, 768); - } completion:^(BOOL finished) { -// [self.horizontalTableView setHidden:NO]; -// [self.horizontalTableView reloadData]; - }]; + } completion:nil]; } + [self.popoverTimePickerController dismissPopoverAnimated:YES]; } - (SlideShow *)slideshow @@ -298,13 +299,9 @@ self.horizontalTableView.rowHeight = kCellWidth; - UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"slideshowRail"]]; - [bgImageView setFrame:self.horizontalTableView.frame]; - - self.horizontalTableView.backgroundView = bgImageView; + self.horizontalTableView.backgroundColor = [UIColor colorWithRed:.674509804 green:.729411765 blue:.760784314 alpha:1.0]; - self.horizontalTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; - self.horizontalTableView.separatorColor = [UIColor clearColor]; + self.horizontalTableView.separatorStyle = UITableViewCellSeparatorStyleNone; NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; @@ -325,6 +322,12 @@ [self.timerView setShadowLight]; self.timer.delegate = self; self.stopWatchTimerScrollView.contentSize = CGSizeMake(1240, 62); + + + CGRect frame = self.stopWatchTimerScrollView.frame; + frame.origin.x = frame.size.width * kDefaultTimerWidget; + frame.origin.y = 0; + [self.stopWatchTimerScrollView scrollRectToVisible:frame animated:YES]; } - (void)viewDidAppear:(BOOL)animated @@ -340,14 +343,12 @@ [self.welcome_blocking_page setAlpha:1]; } completion:nil]; -// NSLog(@"%f %f %f %f", self.NotesView.frame.origin.x, self.NotesView.frame.origin.y, self.NotesView.frame.size.height, self.NotesView.frame.size.width); if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) { [UIView animateWithDuration:0.25 animations:^{ self.NotesView.frame = CGRectMake(-15.0, /*self.NotesView.frame.origin.y - self.horizontalTableView.frame.size.height*/ 466.0, self.NotesView.frame.size.width, /*self.NotesView.frame.size.height + self.horizontalTableView.frame.size.height*/ 176.0); - NSLog(@"h:%f", self.horizontalTableView.bounds.size.height); }]; } else { [UIView animateWithDuration:0.25 animations:^{ @@ -380,14 +381,13 @@ if ([self.comManager.interpreter.slideShow size] == 0) [self setWelcomePageVisible:YES]; if (!self.presentedViewController) { - UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"iPad_autosize" - bundle: nil]; - slideShowPreviewTable_vc_ipad * sspt = [mainStoryboard instantiateViewControllerWithIdentifier:@"slideShowPreview"]; + // We fire up the retained initialNavController which will bring back the preview view controller page. + self.initialNavController.modalPresentationStyle = UIModalPresentationFormSheet; + self.initialNavController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - sspt.modalPresentationStyle = UIModalPresentationFormSheet; - sspt.modalTransitionStyle = UIModalTransitionStyleCoverVertical; - - [self presentViewController:sspt animated:YES completion:^{}]; + [self presentViewController:self.initialNavController animated:YES completion:^{}]; + [self.timer clear]; + [self.stopWatch clear]; } }]; [self startConnectionModal:nil]; @@ -408,8 +408,10 @@ [self setWelcomePageVisible:visible]; [self.currentSlideImageView setUserInteractionEnabled:YES]; } - if ([[NSUserDefaults standardUserDefaults] boolForKey:KEY_TIMER]) + if (kStopwatchAutoStart) [self.stopWatch start]; + if (kCountDownTimerAutoStart) + [self.timer start]; }]; self.slideshow.delegate = self; } @@ -426,6 +428,7 @@ - (void) viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; + [self.popoverTimePickerController dismissPopoverAnimated:YES]; } @@ -436,6 +439,7 @@ } - (void)viewDidUnload { + [self.popoverTimePickerController dismissPopoverAnimated:YES]; [self setHorizontalTableView:nil]; [self setNotesView:nil]; [self setNoteWebView:nil]; @@ -541,6 +545,9 @@ static BOOL isBlank = NO; #pragma mark - Reconnection - (void) didReceiveDisconnection { + //Dismiss time picker in case that users didn't have the time to tap elsewhere to dismiss it. + [self.popoverTimePickerController dismissPopoverAnimated:YES]; + [self dismissViewControllerAnimated:YES completion:^{ [self startConnectionModal:nil]; }]; diff --git a/ios/iosremote/iosremote/Communication/Client.m b/ios/iosremote/iosremote/Communication/Client.m index 6c03f05ede42..70aead015b35 100644 --- a/ios/iosremote/iosremote/Communication/Client.m +++ b/ios/iosremote/iosremote/Communication/Client.m @@ -103,8 +103,6 @@ NSLock *streamStatusLock; // Look up if there is already a pin code for this client. NSUserDefaults * userDefaluts = [NSUserDefaults standardUserDefaults]; - if(!userDefaluts) - NSLog(@"userDefaults nil"); NSInteger newPin = [userDefaluts integerForKey:self.name]; // If not, generate one. diff --git a/ios/iosremote/iosremote/Communication/CommunicationManager.m b/ios/iosremote/iosremote/Communication/CommunicationManager.m index 3c003d03d135..69f1de8b22ea 100644 --- a/ios/iosremote/iosremote/Communication/CommunicationManager.m +++ b/ios/iosremote/iosremote/Communication/CommunicationManager.m @@ -143,9 +143,6 @@ self = [self init]; NSUserDefaults * userDefaluts = [NSUserDefaults standardUserDefaults]; - if(!userDefaluts) - NSLog(@"userDefaults nil"); - NSData *dataRepresentingExistingServers = [userDefaluts objectForKey:ExistingServersKey]; if (dataRepresentingExistingServers != nil) { diff --git a/ios/iosremote/iosremote/ControlVariables.h b/ios/iosremote/iosremote/ControlVariables.h index 83a87cd3c3b5..3db19f6bebc5 100644 --- a/ios/iosremote/iosremote/ControlVariables.h +++ b/ios/iosremote/iosremote/ControlVariables.h @@ -47,4 +47,7 @@ #define kAppSmallTextFont [UIFont fontWithName:@"HelveticaNeue" size:14.0f] +int kDefaultTimerWidget, kCountDownTimerDefaultDuration; +BOOL kStopwatchAutoStart, kCountDownTimerAutoStart, kCountDownTimerVibration; + #endif diff --git a/ios/iosremote/iosremote/HorizontalSlideCell.m b/ios/iosremote/iosremote/HorizontalSlideCell.m index f9661d76b86a..c918c547e032 100644 --- a/ios/iosremote/iosremote/HorizontalSlideCell.m +++ b/ios/iosremote/iosremote/HorizontalSlideCell.m @@ -7,7 +7,6 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. #import "HorizontalSlideCell.h" -#import "ControlVariables.h" @implementation HorizontalSlideCell diff --git a/ios/iosremote/iosremote/Timer.m b/ios/iosremote/iosremote/Timer.m index 2929ca1fc589..8a1b59222095 100644 --- a/ios/iosremote/iosremote/Timer.m +++ b/ios/iosremote/iosremote/Timer.m @@ -34,7 +34,7 @@ int initSecondsLeft; self = [super init]; self.state = TIMER_STATE_CLEARED; self.set = NO; - secondsLeft = 0; + secondsLeft = kCountDownTimerDefaultDuration * 60; return self; } diff --git a/ios/iosremote/iosremote/UIViewController+LibOStyling.m b/ios/iosremote/iosremote/UIViewController+LibOStyling.m index b9cd7ef51077..0ec108d37bb9 100644 --- a/ios/iosremote/iosremote/UIViewController+LibOStyling.m +++ b/ios/iosremote/iosremote/UIViewController+LibOStyling.m @@ -7,7 +7,6 @@ */ #import "UIViewController+LibOStyling.h" -#import "ControlVariables.h" #import "Timer.h" #import "stopWatch.h" diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard index edc3083b3210..2348f44f12a3 100644 --- a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard +++ b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard @@ -73,8 +73,8 @@ - + @@ -113,7 +113,7 @@ - + @@ -173,6 +173,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -468,7 +535,6 @@ - @@ -497,83 +563,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -597,6 +586,7 @@ + @@ -608,14 +598,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.strings b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.strings index 8f60258ce29e..35fc4a7256e7 100644 Binary files a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.strings and b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.strings differ diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard index edc3083b3210..2348f44f12a3 100644 --- a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard +++ b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard @@ -73,8 +73,8 @@ - + @@ -113,7 +113,7 @@ - + @@ -173,6 +173,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -468,7 +535,6 @@ - @@ -497,83 +563,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -597,6 +586,7 @@ + @@ -608,14 +598,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard index 8825a870a220..fad3ed75707d 100644 --- a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard +++ b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard @@ -75,8 +75,8 @@ Contrôle Distant - + @@ -115,7 +115,7 @@ Contrôle Distant - + @@ -175,6 +175,73 @@ Contrôle Distant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -470,7 +537,6 @@ Contrôle Distant - @@ -499,83 +565,6 @@ Contrôle Distant - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -599,6 +588,7 @@ Contrôle Distant + @@ -610,14 +600,86 @@ Contrôle Distant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.strings b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.strings index a3d897943a10..a46df5ea55c1 100644 Binary files a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.strings and b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.strings differ diff --git a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard index 8825a870a220..fad3ed75707d 100644 --- a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard +++ b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard @@ -75,8 +75,8 @@ Contrôle Distant - + @@ -115,7 +115,7 @@ Contrôle Distant - + @@ -175,6 +175,73 @@ Contrôle Distant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -470,7 +537,6 @@ Contrôle Distant - @@ -499,83 +565,6 @@ Contrôle Distant - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -599,6 +588,7 @@ Contrôle Distant + @@ -610,14 +600,86 @@ Contrôle Distant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/ios/iosremote/iosremote/iosremote-Prefix.pch b/ios/iosremote/iosremote/iosremote-Prefix.pch index 4e499e106105..7c895573a66e 100644 --- a/ios/iosremote/iosremote/iosremote-Prefix.pch +++ b/ios/iosremote/iosremote/iosremote-Prefix.pch @@ -12,4 +12,5 @@ #import #import #import "TestFlight.h" + #import "ControlVariables.h" #endif diff --git a/ios/iosremote/iosremote/serverList_vc.m b/ios/iosremote/iosremote/serverList_vc.m index d6aacae24dc3..dbbbc8c1d607 100644 --- a/ios/iosremote/iosremote/serverList_vc.m +++ b/ios/iosremote/iosremote/serverList_vc.m @@ -11,7 +11,6 @@ #import "newServer_vc.h" #import "Server.h" #import "Client.h" -#import "ControlVariables.h" #import "PopoverView.h" #include diff --git a/ios/iosremote/iosremote/slideShowPreviewTable_vc.h b/ios/iosremote/iosremote/slideShowPreviewTable_vc.h index ee0e3bacfb36..31dbeb87621a 100644 --- a/ios/iosremote/iosremote/slideShowPreviewTable_vc.h +++ b/ios/iosremote/iosremote/slideShowPreviewTable_vc.h @@ -11,18 +11,20 @@ #define OPTION_TIMER NSLocalizedString(@"Timer auto-start", nil) #define OPTION_POINTER NSLocalizedString(@"Touch pointer", nil) -#define KEY_TIMER @"TIMER_AUTOSTART_ENABLED" -#define KEY_POINTER @"TOUCH_POINTER_ENABLED" +#define STOPWATCH_AUTO_START @"STOPWATCH_AUTO_START" -@interface slideShowPreviewTable_vc : UITableViewController +@interface slideShowPreviewTable_vc : UIViewController -@property (strong, nonatomic) IBOutlet UITableView *optionsTable; @property (nonatomic, strong) CommunicationManager * comManager; -@property (nonatomic, strong) id slideShowStartObserver; -@property (nonatomic, strong) NSArray * optionsArray; +@property (nonatomic, strong) id slideShowStartObserver; @property (nonatomic, strong) id titleObserver; --(IBAction)startPresentationAction:(id)sender; +@property (weak, nonatomic) IBOutlet UILabel *titleLabel; +@property (weak, nonatomic) IBOutlet UIButton *startButton; +@property (weak, nonatomic) IBOutlet UIButton *prefButton; + +- (IBAction)startPresentationAction:(id)sender; +- (IBAction)startPrefSettings:(id)sender; @end diff --git a/ios/iosremote/iosremote/slideShowPreviewTable_vc.m b/ios/iosremote/iosremote/slideShowPreviewTable_vc.m index 1aa3ceab4b47..87ba962e1667 100644 --- a/ios/iosremote/iosremote/slideShowPreviewTable_vc.m +++ b/ios/iosremote/iosremote/slideShowPreviewTable_vc.m @@ -10,21 +10,20 @@ #import "CommunicationManager.h" #import "CommandTransmitter.h" #import "CommandInterpreter.h" -#import "ControlVariables.h" #import "SlideShow.h" +#import "IASKAppSettingsViewController.h" @interface slideShowPreviewTable_vc () -@property (nonatomic, weak) UIButton * startButton; +@property (nonatomic, strong) IASKAppSettingsViewController *appSettingsViewController; @end @implementation slideShowPreviewTable_vc @synthesize startButton = _startButton; -@synthesize optionsTable = _optionsTable; -@synthesize optionsArray = _optionsArray; @synthesize titleObserver = _titleObserver; +@synthesize appSettingsViewController = _appSettingsViewController; - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { @@ -35,9 +34,9 @@ } } -- (id)initWithStyle:(UITableViewStyle)style +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - self = [super initWithStyle:style]; + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } @@ -47,6 +46,14 @@ - (void)viewDidLoad { [super viewDidLoad]; + + // Setting up UIButton stretchable background + UIImage *backgroundImage = [UIImage imageNamed:@"buttonBackground"]; + UIEdgeInsets insets = UIEdgeInsetsMake(20, 7, 20, 7); + UIImage *stretchableBackgroundImage = [backgroundImage resizableImageWithCapInsets:insets]; + [self.startButton setBackgroundImage:stretchableBackgroundImage forState:UIControlStateNormal]; + [self.prefButton setBackgroundImage:stretchableBackgroundImage forState:UIControlStateNormal]; + } - (void) viewDidDisappear:(BOOL)animated @@ -64,104 +71,30 @@ #pragma mark - Table view data source - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return [self.optionsArray count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - static NSString *CellIdentifier = @"optionCell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - - if (cell == nil) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; - UISwitch *toggleSwitch = [[UISwitch alloc] init]; - cell.accessoryView = [[UIView alloc] initWithFrame:toggleSwitch.frame]; - if (indexPath.row == 0) { - [toggleSwitch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:KEY_TIMER]]; - } else { - [toggleSwitch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:KEY_POINTER]]; - } - [cell.accessoryView addSubview:toggleSwitch]; - } - cell.textLabel.text = [self.optionsArray objectAtIndex:indexPath.row]; - - return cell; -} - - -(IBAction)startPresentationAction:(id)sender { - for (UITableViewCell *cell in self.tableView.visibleCells) { - UISwitch * toggle = [[[cell accessoryView] subviews] objectAtIndex:0]; - - if ([cell.textLabel.text isEqualToString:OPTION_TIMER]) - [[NSUserDefaults standardUserDefaults] setBool:[toggle isOn] forKey:KEY_TIMER]; - else if ([cell.textLabel.text isEqualToString:OPTION_POINTER]) - [[NSUserDefaults standardUserDefaults] setBool:[toggle isOn] forKey:KEY_POINTER]; - } [[self.comManager transmitter] startPresentation]; } -- (UIButton *)startButton{ - if (_startButton == nil) { - _startButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_startButton setBackgroundImage:[UIImage imageNamed:@"navBarButtonNormal"] forState:UIControlStateNormal]; - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - _startButton.frame = CGRectMake(145.0, 30.0, 160.0, 40.0); - } else { - self.modalViewController.view.backgroundColor = [UIColor clearColor]; - _startButton.frame = CGRectMake(260.0, 50.0, 180.0, 40.0); - } - [_startButton setTitle:NSLocalizedString(@"Start Presentation", nil) forState:UIControlStateNormal]; - [_startButton setTitleColor:kTintColor forState:UIControlStateNormal]; - [_startButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted]; - [_startButton addTarget:self action:@selector(startPresentationAction:) forControlEvents:UIControlEventTouchUpInside]; - - UIImage *backgroundImage = [UIImage imageNamed:@"buttonBackground"]; - UIEdgeInsets insets = UIEdgeInsetsMake(20, 7, 20, 7); - UIImage *stretchableBackgroundImage = [backgroundImage resizableImageWithCapInsets:insets]; - - [_startButton setBackgroundImage:stretchableBackgroundImage forState:UIControlStateNormal]; - _startButton.tag = 1; - } - return _startButton; -} - -- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section -{ - UIView* customView; - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { - customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 100.0)]; - } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) - customView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 540.0, 100.0)]; - [customView addSubview:self.startButton]; - - customView.center = CGPointMake(tableView.center.x, customView.center.y); - self.startButton.center = customView.center; - return customView; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section -{ - return 100.0; +- (IBAction)startPrefSettings:(id)sender { + self.appSettingsViewController.showDoneButton = NO; + [self.navigationController pushViewController:self.appSettingsViewController animated:YES]; } -#pragma mark - Table view delegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath]; - UISwitch * toggle = [[[cell accessoryView] subviews] objectAtIndex:0]; - [toggle setOn:![toggle isOn] animated:YES]; - [cell setSelected:NO animated:YES]; +#pragma mark - IN app setting +- (IASKAppSettingsViewController*)appSettingsViewController { + if (!_appSettingsViewController) { + _appSettingsViewController = [[IASKAppSettingsViewController alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil]; + _appSettingsViewController.delegate = self; + } + return _appSettingsViewController; } - (void)viewDidUnload { - [self setOptionsTable:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowStartObserver]; self.slideShowStartObserver = nil; + [self setStartButton:nil]; + [self setPrefButton:nil]; + [self setTitleLabel:nil]; [super viewDidUnload]; } @end diff --git a/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.h b/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.h index 50946bc83d6f..0359b9e61bc0 100644 --- a/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.h +++ b/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.h @@ -17,6 +17,5 @@ @interface slideShowPreviewTable_vc_ipad : slideShowPreviewTable_vc @property (strong, nonatomic) id delegate; -@property (weak, nonatomic) IBOutlet UILabel *titleLabel; @end diff --git a/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.m b/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.m index ca09716fc721..33b3a185969c 100644 --- a/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.m +++ b/ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.m @@ -39,11 +39,6 @@ self.delegate = (MainSplitViewController *) self.navigationController.presentingViewController; else self.delegate = (MainSplitViewController *) self.presentingViewController; - NSLog(@"%@", [self.delegate class]); - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - self.optionsArray = [NSArray arrayWithObjects:OPTION_TIMER, nil]; - } else - self.optionsArray = [NSArray arrayWithObjects:OPTION_TIMER, OPTION_POINTER, nil]; self.comManager = [CommunicationManager sharedComManager]; self.comManager.delegate = self; @@ -67,7 +62,6 @@ { [super viewDidAppear:animated]; if ([self.comManager.interpreter.slideShow size] > 0){ - NSLog(@"3"); [self.delegate didReceivePresentationStarted]; } NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; @@ -87,7 +81,6 @@ - (void)viewDidUnload { - [self setTitleLabel:nil]; [super viewDidUnload]; } @end diff --git a/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.h b/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.h index ed1e551102e5..df100d35451a 100644 --- a/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.h +++ b/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.h @@ -10,6 +10,5 @@ #import "slideShowPreviewTable_vc.h" @interface slideShowPreviewTable_vc_iphone : slideShowPreviewTable_vc -@property (weak, nonatomic) IBOutlet UILabel *titleLabel; @end diff --git a/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.m b/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.m index e1cf5089fb7d..8da5fe7608ae 100644 --- a/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.m +++ b/ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.m @@ -15,7 +15,6 @@ - (void) viewDidLoad { [super viewDidLoad]; - self.optionsArray = [NSArray arrayWithObjects:OPTION_TIMER, OPTION_POINTER, nil]; self.comManager = [CommunicationManager sharedComManager]; self.comManager.delegate = self; diff --git a/ios/iosremote/iosremote/slideShowSwipeInList_ipad.m b/ios/iosremote/iosremote/slideShowSwipeInList_ipad.m index 753dbb6352e5..eb4042605668 100644 --- a/ios/iosremote/iosremote/slideShowSwipeInList_ipad.m +++ b/ios/iosremote/iosremote/slideShowSwipeInList_ipad.m @@ -13,6 +13,7 @@ #import "CommandTransmitter.h" #import "SWRevealViewController.h" #import "slideShowPreviewTable_vc.h" +#import "UIView+Shadowing.h" #import @interface slideShowSwipeInList_ipad () @@ -69,10 +70,7 @@ dispatch_queue_t backgroundQueue; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; } }]; - UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"slideshowRail"]]; - [bgImageView setFrame:self.tableView.frame]; - - self.tableView.backgroundView = bgImageView; + self.tableView.backgroundColor = [UIColor colorWithRed:.674509804 green:.729411765 blue:.760784314 alpha:1.0]; } - (void)viewDidUnload @@ -128,7 +126,9 @@ dispatch_queue_t backgroundQueue; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; UILabel * slideNumber = (UILabel *)[cell viewWithTag:2]; + UIImageView * thumbnail = (UIImageView *)[cell viewWithTag:1]; + [thumbnail setShadow]; // Starting 20, all tags are used for thumbnails in this sidebar [cell setTag:20+indexPath.row]; [self.slideshow getContentAtIndex:indexPath.row forView:cell]; diff --git a/ios/iosremote/iosremote/slideShowSwipeInList_iphone.m b/ios/iosremote/iosremote/slideShowSwipeInList_iphone.m index ff65812653ca..984d2cff3368 100644 --- a/ios/iosremote/iosremote/slideShowSwipeInList_iphone.m +++ b/ios/iosremote/iosremote/slideShowSwipeInList_iphone.m @@ -13,7 +13,6 @@ #import "CommandTransmitter.h" #import "SWRevealViewController.h" #import "slideShowPreviewTable_vc.h" -#import "ControlVariables.h" #import "stopWatch.h" #import "Timer.h" #import "UIImageView+setImageAnimated.h" @@ -51,15 +50,20 @@ dispatch_queue_t backgroundQueue; self.clearsSelectionOnViewWillAppear = NO; // set stopwatch as default, users may swipe for a timer - self.currentPage = 0; - [self.revealViewController setOwner:STOPWATCH]; + self.currentPage = kDefaultTimerWidget; + [self.revealViewController setOwner:kDefaultTimerWidget]; + // Instanciate stopwatch and start if autostart is set self.stopWatch = [[stopWatch alloc] init]; - if ([[NSUserDefaults standardUserDefaults] boolForKey:KEY_TIMER]) { + if (kStopwatchAutoStart) { [self.stopWatch start]; } + // Instanciate timer and start if autostart is set self.timer = [[Timer alloc] init]; + if (kCountDownTimerAutoStart){ + [self.timer start]; + } self.tableView.backgroundColor = [UIColor colorWithRed:.674509804 green:.729411765 blue:.760784314 alpha:1.0]; } @@ -210,6 +214,12 @@ dispatch_queue_t backgroundQueue; UIScrollView * scroll = (UIScrollView *) [cell viewWithTag:7]; scroll.contentSize = CGSizeMake(412, 120); + + CGRect frame = scroll.frame; + frame.origin.x = frame.size.width * kDefaultTimerWidget; + frame.origin.y = 0; + [scroll scrollRectToVisible:frame animated:YES]; + return cell; } else { static NSString *CellIdentifier = @"slide"; diff --git a/ios/iosremote/iosremote/slideShow_vc_iphone.h b/ios/iosremote/iosremote/slideShow_vc_iphone.h index 67f3b6026c91..49d11dacf5e2 100644 --- a/ios/iosremote/iosremote/slideShow_vc_iphone.h +++ b/ios/iosremote/iosremote/slideShow_vc_iphone.h @@ -14,7 +14,6 @@ - (IBAction)nextSlideAction:(id)sender; - (IBAction)previousSlideAction:(id)sender; - (IBAction)pointerAction:(id)sender; -- (IBAction)accPointerAction:(id)sender; @property (weak, nonatomic) IBOutlet UIView *notesView; @property (weak, nonatomic) IBOutlet UIWebView *lecturer_notes; diff --git a/ios/iosremote/iosremote/slideShow_vc_iphone.m b/ios/iosremote/iosremote/slideShow_vc_iphone.m index de33023ab999..148166662ded 100644 --- a/ios/iosremote/iosremote/slideShow_vc_iphone.m +++ b/ios/iosremote/iosremote/slideShow_vc_iphone.m @@ -42,8 +42,6 @@ // SWReveal Controller @property (readwrite) IBOutlet UIBarButtonItem* revealButtonItem; -@property int count; - @end @implementation slideShow_vc @@ -68,129 +66,19 @@ return motionManager; } -- (void)startMotionDetect -{ - // __block float stepMoveFactorX = 5; - // __block float stepMoveFactorY = 5; - // __block double refX, refY; - - [self.motionManager - startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] - withHandler:^(CMAccelerometerData *data, NSError *error) - { - - dispatch_async(dispatch_get_main_queue(), - ^{ - CGRect rect = self.movingPointer.frame; - NSLog(@"x:%f y:%f z:%f", data.acceleration.x, data.acceleration.y, data.acceleration.z); - // Used to calibrate pointer based on initial position - // if (self.pointerCalibrationOn){ - // refX = data.acceleration.x; - // refY = data.acceleration.y; - // self.pointerCalibrationOn = NO; - // } - // float movetoX = rect.origin.x + ((data.acceleration.x - refX) * stepMoveFactorX); - - float movetoX = self.touchPointerImage.frame.origin.x + self.touchPointerImage.frame.size.width * ABS(data.acceleration.x - self.refLeftUpperGravity.x) / ABS(self.refRightUpperGravity.x - self.refLeftUpperGravity.x); - float maxX = self.touchPointerImage.frame.origin.x + self.touchPointerImage.frame.size.width - rect.size.width; - - // float movetoY = (rect.origin.y) + ((data.acceleration.y - refY) * stepMoveFactorY); - float movetoY = self.touchPointerImage.frame.origin.y + self.touchPointerImage.frame.size.height * ABS(data.acceleration.y - self.refRightUpperGravity.y) / ABS(self.refRightLowerGravity.y - self.refRightUpperGravity.y); - float maxY = self.touchPointerImage.frame.origin.y + self.touchPointerImage.frame.size.height; - - if ( movetoX > self.touchPointerImage.frame.origin.x && movetoX < maxX ) { - rect.origin.x = movetoX; - }; - - if ( movetoY > self.touchPointerImage.frame.origin.y && movetoY < maxY ) { - rect.origin.y = movetoY; - }; - - [UIView animateWithDuration:0 delay:0 - options:UIViewAnimationOptionCurveEaseIn - animations:^{ - self.movingPointer.frame = rect; - } - completion:nil - ]; - }); - }]; -} - -- (IBAction)accPointerAction:(id)sender{ - BOOL acc = [[NSUserDefaults standardUserDefaults] boolForKey:KEY_POINTER]; - if (!acc) { - static BOOL pointer = NO; - if (!pointer){ - [self startMotionDetect]; - [self.movingPointer setHidden:NO]; - } - else { - [self.motionManager stopAccelerometerUpdates]; - self.pointerCalibrationOn = NO; - [self.movingPointer setHidden:YES]; - } - pointer = !pointer; - } -} - // Not localized for now since this is subject to fundemental changes - (IBAction)pointerAction:(id)sender { - if (self.count == 0 || self.count == 1){ - CGPoint p; - p.x = [self.motionManager accelerometerData].acceleration.x; - p.y = [self.motionManager accelerometerData].acceleration.y; - self.refLeftUpperGravity = p; - if (self.count == 1) { - UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Calibration" - message:@"Upper left corner calibrated, now point your device to the upper right corner of the screen and click Pointer button again" - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:@"Help", nil]; - [message show]; - } - ++self.count; - } else if (self.count == 2 || self.count == 3) { - CGPoint p; - p.x = [self.motionManager accelerometerData].acceleration.x; - p.y = [self.motionManager accelerometerData].acceleration.y; - self.refRightUpperGravity = p; - if (self.count == 3) { - UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Calibration" - message:@"Upper right corner calibrated, now point your device to the lower right corner of the screen and click Pointer button again!" - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:@"Help", nil]; - [message show]; - } - ++self.count; - } else if (self.count == 4 || self.count == 5) { - CGPoint p; - p.x = [self.motionManager accelerometerData].acceleration.x; - p.y = [self.motionManager accelerometerData].acceleration.y; - self.refRightLowerGravity = p; - if (self.count == 5) { - UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Calibration" - message:@"Lower right corner calibrated, enjoy your pointer!" - delegate:nil - cancelButtonTitle:@"OK" - otherButtonTitles:@"Help", nil]; - [message show]; - } - ++self.count; + if ([self.touchPointerImage isHidden]){ + [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.touchPointerImage]; + CGPoint p = self.view.center; + p.y -= 50; + self.touchPointerImage.center = p; + [self.view removeGestureRecognizer:self.revealViewController.panGestureRecognizer]; } else { - if ([self.touchPointerImage isHidden]){ - [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.touchPointerImage]; - CGPoint p = self.view.center; - p.y -= 50; - self.touchPointerImage.center = p; - [self.view removeGestureRecognizer:self.revealViewController.panGestureRecognizer]; - } else { - [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; - } - [self.touchPointerImage fadeInfadeOutwithDuration:0.0 maxAlpha:1.0]; - [self.blockingView fadeInfadeOutwithDuration:0.0 maxAlpha:0.7]; + [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; } + [self.touchPointerImage fadeInfadeOutwithDuration:0.0 maxAlpha:1.0]; + [self.blockingView fadeInfadeOutwithDuration:0.0 maxAlpha:0.7]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { @@ -313,16 +201,6 @@ self.pointerCalibrationOn = NO; self.movingPointer.layer.cornerRadius = 3; - BOOL acc = [[NSUserDefaults standardUserDefaults] boolForKey:KEY_POINTER]; - if (!acc) { - // Hook up acc detection - [self.pointerBtn addTarget:self action:@selector(pointerAction:) forControlEvents:UIControlEventTouchUpOutside]; - [self.pointerBtn addTarget:self action:@selector(pointerAction:) forControlEvents:UIControlEventTouchUpInside]; - } else { - // Disable all calibration functions for acc based pointer - self.count = INT_MAX; - } - [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; } @@ -385,14 +263,11 @@ - (void) viewDidDisappear:(BOOL)animated { - self.count = 0; [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowFinishedObserver]; [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowImageNoteReadyObserver]; [super viewDidDisappear:animated]; } - - - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; diff --git a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard index d75f29357a64..6a703f70e437 100644 --- a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard +++ b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard @@ -73,8 +73,8 @@ - + @@ -113,7 +113,7 @@ - + @@ -173,6 +173,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -468,7 +535,6 @@ - @@ -497,83 +563,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -597,6 +586,7 @@ + @@ -608,14 +598,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.strings b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.strings index f062848166d1..c8ad37c724ae 100644 Binary files a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.strings and b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.strings differ diff --git a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize_old.storyboard b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize_old.storyboard index d75f29357a64..6a703f70e437 100644 --- a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize_old.storyboard +++ b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize_old.storyboard @@ -73,8 +73,8 @@ - + @@ -113,7 +113,7 @@ - + @@ -173,6 +173,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -468,7 +535,6 @@ - @@ -497,83 +563,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -597,6 +586,7 @@ + @@ -608,14 +598,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/ios/iosremote/zh-Hans.lproj/iPad_autosize.storyboard b/ios/iosremote/zh-Hans.lproj/iPad_autosize.storyboard index 3345e0e74b33..9893c34c8c6c 100644 --- a/ios/iosremote/zh-Hans.lproj/iPad_autosize.storyboard +++ b/ios/iosremote/zh-Hans.lproj/iPad_autosize.storyboard @@ -22,13 +22,13 @@ - + @@ -119,19 +119,19 @@ - + - + - + - + @@ -158,81 +158,70 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + + - - + + - + @@ -541,22 +530,18 @@ - + - @@ -615,6 +600,7 @@ + @@ -693,18 +679,18 @@ - + + - + + + - - - @@ -717,6 +703,6 @@ - + \ No newline at end of file diff --git a/ios/iosremote/zh-Hans.lproj/iPad_autosize.strings b/ios/iosremote/zh-Hans.lproj/iPad_autosize.strings index 07311c046eea..2569a2fc646d 100644 Binary files a/ios/iosremote/zh-Hans.lproj/iPad_autosize.strings and b/ios/iosremote/zh-Hans.lproj/iPad_autosize.strings differ diff --git a/ios/iosremote/zh-Hans.lproj/iPad_autosize_old.storyboard b/ios/iosremote/zh-Hans.lproj/iPad_autosize_old.storyboard index 4209ccedb509..9893c34c8c6c 100644 --- a/ios/iosremote/zh-Hans.lproj/iPad_autosize_old.storyboard +++ b/ios/iosremote/zh-Hans.lproj/iPad_autosize_old.storyboard @@ -22,13 +22,13 @@ @@ -119,19 +119,19 @@ - + - + - + - + @@ -158,81 +158,70 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + + - - + + - + @@ -345,7 +334,7 @@ - + @@ -541,22 +530,18 @@ - + - @@ -615,6 +600,7 @@ + @@ -693,18 +679,18 @@ - + + - + + + - - - @@ -717,6 +703,6 @@ - + \ No newline at end of file -- cgit