From 6fbc55f193374d1ac986b3221ef58e43c4c3a4d2 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Fri, 24 Oct 2014 16:02:10 -0400 Subject: [PATCH 1/7] new ui un-stashed --- Limelight.xcodeproj/project.pbxproj | 34 +++- Limelight/App.h | 15 ++ Limelight/App.m | 13 ++ .../Computer.imageset/Contents.json | 23 +++ .../limelight_computer_2x-1.png | Bin 0 -> 13670 bytes .../limelight_computer_2x-2.png | Bin 0 -> 13670 bytes .../limelight_computer_2x.png | Bin 0 -> 13670 bytes .../Left4Dead2.imageset/Contents.json | 23 +++ .../Left4Dead2.imageset/Left4Dead2-1.jpg | Bin 0 -> 31418 bytes .../Left4Dead2.imageset/Left4Dead2-2.jpg | Bin 0 -> 31418 bytes .../Left4Dead2.imageset/Left4Dead2.jpg | Bin 0 -> 31418 bytes Limelight/Limelight-Info.plist | 6 +- Limelight/UIAppView.h | 16 ++ Limelight/UIAppView.m | 50 ++++++ Limelight/UIComputerView.h | 16 ++ Limelight/UIComputerView.m | 48 ++++++ .../ViewControllers/MainFrameViewController.h | 10 +- .../ViewControllers/MainFrameViewController.m | 130 +++++++-------- .../StreamFrameViewController.m | 9 -- MainFrame-iPad.storyboard | 152 ------------------ MainFrame-iPhone.storyboard | 144 ----------------- iPad.storyboard | 88 ++++++++++ iPhone.storyboard | 80 +++++++++ 23 files changed, 461 insertions(+), 396 deletions(-) create mode 100644 Limelight/App.h create mode 100644 Limelight/App.m create mode 100644 Limelight/Images.xcassets/Computer.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-1.png create mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-2.png create mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x.png create mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2-1.jpg create mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2-2.jpg create mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2.jpg create mode 100644 Limelight/UIAppView.h create mode 100644 Limelight/UIAppView.m create mode 100644 Limelight/UIComputerView.h create mode 100644 Limelight/UIComputerView.m delete mode 100644 MainFrame-iPad.storyboard delete mode 100644 MainFrame-iPhone.storyboard create mode 100644 iPad.storyboard create mode 100644 iPhone.storyboard diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index f4b3942..458f187 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -25,8 +25,8 @@ FB290DB719B2C870004C83CF /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DB619B2C870004C83CF /* libz.dylib */; }; FB290DB919B2C877004C83CF /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DB819B2C877004C83CF /* libbz2.dylib */; }; FB290DC419B2E98F004C83CF /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DC319B2E98F004C83CF /* libxml2.dylib */; }; - FB290E7919B37D81004C83CF /* MainFrame-iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7819B37D81004C83CF /* MainFrame-iPad.storyboard */; }; - FB290E7B19B38036004C83CF /* MainFrame-iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7A19B38036004C83CF /* MainFrame-iPhone.storyboard */; }; + FB290E7919B37D81004C83CF /* iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7819B37D81004C83CF /* iPad.storyboard */; }; + FB290E7B19B38036004C83CF /* iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7A19B38036004C83CF /* iPhone.storyboard */; }; FB7E794419C8B71B00A15F68 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB7E794319C8B71B00A15F68 /* libiconv.dylib */; }; FB89462819F646E200339C8A /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460619F646E200339C8A /* CryptoManager.m */; }; FB89462919F646E200339C8A /* mkcert.c in Sources */ = {isa = PBXBuildFile; fileRef = FB89460719F646E200339C8A /* mkcert.c */; }; @@ -47,6 +47,9 @@ FB8946EB19F6AFE100339C8A /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946E019F6AFB800339C8A /* libcrypto.a */; }; FB8946EC19F6AFE400339C8A /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946E119F6AFB800339C8A /* libssl.a */; }; FB8946ED19F6AFE800339C8A /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946EA19F6AFB800339C8A /* libopus.a */; }; + FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; + FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E519F82297001C18A8 /* UIAppView.m */; }; + FBDE86E919F82315001C18A8 /* App.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E819F82315001C18A8 /* App.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -95,8 +98,8 @@ FB290DB619B2C870004C83CF /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; FB290DB819B2C877004C83CF /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; }; FB290DC319B2E98F004C83CF /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; - FB290E7819B37D81004C83CF /* MainFrame-iPad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MainFrame-iPad.storyboard"; sourceTree = SOURCE_ROOT; }; - FB290E7A19B38036004C83CF /* MainFrame-iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "MainFrame-iPhone.storyboard"; sourceTree = SOURCE_ROOT; }; + FB290E7819B37D81004C83CF /* iPad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPad.storyboard; sourceTree = SOURCE_ROOT; }; + FB290E7A19B38036004C83CF /* iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPhone.storyboard; sourceTree = SOURCE_ROOT; }; FB7E794319C8B71B00A15F68 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; FB89460519F646E200339C8A /* CryptoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoManager.h; sourceTree = ""; }; FB89460619F646E200339C8A /* CryptoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CryptoManager.m; sourceTree = ""; }; @@ -211,6 +214,12 @@ FB8946E719F6AFB800339C8A /* opus_multistream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; FB8946E819F6AFB800339C8A /* opus_types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; FB8946EA19F6AFB800339C8A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; + FBDE86DE19F7A837001C18A8 /* UIComputerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIComputerView.h; sourceTree = ""; }; + FBDE86DF19F7A837001C18A8 /* UIComputerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIComputerView.m; sourceTree = ""; }; + FBDE86E419F82297001C18A8 /* UIAppView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAppView.h; sourceTree = ""; }; + FBDE86E519F82297001C18A8 /* UIAppView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAppView.m; sourceTree = ""; }; + FBDE86E719F82315001C18A8 /* App.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = App.h; sourceTree = ""; }; + FBDE86E819F82315001C18A8 /* App.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = App.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -302,11 +311,17 @@ FB290CFA19B2C406004C83CF /* Supporting Files */, FB290D0219B2C406004C83CF /* AppDelegate.h */, FB290D0319B2C406004C83CF /* AppDelegate.m */, - FB290E7819B37D81004C83CF /* MainFrame-iPad.storyboard */, - FB290E7A19B38036004C83CF /* MainFrame-iPhone.storyboard */, + FB290E7819B37D81004C83CF /* iPad.storyboard */, + FB290E7A19B38036004C83CF /* iPhone.storyboard */, FB89463719F6473800339C8A /* Launch Screen.xib */, FB290D0819B2C406004C83CF /* Images.xcassets */, FB290D0519B2C406004C83CF /* Limelight.xcdatamodeld */, + FBDE86DE19F7A837001C18A8 /* UIComputerView.h */, + FBDE86DF19F7A837001C18A8 /* UIComputerView.m */, + FBDE86E419F82297001C18A8 /* UIAppView.h */, + FBDE86E519F82297001C18A8 /* UIAppView.m */, + FBDE86E719F82315001C18A8 /* App.h */, + FBDE86E819F82315001C18A8 /* App.m */, ); path = Limelight; sourceTree = ""; @@ -668,9 +683,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - FB290E7919B37D81004C83CF /* MainFrame-iPad.storyboard in Resources */, + FB290E7919B37D81004C83CF /* iPad.storyboard in Resources */, FB290CFE19B2C406004C83CF /* InfoPlist.strings in Resources */, - FB290E7B19B38036004C83CF /* MainFrame-iPhone.storyboard in Resources */, + FB290E7B19B38036004C83CF /* iPhone.storyboard in Resources */, FB290D0919B2C406004C83CF /* Images.xcassets in Resources */, FB89463819F6473800339C8A /* Launch Screen.xib in Resources */, ); @@ -695,9 +710,12 @@ FB89463219F646E200339C8A /* VideoDecoderRenderer.m in Sources */, FB290D0419B2C406004C83CF /* AppDelegate.m in Sources */, FB89463419F646E200339C8A /* Utils.m in Sources */, + FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */, FB89463319F646E200339C8A /* Computer.m in Sources */, FB89462F19F646E200339C8A /* Connection.m in Sources */, FB89462919F646E200339C8A /* mkcert.c in Sources */, + FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */, + FBDE86E919F82315001C18A8 /* App.m in Sources */, FB89463019F646E200339C8A /* StreamConfiguration.m in Sources */, FB89462C19F646E200339C8A /* HttpManager.m in Sources */, FB89462D19F646E200339C8A /* MDNSManager.m in Sources */, diff --git a/Limelight/App.h b/Limelight/App.h new file mode 100644 index 0000000..31eab9d --- /dev/null +++ b/Limelight/App.h @@ -0,0 +1,15 @@ +// +// App.h +// Limelight +// +// Created by Diego Waxemberg on 10/22/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import + +@interface App : NSObject + +@property NSString* displayName; + +@end diff --git a/Limelight/App.m b/Limelight/App.m new file mode 100644 index 0000000..2e71b67 --- /dev/null +++ b/Limelight/App.m @@ -0,0 +1,13 @@ +// +// App.m +// Limelight +// +// Created by Diego Waxemberg on 10/22/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "App.h" + +@implementation App + +@end diff --git a/Limelight/Images.xcassets/Computer.imageset/Contents.json b/Limelight/Images.xcassets/Computer.imageset/Contents.json new file mode 100644 index 0000000..8b6e0cc --- /dev/null +++ b/Limelight/Images.xcassets/Computer.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "limelight_computer_2x-1.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "limelight_computer_2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "limelight_computer_2x-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-1.png b/Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..df5cde9f32bc3380e2c7ace19ca79b066f3a377d GIT binary patch literal 13670 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 Launch Screen UIMainStoryboardFile - MainFrame-iPhone + iPhone UIMainStoryboardFile~ipad - MainFrame-iPad + iPad UIRequiredDeviceCapabilities armv7 @@ -44,8 +44,6 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad diff --git a/Limelight/UIAppView.h b/Limelight/UIAppView.h new file mode 100644 index 0000000..a184b1d --- /dev/null +++ b/Limelight/UIAppView.h @@ -0,0 +1,16 @@ +// +// UIAppView.h +// Limelight +// +// Created by Diego Waxemberg on 10/22/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import "App.h" + +@interface UIAppView : UIView + +- (id) initWithApp:(App*)app; + +@end diff --git a/Limelight/UIAppView.m b/Limelight/UIAppView.m new file mode 100644 index 0000000..1d2ea6e --- /dev/null +++ b/Limelight/UIAppView.m @@ -0,0 +1,50 @@ +// +// UIAppView.m +// Limelight +// +// Created by Diego Waxemberg on 10/22/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "UIAppView.h" + +@implementation UIAppView { + App* _app; + UIButton* _appButton; + UILabel* _appLabel; +} +static int LABEL_DY = 20; + +- (id) initWithApp:(App*)app { + self = [super init]; + _app = app; + + _appButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_appButton setContentEdgeInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; + [_appButton setBackgroundImage:[[UIImage imageNamed:@"Left4Dead2"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal]; + [_appButton sizeToFit]; + + _appLabel = [[UILabel alloc] init]; + [_appLabel setText:_app.displayName]; + [_appLabel sizeToFit]; + _appLabel.center = CGPointMake(_appButton.bounds.origin.x + (_appButton.bounds.size.width / 2), _appButton.bounds.origin.y + _appButton.bounds.size.height + LABEL_DY); + + [self addSubview:_appButton]; + [self addSubview:_appLabel]; + + self.frame = CGRectMake(0, 0, _appButton.frame.size.width > _appLabel.frame.size.width ? _appButton.frame.size.width : _appLabel.frame.size.width, _appButton.frame.size.height + _appLabel.frame.size.height); + + return self; +} + + + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/Limelight/UIComputerView.h b/Limelight/UIComputerView.h new file mode 100644 index 0000000..c603bd0 --- /dev/null +++ b/Limelight/UIComputerView.h @@ -0,0 +1,16 @@ +// +// UIComputerView.h +// Limelight +// +// Created by Diego Waxemberg on 10/22/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import "Computer.h" + +@interface UIComputerView : UIView + +- (id) initWithComputer:(Computer*)computer; + +@end diff --git a/Limelight/UIComputerView.m b/Limelight/UIComputerView.m new file mode 100644 index 0000000..0efb111 --- /dev/null +++ b/Limelight/UIComputerView.m @@ -0,0 +1,48 @@ +// +// UIComputerView.m +// Limelight +// +// Created by Diego Waxemberg on 10/22/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "UIComputerView.h" + +@implementation UIComputerView { + Computer* _computer; + UIButton* _hostButton; + UILabel* _hostLabel; +} +static int LABEL_DY = 20; + +- (id) initWithComputer:(Computer*)computer { + self = [super init]; + _computer = computer; + + _hostButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_hostButton setContentEdgeInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; + [_hostButton setBackgroundImage:[[UIImage imageNamed:@"Computer"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal]; + [_hostButton sizeToFit]; + + _hostLabel = [[UILabel alloc] init]; + [_hostLabel setText:[_computer displayName]]; + [_hostLabel sizeToFit]; + _hostLabel.center = CGPointMake(_hostButton.bounds.origin.x + (_hostButton.bounds.size.width / 2), _hostButton.bounds.origin.y + _hostButton.bounds.size.height + LABEL_DY); + + [self addSubview:_hostButton]; + [self addSubview:_hostLabel]; + + self.frame = CGRectMake(0, 0, _hostButton.frame.size.width > _hostLabel.frame.size.width ? _hostButton.frame.size.width : _hostLabel.frame.size.width, _hostButton.frame.size.height + _hostLabel.frame.size.height); + + return self; +} + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/Limelight/ViewControllers/MainFrameViewController.h b/Limelight/ViewControllers/MainFrameViewController.h index d4777f9..7265ca9 100644 --- a/Limelight/ViewControllers/MainFrameViewController.h +++ b/Limelight/ViewControllers/MainFrameViewController.h @@ -11,15 +11,7 @@ #import "PairManager.h" #import "StreamConfiguration.h" -@interface MainFrameViewController : UIViewController -@property (strong, nonatomic) IBOutlet UIPickerView *HostPicker; -- (IBAction)StreamButton:(UIButton *)sender; -- (IBAction)PairButton:(UIButton *)sender; - -@property (strong, nonatomic) IBOutlet UIPickerView *StreamConfigs; -@property (strong, nonatomic) NSArray* streamConfigVals; -@property (strong, nonatomic) NSArray* hostPickerVals; -@property (strong, nonatomic) IBOutlet UITextField *hostTextField; +@interface MainFrameViewController : UIViewController + (StreamConfiguration*) getStreamConfiguration; diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index f1419b3..1ebcd91 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -1,4 +1,4 @@ -// + // MainFrameViewController.m // Limelight-iOS // @@ -14,6 +14,9 @@ #import "VideoDecoderRenderer.h" #import "StreamManager.h" #import "Utils.h" +#import "UIComputerView.h" +#import "UIAppView.h" +#import "App.h" @implementation MainFrameViewController { NSOperationQueue* _opQueue; @@ -27,6 +30,8 @@ static StreamConfiguration* streamConfig; return streamConfig; } +//TODO: no more pair button +/* - (void)PairButton:(UIButton *)sender { NSLog(@"Pair Button Pressed!"); @@ -34,7 +39,7 @@ static StreamConfiguration* streamConfig; _selectedHost = [[Computer alloc] initWithIp:self.hostTextField.text]; NSLog(@"Using custom host: %@", self.hostTextField.text); } - + if (![self validatePcSelected]) { NSLog(@"No valid PC selected"); return; @@ -54,6 +59,7 @@ static StreamConfiguration* streamConfig; [_opQueue addOperation:pMan]; } +*/ - (void)showPIN:(NSString *)PIN { dispatch_sync(dispatch_get_main_queue(), ^{ @@ -86,9 +92,12 @@ static StreamConfiguration* streamConfig; [self presentViewController:alert animated:YES completion:nil]; } +//TODO: No more stream button +/* - (void)StreamButton:(UIButton *)sender { NSLog(@"Stream Button Pressed!"); + if ([self.hostTextField.text length] > 0) { _selectedHost = [[Computer alloc] initWithIp:self.hostTextField.text]; NSLog(@"Using custom host: %@", self.hostTextField.text); @@ -139,18 +148,9 @@ static StreamConfiguration* streamConfig; NSLog(@"StreamConfig: %@, %d, %dx%dx%d at %d Mbps", streamConfig.host, streamConfig.hostAddr, streamConfig.width, streamConfig.height, streamConfig.frameRate, streamConfig.bitRate); [self performSegueWithIdentifier:@"createStreamFrame" sender:self]; } +*/ -- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component -{ - if (pickerView == self.StreamConfigs) { - return [self.streamConfigVals objectAtIndex:row]; - } else if (pickerView == self.HostPicker) { - return ((Computer*)([self.hostPickerVals objectAtIndex:row])).displayName; - } else { - return nil; - } -} - +/* - (void)setSelectedHost:(NSInteger)selectedIndex { _selectedHost = (Computer*)([self.hostPickerVals objectAtIndex:selectedIndex]); @@ -159,58 +159,71 @@ static StreamConfiguration* streamConfig; _selectedHost = NULL; } } +*/ -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component -{ - if (pickerView == self.HostPicker) { - [self setSelectedHost:[self.HostPicker selectedRowInComponent:0]]; - } - - //TODO: figure out how to save this info!! -} - -// returns the number of 'columns' to display. -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView -{ - return 1; -} - -// returns the # of rows in each component.. -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component -{ - if (pickerView == self.StreamConfigs) { - return self.streamConfigVals.count; - } else if (pickerView == self.HostPicker) { - return self.hostPickerVals.count; - } else { - return 0; - } -} - (void)viewDidLoad { [super viewDidLoad]; - self.streamConfigVals = [[NSArray alloc] initWithObjects:@"1280x720 (30Hz)", @"1280x720 (60Hz)", @"1920x1080 (30Hz)", @"1920x1080 (60Hz)",nil]; - [self.StreamConfigs selectRow:1 inComponent:0 animated:NO]; + NSArray* streamConfigVals = [[NSArray alloc] initWithObjects:@"1280x720 (30Hz)", @"1280x720 (60Hz)", @"1920x1080 (30Hz)", @"1920x1080 (60Hz)",nil]; _opQueue = [[NSOperationQueue alloc] init]; // Initialize the host picker list - [self updateHosts:[[NSArray alloc] init]]; + //[self updateHosts:[[NSArray alloc] init]]; + + Computer* test = [[Computer alloc] initWithIp:@"CEMENT-TRUCK"]; + + + UIScrollView* hostScrollView = [[UIScrollView alloc] init]; + hostScrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2); + [hostScrollView setShowsHorizontalScrollIndicator:NO]; + UIComputerView* compView; + for (int i = 0; i < 5; i++) { + compView = [[UIComputerView alloc] initWithComputer:test]; + [hostScrollView addSubview:compView]; + [compView sizeToFit]; + compView.center = CGPointMake((compView.frame.size.width + 20) * i + compView.frame.size.width, hostScrollView.frame.size.height / 2); + + } + + [hostScrollView setContentSize:CGSizeMake(compView.frame.size.width * 5 + compView.frame.size.width, hostScrollView.frame.size.height)]; + + + UIScrollView* appScrollView = [[UIScrollView alloc] init]; + appScrollView.frame = CGRectMake(0, hostScrollView.frame.size.height, self.view.frame.size.width, self.view.frame.size.height / 2); + [appScrollView setShowsHorizontalScrollIndicator:NO]; + + + App* testApp = [[App alloc] init]; + testApp.displayName = @"Left 4 Dead 2"; + UIAppView* appView; + for (int i = 0; i < 5; i++) { + appView = [[UIAppView alloc] initWithApp:testApp]; + [appScrollView addSubview:appView]; + [appView sizeToFit]; + appView.center = CGPointMake((appView.frame.size.width + 20) * i + compView.frame.size.width, appScrollView.frame.size.height / 2); + } + + [appScrollView setContentSize:CGSizeMake(appView.frame.size.width * 5 + appView.frame.size.width, appScrollView.frame.size.height)]; + + [self.view addSubview:hostScrollView]; + [self.view addSubview:appScrollView]; + } - (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - _mDNSManager = [[MDNSManager alloc] initWithCallback:self]; - [_mDNSManager searchForHosts]; + [super viewDidDisappear:animated]; + //_mDNSManager = [[MDNSManager alloc] initWithCallback:self]; + // [_mDNSManager searchForHosts]; } - (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - [_mDNSManager stopSearching]; + [super viewDidDisappear:animated]; + // [_mDNSManager stopSearching]; } - (void)updateHosts:(NSArray *)hosts { @@ -219,11 +232,6 @@ static StreamConfiguration* streamConfig; if ([hostPickerValues count] == 0) { [hostPickerValues addObject:[[Computer alloc] initPlaceholder]]; } - - self.hostPickerVals = hostPickerValues; - [self.HostPicker reloadAllComponents]; - - [self setSelectedHost:[self.HostPicker selectedRowInComponent:0]]; } - (BOOL)validatePcSelected { @@ -257,22 +265,4 @@ static StreamConfiguration* streamConfig; - (BOOL)shouldAutorotate { return YES; } - -- (NSUInteger)supportedInterfaceOrientations { - NSString *deviceType = [UIDevice currentDevice].model; - if ([deviceType containsString:@"iPhone"] || [deviceType containsString:@"iPod"]) { - return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; - } else { - return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; - } -} - -- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { - NSString *deviceType = [UIDevice currentDevice].model; - if ([deviceType containsString:@"iPhone"] || [deviceType containsString:@"iPod"]) { - return UIInterfaceOrientationPortrait; - } else { - return UIInterfaceOrientationLandscapeRight; - } -} @end diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index 588bee9..e05aec0 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -118,13 +118,4 @@ - (BOOL)shouldAutorotate { return YES; } - -- (NSUInteger)supportedInterfaceOrientations { - return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; -} - -- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { - return UIInterfaceOrientationLandscapeRight; -} - @end diff --git a/MainFrame-iPad.storyboard b/MainFrame-iPad.storyboard deleted file mode 100644 index 9eb0431..0000000 --- a/MainFrame-iPad.storyboard +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MainFrame-iPhone.storyboard b/MainFrame-iPhone.storyboard deleted file mode 100644 index 4aecfbb..0000000 --- a/MainFrame-iPhone.storyboard +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/iPad.storyboard b/iPad.storyboard new file mode 100644 index 0000000..eb77d96 --- /dev/null +++ b/iPad.storyboard @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iPhone.storyboard b/iPhone.storyboard new file mode 100644 index 0000000..098b0cc --- /dev/null +++ b/iPhone.storyboard @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 412c5c251658e8280cc0aa9dc543e4d4ad1f476f Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Sun, 26 Oct 2014 02:15:53 -0400 Subject: [PATCH 2/7] new ui is almost fully functional - add hosts - pair to host - get app list - launch app - resume app --- Limelight.xcodeproj/project.pbxproj | 14 +- Limelight/App.h | 4 +- Limelight/App.m | 2 + .../AddComputer.imageset/Contents.json | 23 ++ .../limelight_computer_add_1x.png | Bin 0 -> 11592 bytes .../limelight_computer_add_2x.png | Bin 0 -> 15646 bytes .../limelight_computer_add_3x.png | Bin 0 -> 25270 bytes .../AddComputerIcon.imageset/Contents.json | 21 ++ .../limelight_computer_add_icon_2x.png | Bin 0 -> 1964 bytes .../Computer.imageset/Contents.json | 4 +- .../limelight_computer_1x.png | Bin 0 -> 9502 bytes .../limelight_computer_2x-1.png | Bin 13670 -> 0 bytes .../limelight_computer_2x-2.png | Bin 13670 -> 0 bytes .../limelight_computer_2x.png | Bin 13670 -> 13331 bytes .../limelight_computer_3x.png | Bin 0 -> 22832 bytes .../NoAppImage.imageset/Contents.json | 21 ++ .../limelight_no_app_image_2x.png | Bin 0 -> 22949 bytes Limelight/Network/AppManager.h | 23 ++ Limelight/Network/AppManager.m | 45 ++++ Limelight/Network/HttpManager.h | 2 + Limelight/Network/HttpManager.m | 66 ++++- Limelight/Network/PairManager.h | 1 + Limelight/Network/PairManager.m | 3 +- Limelight/Stream/StreamConfiguration.h | 1 + Limelight/Stream/StreamConfiguration.m | 2 +- Limelight/Stream/StreamManager.m | 8 +- Limelight/UIAppView.h | 11 +- Limelight/UIAppView.m | 30 ++- Limelight/UIComputerView.h | 12 +- Limelight/UIComputerView.m | 65 ++++- Limelight/Utility/Computer.h | 1 - Limelight/Utility/Computer.m | 9 - .../ViewControllers/MainFrameViewController.h | 5 +- .../ViewControllers/MainFrameViewController.m | 229 ++++++++++-------- .../StreamFrameViewController.m | 6 + iPad.storyboard | 30 +-- iPhone.storyboard | 22 +- 37 files changed, 480 insertions(+), 180 deletions(-) create mode 100644 Limelight/Images.xcassets/AddComputer.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_1x.png create mode 100644 Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_2x.png create mode 100644 Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_3x.png create mode 100644 Limelight/Images.xcassets/AddComputerIcon.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/AddComputerIcon.imageset/limelight_computer_add_icon_2x.png create mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_1x.png delete mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-1.png delete mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-2.png create mode 100644 Limelight/Images.xcassets/Computer.imageset/limelight_computer_3x.png create mode 100644 Limelight/Images.xcassets/NoAppImage.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/NoAppImage.imageset/limelight_no_app_image_2x.png create mode 100644 Limelight/Network/AppManager.h create mode 100644 Limelight/Network/AppManager.m diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index 458f187..0c12d33 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ FB8946EB19F6AFE100339C8A /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946E019F6AFB800339C8A /* libcrypto.a */; }; FB8946EC19F6AFE400339C8A /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946E119F6AFB800339C8A /* libssl.a */; }; FB8946ED19F6AFE800339C8A /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946EA19F6AFB800339C8A /* libopus.a */; }; + FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494219FC9C04002D2A60 /* AppManager.m */; }; FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E519F82297001C18A8 /* UIAppView.m */; }; FBDE86E919F82315001C18A8 /* App.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E819F82315001C18A8 /* App.m */; }; @@ -214,12 +215,14 @@ FB8946E719F6AFB800339C8A /* opus_multistream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_multistream.h; sourceTree = ""; }; FB8946E819F6AFB800339C8A /* opus_types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = opus_types.h; sourceTree = ""; }; FB8946EA19F6AFB800339C8A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; + FBD3494119FC9C04002D2A60 /* AppManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppManager.h; sourceTree = ""; }; + FBD3494219FC9C04002D2A60 /* AppManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppManager.m; sourceTree = ""; }; FBDE86DE19F7A837001C18A8 /* UIComputerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIComputerView.h; sourceTree = ""; }; FBDE86DF19F7A837001C18A8 /* UIComputerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIComputerView.m; sourceTree = ""; }; FBDE86E419F82297001C18A8 /* UIAppView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAppView.h; sourceTree = ""; }; FBDE86E519F82297001C18A8 /* UIAppView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIAppView.m; sourceTree = ""; }; - FBDE86E719F82315001C18A8 /* App.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = App.h; sourceTree = ""; }; - FBDE86E819F82315001C18A8 /* App.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = App.m; sourceTree = ""; }; + FBDE86E719F82315001C18A8 /* App.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = App.h; path = ../App.h; sourceTree = ""; }; + FBDE86E819F82315001C18A8 /* App.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = App.m; path = ../App.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -320,8 +323,6 @@ FBDE86DF19F7A837001C18A8 /* UIComputerView.m */, FBDE86E419F82297001C18A8 /* UIAppView.h */, FBDE86E519F82297001C18A8 /* UIAppView.m */, - FBDE86E719F82315001C18A8 /* App.h */, - FBDE86E819F82315001C18A8 /* App.m */, ); path = Limelight; sourceTree = ""; @@ -386,6 +387,8 @@ FB89461219F646E200339C8A /* MDNSManager.m */, FB89461319F646E200339C8A /* PairManager.h */, FB89461419F646E200339C8A /* PairManager.m */, + FBD3494119FC9C04002D2A60 /* AppManager.h */, + FBD3494219FC9C04002D2A60 /* AppManager.m */, ); path = Network; sourceTree = ""; @@ -410,6 +413,8 @@ children = ( FB89461F19F646E200339C8A /* Computer.h */, FB89462019F646E200339C8A /* Computer.m */, + FBDE86E719F82315001C18A8 /* App.h */, + FBDE86E819F82315001C18A8 /* App.m */, FB89462119F646E200339C8A /* Utils.h */, FB89462219F646E200339C8A /* Utils.m */, ); @@ -725,6 +730,7 @@ FB89462819F646E200339C8A /* CryptoManager.m in Sources */, FB89462E19F646E200339C8A /* PairManager.m in Sources */, FB290D0019B2C406004C83CF /* main.m in Sources */, + FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */, FB89462A19F646E200339C8A /* ControllerSupport.m in Sources */, FB89463119F646E200339C8A /* StreamManager.m in Sources */, ); diff --git a/Limelight/App.h b/Limelight/App.h index 31eab9d..2c35cea 100644 --- a/Limelight/App.h +++ b/Limelight/App.h @@ -10,6 +10,8 @@ @interface App : NSObject -@property NSString* displayName; +@property NSString* appId; +@property NSString* appName; +@property UIImage* appImage; @end diff --git a/Limelight/App.m b/Limelight/App.m index 2e71b67..f83476d 100644 --- a/Limelight/App.m +++ b/Limelight/App.m @@ -7,7 +7,9 @@ // #import "App.h" +#import "HttpManager.h" @implementation App +@synthesize appId, appName, appImage; @end diff --git a/Limelight/Images.xcassets/AddComputer.imageset/Contents.json b/Limelight/Images.xcassets/AddComputer.imageset/Contents.json new file mode 100644 index 0000000..142a64c --- /dev/null +++ b/Limelight/Images.xcassets/AddComputer.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "limelight_computer_add_1x.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "limelight_computer_add_2x.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "limelight_computer_add_3x.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_1x.png b/Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ae65f59ef7c99d7dec6f831aa01800094cd54278 GIT binary patch literal 11592 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 Mkx&$`6g3Y1U+yA_{{R30 literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_2x.png b/Limelight/Images.xcassets/AddComputer.imageset/limelight_computer_add_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..77eab3b927727c0762e212b2879a827e02581502 GIT binary patch literal 15646 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 b&Gj7(&A4E)y}`@@@fS+8cfr@$QWF0Km7-B> literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/Computer.imageset/Contents.json b/Limelight/Images.xcassets/Computer.imageset/Contents.json index 8b6e0cc..3a06eed 100644 --- a/Limelight/Images.xcassets/Computer.imageset/Contents.json +++ b/Limelight/Images.xcassets/Computer.imageset/Contents.json @@ -3,7 +3,7 @@ { "idiom" : "universal", "scale" : "1x", - "filename" : "limelight_computer_2x-1.png" + "filename" : "limelight_computer_1x.png" }, { "idiom" : "universal", @@ -13,7 +13,7 @@ { "idiom" : "universal", "scale" : "3x", - "filename" : "limelight_computer_2x-2.png" + "filename" : "limelight_computer_3x.png" } ], "info" : { diff --git a/Limelight/Images.xcassets/Computer.imageset/limelight_computer_1x.png b/Limelight/Images.xcassets/Computer.imageset/limelight_computer_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2e71f17acfe08b2289c24a12637bbc6bf114aa GIT binary patch literal 9502 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 literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-1.png b/Limelight/Images.xcassets/Computer.imageset/limelight_computer_2x-1.png deleted file mode 100644 index df5cde9f32bc3380e2c7ace19ca79b066f3a377d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13670 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%0Dnxw0hK&EtDCf%`^xG?nu@l*TU>D+@+Jp#g{5% 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 CtowWb diff --git a/Limelight/Images.xcassets/Computer.imageset/limelight_computer_3x.png b/Limelight/Images.xcassets/Computer.imageset/limelight_computer_3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e93d41726cde0a262426d125d527f3067cb941e3 GIT binary patch literal 22832 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%0Abpzm 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 literal 0 HcmV?d00001 diff --git a/Limelight/Network/AppManager.h b/Limelight/Network/AppManager.h new file mode 100644 index 0000000..d70b103 --- /dev/null +++ b/Limelight/Network/AppManager.h @@ -0,0 +1,23 @@ +// +// AppManager.h +// Limelight +// +// Created by Diego Waxemberg on 10/25/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import "App.h" +#import "HttpManager.h" + +@protocol AppAssetCallback + +- (void) receivedAssetForApp:(App*)app; + +@end + +@interface AppManager : NSObject + ++ (void) retrieveAppAssets:(NSArray*)apps withManager:(HttpManager*)hMan andCallback:(id)callback; + +@end diff --git a/Limelight/Network/AppManager.m b/Limelight/Network/AppManager.m new file mode 100644 index 0000000..df0c4b2 --- /dev/null +++ b/Limelight/Network/AppManager.m @@ -0,0 +1,45 @@ +// +// AppManager.m +// Limelight +// +// Created by Diego Waxemberg on 10/25/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "AppManager.h" + +@implementation AppManager { + App* _app; + HttpManager* _hMan; + id _callback; +} + ++ (void) retrieveAppAssets:(NSArray*)apps withManager:(HttpManager*)hMan andCallback:(id)callback { + for (App* app in apps) { + AppManager* manager = [[AppManager alloc] initWithApp:app httpManager:hMan andCallback:callback]; + [manager retrieveAsset]; + } + +} + +- (id) initWithApp:(App*)app httpManager:(HttpManager*)hMan andCallback:(id)callback { + self = [super init]; + _app = app; + _hMan = hMan; + _callback = callback; + return self; +} + +- (void) retrieveAsset { + NSData* appAsset = [_hMan executeRequestSynchronously:[_hMan newAppAssetRequestWithAppId:_app.appId]]; + UIImage* appImage = [UIImage imageWithData:appAsset]; + _app.appImage = appImage; + NSLog(@"App Name: %@ id:%@ image: %@", _app.appName, _app.appId, _app.appImage); + [self performSelectorOnMainThread:@selector(sendCallBack) withObject:self waitUntilDone:NO]; +} + +- (void) sendCallBack { + [_callback receivedAssetForApp:_app]; +} + +@end diff --git a/Limelight/Network/HttpManager.h b/Limelight/Network/HttpManager.h index d24f6b4..c7c4b36 100644 --- a/Limelight/Network/HttpManager.h +++ b/Limelight/Network/HttpManager.h @@ -10,6 +10,7 @@ @interface HttpManager : NSObject ++ (NSArray*) getAppListFromXML:(NSData*)xml; + (NSString*) getStringFromXML:(NSData*)xml tag:(NSString*)tag; + (NSString*) getStatusStringFromXML:(NSData*)xml; @@ -24,6 +25,7 @@ - (NSURLRequest*) newServerInfoRequest; - (NSURLRequest*) newLaunchRequest:(NSString*)appId width:(int)width height:(int)height refreshRate:(int)refreshRate rikey:(NSString*)rikey rikeyid:(int)rikeyid; - (NSURLRequest*) newResumeRequestWithRiKey:(NSString*)riKey riKeyId:(int)riKeyId; +- (NSURLRequest*) newAppAssetRequestWithAppId:(NSString*)appId; - (NSData*) executeRequestSynchronously:(NSURLRequest*)request; @end diff --git a/Limelight/Network/HttpManager.m b/Limelight/Network/HttpManager.m index 76f9a8f..3719607 100644 --- a/Limelight/Network/HttpManager.m +++ b/Limelight/Network/HttpManager.m @@ -8,6 +8,7 @@ #import "HttpManager.h" #import "CryptoManager.h" +#import "App.h" #include #include @@ -25,6 +26,60 @@ static const NSString* PORT = @"47984"; ++ (NSArray*) getAppListFromXML:(NSData*)xml { + xmlDocPtr docPtr = xmlParseMemory([xml bytes], (int)[xml length]); + + if (docPtr == NULL) { + NSLog(@"ERROR: An error occured trying to parse xml."); + return NULL; + } + + xmlNodePtr node; + xmlNodePtr rootNode = node = xmlDocGetRootElement(docPtr); + + // Check root status_code + if (![HttpManager verifyStatus: rootNode]) { + NSLog(@"ERROR: Request returned with failure status"); + return NULL; + } + + // Skip the root node + node = node->children; + + NSMutableArray* appList = [[NSMutableArray alloc] init]; + + while (node != NULL) { + NSLog(@"node: %s", node->name); + if (!xmlStrcmp(node->name, (const xmlChar*)"App")) { + xmlNodePtr appInfoNode = node->xmlChildrenNode; + NSString* appName; + NSString* appId; + while (appInfoNode != NULL) { + NSLog(@"appInfoNode: %s", appInfoNode->name); + if (!xmlStrcmp(appInfoNode->name, (const xmlChar*)"AppTitle")) { + xmlChar* nodeVal = xmlNodeListGetString(docPtr, appInfoNode->xmlChildrenNode, 1); + appName = [[NSString alloc] initWithCString:(const char*)nodeVal encoding:NSUTF8StringEncoding]; + xmlFree(nodeVal); + } else if (!xmlStrcmp(appInfoNode->name, (const xmlChar*)"ID")) { + xmlChar* nodeVal = xmlNodeListGetString(docPtr, appInfoNode->xmlChildrenNode, 1); + appId = [[NSString alloc] initWithCString:(const char*)nodeVal encoding:NSUTF8StringEncoding]; + xmlFree(nodeVal); + } + appInfoNode = appInfoNode->next; + } + App* app = [[App alloc] init]; + app.appName = appName; + app.appId = appId; + [appList addObject:app]; + } + node = node->next; + } + xmlFree(rootNode); + xmlFree(docPtr); + + return appList; +} + + (NSString*) getStatusStringFromXML:(NSData*)xml { xmlDocPtr docPtr = xmlParseMemory([xml bytes], (int)[xml length]); @@ -198,6 +253,11 @@ static const NSString* PORT = @"47984"; return [self createRequestFromString:urlString enableTimeout:FALSE]; } +- (NSURLRequest*) newAppAssetRequestWithAppId:(NSString *)appId { + NSString* urlString = [NSString stringWithFormat:@"%@/appasset?uniqueid=%@&appid=%@&AssetType=2&AssetIdx=0", _baseURL, _uniqueId, appId]; + return [self createRequestFromString:urlString enableTimeout:FALSE]; +} + - (NSString*) bytesToHex:(NSData*)data { const unsigned char* bytes = [data bytes]; NSMutableString *hex = [[NSMutableString alloc] init]; @@ -217,7 +277,11 @@ static const NSString* PORT = @"47984"; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { - _requestResp = [HttpManager fixXmlVersion:_respData]; + if ([[NSString alloc] initWithData:_respData encoding:NSUTF8StringEncoding] != nil) { + _requestResp = [HttpManager fixXmlVersion:_respData]; + } else { + _requestResp = _respData; + } dispatch_semaphore_signal(_requestLock); } diff --git a/Limelight/Network/PairManager.h b/Limelight/Network/PairManager.h index 12cd30e..0dc3f45 100644 --- a/Limelight/Network/PairManager.h +++ b/Limelight/Network/PairManager.h @@ -14,6 +14,7 @@ - (void) showPIN:(NSString*)PIN; - (void) pairSuccessful; - (void) pairFailed:(NSString*)message; +- (void) alreadyPaired; @end diff --git a/Limelight/Network/PairManager.m b/Limelight/Network/PairManager.m index b4c6488..0f72ecf 100644 --- a/Limelight/Network/PairManager.m +++ b/Limelight/Network/PairManager.m @@ -32,14 +32,13 @@ [_callback pairFailed:@"Unable to connect to PC"]; return; } - if (![[HttpManager getStringFromXML:serverInfo tag:@"currentgame"] isEqual:@"0"]) { [_callback pairFailed:@"You must stop streaming before attempting to pair."]; } else if (![[HttpManager getStringFromXML:serverInfo tag:@"PairStatus"] isEqual:@"1"]) { [self initiatePair]; } else { - [_callback pairFailed:@"This device is already paired."]; + [_callback alreadyPaired]; } } diff --git a/Limelight/Stream/StreamConfiguration.h b/Limelight/Stream/StreamConfiguration.h index 6129ed3..0490a0a 100644 --- a/Limelight/Stream/StreamConfiguration.h +++ b/Limelight/Stream/StreamConfiguration.h @@ -11,6 +11,7 @@ @interface StreamConfiguration : NSObject @property NSString* host; +@property NSString* appID; @property int hostAddr; @property int width; @property int height; diff --git a/Limelight/Stream/StreamConfiguration.m b/Limelight/Stream/StreamConfiguration.m index b2607bb..ea6ac30 100644 --- a/Limelight/Stream/StreamConfiguration.m +++ b/Limelight/Stream/StreamConfiguration.m @@ -9,5 +9,5 @@ #import "StreamConfiguration.h" @implementation StreamConfiguration -@synthesize host, hostAddr, width, height, frameRate, bitRate, riKeyId, riKey; +@synthesize host, appID, hostAddr, width, height, frameRate, bitRate, riKeyId, riKey; @end diff --git a/Limelight/Stream/StreamManager.m b/Limelight/Stream/StreamManager.m index d35d19f..bc64800 100644 --- a/Limelight/Stream/StreamManager.m +++ b/Limelight/Stream/StreamManager.m @@ -42,6 +42,7 @@ NSData* serverInfoResp = [hMan executeRequestSynchronously:[hMan newServerInfoRequest]]; NSString* currentGame = [HttpManager getStringFromXML:serverInfoResp tag:@"currentgame"]; NSString* pairStatus = [HttpManager getStringFromXML:serverInfoResp tag:@"PairStatus"]; + NSString* currentClient = [HttpManager getStringFromXML:serverInfoResp tag:@"CurrentClient"]; if (currentGame == NULL || pairStatus == NULL) { [_callbacks launchFailed:@"Failed to connect to PC"]; return; @@ -55,6 +56,11 @@ // resumeApp and launchApp handle calling launchFailed if (![currentGame isEqualToString:@"0"]) { + if (![currentClient isEqualToString:@"1"]) { + // The server is streaming to someone else + [_callbacks launchFailed:@"There is another stream in progress"]; + return; + } // App already running, resume it if (![self resumeApp:hMan]) { return; @@ -79,7 +85,7 @@ - (BOOL) launchApp:(HttpManager*)hMan { NSData* launchResp = [hMan executeRequestSynchronously: - [hMan newLaunchRequest:@"67339056" + [hMan newLaunchRequest:_config.appID width:_config.width height:_config.height refreshRate:_config.frameRate diff --git a/Limelight/UIAppView.h b/Limelight/UIAppView.h index a184b1d..9b202d5 100644 --- a/Limelight/UIAppView.h +++ b/Limelight/UIAppView.h @@ -9,8 +9,15 @@ #import #import "App.h" -@interface UIAppView : UIView +@protocol AppCallback -- (id) initWithApp:(App*)app; +- (void) appClicked:(App*) app; + +@end + +@interface UIAppView : UIView + +- (id) initWithApp:(App*)app andCallback:(id)callback; +- (void) updateAppImage; @end diff --git a/Limelight/UIAppView.m b/Limelight/UIAppView.m index 1d2ea6e..645d65d 100644 --- a/Limelight/UIAppView.m +++ b/Limelight/UIAppView.m @@ -12,32 +12,54 @@ App* _app; UIButton* _appButton; UILabel* _appLabel; + id _callback; } static int LABEL_DY = 20; -- (id) initWithApp:(App*)app { +- (id) initWithApp:(App*)app andCallback:(id)callback { self = [super init]; _app = app; + _callback = callback; _appButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_appButton setContentEdgeInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; - [_appButton setBackgroundImage:[[UIImage imageNamed:@"Left4Dead2"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal]; + [_appButton setBackgroundImage:[UIImage imageNamed:@"NoAppImage"] forState:UIControlStateNormal]; [_appButton sizeToFit]; + [_appButton addTarget:self action:@selector(appClicked) forControlEvents:UIControlEventTouchUpInside]; + _appButton.layer.shadowColor = [[UIColor blackColor] CGColor]; + _appButton.layer.shadowOffset = CGSizeMake(5,8); + _appButton.layer.shadowOpacity = 0.7; _appLabel = [[UILabel alloc] init]; - [_appLabel setText:_app.displayName]; + [_appLabel setText:_app.appName]; [_appLabel sizeToFit]; _appLabel.center = CGPointMake(_appButton.bounds.origin.x + (_appButton.bounds.size.width / 2), _appButton.bounds.origin.y + _appButton.bounds.size.height + LABEL_DY); + [self updateBounds]; [self addSubview:_appButton]; [self addSubview:_appLabel]; - self.frame = CGRectMake(0, 0, _appButton.frame.size.width > _appLabel.frame.size.width ? _appButton.frame.size.width : _appLabel.frame.size.width, _appButton.frame.size.height + _appLabel.frame.size.height); return self; } +- (void) updateBounds { + float x = _appButton.frame.origin.x < _appLabel.frame.origin.x ? _appButton.frame.origin.x : _appLabel.frame.origin.x; + float y = _appButton.frame.origin.y < _appLabel.frame.origin.y ? _appButton.frame.origin.y : _appLabel.frame.origin.y; + self.bounds = CGRectMake(x , y, _appButton.frame.size.width > _appLabel.frame.size.width ? _appButton.frame.size.width : _appLabel.frame.size.width, _appButton.frame.size.height + _appLabel.frame.size.height + LABEL_DY / 2); + self.frame = CGRectMake(x , y, _appButton.frame.size.width > _appLabel.frame.size.width ? _appButton.frame.size.width : _appLabel.frame.size.width, _appButton.frame.size.height + _appLabel.frame.size.height + LABEL_DY / 2); +} +- (void) appClicked { + [_callback appClicked:_app]; +} + +- (void) updateAppImage { + if (_app.appImage != nil) { + [_appButton setBackgroundImage:_app.appImage forState:UIControlStateNormal]; + [self setNeedsDisplay]; + } +} /* // Only override drawRect: if you perform custom drawing. diff --git a/Limelight/UIComputerView.h b/Limelight/UIComputerView.h index c603bd0..74b282a 100644 --- a/Limelight/UIComputerView.h +++ b/Limelight/UIComputerView.h @@ -9,8 +9,16 @@ #import #import "Computer.h" -@interface UIComputerView : UIView +@protocol HostCallback -- (id) initWithComputer:(Computer*)computer; +- (void) hostClicked:(Computer*)computer; +- (void) addHostClicked; + +@end + +@interface UIComputerView : UIView + +- (id) initWithComputer:(Computer*)computer andCallback:(id)callback; +- (id) initForAddWithCallback:(id)callback; @end diff --git a/Limelight/UIComputerView.m b/Limelight/UIComputerView.m index 0efb111..b97b91e 100644 --- a/Limelight/UIComputerView.m +++ b/Limelight/UIComputerView.m @@ -12,31 +12,82 @@ Computer* _computer; UIButton* _hostButton; UILabel* _hostLabel; + id _callback; + CGSize _labelSize; } static int LABEL_DY = 20; -- (id) initWithComputer:(Computer*)computer { +- (id) init { self = [super init]; - _computer = computer; - _hostButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_hostButton setContentEdgeInsets:UIEdgeInsetsMake(0, 4, 0, 4)]; - [_hostButton setBackgroundImage:[[UIImage imageNamed:@"Computer"] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)] forState:UIControlStateNormal]; + [_hostButton setBackgroundImage:[UIImage imageNamed:@"Computer"] forState:UIControlStateNormal]; [_hostButton sizeToFit]; + _hostButton.layer.shadowColor = [[UIColor blackColor] CGColor]; + _hostButton.layer.shadowOffset = CGSizeMake(5,8); + _hostButton.layer.shadowOpacity = 0.7; + _hostLabel = [[UILabel alloc] init]; + + return self; +} + +- (id) initWithComputer:(Computer*)computer andCallback:(id)callback { + self = [self init]; + _computer = computer; + _callback = callback; + [_hostLabel setText:[_computer displayName]]; [_hostLabel sizeToFit]; - _hostLabel.center = CGPointMake(_hostButton.bounds.origin.x + (_hostButton.bounds.size.width / 2), _hostButton.bounds.origin.y + _hostButton.bounds.size.height + LABEL_DY); - + [_hostButton addTarget:self action:@selector(hostClicked) forControlEvents:UIControlEventTouchUpInside]; + _hostLabel.center = CGPointMake(_hostButton.frame.origin.x + (_hostButton.frame.size.width / 2), _hostButton.frame.origin.y + _hostButton.frame.size.height + LABEL_DY); + [self updateBounds]; [self addSubview:_hostButton]; [self addSubview:_hostLabel]; - self.frame = CGRectMake(0, 0, _hostButton.frame.size.width > _hostLabel.frame.size.width ? _hostButton.frame.size.width : _hostLabel.frame.size.width, _hostButton.frame.size.height + _hostLabel.frame.size.height); + return self; +} + +- (void) updateBounds { + float x = _hostButton.frame.origin.x < _hostLabel.frame.origin.x ? _hostButton.frame.origin.x : _hostLabel.frame.origin.x; + float y = _hostButton.frame.origin.y < _hostLabel.frame.origin.y ? _hostButton.frame.origin.y : _hostLabel.frame.origin.y; + self.bounds = CGRectMake(x , y, _hostButton.frame.size.width > _hostLabel.frame.size.width ? _hostButton.frame.size.width : _hostLabel.frame.size.width, _hostButton.frame.size.height + _hostLabel.frame.size.height + LABEL_DY / 2); + self.frame = CGRectMake(x , y, _hostButton.frame.size.width > _hostLabel.frame.size.width ? _hostButton.frame.size.width : _hostLabel.frame.size.width, _hostButton.frame.size.height + _hostLabel.frame.size.height + LABEL_DY / 2); +} + +- (id) initForAddWithCallback:(id)callback { + self = [self init]; + _callback = callback; + + [_hostButton setBackgroundImage:[UIImage imageNamed:@"Computer"] forState:UIControlStateNormal]; + [_hostButton sizeToFit]; + [_hostButton addTarget:self action:@selector(addClicked) forControlEvents:UIControlEventTouchUpInside]; + + [_hostLabel setText:@"Add Host"]; + [_hostLabel sizeToFit]; + _hostLabel.center = CGPointMake(_hostButton.frame.origin.x + (_hostButton.frame.size.width / 2), _hostButton.frame.origin.y + _hostButton.frame.size.height + LABEL_DY); + + UIImageView* addIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"AddComputerIcon"]]; + [addIcon sizeToFit]; + addIcon.center = CGPointMake(_hostButton.frame.origin.x + _hostButton.frame.size.width, _hostButton.frame.origin.y); + + [self updateBounds]; + [self addSubview:_hostButton]; + [self addSubview:_hostLabel]; + [self addSubview:addIcon]; return self; } +- (void) hostClicked { + [_callback hostClicked:_computer]; +} + +- (void) addClicked { + [_callback addHostClicked]; +} + /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. diff --git a/Limelight/Utility/Computer.h b/Limelight/Utility/Computer.h index dc0058c..854a3dd 100644 --- a/Limelight/Utility/Computer.h +++ b/Limelight/Utility/Computer.h @@ -15,6 +15,5 @@ - (id) initWithHost:(NSNetService*)host; - (id) initWithIp:(NSString*)host; -- (id) initPlaceholder; @end diff --git a/Limelight/Utility/Computer.m b/Limelight/Utility/Computer.m index fa8deb9..6a7cb22 100644 --- a/Limelight/Utility/Computer.m +++ b/Limelight/Utility/Computer.m @@ -28,13 +28,4 @@ return self; } -- (id) initPlaceholder { - self = [super init]; - - self.hostName = NULL; - self.displayName = @"No computers found"; - - return self; -} - @end diff --git a/Limelight/ViewControllers/MainFrameViewController.h b/Limelight/ViewControllers/MainFrameViewController.h index 7265ca9..70e106e 100644 --- a/Limelight/ViewControllers/MainFrameViewController.h +++ b/Limelight/ViewControllers/MainFrameViewController.h @@ -10,8 +10,11 @@ #import "MDNSManager.h" #import "PairManager.h" #import "StreamConfiguration.h" +#import "UIComputerView.h" +#import "UIAppView.h" +#import "AppManager.h" -@interface MainFrameViewController : UIViewController +@interface MainFrameViewController : UIViewController + (StreamConfiguration*) getStreamConfiguration; diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index 1ebcd91..328b0f1 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -1,4 +1,3 @@ - // MainFrameViewController.m // Limelight-iOS // @@ -22,45 +21,21 @@ NSOperationQueue* _opQueue; MDNSManager* _mDNSManager; Computer* _selectedHost; + NSString* _uniqueId; + NSData* _cert; + UIAlertView* _pairAlert; + UIScrollView* hostScrollView; + UIScrollView* appScrollView; } +static NSString* deviceName = @"roth"; +static NSMutableSet* hostList; static StreamConfiguration* streamConfig; + (StreamConfiguration*) getStreamConfiguration { return streamConfig; } -//TODO: no more pair button -/* -- (void)PairButton:(UIButton *)sender -{ - NSLog(@"Pair Button Pressed!"); - if ([self.hostTextField.text length] > 0) { - _selectedHost = [[Computer alloc] initWithIp:self.hostTextField.text]; - NSLog(@"Using custom host: %@", self.hostTextField.text); - } - - if (![self validatePcSelected]) { - NSLog(@"No valid PC selected"); - return; - } - - [CryptoManager generateKeyPairUsingSSl]; - NSString* uniqueId = [CryptoManager getUniqueID]; - NSData* cert = [CryptoManager readCertFromFile]; - - if ([Utils resolveHost:_selectedHost.hostName] == 0) { - [self displayDnsFailedDialog]; - return; - } - - HttpManager* hMan = [[HttpManager alloc] initWithHost:_selectedHost.hostName uniqueId:uniqueId deviceName:@"roth" cert:cert]; - PairManager* pMan = [[PairManager alloc] initWithManager:hMan andCert:cert callback:self]; - - [_opQueue addOperation:pMan]; -} -*/ - - (void)showPIN:(NSString *)PIN { dispatch_sync(dispatch_get_main_queue(), ^{ _pairAlert = [[UIAlertView alloc] initWithTitle:@"Pairing" message:[NSString stringWithFormat:@"Enter the following PIN on the host machine: %@", PIN]delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; @@ -84,6 +59,26 @@ static StreamConfiguration* streamConfig; }); } +- (void)alreadyPaired { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + HttpManager* hMan = [[HttpManager alloc] initWithHost:_selectedHost.hostName uniqueId:_uniqueId deviceName:deviceName cert:_cert]; + NSData* appListResp = [hMan executeRequestSynchronously:[hMan newAppListRequest]]; + NSArray* appList = [HttpManager getAppListFromXML:appListResp]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self updateApps:appList]; + }); + [AppManager retrieveAppAssets:appList withManager:hMan andCallback:self]; + }); +} + +- (void) receivedAssetForApp:(App*)app { + NSArray* subviews = [appScrollView subviews]; + for (UIAppView* appView in subviews) { + [appView updateAppImage]; + } +} + - (void)displayDnsFailedDialog { UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Network Error" message:@"Failed to resolve host." @@ -92,31 +87,55 @@ static StreamConfiguration* streamConfig; [self presentViewController:alert animated:YES completion:nil]; } -//TODO: No more stream button -/* -- (void)StreamButton:(UIButton *)sender -{ - NSLog(@"Stream Button Pressed!"); - - if ([self.hostTextField.text length] > 0) { - _selectedHost = [[Computer alloc] initWithIp:self.hostTextField.text]; - NSLog(@"Using custom host: %@", self.hostTextField.text); - } - - if (![self validatePcSelected]) { - NSLog(@"No valid PC selected"); - return; - } - +- (void) hostClicked:(Computer *)computer { + NSLog(@"Clicked host: %@", computer.displayName); + _selectedHost = computer; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + HttpManager* hMan = [[HttpManager alloc] initWithHost:computer.hostName uniqueId:_uniqueId deviceName:deviceName cert:_cert]; + NSData* serverInfoResp = [hMan executeRequestSynchronously:[hMan newServerInfoRequest]]; + if ([[HttpManager getStringFromXML:serverInfoResp tag:@"PairStatus"] isEqualToString:@"1"]) { + NSLog(@"Already Paired"); + [self alreadyPaired]; + } else { + NSLog(@"Trying to pair"); + PairManager* pMan = [[PairManager alloc] initWithManager:hMan andCert:_cert callback:self]; + [_opQueue addOperation:pMan]; + } + }); +} + +- (void) addHostClicked { + NSLog(@"Clicked add host"); + UIAlertController* alertController = [UIAlertController alertControllerWithTitle:@"Host Address" message:@"Please enter a hostname or IP address" preferredStyle:UIAlertControllerStyleAlert]; + [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; + [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction* action){ + NSString* host = ((UITextField*)[[alertController textFields] objectAtIndex:0]).text; + Computer* newHost = [[Computer alloc] initWithIp:host]; + [hostList addObject:newHost]; + [self updateHosts:[hostList allObjects]]; + + + //TODO: get pair state + + + }]]; + [alertController addTextFieldWithConfigurationHandler:nil]; + [self presentViewController:alertController animated:YES completion:nil]; +} + +- (void) appClicked:(App *)app { + NSLog(@"Clicked app: %@", app.appName); streamConfig = [[StreamConfiguration alloc] init]; streamConfig.host = _selectedHost.hostName; streamConfig.hostAddr = [Utils resolveHost:_selectedHost.hostName]; + streamConfig.appID = app.appId; if (streamConfig.hostAddr == 0) { [self displayDnsFailedDialog]; return; } - unsigned long selectedConf = [self.StreamConfigs selectedRowInComponent:0]; + // TODO: actually allow the user to choose the config + unsigned long selectedConf = 1; NSLog(@"selectedConf: %ld", selectedConf); switch (selectedConf) { case 0: @@ -148,19 +167,6 @@ static StreamConfiguration* streamConfig; NSLog(@"StreamConfig: %@, %d, %dx%dx%d at %d Mbps", streamConfig.host, streamConfig.hostAddr, streamConfig.width, streamConfig.height, streamConfig.frameRate, streamConfig.bitRate); [self performSegueWithIdentifier:@"createStreamFrame" sender:self]; } -*/ - -/* -- (void)setSelectedHost:(NSInteger)selectedIndex -{ - _selectedHost = (Computer*)([self.hostPickerVals objectAtIndex:selectedIndex]); - if (_selectedHost.hostName == NULL) { - // This must be the placeholder computer - _selectedHost = NULL; - } -} -*/ - - (void)viewDidLoad { @@ -169,68 +175,91 @@ static StreamConfiguration* streamConfig; NSArray* streamConfigVals = [[NSArray alloc] initWithObjects:@"1280x720 (30Hz)", @"1280x720 (60Hz)", @"1920x1080 (30Hz)", @"1920x1080 (60Hz)",nil]; _opQueue = [[NSOperationQueue alloc] init]; + [CryptoManager generateKeyPairUsingSSl]; + _uniqueId = [CryptoManager getUniqueID]; + _cert = [CryptoManager readCertFromFile]; // Initialize the host picker list - //[self updateHosts:[[NSArray alloc] init]]; + if (hostList == nil) { + hostList = [[NSMutableSet alloc] init]; + } - Computer* test = [[Computer alloc] initWithIp:@"CEMENT-TRUCK"]; - - - UIScrollView* hostScrollView = [[UIScrollView alloc] init]; + hostScrollView = [[UIScrollView alloc] init]; hostScrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2); [hostScrollView setShowsHorizontalScrollIndicator:NO]; - UIComputerView* compView; - for (int i = 0; i < 5; i++) { - compView = [[UIComputerView alloc] initWithComputer:test]; - [hostScrollView addSubview:compView]; - [compView sizeToFit]; - compView.center = CGPointMake((compView.frame.size.width + 20) * i + compView.frame.size.width, hostScrollView.frame.size.height / 2); - - } - - [hostScrollView setContentSize:CGSizeMake(compView.frame.size.width * 5 + compView.frame.size.width, hostScrollView.frame.size.height)]; - - UIScrollView* appScrollView = [[UIScrollView alloc] init]; + appScrollView = [[UIScrollView alloc] init]; appScrollView.frame = CGRectMake(0, hostScrollView.frame.size.height, self.view.frame.size.width, self.view.frame.size.height / 2); [appScrollView setShowsHorizontalScrollIndicator:NO]; - - - App* testApp = [[App alloc] init]; - testApp.displayName = @"Left 4 Dead 2"; - UIAppView* appView; - for (int i = 0; i < 5; i++) { - appView = [[UIAppView alloc] initWithApp:testApp]; - [appScrollView addSubview:appView]; - [appView sizeToFit]; - appView.center = CGPointMake((appView.frame.size.width + 20) * i + compView.frame.size.width, appScrollView.frame.size.height / 2); - } - - [appScrollView setContentSize:CGSizeMake(appView.frame.size.width * 5 + appView.frame.size.width, appScrollView.frame.size.height)]; - + + [self updateHosts:[hostList allObjects]]; [self.view addSubview:hostScrollView]; [self.view addSubview:appScrollView]; - } - (void)viewDidAppear:(BOOL)animated { [super viewDidDisappear:animated]; - //_mDNSManager = [[MDNSManager alloc] initWithCallback:self]; - // [_mDNSManager searchForHosts]; + _mDNSManager = [[MDNSManager alloc] initWithCallback:self]; + [_mDNSManager searchForHosts]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; - // [_mDNSManager stopSearching]; + [_mDNSManager stopSearching]; } - (void)updateHosts:(NSArray *)hosts { - NSMutableArray *hostPickerValues = [[NSMutableArray alloc] initWithArray:hosts]; + [hostList addObjectsFromArray:hosts]; + [[hostScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; + UIComputerView* addComp = [[UIComputerView alloc] initForAddWithCallback:self]; + UIComputerView* compView; + float prevEdge = -1; + for (Computer* comp in hostList) { + compView = [[UIComputerView alloc] initWithComputer:comp andCallback:self]; + compView.center = CGPointMake([self getCompViewX:compView addComp:addComp prevEdge:prevEdge], hostScrollView.frame.size.height / 2); + prevEdge = compView.frame.origin.x + compView.frame.size.width; + [hostScrollView addSubview:compView]; + } - if ([hostPickerValues count] == 0) { - [hostPickerValues addObject:[[Computer alloc] initPlaceholder]]; + prevEdge = [self getCompViewX:addComp addComp:addComp prevEdge:prevEdge]; + addComp.center = CGPointMake(prevEdge, hostScrollView.frame.size.height / 2); + + [hostScrollView addSubview:addComp]; + [hostScrollView setContentSize:CGSizeMake(prevEdge + addComp.frame.size.width, hostScrollView.frame.size.height)]; +} + +- (float) getCompViewX:(UIComputerView*)comp addComp:(UIComputerView*)addComp prevEdge:(float)prevEdge { + if (prevEdge == -1) { + return hostScrollView.frame.origin.x + comp.frame.size.width / 2 + addComp.frame.size.width / 2; + } else { + return prevEdge + addComp.frame.size.width / 2 + comp.frame.size.width / 2; + } +} + +- (void) updateApps:(NSArray*)apps { + [[appScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; + App* fakeApp = [[App alloc] init]; + fakeApp.appName = @"No App Name"; + UIAppView* noAppImage = [[UIAppView alloc] initWithApp:fakeApp andCallback:nil]; + float prevEdge = -1; + UIAppView* appView; + for (App* app in apps) { + appView = [[UIAppView alloc] initWithApp:app andCallback:self]; + prevEdge = [self getAppViewX:appView noApp:noAppImage prevEdge:prevEdge]; + appView.center = CGPointMake(prevEdge, appScrollView.frame.size.height / 2); + prevEdge = appView.frame.origin.x + appView.frame.size.width; + [appScrollView addSubview:appView]; + } + [appScrollView setContentSize:CGSizeMake(prevEdge + noAppImage.frame.size.width, appScrollView.frame.size.height)]; +} + +- (float) getAppViewX:(UIAppView*)app noApp:(UIAppView*)noAppImage prevEdge:(float)prevEdge { + if (prevEdge == -1) { + return appScrollView.frame.origin.x + app.frame.size.width / 2 + noAppImage.frame.size.width / 2; + } else { + return prevEdge + app.frame.size.width / 2 + noAppImage.frame.size.width / 2; } } diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index e05aec0..0331ee3 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -26,6 +26,8 @@ [super viewDidLoad]; [self.stageLabel setText:@"Starting App"]; + [self.stageLabel sizeToFit]; + self.stageLabel.center = CGPointMake(self.view.frame.size.width / 2, self.stageLabel.center.y); [UIApplication sharedApplication].idleTimerDisabled = YES; @@ -53,6 +55,8 @@ dispatch_async(dispatch_get_main_queue(), ^{ [self.spinner stopAnimating]; [self.stageLabel setText:@"Waiting for first frame..."]; + [self.stageLabel sizeToFit]; + self.stageLabel.center = CGPointMake(self.view.frame.size.width / 2, self.stageLabel.center.y); }); } @@ -74,6 +78,8 @@ NSString* lowerCase = [NSString stringWithFormat:@"%s in progress...", stageName]; NSString* titleCase = [[[lowerCase substringToIndex:1] uppercaseString] stringByAppendingString:[lowerCase substringFromIndex:1]]; [self.stageLabel setText:titleCase]; + [self.stageLabel sizeToFit]; + self.stageLabel.center = CGPointMake(self.view.frame.size.width / 2, self.stageLabel.center.y); }); } diff --git a/iPad.storyboard b/iPad.storyboard index eb77d96..37d9a06 100644 --- a/iPad.storyboard +++ b/iPad.storyboard @@ -1,5 +1,5 @@ - + @@ -8,21 +8,9 @@ - - - - - - - @@ -38,31 +26,23 @@ - - - - - + + - - - - - - - diff --git a/iPhone.storyboard b/iPhone.storyboard index 098b0cc..efe9f1d 100644 --- a/iPhone.storyboard +++ b/iPhone.storyboard @@ -1,5 +1,5 @@ - + @@ -8,10 +8,6 @@ - - - - @@ -32,31 +28,23 @@ - - - - - + + - - - - - - - From 77b6d304f7bf9f71885de2b321d1ec206ebd1345 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Wed, 29 Oct 2014 00:47:51 -0400 Subject: [PATCH 3/7] added settings menu and persistent storage for settings --- Limelight.xcodeproj/project.pbxproj | 40 + Limelight/AppDelegate.h | 1 + Limelight/AppDelegate.m | 6 +- Limelight/Database/DataManager.h | 22 + Limelight/Database/DataManager.m | 65 + Limelight/Database/Hosts.h | 18 + Limelight/Database/Hosts.m | 17 + Limelight/Database/Settings.h | 20 + Limelight/Database/Settings.m | 19 + .../Left4Dead2.imageset/Left4Dead2-1.jpg | Bin 31418 -> 0 bytes .../Left4Dead2.imageset/Left4Dead2-2.jpg | Bin 31418 -> 0 bytes .../Left4Dead2.imageset/Left4Dead2.jpg | Bin 31418 -> 0 bytes .../Contents.json | 8 +- .../Settings.imageset/settings_2x.png | Bin 0 -> 2764 bytes .../Limelight.xcdatamodel/contents | 17 +- .../ViewControllers/MainFrameViewController.h | 4 +- .../ViewControllers/MainFrameViewController.m | 76 +- .../ViewControllers/SWRevealViewController.h | 418 ++++ .../ViewControllers/SWRevealViewController.m | 1897 +++++++++++++++++ .../ViewControllers/SettingsViewController.h | 20 + .../ViewControllers/SettingsViewController.m | 64 + .../StreamFrameViewController.m | 14 +- iPad.storyboard | 13 + iPhone.storyboard | 120 +- 24 files changed, 2803 insertions(+), 56 deletions(-) create mode 100644 Limelight/Database/DataManager.h create mode 100644 Limelight/Database/DataManager.m create mode 100644 Limelight/Database/Hosts.h create mode 100644 Limelight/Database/Hosts.m create mode 100644 Limelight/Database/Settings.h create mode 100644 Limelight/Database/Settings.m delete mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2-1.jpg delete mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2-2.jpg delete mode 100644 Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2.jpg rename Limelight/Images.xcassets/{Left4Dead2.imageset => Settings.imageset}/Contents.json (59%) create mode 100644 Limelight/Images.xcassets/Settings.imageset/settings_2x.png create mode 100755 Limelight/ViewControllers/SWRevealViewController.h create mode 100755 Limelight/ViewControllers/SWRevealViewController.m create mode 100644 Limelight/ViewControllers/SettingsViewController.h create mode 100644 Limelight/ViewControllers/SettingsViewController.m diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index 0c12d33..2d7ee76 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -48,6 +48,11 @@ FB8946EC19F6AFE400339C8A /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946E119F6AFB800339C8A /* libssl.a */; }; FB8946ED19F6AFE800339C8A /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FB8946EA19F6AFB800339C8A /* libopus.a */; }; FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494219FC9C04002D2A60 /* AppManager.m */; }; + FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494F19FF2174002D2A60 /* SettingsViewController.m */; }; + FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */; }; + FBD3495B1A004411002D2A60 /* Hosts.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495A1A004411002D2A60 /* Hosts.m */; }; + FBD3495E1A004412002D2A60 /* Settings.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495D1A004412002D2A60 /* Settings.m */; }; + FBD349621A0089F6002D2A60 /* DataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD349611A0089F6002D2A60 /* DataManager.m */; }; FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E519F82297001C18A8 /* UIAppView.m */; }; FBDE86E919F82315001C18A8 /* App.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86E819F82315001C18A8 /* App.m */; }; @@ -217,6 +222,17 @@ FB8946EA19F6AFB800339C8A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libopus.a; sourceTree = ""; }; FBD3494119FC9C04002D2A60 /* AppManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppManager.h; sourceTree = ""; }; FBD3494219FC9C04002D2A60 /* AppManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppManager.m; sourceTree = ""; }; + FBD3494E19FF2174002D2A60 /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; + FBD3494F19FF2174002D2A60 /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; + FBD3495119FF36FB002D2A60 /* SWRevealViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWRevealViewController.h; sourceTree = ""; }; + FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWRevealViewController.m; sourceTree = ""; }; + FBD349571A003F05002D2A60 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; + FBD349591A004411002D2A60 /* Hosts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Hosts.h; path = Database/Hosts.h; sourceTree = ""; }; + FBD3495A1A004411002D2A60 /* Hosts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Hosts.m; path = Database/Hosts.m; sourceTree = ""; }; + FBD3495C1A004412002D2A60 /* Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Settings.h; path = Database/Settings.h; sourceTree = ""; }; + FBD3495D1A004412002D2A60 /* Settings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Settings.m; path = Database/Settings.m; sourceTree = ""; }; + FBD349601A0089F6002D2A60 /* DataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DataManager.h; path = Database/DataManager.h; sourceTree = ""; }; + FBD349611A0089F6002D2A60 /* DataManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DataManager.m; path = Database/DataManager.m; sourceTree = ""; }; FBDE86DE19F7A837001C18A8 /* UIComputerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIComputerView.h; sourceTree = ""; }; FBDE86DF19F7A837001C18A8 /* UIComputerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIComputerView.m; sourceTree = ""; }; FBDE86E419F82297001C18A8 /* UIAppView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIAppView.h; sourceTree = ""; }; @@ -289,6 +305,7 @@ FB290CF019B2C406004C83CF /* Frameworks */ = { isa = PBXGroup; children = ( + FBD349571A003F05002D2A60 /* libsqlite3.dylib */, FB89468F19F6AFB800339C8A /* libs */, FB7E794319C8B71B00A15F68 /* libiconv.dylib */, FB290DC319B2E98F004C83CF /* libxml2.dylib */, @@ -311,6 +328,7 @@ FB89461519F646E200339C8A /* Stream */, FB89461E19F646E200339C8A /* Utility */, FB89462319F646E200339C8A /* ViewControllers */, + FBD3495F1A004453002D2A60 /* Database */, FB290CFA19B2C406004C83CF /* Supporting Files */, FB290D0219B2C406004C83CF /* AppDelegate.h */, FB290D0319B2C406004C83CF /* AppDelegate.m */, @@ -424,10 +442,14 @@ FB89462319F646E200339C8A /* ViewControllers */ = { isa = PBXGroup; children = ( + FBD3495119FF36FB002D2A60 /* SWRevealViewController.h */, + FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */, FB89462419F646E200339C8A /* MainFrameViewController.h */, FB89462519F646E200339C8A /* MainFrameViewController.m */, FB89462619F646E200339C8A /* StreamFrameViewController.h */, FB89462719F646E200339C8A /* StreamFrameViewController.m */, + FBD3494E19FF2174002D2A60 /* SettingsViewController.h */, + FBD3494F19FF2174002D2A60 /* SettingsViewController.m */, ); path = ViewControllers; sourceTree = ""; @@ -593,6 +615,19 @@ path = lib; sourceTree = ""; }; + FBD3495F1A004453002D2A60 /* Database */ = { + isa = PBXGroup; + children = ( + FBD3495C1A004412002D2A60 /* Settings.h */, + FBD3495D1A004412002D2A60 /* Settings.m */, + FBD349591A004411002D2A60 /* Hosts.h */, + FBD3495A1A004411002D2A60 /* Hosts.m */, + FBD349601A0089F6002D2A60 /* DataManager.h */, + FBD349611A0089F6002D2A60 /* DataManager.m */, + ); + name = Database; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -713,6 +748,7 @@ files = ( FB290D0719B2C406004C83CF /* Limelight.xcdatamodeld in Sources */, FB89463219F646E200339C8A /* VideoDecoderRenderer.m in Sources */, + FBD3495E1A004412002D2A60 /* Settings.m in Sources */, FB290D0419B2C406004C83CF /* AppDelegate.m in Sources */, FB89463419F646E200339C8A /* Utils.m in Sources */, FBDE86E619F82297001C18A8 /* UIAppView.m in Sources */, @@ -722,9 +758,12 @@ FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */, FBDE86E919F82315001C18A8 /* App.m in Sources */, FB89463019F646E200339C8A /* StreamConfiguration.m in Sources */, + FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */, + FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */, FB89462C19F646E200339C8A /* HttpManager.m in Sources */, FB89462D19F646E200339C8A /* MDNSManager.m in Sources */, FB89462B19F646E200339C8A /* StreamView.m in Sources */, + FBD3495B1A004411002D2A60 /* Hosts.m in Sources */, FB89463519F646E200339C8A /* MainFrameViewController.m in Sources */, FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */, FB89462819F646E200339C8A /* CryptoManager.m in Sources */, @@ -732,6 +771,7 @@ FB290D0019B2C406004C83CF /* main.m in Sources */, FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */, FB89462A19F646E200339C8A /* ControllerSupport.m in Sources */, + FBD349621A0089F6002D2A60 /* DataManager.m in Sources */, FB89463119F646E200339C8A /* StreamManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Limelight/AppDelegate.h b/Limelight/AppDelegate.h index 3e323b4..8d06c52 100644 --- a/Limelight/AppDelegate.h +++ b/Limelight/AppDelegate.h @@ -18,5 +18,6 @@ - (void)saveContext; - (NSURL *)applicationDocumentsDirectory; +- (NSURL*) getStoreURL; @end diff --git a/Limelight/AppDelegate.m b/Limelight/AppDelegate.m index 680aa5f..18fabba 100644 --- a/Limelight/AppDelegate.m +++ b/Limelight/AppDelegate.m @@ -100,7 +100,7 @@ static NSOperationQueue* mainQueue; return _persistentStoreCoordinator; } - NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Limelight_iOS.sqlite"]; + NSURL *storeURL = [self getStoreURL]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; @@ -143,4 +143,8 @@ static NSOperationQueue* mainQueue; return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; } +- (NSURL*) getStoreURL { + return [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Limelight_iOS.sqlite"]; +} + @end diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h new file mode 100644 index 0000000..3a193be --- /dev/null +++ b/Limelight/Database/DataManager.h @@ -0,0 +1,22 @@ +// +// DataManager.h +// Limelight +// +// Created by Diego Waxemberg on 10/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import "Settings.h" +#import "AppDelegate.h" +#import "Hosts.h" + +@interface DataManager : NSObject + +@property (strong, nonatomic) AppDelegate* appDelegate; + +- (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width; +- (Settings*) retrieveSettings; + + +@end diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m new file mode 100644 index 0000000..1613022 --- /dev/null +++ b/Limelight/Database/DataManager.m @@ -0,0 +1,65 @@ +// +// DataManager.m +// Limelight +// +// Created by Diego Waxemberg on 10/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "DataManager.h" + +@implementation DataManager +static NSInteger DEFAULT_BITRATE = 10000; +static NSInteger DEFAULT_FRAMERATE = 60; +static NSInteger DEFAULT_HEIGHT = 720; +static NSInteger DEFAULT_WIDTH = 1280; + +- (id) init { + self = [super init]; + self.appDelegate = [[UIApplication sharedApplication] delegate]; + return self; +} + +- (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width { + Settings* settingsToSave = [self retrieveSettings]; + settingsToSave.framerate = [NSNumber numberWithInteger:framerate]; + settingsToSave.bitrate = [NSNumber numberWithInteger:bitrate]; + settingsToSave.height = [NSNumber numberWithInteger:height]; + settingsToSave.width = [NSNumber numberWithInteger:width]; + [self saveSettings:settingsToSave]; +} + +- (Settings*) retrieveSettings { + NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription* entity = [NSEntityDescription entityForName:@"Settings" inManagedObjectContext:[self.appDelegate managedObjectContext]]; + [fetchRequest setEntity:entity]; + [fetchRequest setAffectedStores:[NSArray arrayWithObjects:[[self.appDelegate persistentStoreCoordinator] persistentStoreForURL:[self.appDelegate getStoreURL]], nil]]; + + NSError* error; + NSArray* fetchedRecords = [[self.appDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&error]; + + if (fetchedRecords.count == 0) { + // create a new settings object with the default values + Settings* settings = [[Settings alloc] initWithEntity:entity insertIntoManagedObjectContext:[self.appDelegate managedObjectContext]]; + settings.framerate = [NSNumber numberWithInteger:DEFAULT_FRAMERATE]; + settings.bitrate = [NSNumber numberWithInteger:DEFAULT_BITRATE]; + settings.height = [NSNumber numberWithInteger:DEFAULT_HEIGHT]; + settings.width = [NSNumber numberWithInteger:DEFAULT_WIDTH]; + return settings; + } else { + // we should only ever have 1 settings object stored + return [fetchedRecords objectAtIndex:0]; + } +} + +- (void) saveSettings:(Settings*)settings { + NSError* error; + if (![[self.appDelegate managedObjectContext] save:&error]) { + NSLog(@"ERROR: Unable to save settings to database"); + } + + [self.appDelegate saveContext]; +} + + +@end diff --git a/Limelight/Database/Hosts.h b/Limelight/Database/Hosts.h new file mode 100644 index 0000000..2b4d184 --- /dev/null +++ b/Limelight/Database/Hosts.h @@ -0,0 +1,18 @@ +// +// Hosts.h +// Limelight +// +// Created by Diego Waxemberg on 10/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import + + +@interface Hosts : NSManagedObject + +@property (nonatomic, retain) NSString * address; +@property (nonatomic, retain) NSString * name; + +@end diff --git a/Limelight/Database/Hosts.m b/Limelight/Database/Hosts.m new file mode 100644 index 0000000..71eeaa6 --- /dev/null +++ b/Limelight/Database/Hosts.m @@ -0,0 +1,17 @@ +// +// Hosts.m +// Limelight +// +// Created by Diego Waxemberg on 10/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "Hosts.h" + + +@implementation Hosts + +@dynamic address; +@dynamic name; + +@end diff --git a/Limelight/Database/Settings.h b/Limelight/Database/Settings.h new file mode 100644 index 0000000..1198a2c --- /dev/null +++ b/Limelight/Database/Settings.h @@ -0,0 +1,20 @@ +// +// Settings.h +// Limelight +// +// Created by Diego Waxemberg on 10/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import + + +@interface Settings : NSManagedObject + +@property (nonatomic, retain) NSNumber * bitrate; +@property (nonatomic, retain) NSNumber * framerate; +@property (nonatomic, retain) NSNumber * height; +@property (nonatomic, retain) NSNumber * width; + +@end diff --git a/Limelight/Database/Settings.m b/Limelight/Database/Settings.m new file mode 100644 index 0000000..001f8ca --- /dev/null +++ b/Limelight/Database/Settings.m @@ -0,0 +1,19 @@ +// +// Settings.m +// Limelight +// +// Created by Diego Waxemberg on 10/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "Settings.h" + + +@implementation Settings + +@dynamic bitrate; +@dynamic framerate; +@dynamic height; +@dynamic width; + +@end diff --git a/Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2-1.jpg b/Limelight/Images.xcassets/Left4Dead2.imageset/Left4Dead2-1.jpg deleted file mode 100644 index ffd4f4afcca29e0ecb248750e0ddee16980a5a0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31418 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 B-Z=mO literal 0 HcmV?d00001 diff --git a/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents index 193f33c..4012f03 100644 --- a/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents @@ -1,4 +1,17 @@ - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Limelight/ViewControllers/MainFrameViewController.h b/Limelight/ViewControllers/MainFrameViewController.h index 70e106e..cc8a15b 100644 --- a/Limelight/ViewControllers/MainFrameViewController.h +++ b/Limelight/ViewControllers/MainFrameViewController.h @@ -13,8 +13,10 @@ #import "UIComputerView.h" #import "UIAppView.h" #import "AppManager.h" +#import "SWRevealViewController.h" -@interface MainFrameViewController : UIViewController +@interface MainFrameViewController : UIViewController +@property (strong, nonatomic) IBOutlet UIBarButtonItem *settingsSidebarButton; + (StreamConfiguration*) getStreamConfiguration; diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index 328b0f1..fe6d06c 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -16,6 +16,9 @@ #import "UIComputerView.h" #import "UIAppView.h" #import "App.h" +#import "SettingsViewController.h" +#import "DataManager.h" +#import "Settings.h" @implementation MainFrameViewController { NSOperationQueue* _opQueue; @@ -134,60 +137,58 @@ static StreamConfiguration* streamConfig; return; } - // TODO: actually allow the user to choose the config - unsigned long selectedConf = 1; - NSLog(@"selectedConf: %ld", selectedConf); - switch (selectedConf) { - case 0: - streamConfig.width = 1280; - streamConfig.height = 720; - streamConfig.frameRate = 30; - streamConfig.bitRate = 5000; - break; - default: - case 1: - streamConfig.width = 1280; - streamConfig.height = 720; - streamConfig.frameRate = 60; - streamConfig.bitRate = 10000; - break; - case 2: - streamConfig.width = 1920; - streamConfig.height = 1080; - streamConfig.frameRate = 30; - streamConfig.bitRate = 10000; - break; - case 3: - streamConfig.width = 1920; - streamConfig.height = 1080; - streamConfig.frameRate = 60; - streamConfig.bitRate = 20000; - break; + DataManager* dataMan = [[DataManager alloc] init]; + Settings* streamSettings = [dataMan retrieveSettings]; + + streamConfig.frameRate = [streamSettings.framerate intValue]; + streamConfig.bitRate = [streamSettings.bitrate intValue]; + streamConfig.height = [streamSettings.height intValue]; + streamConfig.width = [streamSettings.width intValue]; + + [self performSegueWithIdentifier:@"createStreamFrame" sender:nil]; +} + +- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position { + // If we moved back to the center position, we should save the settings + if (position == FrontViewPositionLeft) { + [(SettingsViewController*)[revealController rearViewController] saveSettings]; } - NSLog(@"StreamConfig: %@, %d, %dx%dx%d at %d Mbps", streamConfig.host, streamConfig.hostAddr, streamConfig.width, streamConfig.height, streamConfig.frameRate, streamConfig.bitRate); - [self performSegueWithIdentifier:@"createStreamFrame" sender:self]; } - (void)viewDidLoad { [super viewDidLoad]; - - NSArray* streamConfigVals = [[NSArray alloc] initWithObjects:@"1280x720 (30Hz)", @"1280x720 (60Hz)", @"1920x1080 (30Hz)", @"1920x1080 (60Hz)",nil]; + + // Change button color + _settingsSidebarButton.tintColor = [UIColor colorWithRed:.2 green:.9 blue:0.f alpha:1.f]; + + // Set the side bar button action. When it's tapped, it'll show up the sidebar. + _settingsSidebarButton.target = self.revealViewController; + _settingsSidebarButton.action = @selector(revealToggle:); + + // Set the gesture + [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; + + [self.revealViewController setDelegate:self]; + + //NSArray* streamConfigVals = [[NSArray alloc] initWithObjects:@"1280x720 (30Hz)", @"1280x720 (60Hz)", @"1920x1080 (30Hz)", @"1920x1080 (60Hz)",nil]; _opQueue = [[NSOperationQueue alloc] init]; [CryptoManager generateKeyPairUsingSSl]; _uniqueId = [CryptoManager getUniqueID]; _cert = [CryptoManager readCertFromFile]; - // Initialize the host picker list + // Only initialize the host picker list once if (hostList == nil) { hostList = [[NSMutableSet alloc] init]; } + [self setAutomaticallyAdjustsScrollViewInsets:NO]; + hostScrollView = [[UIScrollView alloc] init]; - hostScrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height / 2); + hostScrollView.frame = CGRectMake(0, self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height, self.view.frame.size.width, self.view.frame.size.height / 2); [hostScrollView setShowsHorizontalScrollIndicator:NO]; - + appScrollView = [[UIScrollView alloc] init]; appScrollView.frame = CGRectMake(0, hostScrollView.frame.size.height, self.view.frame.size.width, self.view.frame.size.height / 2); [appScrollView setShowsHorizontalScrollIndicator:NO]; @@ -199,7 +200,8 @@ static StreamConfiguration* streamConfig; - (void)viewDidAppear:(BOOL)animated { - [super viewDidDisappear:animated]; + [super viewDidAppear:animated]; + [self.navigationController setNavigationBarHidden:NO animated:YES]; _mDNSManager = [[MDNSManager alloc] initWithCallback:self]; [_mDNSManager searchForHosts]; } diff --git a/Limelight/ViewControllers/SWRevealViewController.h b/Limelight/ViewControllers/SWRevealViewController.h new file mode 100755 index 0000000..279106e --- /dev/null +++ b/Limelight/ViewControllers/SWRevealViewController.h @@ -0,0 +1,418 @@ +/* + + Copyright (c) 2013 Joan Lluch + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org) + +*/ + +/* + + RELEASE NOTES + + + Version 2.3.0 (Current Version) + + - StoryBoard initializing bug fix + - Minor Code refactoring + + Version 2.2.0 + + - State Restoration support. + - Reverted panGestureRecognizer implementation to before v2.1.0 (works better). + - New properties 'toggleAnimationType', 'springDampingRatio'. Default reveal animation is 'Spring' + - New property 'frontViewShadowColor' + - New properties 'clipsViewsToBounds' and '_extendedPointInsideHit' + - New delegate methods for finer control of front view location in the overdraw area, as long as deprecation note on former delegate methods + - Other minor changes that should not affect current implementations + + Version 2.1.0 + + - Removed SWDirectionPanGestureRecognizer. Horizontal panning is filtered on the shouldBegin delegate. This is cleaner, I hope it does not break previous funcionality + - Took a cleaner approach to storyboard support. SWRevealViewControllerSegue is now deprecated and you should use SWRevealViewControllerSegueSetController and SWRevealViewControllerSeguePushController instead. + - A minor change on the autoresizingMask of the internal views to fix a glitch on iOS8. This should not affect iOS7 + + Version 2.0.2 + + - Added new delegates for better control of gesture recognizers + + Version 2.0.1 + + - Fix: draggableBorderWidth now correctly handles the cases where one of the rear controllers is not provided + - Fix: the shadow related properties are now granted at any time after view load, not just after initialization. + + Version 2.0.0 + +- Dropped support for iOS6 and earlier. This version will only work on iOS7 + +- The method setFrontViewController:animated: does not longer perform a full reveal animation. Instead it just replaces the frontViewController in + its current position. Use the new pushFrontViewController:animated: method to perform a replacement of the front controlles with reveal animation + as in the previous version + + IMPORTANT: You must replace all calls to setFrontViewController:animated by calls to pushFrontViewController:animated to prevent breaking + functionality on existing projects. + +- Added support for animated replacement of child controllers: setRearViewController, setFrontViewController, setRightViewController now have animated versions. + +- The new 'replaceViewAnimationDuration' property sets the default duration of child viewController replacement. + +- Added the following new delegate methods + revealController:willAddViewController:forOperation:animated: + revealController:didAddViewController:forOperation:animated: + +- The class also supports custom UIViewControllerAnimatedTransitioning related with the replacement of child viewControllers. + You can implement the following new delegate method: revealController:animationControllerForOperation:fromViewController:toViewController: + and provide an object conforming to UIViewControllerAnimatedTransitioning to implement custom animations. + + Version 1.1.3 + +- Reverted the supportedInterfaceOrientations to the default behavior. This is consistent with Apple provided controllers + +- The presentFrontViewHierarchically now dynamically takes into account the smaller header height of bars on iPhone landscape orientation + + Version 1.1.2 + + - The status bar style and appearance are now handled in sync with the class animations. + You can implement the methods preferredStatusBarStyle and prefersStatusBarHidden on your child controllers to define the desired appearance + + - The loadView method now calls a method, loadStoryboardControllers, just for the purpose of loading child controllers from a storyboard. + You can override this method and remove the @try @catch statements if you want the debugger not to stop at them in case you have set an exception breakpoint. + + Version 1.1.1 + + - You can now get a tapGestureRecognizer from the class. See the tapGestureRecognizer method for more information. + + - Both the panGestureRecognizer and the tapGestureRecognizer are now attached to the revealViewController's front content view + by default, so they will start working just by calling their access methods even if you do not attach them to any of your views. + This enables you to dissable interactions on your views -for example based on position- without breaking normal gesture behavior. + + - Corrected a bug that caused a crash on iOS6 and earlier. + + Version 1.1.0 + + - The method setFrontViewController:animated now performs the correct animations both for left and right controllers. + + - The class now automatically handles the status bar appearance depending on the currently shown child controller. + + Version 1.0.8 + + - Support for constant width frontView by setting a negative value to reveal widths. See properties rearViewRevealWidth and rightViewRevealWidth + + - Support for draggableBorderWidth. See property of the same name. + + - The Pan gesture recongnizer can be disabled by implementing the following delegate method and returning NO + revealControllerPanGestureShouldBegin: + + - Added the ability to track pan gesture reveal progress through the following new delegate methods + revealController:panGestureBeganFromLocation:progress: + revealController:panGestureMovedToLocation:progress: + revealController:panGestureEndedToLocation:progress: + + Previous Versions + + - No release notes were updated for previous versions. + +*/ + + +#import + +@class SWRevealViewController; +@protocol SWRevealViewControllerDelegate; + +#pragma mark - SWRevealViewController Class + +// Enum values for setFrontViewPosition:animated: +typedef NS_ENUM( NSInteger, FrontViewPosition) +{ + // Front controller is removed from view. Animated transitioning from this state will cause the same + // effect than animating from FrontViewPositionLeftSideMost. Use this instead of FrontViewPositionLeftSideMost when + // you want to remove the front view controller view from the view hierarchy. + FrontViewPositionLeftSideMostRemoved, + + // Left most position, front view is presented left-offseted by rightViewRevealWidth+rigthViewRevealOverdraw + FrontViewPositionLeftSideMost, + + // Left position, front view is presented left-offseted by rightViewRevealWidth + FrontViewPositionLeftSide, + + // Center position, rear view is hidden behind front controller + FrontViewPositionLeft, + + // Right possition, front view is presented right-offseted by rearViewRevealWidth + FrontViewPositionRight, + + // Right most possition, front view is presented right-offseted by rearViewRevealWidth+rearViewRevealOverdraw + FrontViewPositionRightMost, + + // Front controller is removed from view. Animated transitioning from this state will cause the same + // effect than animating from FrontViewPositionRightMost. Use this instead of FrontViewPositionRightMost when + // you intent to remove the front controller view from the view hierarchy. + FrontViewPositionRightMostRemoved, + +}; + +// Enum values for toggleAnimationType +typedef NS_ENUM(NSInteger, SWRevealToggleAnimationType) +{ + SWRevealToggleAnimationTypeSpring, // <- produces a spring based animation + SWRevealToggleAnimationTypeEaseOut, // <- produces an ease out curve animation +}; + + +@interface SWRevealViewController : UIViewController + +/* Basic API */ + +// Object instance init and rear view setting +- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController; + +// Rear view controller, can be nil if not used +@property (nonatomic) UIViewController *rearViewController; +- (void)setRearViewController:(UIViewController *)rearViewController animated:(BOOL)animated; + +// Optional right view controller, can be nil if not used +@property (nonatomic) UIViewController *rightViewController; +- (void)setRightViewController:(UIViewController *)rightViewController animated:(BOOL)animated; + +// Front view controller, can be nil on initialization but must be supplied by the time the view is loaded +@property (nonatomic) UIViewController *frontViewController; +- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated; + +// Sets the frontViewController using a default set of chained animations consisting on moving the +// presented frontViewController to the right most possition, replacing it, and moving it back to the left position +- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated; + +// Sets the frontViewController position. You can call the animated version several times with different +// positions to obtain a set of animations that will be performed in order one after the other. +@property (nonatomic) FrontViewPosition frontViewPosition; +- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated; + +// The following methods are meant to be directly connected to the action method of a button +// to perform user triggered postion change of the controller views. This is ussually added to a +// button on top left or right of the frontViewController +- (IBAction)revealToggle:(id)sender; +- (IBAction)rightRevealToggle:(id)sender; // <-- simetric implementation of the above for the rightViewController + +// Toogles the current state of the front controller between Left or Right and fully visible +// Use setFrontViewPosition to set a particular position +- (void)revealToggleAnimated:(BOOL)animated; +- (void)rightRevealToggleAnimated:(BOOL)animated; // <-- simetric implementation of the above for the rightViewController + +// The following method will provide a panGestureRecognizer suitable to be added to any view +// in order to perform usual drag and swipe gestures to reveal the rear views. This is usually added to the top bar +// of a front controller, but it can be added to your frontViewController view or to the reveal controller view to provide full screen panning. +// By default, the panGestureRecognizer is added to the view containing the front controller view. To keep this default behavior +// you still need to call this method, just don't add it to any of your views. The default setup allows you to dissable +// user interactions on your controller views without affecting the recognizer. +- (UIPanGestureRecognizer*)panGestureRecognizer; + +// The following method will provide a tapGestureRecognizer suitable to be added to any view on the frontController +// for concealing the rear views. By default no tap recognizer is created or added to any view, however if you call this method after +// the controller's view has been loaded the recognizer is added to the reveal controller's front container view. +// Thus, you can disable user interactions on your frontViewController view without affecting the tap recognizer. +- (UITapGestureRecognizer*)tapGestureRecognizer; + +/* The following properties are provided for further customization, they are set to default values on initialization, + you do not generally have to set them */ + +// Defines how much of the rear or right view is shown, default is 260. +// Negative values indicate that the reveal width should be computed by substracting the full front view width, +// so the revealed frontView width is kept constant when bounds change as opposed to the rear or right width. +@property (nonatomic) CGFloat rearViewRevealWidth; +@property (nonatomic) CGFloat rightViewRevealWidth; // <-- simetric implementation of the above for the rightViewController + +// Defines how much of an overdraw can occur when dragging further than 'rearViewRevealWidth', default is 60. +@property (nonatomic) CGFloat rearViewRevealOverdraw; +@property (nonatomic) CGFloat rightViewRevealOverdraw; // <-- simetric implementation of the above for the rightViewController + +// Defines how much displacement is applied to the rear view when animating or dragging the front view, default is 40. +@property (nonatomic) CGFloat rearViewRevealDisplacement; +@property (nonatomic) CGFloat rightViewRevealDisplacement; // <-- simetric implementation of the above for the rightViewController + +// Defines a width on the border of the view attached to the panGesturRecognizer where the gesture is allowed, +// default is 0 which means no restriction. +@property (nonatomic) CGFloat draggableBorderWidth; + +// If YES (the default) the controller will bounce to the Left position when dragging further than 'rearViewRevealWidth' +@property (nonatomic) BOOL bounceBackOnOverdraw; +@property (nonatomic) BOOL bounceBackOnLeftOverdraw; // <-- simetric implementation of the above for the rightViewController + +// If YES (default is NO) the controller will allow permanent dragging up to the rightMostPosition +@property (nonatomic) BOOL stableDragOnOverdraw; +@property (nonatomic) BOOL stableDragOnLeftOverdraw; // <-- simetric implementation of the above for the rightViewController + +// If YES (default is NO) the front view controller will be ofsseted vertically by the height of a navigation bar. +// Use this on iOS7 when you add an instance of RevealViewController as a child of a UINavigationController (or another SWRevealViewController) +// and you want the front view controller to be presented below the navigation bar of its UINavigationController grand parent. +// The rearViewController will still appear full size and blurred behind the navigation bar of its UINavigationController grand parent +@property (nonatomic) BOOL presentFrontViewHierarchically; + +// Velocity required for the controller to toggle its state based on a swipe movement, default is 250 +@property (nonatomic) CGFloat quickFlickVelocity; + +// Duration for the revealToggle animation, default is 0.25 +@property (nonatomic) NSTimeInterval toggleAnimationDuration; + +// Animation type, default is SWRevealToggleAnimationTypeSpring +@property (nonatomic) SWRevealToggleAnimationType toggleAnimationType; + +// When animation type is SWRevealToggleAnimationTypeSpring determines the damping ratio, default is 1 +@property (nonatomic) CGFloat springDampingRatio; + +// Duration for animated replacement of view controllers +@property (nonatomic) NSTimeInterval replaceViewAnimationDuration; + +// Defines the radius of the front view's shadow, default is 2.5f +@property (nonatomic) CGFloat frontViewShadowRadius; + +// Defines the radius of the front view's shadow offset default is {0.0f,2.5f} +@property (nonatomic) CGSize frontViewShadowOffset; + +// Defines the front view's shadow opacity, default is 1.0f +@property (nonatomic) CGFloat frontViewShadowOpacity; + +// Defines the front view's shadow color, default is blackColor +@property (nonatomic) UIColor *frontViewShadowColor; + +// Defines whether the controller should clip subviews to its view bounds. Default is NO. +// Set this to YES when you are presenting this controller as a non full-screen child of a +// custom container controller which does not explicitly clips its subviews. +@property (nonatomic) BOOL clipsViewsToBounds; + +// Defines whether your views clicable area extends beyond the bounds of this controller. Default is NO. +// Set this to YES if you are presenting this controller as a non full-screen child of a custom container and you are not +// clipping your front view to this controller bounds. +@property (nonatomic) BOOL extendsPointInsideHit; + +/* The class properly handles all the relevant calls to appearance methods on the contained controllers. + Moreover you can assign a delegate to let the class inform you on positions and animation activity */ + +// Delegate +@property (nonatomic,weak) id delegate; + +@end + + +#pragma mark - SWRevealViewControllerDelegate Protocol + +typedef enum +{ + SWRevealControllerOperationNone, + SWRevealControllerOperationReplaceRearController, + SWRevealControllerOperationReplaceFrontController, + SWRevealControllerOperationReplaceRightController, + +} SWRevealControllerOperation; + + +@protocol SWRevealViewControllerDelegate + +@optional + +// The following delegate methods will be called before and after the front view moves to a position +- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position; +- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position; + +// This will be called inside the reveal animation, thus you can use it to place your own code that will be animated in sync +- (void)revealController:(SWRevealViewController *)revealController animateToPosition:(FrontViewPosition)position; + +// Implement this to return NO when you want the pan gesture recognizer to be ignored +- (BOOL)revealControllerPanGestureShouldBegin:(SWRevealViewController *)revealController; + +// Implement this to return NO when you want the tap gesture recognizer to be ignored +- (BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController; + +// Implement this to return YES if you want other gesture recognizer to share touch events with the pan gesture +- (BOOL)revealController:(SWRevealViewController *)revealController + panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; + +// Implement this to return YES if you want other gesture recognizer to share touch events with the tap gesture +- (BOOL)revealController:(SWRevealViewController *)revealController + tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; + +// Called when the gestureRecognizer began and ended +- (void)revealControllerPanGestureBegan:(SWRevealViewController *)revealController; +- (void)revealControllerPanGestureEnded:(SWRevealViewController *)revealController; + +// The following methods provide a means to track the evolution of the gesture recognizer. +// The 'location' parameter is the X origin coordinate of the front view as the user drags it +// The 'progress' parameter is a number ranging from 0 to 1 indicating the front view location relative to the +// rearRevealWidth or rightRevealWidth. 1 is fully revealed, dragging ocurring in the overDraw region will result in values above 1. +// The 'overProgress' parameter is a number ranging from 0 to 1 indicating the front view location relative to the +// overdraw region. 0 is fully revealed, 1 is fully overdrawn. Negative values occur inside the normal reveal region +- (void)revealController:(SWRevealViewController *)revealController panGestureBeganFromLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress; +- (void)revealController:(SWRevealViewController *)revealController panGestureMovedToLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress; +- (void)revealController:(SWRevealViewController *)revealController panGestureEndedToLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress; + +// Notification of child controller replacement +- (void)revealController:(SWRevealViewController *)revealController willAddViewController:(UIViewController *)viewController + forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated; +- (void)revealController:(SWRevealViewController *)revealController didAddViewController:(UIViewController *)viewController + forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated; + +// Support for custom transition animations while replacing child controllers. If implemented, it will be fired in response +// to calls to 'setXXViewController' methods +- (id)revealController:(SWRevealViewController *)revealController + animationControllerForOperation:(SWRevealControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC; + +// DEPRECATED - The following delegate methods will be removed some time in the future +- (void)revealController:(SWRevealViewController *)revealController panGestureBeganFromLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED) +- (void)revealController:(SWRevealViewController *)revealController panGestureMovedToLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED) +- (void)revealController:(SWRevealViewController *)revealController panGestureEndedToLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED) +@end + + +#pragma mark - UIViewController(SWRevealViewController) Category + +// A category of UIViewController to let childViewControllers easily access their parent SWRevealViewController +@interface UIViewController(SWRevealViewController) + +- (SWRevealViewController*)revealViewController; + +@end + + +#pragma mark - StoryBoard support Classes + +/* StoryBoard support */ + +// String identifiers to be applied to segues on a storyboard +extern NSString* const SWSegueRearIdentifier; // this is @"sw_rear" +extern NSString* const SWSegueFrontIdentifier; // this is @"sw_front" +extern NSString* const SWSegueRightIdentifier; // this is @"sw_right" + +/* This will allow the class to be defined on a storyboard */ + +// Use this along with one of the above segue identifiers to segue to the initial state +@interface SWRevealViewControllerSegueSetController : UIStoryboardSegue +@end + +// Use this to push a view controller +@interface SWRevealViewControllerSeguePushController : UIStoryboardSegue +@end + + +//#pragma mark - SWRevealViewControllerSegue (DEPRECATED) +// +//@interface SWRevealViewControllerSegue : UIStoryboardSegue // DEPRECATED: USE SWRevealViewControllerSegueSetController instead +//@property (nonatomic, strong) void(^performBlock)( SWRevealViewControllerSegue* segue, UIViewController* svc, UIViewController* dvc ); +//@end diff --git a/Limelight/ViewControllers/SWRevealViewController.m b/Limelight/ViewControllers/SWRevealViewController.m new file mode 100755 index 0000000..de73c51 --- /dev/null +++ b/Limelight/ViewControllers/SWRevealViewController.m @@ -0,0 +1,1897 @@ +/* + + Copyright (c) 2013 Joan Lluch + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org) + +*/ + +#import + +#import "SWRevealViewController.h" + + +#pragma mark - StatusBar Helper Function + +// computes the required offset adjustment due to the status bar for the passed in view, +// it will return the statusBar height if view fully overlaps the statusBar, otherwise returns 0.0f +static CGFloat statusBarAdjustment( UIView* view ) +{ + CGFloat adjustment = 0.0f; + UIApplication *app = [UIApplication sharedApplication]; + CGRect viewFrame = [view convertRect:view.bounds toView:[app keyWindow]]; + CGRect statusBarFrame = [app statusBarFrame]; + + if ( CGRectIntersectsRect(viewFrame, statusBarFrame) ) + adjustment = fminf(statusBarFrame.size.width, statusBarFrame.size.height); + + return adjustment; +} + + +#pragma mark - SWRevealView Class + +@interface SWRevealView: UIView +{ + __weak SWRevealViewController *_c; +} + +@property (nonatomic, readonly) UIView *rearView; +@property (nonatomic, readonly) UIView *rightView; +@property (nonatomic, readonly) UIView *frontView; +@property (nonatomic, assign) BOOL disableLayout; + +@end + + +@interface SWRevealViewController() +- (void)_getRevealWidth:(CGFloat*)pRevealWidth revealOverDraw:(CGFloat*)pRevealOverdraw forSymetry:(int)symetry; +- (void)_getBounceBack:(BOOL*)pBounceBack pStableDrag:(BOOL*)pStableDrag forSymetry:(int)symetry; +- (void)_getAdjustedFrontViewPosition:(FrontViewPosition*)frontViewPosition forSymetry:(int)symetry; +@end + + +@implementation SWRevealView + + +static CGFloat scaledValue( CGFloat v1, CGFloat min2, CGFloat max2, CGFloat min1, CGFloat max1) +{ + CGFloat result = min2 + (v1-min1)*((max2-min2)/(max1-min1)); + if ( result != result ) return min2; // nan + if ( result < min2 ) return min2; + if ( result > max2 ) return max2; + return result; +} + + +- (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller +{ + self = [super initWithFrame:frame]; + if ( self ) + { + _c = controller; + CGRect bounds = self.bounds; + + _frontView = [[UIView alloc] initWithFrame:bounds]; + _frontView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; + [self reloadShadow]; + + [self addSubview:_frontView]; + } + return self; +} + + +- (void)reloadShadow +{ + CALayer *frontViewLayer = _frontView.layer; + frontViewLayer.shadowColor = [_c.frontViewShadowColor CGColor]; + frontViewLayer.shadowOpacity = _c.frontViewShadowOpacity; + frontViewLayer.shadowOffset = _c.frontViewShadowOffset; + frontViewLayer.shadowRadius = _c.frontViewShadowRadius; +} + + +- (CGRect)hierarchycalFrameAdjustment:(CGRect)frame +{ + if ( _c.presentFrontViewHierarchically ) + { + UINavigationBar *dummyBar = [[UINavigationBar alloc] init]; + CGFloat barHeight = [dummyBar sizeThatFits:CGSizeMake(100,100)].height; + CGFloat offset = barHeight + statusBarAdjustment(self); + frame.origin.y += offset; + frame.size.height -= offset; + } + return frame; +} + + +- (void)prepareRearViewForPosition:(FrontViewPosition)newPosition +{ + if ( _rearView == nil ) + { + _rearView = [[UIView alloc] initWithFrame:self.bounds]; + _rearView.autoresizingMask = /*UIViewAutoresizingFlexibleWidth|*/UIViewAutoresizingFlexibleHeight; + [self insertSubview:_rearView belowSubview:_frontView]; + } + + CGFloat xLocation = [self frontLocationForPosition:_c.frontViewPosition]; + [self _layoutRearViewsForLocation:xLocation]; + [self _prepareForNewPosition:newPosition]; +} + + +- (void)prepareRightViewForPosition:(FrontViewPosition)newPosition +{ + if ( _rightView == nil ) + { + _rightView = [[UIView alloc] initWithFrame:self.bounds]; + _rightView.autoresizingMask = /*UIViewAutoresizingFlexibleWidth|*/UIViewAutoresizingFlexibleHeight; + [self insertSubview:_rightView belowSubview:_frontView]; + } + + CGFloat xLocation = [self frontLocationForPosition:_c.frontViewPosition]; + [self _layoutRearViewsForLocation:xLocation]; + [self _prepareForNewPosition:newPosition]; +} + + +- (CGFloat)frontLocationForPosition:(FrontViewPosition)frontViewPosition +{ + CGFloat revealWidth; + CGFloat revealOverdraw; + + CGFloat location = 0.0f; + + int symetry = frontViewPosition FrontViewPositionRight ) + location = revealWidth + revealOverdraw; + + return location*symetry; +} + + +- (void)dragFrontViewToXLocation:(CGFloat)xLocation +{ + CGRect bounds = self.bounds; + + xLocation = [self _adjustedDragLocationForLocation:xLocation]; + [self _layoutRearViewsForLocation:xLocation]; + + CGRect frame = CGRectMake(xLocation, 0.0f, bounds.size.width, bounds.size.height); + _frontView.frame = [self hierarchycalFrameAdjustment:frame]; +} + + +# pragma mark - overrides + +- (void)layoutSubviews +{ + if ( _disableLayout ) return; + + CGRect bounds = self.bounds; + + FrontViewPosition position = _c.frontViewPosition; + CGFloat xLocation = [self frontLocationForPosition:position]; + + // set rear view frames + [self _layoutRearViewsForLocation:xLocation]; + + // set front view frame + CGRect frame = CGRectMake(xLocation, 0.0f, bounds.size.width, bounds.size.height); + _frontView.frame = [self hierarchycalFrameAdjustment:frame]; + + // setup front view shadow path if needed (front view loaded and not removed) + UIViewController *frontViewController = _c.frontViewController; + BOOL viewLoaded = frontViewController != nil && frontViewController.isViewLoaded; + BOOL viewNotRemoved = position > FrontViewPositionLeftSideMostRemoved && position < FrontViewPositionRightMostRemoved; + CGRect shadowBounds = viewLoaded && viewNotRemoved ? _frontView.bounds : CGRectZero; + + UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:shadowBounds]; + _frontView.layer.shadowPath = shadowPath.CGPath; +} + + +- (BOOL)pointInsideD:(CGPoint)point withEvent:(UIEvent *)event +{ + BOOL isInside = [super pointInside:point withEvent:event]; + if ( _c.extendsPointInsideHit ) + { + if ( !isInside && _rearView && [_c.rearViewController isViewLoaded] ) + { + CGPoint pt = [self convertPoint:point toView:_rearView]; + isInside = [_rearView pointInside:pt withEvent:event]; + } + + if ( !isInside && _frontView && [_c.frontViewController isViewLoaded] ) + { + CGPoint pt = [self convertPoint:point toView:_frontView]; + isInside = [_frontView pointInside:pt withEvent:event]; + } + + if ( !isInside && _rightView && [_c.rightViewController isViewLoaded] ) + { + CGPoint pt = [self convertPoint:point toView:_rightView]; + isInside = [_rightView pointInside:pt withEvent:event]; + } + } + return isInside; +} + + +- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event +{ + BOOL isInside = [super pointInside:point withEvent:event]; + if ( !isInside && _c.extendsPointInsideHit ) + { + UIView *testViews[] = { _rearView, _frontView, _rightView }; + UIViewController *testControllers[] = { _c.rearViewController, _c.frontViewController, _c.rightViewController }; + + for ( NSInteger i=0 ; i<3 && !isInside ; i++ ) + { + if ( testViews[i] && [testControllers[i] isViewLoaded] ) + { + CGPoint pt = [self convertPoint:point toView:testViews[i]]; + isInside = [testViews[i] pointInside:pt withEvent:event]; + } + } + } + return isInside; +} + + +# pragma mark - private + + +- (void)_layoutRearViewsForLocation:(CGFloat)xLocation +{ + CGRect bounds = self.bounds; + + CGFloat rearRevealWidth = _c.rearViewRevealWidth; + if ( rearRevealWidth < 0) rearRevealWidth = bounds.size.width + _c.rearViewRevealWidth; + + CGFloat rearXLocation = scaledValue(xLocation, -_c.rearViewRevealDisplacement, 0, 0, rearRevealWidth); + + CGFloat rearWidth = rearRevealWidth + _c.rearViewRevealOverdraw; + _rearView.frame = CGRectMake(rearXLocation, 0.0, rearWidth, bounds.size.height); + + CGFloat rightRevealWidth = _c.rightViewRevealWidth; + if ( rightRevealWidth < 0) rightRevealWidth = bounds.size.width + _c.rightViewRevealWidth; + + CGFloat rightXLocation = scaledValue(xLocation, 0, _c.rightViewRevealDisplacement, -rightRevealWidth, 0); + + CGFloat rightWidth = rightRevealWidth + _c.rightViewRevealOverdraw; + _rightView.frame = CGRectMake(bounds.size.width-rightWidth+rightXLocation, 0.0f, rightWidth, bounds.size.height); +} + + +- (void)_prepareForNewPosition:(FrontViewPosition)newPosition; +{ + if ( _rearView == nil || _rightView == nil ) + return; + + int symetry = newPosition 0 && rearIndex < rightIndex) ) + [self exchangeSubviewAtIndex:rightIndex withSubviewAtIndex:rearIndex]; +} + + +- (CGFloat)_adjustedDragLocationForLocation:(CGFloat)x +{ + CGFloat result; + + CGFloat revealWidth; + CGFloat revealOverdraw; + BOOL bounceBack; + BOOL stableDrag; + FrontViewPosition position = _c.frontViewPosition; + + int symetry = x<0 ? -1 : 1; + + [_c _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry]; + [_c _getBounceBack:&bounceBack pStableDrag:&stableDrag forSymetry:symetry]; + + BOOL stableTrack = !bounceBack || stableDrag || position==FrontViewPositionRightMost || position==FrontViewPositionLeftSideMost; + if ( stableTrack ) + { + revealWidth += revealOverdraw; + revealOverdraw = 0.0f; + } + + x = x * symetry; + + if (x <= revealWidth) + result = x; // Translate linearly. + + else if (x <= revealWidth+2*revealOverdraw) + result = revealWidth + (x-revealWidth)/2; // slow down translation by halph the movement. + + else + result = revealWidth+revealOverdraw; // keep at the rightMost location. + + return result * symetry; +} + +@end + + +#pragma mark - SWContextTransitioningObject + +@interface SWContextTransitionObject : NSObject +@end + + +@implementation SWContextTransitionObject +{ + __weak SWRevealViewController *_revealVC; + UIView *_view; + UIViewController *_toVC; + UIViewController *_fromVC; + void (^_completion)(void); +} + +- (id)initWithRevealController:(SWRevealViewController*)revealVC containerView:(UIView*)view fromVC:(UIViewController*)fromVC + toVC:(UIViewController*)toVC completion:(void (^)(void))completion +{ + self = [super init]; + if ( self ) + { + _revealVC = revealVC; + _view = view; + _fromVC = fromVC; + _toVC = toVC; + _completion = completion; + } + return self; +} + + +- (UIView *)containerView +{ + return _view; +} + + +- (BOOL)isAnimated +{ + return YES; +} + + +- (BOOL)isInteractive +{ + return NO; // not supported +} + +- (BOOL)transitionWasCancelled +{ + return NO; // not supported +} + +- (CGAffineTransform)targetTransform { + return CGAffineTransformIdentity; +} + +- (UIModalPresentationStyle)presentationStyle +{ + return UIModalPresentationNone; // not applicable +} + + +- (void)updateInteractiveTransition:(CGFloat)percentComplete +{ + // not supported +} + + +- (void)finishInteractiveTransition +{ + // not supported +} + + +- (void)cancelInteractiveTransition +{ + // not supported +} + + +- (void)completeTransition:(BOOL)didComplete +{ + _completion(); +} + + +- (UIViewController *)viewControllerForKey:(NSString *)key +{ + if ( [key isEqualToString:UITransitionContextFromViewControllerKey] ) + return _fromVC; + + if ( [key isEqualToString:UITransitionContextToViewControllerKey] ) + return _toVC; + + return nil; +} + + +- (UIView *)viewForKey:(NSString *)key +{ + return nil; +} + + +- (CGRect)initialFrameForViewController:(UIViewController *)vc +{ + return _view.bounds; +} + + +- (CGRect)finalFrameForViewController:(UIViewController *)vc +{ + return _view.bounds; +} + +@end + + +#pragma mark - SWDefaultAnimationController Class + +@interface SWDefaultAnimationController : NSObject +@end + +@implementation SWDefaultAnimationController +{ + NSTimeInterval _duration; +} + + +- (id)initWithDuration:(NSTimeInterval)duration +{ + self = [super init]; + if ( self ) + { + _duration = duration; + } + return self; +} + + +- (NSTimeInterval)transitionDuration:(id)transitionContext +{ + return _duration; +} + + +- (void)animateTransition:(id )transitionContext +{ + UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; + UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; + + if ( fromViewController ) + { + [UIView transitionFromView:fromViewController.view toView:toViewController.view duration:_duration + options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationOptionOverrideInheritedOptions + completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; + } + else + { + // tansitionFromView does not correctly handle the case where the fromView is nil (at least on iOS7) it just pops up the toView view with no animation, + // so in such case we replace the crossDissolve animation by a simple alpha animation on the appearing view + UIView *toView = toViewController.view; + CGFloat alpha = toView.alpha; + toView.alpha = 0; + + [UIView animateWithDuration:_duration delay:0 options:UIViewAnimationOptionCurveEaseOut + animations:^{ toView.alpha = alpha;} + completion:^(BOOL finished) { [transitionContext completeTransition:finished];}]; + } +} + +@end + + +#pragma mark - SWRevealViewControllerPanGestureRecognizer + +#import + +@interface SWRevealViewControllerPanGestureRecognizer : UIPanGestureRecognizer +@end + +@implementation SWRevealViewControllerPanGestureRecognizer +{ + BOOL _dragging; + CGPoint _beginPoint; +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + [super touchesBegan:touches withEvent:event]; + + UITouch *touch = [touches anyObject]; + _beginPoint = [touch locationInView:self.view]; + _dragging = NO; +} + + +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +{ + [super touchesMoved:touches withEvent:event]; + + if ( _dragging || self.state == UIGestureRecognizerStateFailed) + return; + + const int kDirectionPanThreshold = 5; + + UITouch *touch = [touches anyObject]; + CGPoint nowPoint = [touch locationInView:self.view]; + + if (abs(nowPoint.x - _beginPoint.x) > kDirectionPanThreshold) _dragging = YES; + else if (abs(nowPoint.y - _beginPoint.y) > kDirectionPanThreshold) self.state = UIGestureRecognizerStateFailed; +} + +@end + + +#pragma mark - SWRevealViewController Class + +@interface SWRevealViewController() +{ + SWRevealView *_contentView; + UIPanGestureRecognizer *_panGestureRecognizer; + UITapGestureRecognizer *_tapGestureRecognizer; + FrontViewPosition _frontViewPosition; + FrontViewPosition _rearViewPosition; + FrontViewPosition _rightViewPosition; + SWContextTransitionObject *_rearTransitioningController; + SWContextTransitionObject *_frontTransitioningController; + SWContextTransitionObject *_rightTransitioningController; +} +@end + + +@implementation SWRevealViewController +{ + FrontViewPosition _panInitialFrontPosition; + NSMutableArray *_animationQueue; + BOOL _userInteractionStore; +} + +const int FrontViewPositionNone = 0xff; + + +#pragma mark - Init + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if ( self ) + { + [self _initDefaultProperties]; + } + return self; +} + + +- (id)init +{ + return [self initWithRearViewController:nil frontViewController:nil]; +} + + +- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController; +{ + self = [super init]; + if ( self ) + { + [self _initDefaultProperties]; + [self _performTransitionOperation:SWRevealControllerOperationReplaceRearController withViewController:rearViewController animated:NO]; + [self _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:NO]; + } + return self; +} + + +- (void)_initDefaultProperties +{ + _frontViewPosition = FrontViewPositionLeft; + _rearViewPosition = FrontViewPositionLeft; + _rightViewPosition = FrontViewPositionLeft; + _rearViewRevealWidth = 260.0f; + _rearViewRevealOverdraw = 60.0f; + _rearViewRevealDisplacement = 40.0f; + _rightViewRevealWidth = 260.0f; + _rightViewRevealOverdraw = 60.0f; + _rightViewRevealDisplacement = 40.0f; + _bounceBackOnOverdraw = YES; + _bounceBackOnLeftOverdraw = YES; + _stableDragOnOverdraw = NO; + _stableDragOnLeftOverdraw = NO; + _presentFrontViewHierarchically = NO; + _quickFlickVelocity = 250.0f; + _toggleAnimationDuration = 0.3; + _toggleAnimationType = SWRevealToggleAnimationTypeSpring; + _springDampingRatio = 1; + _replaceViewAnimationDuration = 0.25; + _frontViewShadowRadius = 2.5f; + _frontViewShadowOffset = CGSizeMake(0.0f, 2.5f); + _frontViewShadowOpacity = 1.0f; + _frontViewShadowColor = [UIColor blackColor]; + _userInteractionStore = YES; + _animationQueue = [NSMutableArray array]; + _draggableBorderWidth = 0.0f; + _clipsViewsToBounds = NO; + _extendsPointInsideHit = NO; +} + + +#pragma mark - StatusBar + +- (UIViewController *)childViewControllerForStatusBarStyle +{ + int positionDif = _frontViewPosition - FrontViewPositionLeft; + + UIViewController *controller = _frontViewController; + if ( positionDif > 0 ) controller = _rearViewController; + else if ( positionDif < 0 ) controller = _rightViewController; + + return controller; +} + +- (UIViewController *)childViewControllerForStatusBarHidden +{ + UIViewController *controller = [self childViewControllerForStatusBarStyle]; + return controller; +} + + +#pragma mark - View lifecycle + +- (void)loadView +{ + // Do not call super, to prevent the apis from unfruitful looking for inexistent xibs! + //[super loadView]; + + // load any defined front/rear controllers from the storyboard before + [self loadStoryboardControllers]; + + // This is what Apple used to tell us to set as the initial frame, which is of course totally irrelevant + // with view controller containment patterns, let's leave it for the sake of it! + // CGRect frame = [[UIScreen mainScreen] applicationFrame]; + + // On iOS7 the applicationFrame does not return the whole screen. This is possibly a bug. + // As a workaround we use the screen bounds, this still works on iOS6, any zero based frame would work anyway! + CGRect frame = [[UIScreen mainScreen] bounds]; + + // create a custom content view for the controller + _contentView = [[SWRevealView alloc] initWithFrame:frame controller:self]; + + // set the content view to resize along with its superview + [_contentView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; + + // set the content view to clip its bounds if requested + [_contentView setClipsToBounds:_clipsViewsToBounds]; + + // set our contentView to the controllers view + self.view = _contentView; + + // Apple also tells us to do this: + _contentView.backgroundColor = [UIColor blackColor]; + + // we set the current frontViewPosition to none before seting the + // desired initial position, this will force proper controller reload + FrontViewPosition initialPosition = _frontViewPosition; + _frontViewPosition = FrontViewPositionNone; + _rearViewPosition = FrontViewPositionNone; + _rightViewPosition = FrontViewPositionNone; + + // now set the desired initial position + [self _setFrontViewPosition:initialPosition withDuration:0.0]; +} + + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + // Uncomment the following code if you want the child controllers + // to be loaded at this point. + // + // We leave this commented out because we think loading childs here is conceptually wrong. + // Instead, we refrain view loads until necesary, for example we may never load + // the rear controller view -or the front controller view- if it is never displayed. + // + // If you need to manipulate views of any of your child controllers in an override + // of this method, you can load yourself the views explicitly on your overriden method. + // However we discourage it as an app following the MVC principles should never need to do so + +// [_frontViewController view]; +// [_rearViewController view]; + + // we store at this point the view's user interaction state as we may temporarily disable it + // and resume it back to the previous state, it is possible to override this behaviour by + // intercepting it on the panGestureBegan and panGestureEnded delegates + _userInteractionStore = _contentView.userInteractionEnabled; +} + + +- (NSUInteger)supportedInterfaceOrientations +{ + // we could have simply not implemented this, but we choose to call super to make explicit that we + // want the default behavior. + return [super supportedInterfaceOrientations]; +} + + +#pragma mark - Public methods and property accessors + +- (void)setFrontViewController:(UIViewController *)frontViewController +{ + [self setFrontViewController:frontViewController animated:NO]; +} + + +- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated +{ + if ( ![self isViewLoaded]) + { + [self _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:NO]; + return; + } + + [self _dispatchTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:animated]; +} + + +- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated +{ + if ( ![self isViewLoaded]) + { + [self _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:NO]; + return; + } + + [self _dispatchPushFrontViewController:frontViewController animated:animated]; +} + + +- (void)setRearViewController:(UIViewController *)rearViewController +{ + [self setRearViewController:rearViewController animated:NO]; +} + + +- (void)setRearViewController:(UIViewController *)rearViewController animated:(BOOL)animated +{ + if ( ![self isViewLoaded]) + { + [self _performTransitionOperation:SWRevealControllerOperationReplaceRearController withViewController:rearViewController animated:NO]; + return; + } + + [self _dispatchTransitionOperation:SWRevealControllerOperationReplaceRearController withViewController:rearViewController animated:animated]; +} + + +- (void)setRightViewController:(UIViewController *)rightViewController +{ + [self setRightViewController:rightViewController animated:NO]; +} + + +- (void)setRightViewController:(UIViewController *)rightViewController animated:(BOOL)animated +{ + if ( ![self isViewLoaded]) + { + [self _performTransitionOperation:SWRevealControllerOperationReplaceRightController withViewController:rightViewController animated:NO]; + return; + } + + [self _dispatchTransitionOperation:SWRevealControllerOperationReplaceRightController withViewController:rightViewController animated:animated]; +} + + +- (void)revealToggleAnimated:(BOOL)animated +{ + FrontViewPosition toggledFrontViewPosition = FrontViewPositionLeft; + if (_frontViewPosition <= FrontViewPositionLeft) + toggledFrontViewPosition = FrontViewPositionRight; + + [self setFrontViewPosition:toggledFrontViewPosition animated:animated]; +} + + +- (void)rightRevealToggleAnimated:(BOOL)animated +{ + FrontViewPosition toggledFrontViewPosition = FrontViewPositionLeft; + if (_frontViewPosition >= FrontViewPositionLeft) + toggledFrontViewPosition = FrontViewPositionLeftSide; + + [self setFrontViewPosition:toggledFrontViewPosition animated:animated]; +} + + +- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition +{ + [self setFrontViewPosition:frontViewPosition animated:NO]; +} + + +- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated +{ + if ( ![self isViewLoaded] ) + { + _frontViewPosition = frontViewPosition; + _rearViewPosition = frontViewPosition; + _rightViewPosition = frontViewPosition; + return; + } + + [self _dispatchSetFrontViewPosition:frontViewPosition animated:animated]; +} + + +- (void)setFrontViewShadowRadius:(CGFloat)frontViewShadowRadius +{ + _frontViewShadowRadius = frontViewShadowRadius; + [_contentView reloadShadow]; +} + + +- (void)setFrontViewShadowOffset:(CGSize)frontViewShadowOffset +{ + _frontViewShadowOffset = frontViewShadowOffset; + [_contentView reloadShadow]; +} + + +- (void)setFrontViewShadowOpacity:(CGFloat)frontViewShadowOpacity +{ + _frontViewShadowOpacity = frontViewShadowOpacity; + [_contentView reloadShadow]; +} + + +- (void)setFrontViewShadowColor:(UIColor *)frontViewShadowColor +{ + _frontViewShadowColor = frontViewShadowColor; + [_contentView reloadShadow]; +} + + +- (UIPanGestureRecognizer*)panGestureRecognizer +{ + if ( _panGestureRecognizer == nil ) + { + _panGestureRecognizer = [[SWRevealViewControllerPanGestureRecognizer alloc] initWithTarget:self action:@selector(_handleRevealGesture:)]; + _panGestureRecognizer.delegate = self; + [_contentView.frontView addGestureRecognizer:_panGestureRecognizer]; + } + return _panGestureRecognizer; +} + + +- (UITapGestureRecognizer*)tapGestureRecognizer +{ + if ( _tapGestureRecognizer == nil ) + { + UITapGestureRecognizer *tapRecognizer = + [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTapGesture:)]; + + tapRecognizer.delegate = self; + [_contentView.frontView addGestureRecognizer:tapRecognizer]; + _tapGestureRecognizer = tapRecognizer ; + } + return _tapGestureRecognizer; +} + + +- (void)setClipsViewsToBounds:(BOOL)clipsViewsToBounds +{ + _clipsViewsToBounds = clipsViewsToBounds; + [_contentView setClipsToBounds:clipsViewsToBounds]; +} + + + +#pragma mark - Provided acction methods + +- (IBAction)revealToggle:(id)sender +{ + [self revealToggleAnimated:YES]; +} + + +- (IBAction)rightRevealToggle:(id)sender +{ + [self rightRevealToggleAnimated:YES]; +} + + +#pragma mark - UserInteractionEnabling + +// disable userInteraction on the entire control +- (void)_disableUserInteraction +{ + [_contentView setUserInteractionEnabled:NO]; + [_contentView setDisableLayout:YES]; +} + +// restore userInteraction on the control +- (void)_restoreUserInteraction +{ + // we use the stored userInteraction state just in case a developer decided + // to have our view interaction disabled beforehand + [_contentView setUserInteractionEnabled:_userInteractionStore]; + [_contentView setDisableLayout:NO]; +} + + +#pragma mark - PanGesture progress notification + +- (void)_notifyPanGestureBegan +{ + if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureBegan:)] ) + [_delegate revealControllerPanGestureBegan:self]; + + CGFloat xLocation, dragProgress, overProgress; + [self _getDragLocation:&xLocation progress:&dragProgress overdrawProgress:&overProgress]; + + if ( [_delegate respondsToSelector:@selector(revealController:panGestureBeganFromLocation:progress:overProgress:)] ) + [_delegate revealController:self panGestureBeganFromLocation:xLocation progress:dragProgress overProgress:overProgress]; + + else if ( [_delegate respondsToSelector:@selector(revealController:panGestureBeganFromLocation:progress:)] ) + [_delegate revealController:self panGestureBeganFromLocation:xLocation progress:dragProgress]; +} + +- (void)_notifyPanGestureMoved +{ + CGFloat xLocation, dragProgress, overProgress; + [self _getDragLocation:&xLocation progress:&dragProgress overdrawProgress:&overProgress]; + + if ( [_delegate respondsToSelector:@selector(revealController:panGestureMovedToLocation:progress:overProgress:)] ) + [_delegate revealController:self panGestureMovedToLocation:xLocation progress:dragProgress overProgress:overProgress]; + + else if ( [_delegate respondsToSelector:@selector(revealController:panGestureMovedToLocation:progress:)] ) + [_delegate revealController:self panGestureMovedToLocation:xLocation progress:dragProgress]; +} + +- (void)_notifyPanGestureEnded +{ + CGFloat xLocation, dragProgress, overProgress; + [self _getDragLocation:&xLocation progress:&dragProgress overdrawProgress:&overProgress]; + + if ( [_delegate respondsToSelector:@selector(revealController:panGestureEndedToLocation:progress:overProgress:)] ) + [_delegate revealController:self panGestureEndedToLocation:xLocation progress:dragProgress overProgress:overProgress]; + + else if ( [_delegate respondsToSelector:@selector(revealController:panGestureEndedToLocation:progress:)] ) + [_delegate revealController:self panGestureEndedToLocation:xLocation progress:dragProgress]; + + if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureEnded:)] ) + [_delegate revealControllerPanGestureEnded:self]; +} + + +#pragma mark - Symetry + +- (void)_getRevealWidth:(CGFloat*)pRevealWidth revealOverDraw:(CGFloat*)pRevealOverdraw forSymetry:(int)symetry +{ + if ( symetry < 0 ) *pRevealWidth = _rightViewRevealWidth, *pRevealOverdraw = _rightViewRevealOverdraw; + else *pRevealWidth = _rearViewRevealWidth, *pRevealOverdraw = _rearViewRevealOverdraw; + + if (*pRevealWidth < 0) *pRevealWidth = _contentView.bounds.size.width + *pRevealWidth; +} + +- (void)_getBounceBack:(BOOL*)pBounceBack pStableDrag:(BOOL*)pStableDrag forSymetry:(int)symetry +{ + if ( symetry < 0 ) *pBounceBack = _bounceBackOnLeftOverdraw, *pStableDrag = _stableDragOnLeftOverdraw; + else *pBounceBack = _bounceBackOnOverdraw, *pStableDrag = _stableDragOnOverdraw; +} + +- (void)_getAdjustedFrontViewPosition:(FrontViewPosition*)frontViewPosition forSymetry:(int)symetry +{ + if ( symetry < 0 ) *frontViewPosition = FrontViewPositionLeft + symetry*(*frontViewPosition-FrontViewPositionLeft); +} + +- (void)_getDragLocationx:(CGFloat*)xLocation progress:(CGFloat*)progress +{ + UIView *frontView = _contentView.frontView; + *xLocation = frontView.frame.origin.x; + + int symetry = *xLocation<0 ? -1 : 1; + + CGFloat xWidth = symetry < 0 ? _rightViewRevealWidth : _rearViewRevealWidth; + if ( xWidth < 0 ) xWidth = _contentView.bounds.size.width + xWidth; + + *progress = *xLocation/xWidth * symetry; +} + +- (void)_getDragLocation:(CGFloat*)xLocation progress:(CGFloat*)progress overdrawProgress:(CGFloat*)overProgress +{ + UIView *frontView = _contentView.frontView; + *xLocation = frontView.frame.origin.x; + + int symetry = *xLocation<0 ? -1 : 1; + + CGFloat xWidth = symetry < 0 ? _rightViewRevealWidth : _rearViewRevealWidth; + CGFloat xOverWidth = symetry < 0 ? _rightViewRevealOverdraw : _rearViewRevealOverdraw; + + if ( xWidth < 0 ) xWidth = _contentView.bounds.size.width + xWidth; + + *progress = *xLocation*symetry/xWidth; + *overProgress = (*xLocation*symetry-xWidth)/xOverWidth; +} + + +#pragma mark - Deferred block execution queue + +// Define a convenience macro to enqueue single statements +#define _enqueue(code) [self _enqueueBlock:^{code;}]; + +// Defers the execution of the passed in block until a paired _dequeue call is received, +// or executes the block right away if no pending requests are present. +- (void)_enqueueBlock:(void (^)(void))block +{ + [_animationQueue insertObject:block atIndex:0]; + if ( _animationQueue.count == 1) + { + block(); + } +} + +// Removes the top most block in the queue and executes the following one if any. +// Calls to this method must be paired with calls to _enqueueBlock, particularly it may be called +// from within a block passed to _enqueueBlock to remove itself when done with animations. +- (void)_dequeue +{ + [_animationQueue removeLastObject]; + + if ( _animationQueue.count > 0 ) + { + void (^block)(void) = [_animationQueue lastObject]; + block(); + } +} + + +#pragma mark - Gesture Delegate + +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)recognizer +{ + // only allow gesture if no previous request is in process + if ( _animationQueue.count == 0 ) + { + if ( recognizer == _panGestureRecognizer ) + return [self _panGestureShouldBegin]; + + if ( recognizer == _tapGestureRecognizer ) + return [self _tapGestureShouldBegin]; + } + + return NO; +} + + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer +{ + if ( gestureRecognizer == _panGestureRecognizer ) + { + if ( [_delegate respondsToSelector:@selector(revealController:panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:)] ) + if ( [_delegate revealController:self panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer] != NO ) + return YES; + } + if ( gestureRecognizer == _tapGestureRecognizer ) + { + if ( [_delegate respondsToSelector:@selector(revealController:tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:)] ) + if ( [_delegate revealController:self tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer] != NO ) + return YES; + } + + return NO; +} + + +- (BOOL)_tapGestureShouldBegin +{ + if ( _frontViewPosition == FrontViewPositionLeft || + _frontViewPosition == FrontViewPositionRightMostRemoved || + _frontViewPosition == FrontViewPositionLeftSideMostRemoved ) + return NO; + + // forbid gesture if the following delegate is implemented and returns NO + if ( [_delegate respondsToSelector:@selector(revealControllerTapGestureShouldBegin:)] ) + if ( [_delegate revealControllerTapGestureShouldBegin:self] == NO ) + return NO; + + return YES; +} + + +- (BOOL)_panGestureShouldBegin +{ + // forbid gesture if the initial translation is not horizontal + UIView *recognizerView = _panGestureRecognizer.view; + CGPoint translation = [_panGestureRecognizer translationInView:recognizerView]; +// NSLog( @"translation:%@", NSStringFromCGPoint(translation) ); +// if ( fabs(translation.y/translation.x) > 1 ) +// return NO; + + // forbid gesture if the following delegate is implemented and returns NO + if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureShouldBegin:)] ) + if ( [_delegate revealControllerPanGestureShouldBegin:self] == NO ) + return NO; + + CGFloat xLocation = [_panGestureRecognizer locationInView:recognizerView].x; + CGFloat width = recognizerView.bounds.size.width; + + BOOL draggableBorderAllowing = ( + /*_frontViewPosition != FrontViewPositionLeft ||*/ _draggableBorderWidth == 0.0f || + (_rearViewController && xLocation <= _draggableBorderWidth) || + (_rightViewController && xLocation >= (width - _draggableBorderWidth)) ); + + + BOOL translationForbidding = ( _frontViewPosition == FrontViewPositionLeft && + ((_rearViewController == nil && translation.x > 0) || (_rightViewController == nil && translation.x < 0)) ); + + // allow gesture only within the bounds defined by the draggableBorderWidth property + return draggableBorderAllowing && !translationForbidding ; +} + + +#pragma mark - Gesture Based Reveal + +- (void)_handleTapGesture:(UITapGestureRecognizer *)recognizer +{ + NSTimeInterval duration = _toggleAnimationDuration; + [self _setFrontViewPosition:FrontViewPositionLeft withDuration:duration]; +} + + +- (void)_handleRevealGesture:(UIPanGestureRecognizer *)recognizer +{ + switch ( recognizer.state ) + { + case UIGestureRecognizerStateBegan: + [self _handleRevealGestureStateBeganWithRecognizer:recognizer]; + break; + + case UIGestureRecognizerStateChanged: + [self _handleRevealGestureStateChangedWithRecognizer:recognizer]; + break; + + case UIGestureRecognizerStateEnded: + [self _handleRevealGestureStateEndedWithRecognizer:recognizer]; + break; + + case UIGestureRecognizerStateCancelled: + //case UIGestureRecognizerStateFailed: + [self _handleRevealGestureStateCancelledWithRecognizer:recognizer]; + break; + + default: + break; + } +} + + +- (void)_handleRevealGestureStateBeganWithRecognizer:(UIPanGestureRecognizer *)recognizer +{ + // we know that we will not get here unless the animationQueue is empty because the recognizer + // delegate prevents it, however we do not want any forthcoming programatic actions to disturb + // the gesture, so we just enqueue a dummy block to ensure any programatic acctions will be + // scheduled after the gesture is completed + [self _enqueueBlock:^{}]; // <-- dummy block + + // we store the initial position and initialize a target position + _panInitialFrontPosition = _frontViewPosition; + + // we disable user interactions on the views, however programatic accions will still be + // enqueued to be performed after the gesture completes + [self _disableUserInteraction]; + [self _notifyPanGestureBegan]; +} + + +- (void)_handleRevealGestureStateChangedWithRecognizer:(UIPanGestureRecognizer *)recognizer +{ + CGFloat translation = [recognizer translationInView:_contentView].x; + + CGFloat baseLocation = [_contentView frontLocationForPosition:_panInitialFrontPosition]; + CGFloat xLocation = baseLocation + translation; + + if ( xLocation < 0 ) + { + if ( _rightViewController == nil ) xLocation = 0; + [self _rightViewDeploymentForNewFrontViewPosition:FrontViewPositionLeftSide](); + [self _rearViewDeploymentForNewFrontViewPosition:FrontViewPositionLeftSide](); + } + + if ( xLocation > 0 ) + { + if ( _rearViewController == nil ) xLocation = 0; + [self _rightViewDeploymentForNewFrontViewPosition:FrontViewPositionRight](); + [self _rearViewDeploymentForNewFrontViewPosition:FrontViewPositionRight](); + } + + [_contentView dragFrontViewToXLocation:xLocation]; + [self _notifyPanGestureMoved]; +} + + +- (void)_handleRevealGestureStateEndedWithRecognizer:(UIPanGestureRecognizer *)recognizer +{ + UIView *frontView = _contentView.frontView; + + CGFloat xLocation = frontView.frame.origin.x; + CGFloat velocity = [recognizer velocityInView:_contentView].x; + //NSLog( @"Velocity:%1.4f", velocity); + + // depending on position we compute a simetric replacement of widths and positions + int symetry = xLocation<0 ? -1 : 1; + + // simetring computing of widths + CGFloat revealWidth ; + CGFloat revealOverdraw ; + BOOL bounceBack; + BOOL stableDrag; + + [self _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry]; + [self _getBounceBack:&bounceBack pStableDrag:&stableDrag forSymetry:symetry]; + + // simetric replacement of position + xLocation = xLocation * symetry; + + // initially we assume drag to left and default duration + FrontViewPosition frontViewPosition = FrontViewPositionLeft; + NSTimeInterval duration = _toggleAnimationDuration; + + // Velocity driven change: + if (fabsf(velocity) > _quickFlickVelocity) + { + // we may need to set the drag position and to adjust the animation duration + CGFloat journey = xLocation; + if (velocity*symetry > 0.0f) + { + frontViewPosition = FrontViewPositionRight; + journey = revealWidth - xLocation; + if (xLocation > revealWidth) + { + if (!bounceBack && stableDrag /*&& xPosition > _rearViewRevealWidth+_rearViewRevealOverdraw*0.5f*/) + { + frontViewPosition = FrontViewPositionRightMost; + journey = revealWidth+revealOverdraw - xLocation; + } + } + } + + duration = fabsf(journey/velocity); + } + + // Position driven change: + else + { + // we may need to set the drag position + if (xLocation > revealWidth*0.5f) + { + frontViewPosition = FrontViewPositionRight; + if (xLocation > revealWidth) + { + if (bounceBack) + frontViewPosition = FrontViewPositionLeft; + + else if (stableDrag && xLocation > revealWidth+revealOverdraw*0.5f) + frontViewPosition = FrontViewPositionRightMost; + } + } + } + + // symetric replacement of frontViewPosition + [self _getAdjustedFrontViewPosition:&frontViewPosition forSymetry:symetry]; + + // restore user interaction and animate to the final position + [self _restoreUserInteraction]; + [self _notifyPanGestureEnded]; + [self _setFrontViewPosition:frontViewPosition withDuration:duration]; +} + + +- (void)_handleRevealGestureStateCancelledWithRecognizer:(UIPanGestureRecognizer *)recognizer +{ + [self _restoreUserInteraction]; + [self _notifyPanGestureEnded]; + [self _dequeue]; +} + + +#pragma mark Enqueued position and controller setup + +- (void)_dispatchSetFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated +{ + NSTimeInterval duration = animated?_toggleAnimationDuration:0.0; + __weak SWRevealViewController *theSelf = self; + _enqueue( [theSelf _setFrontViewPosition:frontViewPosition withDuration:duration] ); +} + + +- (void)_dispatchPushFrontViewController:(UIViewController *)newFrontViewController animated:(BOOL)animated +{ + FrontViewPosition preReplacementPosition = FrontViewPositionLeft; + if ( _frontViewPosition > FrontViewPositionLeft ) preReplacementPosition = FrontViewPositionRightMost; + if ( _frontViewPosition < FrontViewPositionLeft ) preReplacementPosition = FrontViewPositionLeftSideMost; + + NSTimeInterval duration = animated?_toggleAnimationDuration:0.0; + NSTimeInterval firstDuration = duration; + int initialPosDif = abs( _frontViewPosition - preReplacementPosition ); + if ( initialPosDif == 1 ) firstDuration *= 0.8; + else if ( initialPosDif == 0 ) firstDuration = 0; + + __weak SWRevealViewController *theSelf = self; + if ( animated ) + { + _enqueue( [theSelf _setFrontViewPosition:preReplacementPosition withDuration:firstDuration] ); + _enqueue( [theSelf _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:newFrontViewController animated:NO] ); + _enqueue( [theSelf _setFrontViewPosition:FrontViewPositionLeft withDuration:duration] ); + } + else + { + _enqueue( [theSelf _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:newFrontViewController animated:NO] ); + } +} + + +- (void)_dispatchTransitionOperation:(SWRevealControllerOperation)operation withViewController:(UIViewController *)newViewController animated:(BOOL)animated +{ + __weak SWRevealViewController *theSelf = self; + _enqueue( [theSelf _performTransitionOperation:operation withViewController:newViewController animated:animated] ); +} + + +#pragma mark Animated view controller deployment and layout + +// Primitive method for view controller deployment and animated layout to the given position. +- (void)_setFrontViewPosition:(FrontViewPosition)newPosition withDuration:(NSTimeInterval)duration +{ + void (^rearDeploymentCompletion)() = [self _rearViewDeploymentForNewFrontViewPosition:newPosition]; + void (^rightDeploymentCompletion)() = [self _rightViewDeploymentForNewFrontViewPosition:newPosition]; + void (^frontDeploymentCompletion)() = [self _frontViewDeploymentForNewFrontViewPosition:newPosition]; + + void (^animations)() = ^() + { + // Calling this in the animation block causes the status bar to appear/dissapear in sync with our own animation + [self setNeedsStatusBarAppearanceUpdate]; + + // We call the layoutSubviews method on the contentView view and send a delegate, which will + // occur inside of an animation block if any animated transition is being performed + [_contentView layoutSubviews]; + + if ([_delegate respondsToSelector:@selector(revealController:animateToPosition:)]) + [_delegate revealController:self animateToPosition:_frontViewPosition]; + }; + + void (^completion)(BOOL) = ^(BOOL finished) + { + rearDeploymentCompletion(); + rightDeploymentCompletion(); + frontDeploymentCompletion(); + [self _dequeue]; + }; + + if ( duration > 0.0 ) + { + if ( _toggleAnimationType == SWRevealToggleAnimationTypeEaseOut ) + { + [UIView animateWithDuration:duration delay:0.0 + options:UIViewAnimationOptionCurveEaseOut animations:animations completion:completion]; + } + else + { + [UIView animateWithDuration:_toggleAnimationDuration delay:0.0 usingSpringWithDamping:_springDampingRatio initialSpringVelocity:1/duration + options:0 animations:animations completion:completion]; + } + } + else + { + animations(); + completion(YES); + } +} + + +// Primitive method for animated controller transition +//- (void)_performTransitionToViewController:(UIViewController*)new operation:(SWRevealControllerOperation)operation animated:(BOOL)animated +- (void)_performTransitionOperation:(SWRevealControllerOperation)operation withViewController:(UIViewController*)new animated:(BOOL)animated +{ + if ( [_delegate respondsToSelector:@selector(revealController:willAddViewController:forOperation:animated:)] ) + [_delegate revealController:self willAddViewController:new forOperation:operation animated:animated]; + + UIViewController *old = nil; + UIView *view = nil; + + if ( operation == SWRevealControllerOperationReplaceRearController ) + old = _rearViewController, _rearViewController = new, view = _contentView.rearView; + + else if ( operation == SWRevealControllerOperationReplaceFrontController ) + old = _frontViewController, _frontViewController = new, view = _contentView.frontView; + + else if ( operation == SWRevealControllerOperationReplaceRightController ) + old = _rightViewController, _rightViewController = new, view = _contentView.rightView; + + void (^completion)() = [self _transitionFromViewController:old toViewController:new inView:view]; + + void (^animationCompletion)() = ^ + { + completion(); + if ( [_delegate respondsToSelector:@selector(revealController:didAddViewController:forOperation:animated:)] ) + [_delegate revealController:self didAddViewController:new forOperation:operation animated:animated]; + + [self _dequeue]; + }; + + if ( animated ) + { + id animationController = nil; + + if ( [_delegate respondsToSelector:@selector(revealController:animationControllerForOperation:fromViewController:toViewController:)] ) + animationController = [_delegate revealController:self animationControllerForOperation:operation fromViewController:old toViewController:new]; + + if ( !animationController ) + animationController = [[SWDefaultAnimationController alloc] initWithDuration:_replaceViewAnimationDuration]; + + SWContextTransitionObject *transitioningObject = [[SWContextTransitionObject alloc] initWithRevealController:self containerView:view + fromVC:old toVC:new completion:animationCompletion]; + + if ( [animationController transitionDuration:transitioningObject] > 0 ) + [animationController animateTransition:transitioningObject]; + else + animationCompletion(); + } + else + { + animationCompletion(); + } +} + + +#pragma mark Position based view controller deployment + +// Deploy/Undeploy of the front view controller following the containment principles. Returns a block +// that must be invoked on animation completion in order to finish deployment +- (void (^)(void))_frontViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition +{ + if ( (_rightViewController == nil && newPosition < FrontViewPositionLeft) || + (_rearViewController == nil && newPosition > FrontViewPositionLeft) ) + newPosition = FrontViewPositionLeft; + + BOOL positionIsChanging = (_frontViewPosition != newPosition); + + BOOL appear = + (_frontViewPosition >= FrontViewPositionRightMostRemoved || _frontViewPosition <= FrontViewPositionLeftSideMostRemoved || _frontViewPosition == FrontViewPositionNone) && + (newPosition < FrontViewPositionRightMostRemoved && newPosition > FrontViewPositionLeftSideMostRemoved); + + BOOL disappear = + (newPosition >= FrontViewPositionRightMostRemoved || newPosition <= FrontViewPositionLeftSideMostRemoved ) && + (_frontViewPosition < FrontViewPositionRightMostRemoved && _frontViewPosition > FrontViewPositionLeftSideMostRemoved && _frontViewPosition != FrontViewPositionNone); + + if ( positionIsChanging ) + { + if ( [_delegate respondsToSelector:@selector(revealController:willMoveToPosition:)] ) + [_delegate revealController:self willMoveToPosition:newPosition]; + } + + _frontViewPosition = newPosition; + + void (^deploymentCompletion)() = + [self _deploymentForViewController:_frontViewController inView:_contentView.frontView appear:appear disappear:disappear]; + + void (^completion)() = ^() + { + deploymentCompletion(); + if ( positionIsChanging ) + { + if ( [_delegate respondsToSelector:@selector(revealController:didMoveToPosition:)] ) + [_delegate revealController:self didMoveToPosition:newPosition]; + } + }; + + return completion; +} + +// Deploy/Undeploy of the left view controller following the containment principles. Returns a block +// that must be invoked on animation completion in order to finish deployment +- (void (^)(void))_rearViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition +{ + if ( _presentFrontViewHierarchically ) + newPosition = FrontViewPositionRight; + + if ( _rearViewController == nil && newPosition > FrontViewPositionLeft ) + newPosition = FrontViewPositionLeft; + + BOOL appear = (_rearViewPosition <= FrontViewPositionLeft || _rearViewPosition == FrontViewPositionNone) && newPosition > FrontViewPositionLeft; + BOOL disappear = newPosition <= FrontViewPositionLeft && (_rearViewPosition > FrontViewPositionLeft && _rearViewPosition != FrontViewPositionNone); + + if ( appear ) + [_contentView prepareRearViewForPosition:newPosition]; + + _rearViewPosition = newPosition; + + return [self _deploymentForViewController:_rearViewController inView:_contentView.rearView appear:appear disappear:disappear]; +} + +// Deploy/Undeploy of the right view controller following the containment principles. Returns a block +// that must be invoked on animation completion in order to finish deployment +- (void (^)(void))_rightViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition +{ + if ( _rightViewController == nil && newPosition < FrontViewPositionLeft ) + newPosition = FrontViewPositionLeft; + + BOOL appear = (_rightViewPosition >= FrontViewPositionLeft || _rightViewPosition == FrontViewPositionNone) && newPosition < FrontViewPositionLeft ; + BOOL disappear = newPosition >= FrontViewPositionLeft && (_rightViewPosition < FrontViewPositionLeft && _rightViewPosition != FrontViewPositionNone); + + if ( appear ) + [_contentView prepareRightViewForPosition:newPosition]; + + _rightViewPosition = newPosition; + + return [self _deploymentForViewController:_rightViewController inView:_contentView.rightView appear:appear disappear:disappear]; +} + + +- (void (^)(void)) _deploymentForViewController:(UIViewController*)controller inView:(UIView*)view appear:(BOOL)appear disappear:(BOOL)disappear +{ + if ( appear ) return [self _deployForViewController:controller inView:view]; + if ( disappear ) return [self _undeployForViewController:controller]; + return ^{}; +} + + +#pragma mark Containment view controller deployment and transition + +// Containment Deploy method. Returns a block to be invoked at the +// animation completion, or right after return in case of non-animated deployment. +- (void (^)(void))_deployForViewController:(UIViewController*)controller inView:(UIView*)view +{ + if ( !controller || !view ) + return ^(void){}; + + CGRect frame = view.bounds; + + UIView *controllerView = controller.view; + controllerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + controllerView.frame = frame; + + if ( [controllerView isKindOfClass:[UIScrollView class]] ) + { + BOOL adjust = controller.automaticallyAdjustsScrollViewInsets; + + if ( adjust ) + { + [(id)controllerView setContentInset:UIEdgeInsetsMake(statusBarAdjustment(_contentView), 0, 0, 0)]; + } + } + + [view addSubview:controllerView]; + + void (^completionBlock)(void) = ^(void) + { + // nothing to do on completion at this stage + }; + + return completionBlock; +} + +// Containment Undeploy method. Returns a block to be invoked at the +// animation completion, or right after return in case of non-animated deployment. +- (void (^)(void))_undeployForViewController:(UIViewController*)controller +{ + if (!controller) + return ^(void){}; + + // nothing to do before completion at this stage + + void (^completionBlock)(void) = ^(void) + { + [controller.view removeFromSuperview]; + }; + + return completionBlock; +} + +// Containment Transition method. Returns a block to be invoked at the +// animation completion, or right after return in case of non-animated transition. +- (void(^)(void))_transitionFromViewController:(UIViewController*)fromController toViewController:(UIViewController*)toController inView:(UIView*)view +{ + if ( fromController == toController ) + return ^(void){}; + + if ( toController ) [self addChildViewController:toController]; + + void (^deployCompletion)() = [self _deployForViewController:toController inView:view]; + + [fromController willMoveToParentViewController:nil]; + + void (^undeployCompletion)() = [self _undeployForViewController:fromController]; + + void (^completionBlock)(void) = ^(void) + { + undeployCompletion() ; + [fromController removeFromParentViewController]; + + deployCompletion() ; + [toController didMoveToParentViewController:self]; + }; + return completionBlock; +} + +// Load any defined front/rear controllers from the storyboard +// This method is intended to be overrided in case the default behavior will not meet your needs +- (void)loadStoryboardControllers +{ + if ( self.storyboard && _rearViewController == nil ) + { + //Try each segue separately so it doesn't break prematurely if either Rear or Right views are not used. + @try + { + [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil]; + } + @catch(NSException *exception) {} + + @try + { + [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil]; + } + @catch(NSException *exception) {} + + @try + { + [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; + } + @catch(NSException *exception) {} + } +} + + +#pragma mark state preservation / restoration + ++ (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder*)coder +{ + SWRevealViewController* vc = nil; + UIStoryboard* sb = [coder decodeObjectForKey:UIStateRestorationViewControllerStoryboardKey]; + + if (sb) + { + vc = (SWRevealViewController*)[sb instantiateViewControllerWithIdentifier:@"SWRevealViewController"]; + vc.restorationIdentifier = [identifierComponents lastObject]; + vc.restorationClass = [SWRevealViewController class]; + } + return vc; +} + + +- (void)encodeRestorableStateWithCoder:(NSCoder *)coder +{ + [coder encodeDouble:_rearViewRevealWidth forKey:@"_rearViewRevealWidth"]; + [coder encodeDouble:_rearViewRevealOverdraw forKey:@"_rearViewRevealOverdraw"]; + [coder encodeDouble:_rearViewRevealDisplacement forKey:@"_rearViewRevealDisplacement"]; + [coder encodeDouble:_rightViewRevealWidth forKey:@"_rightViewRevealWidth"]; + [coder encodeDouble:_rightViewRevealOverdraw forKey:@"_rightViewRevealOverdraw"]; + [coder encodeDouble:_rightViewRevealDisplacement forKey:@"_rightViewRevealDisplacement"]; + [coder encodeBool:_bounceBackOnOverdraw forKey:@"_bounceBackOnOverdraw"]; + [coder encodeBool:_bounceBackOnLeftOverdraw forKey:@"_bounceBackOnLeftOverdraw"]; + [coder encodeBool:_stableDragOnOverdraw forKey:@"_stableDragOnOverdraw"]; + [coder encodeBool:_stableDragOnLeftOverdraw forKey:@"_stableDragOnLeftOverdraw"]; + [coder encodeBool:_presentFrontViewHierarchically forKey:@"_presentFrontViewHierarchically"]; + [coder encodeDouble:_quickFlickVelocity forKey:@"_quickFlickVelocity"]; + [coder encodeDouble:_toggleAnimationDuration forKey:@"_toggleAnimationDuration"]; + [coder encodeInteger:_toggleAnimationType forKey:@"_toggleAnimationType"]; + [coder encodeDouble:_springDampingRatio forKey:@"_springDampingRatio"]; + [coder encodeDouble:_replaceViewAnimationDuration forKey:@"_replaceViewAnimationDuration"]; + [coder encodeDouble:_frontViewShadowRadius forKey:@"_frontViewShadowRadius"]; + [coder encodeCGSize:_frontViewShadowOffset forKey:@"_frontViewShadowOffset"]; + [coder encodeDouble:_frontViewShadowOpacity forKey:@"_frontViewShadowOpacity"]; + [coder encodeObject:_frontViewShadowColor forKey:@"_frontViewShadowColor"]; + [coder encodeBool:_userInteractionStore forKey:@"_userInteractionStore"]; + [coder encodeDouble:_draggableBorderWidth forKey:@"_draggableBorderWidth"]; + [coder encodeBool:_clipsViewsToBounds forKey:@"_clipsViewsToBounds"]; + [coder encodeBool:_extendsPointInsideHit forKey:@"_extendsPointInsideHit"]; + + [coder encodeObject:_rearViewController forKey:@"_rearViewController"]; + [coder encodeObject:_frontViewController forKey:@"_frontViewController"]; + [coder encodeObject:_rightViewController forKey:@"_rightViewController"]; + + [coder encodeInteger:_frontViewPosition forKey:@"_frontViewPosition"]; + + [super encodeRestorableStateWithCoder:coder]; +} + + +- (void)decodeRestorableStateWithCoder:(NSCoder *)coder +{ + _rearViewRevealWidth = [coder decodeDoubleForKey:@"_rearViewRevealWidth"]; + _rearViewRevealOverdraw = [coder decodeDoubleForKey:@"_rearViewRevealOverdraw"]; + _rearViewRevealDisplacement = [coder decodeDoubleForKey:@"_rearViewRevealDisplacement"]; + _rightViewRevealWidth = [coder decodeDoubleForKey:@"_rightViewRevealWidth"]; + _rightViewRevealOverdraw = [coder decodeDoubleForKey:@"_rightViewRevealOverdraw"]; + _rightViewRevealDisplacement = [coder decodeDoubleForKey:@"_rightViewRevealDisplacement"]; + _bounceBackOnOverdraw = [coder decodeBoolForKey:@"_bounceBackOnOverdraw"]; + _bounceBackOnLeftOverdraw = [coder decodeBoolForKey:@"_bounceBackOnLeftOverdraw"]; + _stableDragOnOverdraw = [coder decodeBoolForKey:@"_stableDragOnOverdraw"]; + _stableDragOnLeftOverdraw = [coder decodeBoolForKey:@"_stableDragOnLeftOverdraw"]; + _presentFrontViewHierarchically = [coder decodeBoolForKey:@"_presentFrontViewHierarchically"]; + _quickFlickVelocity = [coder decodeDoubleForKey:@"_quickFlickVelocity"]; + _toggleAnimationDuration = [coder decodeDoubleForKey:@"_toggleAnimationDuration"]; + _toggleAnimationType = [coder decodeIntegerForKey:@"_toggleAnimationType"]; + _springDampingRatio = [coder decodeDoubleForKey:@"_springDampingRatio"]; + _replaceViewAnimationDuration = [coder decodeDoubleForKey:@"_replaceViewAnimationDuration"]; + _frontViewShadowRadius = [coder decodeDoubleForKey:@"_frontViewShadowRadius"]; + _frontViewShadowOffset = [coder decodeCGSizeForKey:@"_frontViewShadowOffset"]; + _frontViewShadowOpacity = [coder decodeDoubleForKey:@"_frontViewShadowOpacity"]; + _frontViewShadowColor = [coder decodeObjectForKey:@"_frontViewShadowColor"]; + _userInteractionStore = [coder decodeBoolForKey:@"_userInteractionStore"]; + _animationQueue = [NSMutableArray array]; + _draggableBorderWidth = [coder decodeDoubleForKey:@"_draggableBorderWidth"]; + _clipsViewsToBounds = [coder decodeBoolForKey:@"_clipsViewsToBounds"]; + _extendsPointInsideHit = [coder decodeBoolForKey:@"_extendsPointInsideHit"]; + + [self setRearViewController:[coder decodeObjectForKey:@"_rearViewController"]]; + [self setFrontViewController:[coder decodeObjectForKey:@"_frontViewController"]]; + [self setRightViewController:[coder decodeObjectForKey:@"_rightViewController"]]; + + [self setFrontViewPosition:[coder decodeIntForKey: @"_frontViewPosition"]]; + + [super decodeRestorableStateWithCoder:coder]; +} + + +- (void)applicationFinishedRestoringState +{ + // nothing to do at this stage +} + + +@end + + +#pragma mark - UIViewController(SWRevealViewController) Category + +@implementation UIViewController(SWRevealViewController) + +- (SWRevealViewController*)revealViewController +{ + UIViewController *parent = self; + Class revealClass = [SWRevealViewController class]; + while ( nil != (parent = [parent parentViewController]) && ![parent isKindOfClass:revealClass] ) {} + return (id)parent; +} + +@end + + +#pragma mark - SWRevealViewControllerSegueSetController segue identifiers + +NSString * const SWSegueRearIdentifier = @"sw_rear"; +NSString * const SWSegueFrontIdentifier = @"sw_front"; +NSString * const SWSegueRightIdentifier = @"sw_right"; + + +#pragma mark - SWRevealViewControllerSegueSetController class + +@implementation SWRevealViewControllerSegueSetController + +- (void)perform +{ + SWRevealControllerOperation operation = SWRevealControllerOperationNone; + + NSString *identifier = self.identifier; + SWRevealViewController *rvc = self.sourceViewController; + UIViewController *dvc = self.destinationViewController; + + if ( [identifier isEqualToString:SWSegueFrontIdentifier] ) + operation = SWRevealControllerOperationReplaceFrontController; + + else if ( [identifier isEqualToString:SWSegueRearIdentifier] ) + operation = SWRevealControllerOperationReplaceRearController; + + else if ( [identifier isEqualToString:SWSegueRightIdentifier] ) + operation = SWRevealControllerOperationReplaceRightController; + + if ( operation != SWRevealControllerOperationNone ) + [rvc _performTransitionOperation:operation withViewController:dvc animated:NO]; +} + +@end + + +#pragma mark - SWRevealViewControllerSeguePushController class + +@implementation SWRevealViewControllerSeguePushController + +- (void)perform +{ + SWRevealViewController *rvc = [self.sourceViewController revealViewController]; + UIViewController *dvc = self.destinationViewController; + [rvc pushFrontViewController:dvc animated:YES]; +} + +@end + + +//#pragma mark - SWRevealViewControllerSegue Class +// +//@implementation SWRevealViewControllerSegue // DEPRECATED +// +//- (void)perform +//{ +// if ( _performBlock ) +// _performBlock( self, self.sourceViewController, self.destinationViewController ); +//} +// +//@end +// +// +//#pragma mark Storyboard support +// +//@implementation SWRevealViewController(deprecated) +// +//- (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender // TO REMOVE: DEPRECATED IMPLEMENTATION +//{ +// // This method is required for compatibility with SWRevealViewControllerSegue, now deprecated. +// // It can be simply removed when using SWRevealViewControllerSegueSetController and SWRevealViewControlerSeguePushController +// +// NSString *identifier = segue.identifier; +// if ( [segue isKindOfClass:[SWRevealViewControllerSegue class]] && sender == nil ) +// { +// if ( [identifier isEqualToString:SWSegueRearIdentifier] ) +// { +// segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) +// { +// [self _setRearViewController:dvc animated:NO]; +// }; +// } +// else if ( [identifier isEqualToString:SWSegueFrontIdentifier] ) +// { +// segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) +// { +// [self _setFrontViewController:dvc animated:NO]; +// }; +// } +// else if ( [identifier isEqualToString:SWSegueRightIdentifier] ) +// { +// segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) +// { +// [self _setRightViewController:dvc animated:NO]; +// }; +// } +// } +//} +// +//@end + + diff --git a/Limelight/ViewControllers/SettingsViewController.h b/Limelight/ViewControllers/SettingsViewController.h new file mode 100644 index 0000000..704f97a --- /dev/null +++ b/Limelight/ViewControllers/SettingsViewController.h @@ -0,0 +1,20 @@ +// +// SettingsViewController.h +// Limelight +// +// Created by Diego Waxemberg on 10/27/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import +#import "AppDelegate.h" + +@interface SettingsViewController : UIViewController +@property (strong, nonatomic) IBOutlet UILabel *bitrateLabel; +@property (strong, nonatomic) IBOutlet UISlider *bitrateSlider; +@property (strong, nonatomic) IBOutlet UISegmentedControl *framerateSelector; +@property (strong, nonatomic) IBOutlet UISegmentedControl *resolutionSelector; + +- (void) saveSettings; + +@end diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m new file mode 100644 index 0000000..667283e --- /dev/null +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -0,0 +1,64 @@ +// +// SettingsViewController.m +// Limelight +// +// Created by Diego Waxemberg on 10/27/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "SettingsViewController.h" +#import "Settings.h" +#import "DataManager.h" + +#define BITRATE_INTERVAL 100 + +@implementation SettingsViewController { + NSInteger _bitrate; +} +static NSString* bitrateFormat = @"Bitrate: %d bps"; + + +- (void)viewDidLoad { + [super viewDidLoad]; + + DataManager* dataMan = [[DataManager alloc] init]; + Settings* currentSettings = [dataMan retrieveSettings]; + + _bitrate = [currentSettings.bitrate integerValue]; + NSInteger framerate = [currentSettings.framerate integerValue] == 30 ? 0 : 1; + NSInteger resolution = [currentSettings.height integerValue] == 720 ? 0 : 1; + + [self.resolutionSelector setSelectedSegmentIndex:resolution]; + [self.framerateSelector setSelectedSegmentIndex:framerate]; + [self.bitrateSlider setValue:_bitrate animated:YES]; + [self.bitrateSlider addTarget:self action:@selector(bitrateSliderMoved) forControlEvents:UIControlEventValueChanged]; + [self.bitrateLabel setText:[NSString stringWithFormat:bitrateFormat, (int)_bitrate]]; +} + +- (void) bitrateSliderMoved { + _bitrate = BITRATE_INTERVAL * floor((self.bitrateSlider.value/BITRATE_INTERVAL)+0.5); + [self.bitrateLabel setText:[NSString stringWithFormat:bitrateFormat, (int)_bitrate]]; +} + + +- (void) saveSettings { + DataManager* dataMan = [[DataManager alloc] init]; + NSInteger framerate = [self.framerateSelector selectedSegmentIndex] == 0 ? 30 : 60; + NSInteger height = [self.resolutionSelector selectedSegmentIndex] == 0 ? 720 : 1080; + NSInteger width = height == 720 ? 1280 : 1920; + [dataMan saveSettingsWithBitrate:_bitrate framerate:framerate height:height width:width]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +#pragma mark - Navigation + +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { +} + + +@end diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index 0331ee3..fa3a4c4 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -25,6 +25,8 @@ { [super viewDidLoad]; + [self.navigationController setNavigationBarHidden:YES animated:YES]; + [self.stageLabel setText:@"Starting App"]; [self.stageLabel sizeToFit]; self.stageLabel.center = CGPointMake(self.view.frame.size.width / 2, self.stageLabel.center.y); @@ -45,9 +47,13 @@ object:nil]; } +- (void) returnToMainFrame { + [self.navigationController popToRootViewControllerAnimated:YES]; +} + - (void)applicationWillResignActive:(NSNotification *)notification { [_streamMan stopStream]; - [self performSegueWithIdentifier:@"returnToMainFrame" sender:self]; + [self returnToMainFrame]; } - (void) connectionStarted { @@ -65,7 +71,7 @@ UIAlertController* conTermAlert = [UIAlertController alertControllerWithTitle:@"Connection Terminated" message:@"The connection terminated unexpectedly" preferredStyle:UIAlertControllerStyleAlert]; [conTermAlert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDestructive handler:^(UIAlertAction* action){ - [self performSegueWithIdentifier:@"returnToMainFrame" sender:self]; + [self returnToMainFrame]; }]]; [self presentViewController:conTermAlert animated:YES completion:nil]; @@ -92,7 +98,7 @@ stageName, errorCode] preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDestructive handler:^(UIAlertAction* action){ - [self performSegueWithIdentifier:@"returnToMainFrame" sender:self]; + [self returnToMainFrame]; }]]; [self presentViewController:alert animated:YES completion:nil]; } @@ -102,7 +108,7 @@ message:message preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDestructive handler:^(UIAlertAction* action){ - [self performSegueWithIdentifier:@"returnToMainFrame" sender:self]; + [self returnToMainFrame]; }]]; [self presentViewController:alert animated:YES completion:nil]; } diff --git a/iPad.storyboard b/iPad.storyboard index 37d9a06..8ab6bbd 100644 --- a/iPad.storyboard +++ b/iPad.storyboard @@ -11,10 +11,20 @@ + + + + @@ -60,6 +70,9 @@ + + + diff --git a/iPhone.storyboard b/iPhone.storyboard index efe9f1d..1068cad 100644 --- a/iPhone.storyboard +++ b/iPhone.storyboard @@ -1,10 +1,10 @@ - + - + @@ -14,15 +14,119 @@ + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,20 +150,24 @@ + + - - + + + + From 2a49f8901f0fc5d259f327e18f1ac7ba7a53682d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 31 Oct 2014 21:43:13 -0700 Subject: [PATCH 4/7] Cherry Pick "Fix iOS build with new common" --- Limelight/Stream/Connection.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Limelight/Stream/Connection.m b/Limelight/Stream/Connection.m index 9679260..9a085eb 100644 --- a/Limelight/Stream/Connection.m +++ b/Limelight/Stream/Connection.m @@ -408,7 +408,18 @@ static OSStatus playbackCallback(void *inRefCon, -(void) main { - LiStartConnection(_host, &_streamConfig, &_clCallbacks, &_drCallbacks, &_arCallbacks, NULL, 0); + PLATFORM_CALLBACKS dummyPlCallbacks; + + // Only used on Windows + dummyPlCallbacks.threadStart = NULL; + + LiStartConnection(_host, + &_streamConfig, + &_clCallbacks, + &_drCallbacks, + &_arCallbacks, + &dummyPlCallbacks, + NULL, 0); } From 8d360d22660b20d9930fb370ac977699b6557a92 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 11 Nov 2014 19:03:46 -0800 Subject: [PATCH 5/7] Cherry Pick "Update to the new common library" --- Limelight/Stream/Connection.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Limelight/Stream/Connection.m b/Limelight/Stream/Connection.m index 9a085eb..c0152d9 100644 --- a/Limelight/Stream/Connection.m +++ b/Limelight/Stream/Connection.m @@ -412,6 +412,7 @@ static OSStatus playbackCallback(void *inRefCon, // Only used on Windows dummyPlCallbacks.threadStart = NULL; + dummyPlCallbacks.debugPrint = NULL; LiStartConnection(_host, &_streamConfig, From 1be97e1c8af37534ef3f2d6fd9efaec3434cdb9f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 11 Nov 2014 19:07:02 -0800 Subject: [PATCH 6/7] Update common submodule --- limelight-common-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limelight-common-c b/limelight-common-c index 71ace09..9143994 160000 --- a/limelight-common-c +++ b/limelight-common-c @@ -1 +1 @@ -Subproject commit 71ace097f8a5904785b978e9b0b73380bbe900c5 +Subproject commit 9143994588db7704ca659cb0ffdc277bd11e41fe From dae484445bdac1b90ad8400ac1250ea08dee09d6 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Wed, 26 Nov 2014 17:57:16 -0500 Subject: [PATCH 7/7] finished new ui --- .gitignore | 1 + Limelight.xcodeproj/project.pbxproj | 12 +- Limelight/Database/DataManager.h | 6 +- Limelight/Database/DataManager.m | 49 +++++-- Limelight/Database/{Hosts.h => Host.h} | 4 +- Limelight/Database/{Hosts.m => Host.m} | 6 +- .../Limelight.xcdatamodel/contents | 8 +- .../ViewControllers/MainFrameViewController.m | 23 +++- .../ViewControllers/SettingsViewController.m | 2 +- iPad.storyboard | 124 +++++++++++++++--- iPhone.storyboard | 12 +- 11 files changed, 192 insertions(+), 55 deletions(-) rename Limelight/Database/{Hosts.h => Host.h} (86%) rename Limelight/Database/{Hosts.m => Host.m} (76%) diff --git a/.gitignore b/.gitignore index 14ce7f3..cb7b8d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ **/xcuserdata/ +Build diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index 2d7ee76..e0ebc14 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -50,7 +50,7 @@ FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494219FC9C04002D2A60 /* AppManager.m */; }; FBD3495019FF2174002D2A60 /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3494F19FF2174002D2A60 /* SettingsViewController.m */; }; FBD3495319FF36FB002D2A60 /* SWRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */; }; - FBD3495B1A004411002D2A60 /* Hosts.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495A1A004411002D2A60 /* Hosts.m */; }; + FBD3495B1A004411002D2A60 /* Host.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495A1A004411002D2A60 /* Host.m */; }; FBD3495E1A004412002D2A60 /* Settings.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD3495D1A004412002D2A60 /* Settings.m */; }; FBD349621A0089F6002D2A60 /* DataManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBD349611A0089F6002D2A60 /* DataManager.m */; }; FBDE86E019F7A837001C18A8 /* UIComputerView.m in Sources */ = {isa = PBXBuildFile; fileRef = FBDE86DF19F7A837001C18A8 /* UIComputerView.m */; }; @@ -227,8 +227,8 @@ FBD3495119FF36FB002D2A60 /* SWRevealViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWRevealViewController.h; sourceTree = ""; }; FBD3495219FF36FB002D2A60 /* SWRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWRevealViewController.m; sourceTree = ""; }; FBD349571A003F05002D2A60 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; - FBD349591A004411002D2A60 /* Hosts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Hosts.h; path = Database/Hosts.h; sourceTree = ""; }; - FBD3495A1A004411002D2A60 /* Hosts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Hosts.m; path = Database/Hosts.m; sourceTree = ""; }; + FBD349591A004411002D2A60 /* Host.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Host.h; path = Database/Host.h; sourceTree = ""; }; + FBD3495A1A004411002D2A60 /* Host.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Host.m; path = Database/Host.m; sourceTree = ""; }; FBD3495C1A004412002D2A60 /* Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Settings.h; path = Database/Settings.h; sourceTree = ""; }; FBD3495D1A004412002D2A60 /* Settings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Settings.m; path = Database/Settings.m; sourceTree = ""; }; FBD349601A0089F6002D2A60 /* DataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DataManager.h; path = Database/DataManager.h; sourceTree = ""; }; @@ -620,8 +620,8 @@ children = ( FBD3495C1A004412002D2A60 /* Settings.h */, FBD3495D1A004412002D2A60 /* Settings.m */, - FBD349591A004411002D2A60 /* Hosts.h */, - FBD3495A1A004411002D2A60 /* Hosts.m */, + FBD349591A004411002D2A60 /* Host.h */, + FBD3495A1A004411002D2A60 /* Host.m */, FBD349601A0089F6002D2A60 /* DataManager.h */, FBD349611A0089F6002D2A60 /* DataManager.m */, ); @@ -763,7 +763,7 @@ FB89462C19F646E200339C8A /* HttpManager.m in Sources */, FB89462D19F646E200339C8A /* MDNSManager.m in Sources */, FB89462B19F646E200339C8A /* StreamView.m in Sources */, - FBD3495B1A004411002D2A60 /* Hosts.m in Sources */, + FBD3495B1A004411002D2A60 /* Host.m in Sources */, FB89463519F646E200339C8A /* MainFrameViewController.m in Sources */, FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */, FB89462819F646E200339C8A /* CryptoManager.m in Sources */, diff --git a/Limelight/Database/DataManager.h b/Limelight/Database/DataManager.h index 3a193be..88450bc 100644 --- a/Limelight/Database/DataManager.h +++ b/Limelight/Database/DataManager.h @@ -9,7 +9,7 @@ #import #import "Settings.h" #import "AppDelegate.h" -#import "Hosts.h" +#import "Host.h" @interface DataManager : NSObject @@ -17,6 +17,8 @@ - (void) saveSettingsWithBitrate:(NSInteger)bitrate framerate:(NSInteger)framerate height:(NSInteger)height width:(NSInteger)width; - (Settings*) retrieveSettings; - +- (NSArray*) retrieveHosts; +- (void) saveHosts; +- (Host*) createHost:(NSString*)name hostname:(NSString*)address; @end diff --git a/Limelight/Database/DataManager.m b/Limelight/Database/DataManager.m index 1613022..13f9f97 100644 --- a/Limelight/Database/DataManager.m +++ b/Limelight/Database/DataManager.m @@ -26,21 +26,20 @@ static NSInteger DEFAULT_WIDTH = 1280; settingsToSave.bitrate = [NSNumber numberWithInteger:bitrate]; settingsToSave.height = [NSNumber numberWithInteger:height]; settingsToSave.width = [NSNumber numberWithInteger:width]; - [self saveSettings:settingsToSave]; + NSError* error; + if (![[self.appDelegate managedObjectContext] save:&error]) { + NSLog(@"ERROR: Unable to save settings to database"); + } + [self.appDelegate saveContext]; } - (Settings*) retrieveSettings { - NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; - NSEntityDescription* entity = [NSEntityDescription entityForName:@"Settings" inManagedObjectContext:[self.appDelegate managedObjectContext]]; - [fetchRequest setEntity:entity]; - [fetchRequest setAffectedStores:[NSArray arrayWithObjects:[[self.appDelegate persistentStoreCoordinator] persistentStoreForURL:[self.appDelegate getStoreURL]], nil]]; - - NSError* error; - NSArray* fetchedRecords = [[self.appDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&error]; - + NSArray* fetchedRecords = [self fetchRecords:@"Settings"]; if (fetchedRecords.count == 0) { // create a new settings object with the default values + NSEntityDescription* entity = [NSEntityDescription entityForName:@"Settings" inManagedObjectContext:[self.appDelegate managedObjectContext]]; Settings* settings = [[Settings alloc] initWithEntity:entity insertIntoManagedObjectContext:[self.appDelegate managedObjectContext]]; + settings.framerate = [NSNumber numberWithInteger:DEFAULT_FRAMERATE]; settings.bitrate = [NSNumber numberWithInteger:DEFAULT_BITRATE]; settings.height = [NSNumber numberWithInteger:DEFAULT_HEIGHT]; @@ -52,14 +51,40 @@ static NSInteger DEFAULT_WIDTH = 1280; } } -- (void) saveSettings:(Settings*)settings { +- (Host*) createHost:(NSString*)name hostname:(NSString*)address { + NSEntityDescription* entity = [NSEntityDescription entityForName:@"Host" inManagedObjectContext:[self.appDelegate managedObjectContext]]; + Host* host = [[Host alloc] initWithEntity:entity insertIntoManagedObjectContext:[self.appDelegate managedObjectContext]]; + + host.name = name; + host.address = address; + return host; +} + +- (void) saveHosts { NSError* error; if (![[self.appDelegate managedObjectContext] save:&error]) { - NSLog(@"ERROR: Unable to save settings to database"); + NSLog(@"ERROR: Unable to save hosts to database"); } - [self.appDelegate saveContext]; } +- (NSArray*) retrieveHosts { + return [self fetchRecords:@"Host"]; +} + +- (NSArray*) fetchRecords:(NSString*)entityName { + NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; + NSEntityDescription* entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:[self.appDelegate managedObjectContext]]; + [fetchRequest setEntity:entity]; + [fetchRequest setAffectedStores:[NSArray arrayWithObjects:[[self.appDelegate persistentStoreCoordinator] persistentStoreForURL:[self.appDelegate getStoreURL]], nil]]; + + NSError* error; + NSArray* fetchedRecords = [[self.appDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&error]; + //TODO: handle errors + + return fetchedRecords; + +} @end + diff --git a/Limelight/Database/Hosts.h b/Limelight/Database/Host.h similarity index 86% rename from Limelight/Database/Hosts.h rename to Limelight/Database/Host.h index 2b4d184..c63b4c4 100644 --- a/Limelight/Database/Hosts.h +++ b/Limelight/Database/Host.h @@ -1,5 +1,5 @@ // -// Hosts.h +// Host.h // Limelight // // Created by Diego Waxemberg on 10/28/14. @@ -10,7 +10,7 @@ #import -@interface Hosts : NSManagedObject +@interface Host : NSManagedObject @property (nonatomic, retain) NSString * address; @property (nonatomic, retain) NSString * name; diff --git a/Limelight/Database/Hosts.m b/Limelight/Database/Host.m similarity index 76% rename from Limelight/Database/Hosts.m rename to Limelight/Database/Host.m index 71eeaa6..7413518 100644 --- a/Limelight/Database/Hosts.m +++ b/Limelight/Database/Host.m @@ -1,15 +1,15 @@ // -// Hosts.m +// Host.m // Limelight // // Created by Diego Waxemberg on 10/28/14. // Copyright (c) 2014 Limelight Stream. All rights reserved. // -#import "Hosts.h" +#import "Host.h" -@implementation Hosts +@implementation Host @dynamic address; @dynamic name; diff --git a/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents b/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents index 4012f03..b8b065e 100644 --- a/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents +++ b/Limelight/Limelight.xcdatamodeld/Limelight.xcdatamodel/contents @@ -1,6 +1,6 @@ - - + + @@ -11,7 +11,7 @@ - - + + \ No newline at end of file diff --git a/Limelight/ViewControllers/MainFrameViewController.m b/Limelight/ViewControllers/MainFrameViewController.m index fe6d06c..9c992e6 100644 --- a/Limelight/ViewControllers/MainFrameViewController.m +++ b/Limelight/ViewControllers/MainFrameViewController.m @@ -116,7 +116,9 @@ static StreamConfiguration* streamConfig; Computer* newHost = [[Computer alloc] initWithIp:host]; [hostList addObject:newHost]; [self updateHosts:[hostList allObjects]]; - + DataManager* dataMan = [[DataManager alloc] init]; + [dataMan createHost:newHost.displayName hostname:newHost.hostName]; + [dataMan saveHosts]; //TODO: get pair state @@ -192,7 +194,8 @@ static StreamConfiguration* streamConfig; appScrollView = [[UIScrollView alloc] init]; appScrollView.frame = CGRectMake(0, hostScrollView.frame.size.height, self.view.frame.size.width, self.view.frame.size.height / 2); [appScrollView setShowsHorizontalScrollIndicator:NO]; - + + [self retrieveSavedHosts]; [self updateHosts:[hostList allObjects]]; [self.view addSubview:hostScrollView]; [self.view addSubview:appScrollView]; @@ -200,7 +203,7 @@ static StreamConfiguration* streamConfig; - (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; + [super viewDidAppear:animated]; [self.navigationController setNavigationBarHidden:NO animated:YES]; _mDNSManager = [[MDNSManager alloc] initWithCallback:self]; [_mDNSManager searchForHosts]; @@ -208,10 +211,22 @@ static StreamConfiguration* streamConfig; - (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; + [super viewDidDisappear:animated]; [_mDNSManager stopSearching]; } +- (void) retrieveSavedHosts { + //TODO: Get rid of Computer and only use Host + + DataManager* dataMan = [[DataManager alloc] init]; + NSArray* hosts = [dataMan retrieveHosts]; + for (Host* host in hosts) { + Computer* comp = [[Computer alloc] initWithIp:host.address]; + comp.displayName = host.name; + [hostList addObject:comp]; + } +} + - (void)updateHosts:(NSArray *)hosts { [hostList addObjectsFromArray:hosts]; [[hostScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; diff --git a/Limelight/ViewControllers/SettingsViewController.m b/Limelight/ViewControllers/SettingsViewController.m index 667283e..0dbc7b2 100644 --- a/Limelight/ViewControllers/SettingsViewController.m +++ b/Limelight/ViewControllers/SettingsViewController.m @@ -15,7 +15,7 @@ @implementation SettingsViewController { NSInteger _bitrate; } -static NSString* bitrateFormat = @"Bitrate: %d bps"; +static NSString* bitrateFormat = @"Bitrate: %d kbps"; - (void)viewDidLoad { diff --git a/iPad.storyboard b/iPad.storyboard index 8ab6bbd..86400a9 100644 --- a/iPad.storyboard +++ b/iPad.storyboard @@ -1,36 +1,130 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -54,6 +148,7 @@ + @@ -62,16 +157,15 @@ - - + - + diff --git a/iPhone.storyboard b/iPhone.storyboard index 1068cad..cd22b7f 100644 --- a/iPhone.storyboard +++ b/iPhone.storyboard @@ -1,5 +1,5 @@ - + @@ -45,7 +45,7 @@ - + @@ -59,8 +59,8 @@ -