├── ActionDetailViewController.h ├── ActionDetailViewController.m ├── Icons ├── Clear.png ├── Dropbox.png ├── FaceTime.png ├── Facebook.png ├── Fantastical 2.png ├── Foursquare.png ├── IFTTT.png ├── Instagram.png ├── Launch Center Pro.png ├── Lyft.png ├── Messenger.png ├── Music.png ├── OpenItIcons │ ├── CustomAction.png │ ├── icon-7-1024.png │ ├── icon-7-120.png │ ├── icon-7-152.png │ ├── icon-7-58.png │ ├── icon-7-76.png │ └── icon-7-80.png ├── Pebble.png ├── Phone.png ├── Photos.png ├── Pocket.png ├── Safari.png ├── Skype.png ├── Spotify.png ├── Starbucks.png ├── Swarm.png ├── TodoMovies 3.png ├── Tweetbot.png ├── Twitter.png ├── Uber.png ├── WhatsApp.png ├── YouTube.png ├── iBooks.png ├── mail.png └── messages.png ├── Launch Screen.xib ├── OpenIt.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── PatrickBalestra.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── OpenIt.xcscheme │ ├── TodayViewWidget.xcscheme │ └── xcschememanagement.plist ├── OpenIt ├── Add@2x.png ├── AppDelegate.h ├── AppDelegate.m ├── Base.lproj │ └── Main.storyboard ├── Calendar.png ├── ChooseActionViewController.h ├── ChooseActionViewController.m ├── Clear.png ├── Custom.png ├── Dropbox.png ├── FaceTime.png ├── Facebook.png ├── Fantastical 2.png ├── Foursquare.png ├── IFTTT.png ├── Images.xcassets │ ├── AppIcon-2.appiconset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── icon-7-120.png │ │ ├── icon-7-152.png │ │ ├── icon-7-76.png │ │ ├── icon-7-80-1.png │ │ └── icon-7-80.png │ ├── LaunchImage-2.launchimage │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── Info.plist ├── Instagram.png ├── Launch Center Pro.png ├── Lyft.png ├── Mail.png ├── Maps.png ├── Messages.png ├── Messenger.png ├── Music.png ├── OpenIt.entitlements ├── OtherActions.plist ├── Pebble.png ├── Phone.png ├── Photos.png ├── Pocket.png ├── Safari.png ├── SchemeBuilder.h ├── SchemeBuilder.m ├── Settings@2x.png ├── Skype.png ├── Spotify.png ├── Starbucks.png ├── Swarm.png ├── SystemActions.plist ├── TodoMovies 3.png ├── Tweetbot.png ├── Twitter.png ├── Uber.png ├── WhatsApp.png ├── YouTube.png ├── YourActionsViewController.h ├── YourActionsViewController.m ├── iBooks.png └── main.m ├── OpenItDemo.gif ├── README.md └── TodayViewWidget ├── Info.plist ├── MainInterface.storyboard ├── TodayViewController.h ├── TodayViewController.m └── TodayViewWidget.entitlements /ActionDetailViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ActionDetailViewController.h 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 24/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ActionDetailViewController : UITableViewController 12 | 13 | @property (strong, nonatomic) NSMutableArray *shortcutArray; 14 | @property (nonatomic) BOOL newAction; 15 | 16 | @property (weak, nonatomic) IBOutlet UIBarButtonItem *saveButton; 17 | 18 | - (IBAction)save:(id)sender; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ActionDetailViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ActionDetailViewController.m 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 24/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import "ActionDetailViewController.h" 10 | #import "ChooseActionViewController.h" 11 | 12 | @interface ActionDetailViewController () 13 | 14 | @end 15 | 16 | @implementation ActionDetailViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | 21 | self.title = self.shortcutArray[0][@"Title"]; 22 | 23 | if (![self.shortcutArray[0][@"Title"] isEqualToString:@""]) { 24 | self.title = self.shortcutArray[0][@"Title"]; 25 | } else { 26 | self.title = self.shortcutArray[1][@"Type"]; 27 | } 28 | 29 | if (!self.shortcutArray) { 30 | self.shortcutArray = [NSMutableArray array]; 31 | } 32 | 33 | self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; 34 | 35 | } 36 | 37 | - (IBAction)save:(id)sender { 38 | [self.view endEditing:YES]; 39 | 40 | if (self.shortcutArray.count > 0) { 41 | if (![self.shortcutArray[0][@"Title"] isEqualToString:@""]) { 42 | 43 | if (self.newAction) { 44 | [[NSNotificationCenter defaultCenter] postNotificationName:@"EditAction" object:self.shortcutArray]; 45 | } else { 46 | [[NSNotificationCenter defaultCenter] postNotificationName:@"AddNewAction" object:self.shortcutArray]; 47 | } 48 | 49 | if (!self.newAction) { 50 | // Remove Choose Action View Controller from the hierarchy to pop directly to Your Actions View Controller 51 | NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 52 | [allViewControllers removeObjectAtIndex:1]; 53 | self.navigationController.viewControllers = allViewControllers; 54 | } 55 | 56 | [self.navigationController popViewControllerAnimated:YES]; 57 | 58 | } else { 59 | UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Please Add a Title" message:nil preferredStyle:UIAlertControllerStyleAlert]; 60 | [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 61 | [alert dismissViewControllerAnimated:YES completion:nil]; 62 | }]]; 63 | [self presentViewController:alert animated:YES completion:nil]; 64 | } 65 | } 66 | } 67 | 68 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 69 | if (self.shortcutArray.count > 0) { 70 | if (self.shortcutArray.count > 3) { 71 | return 3; 72 | } else { 73 | return 2; 74 | } 75 | } 76 | return 1; 77 | } 78 | 79 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 80 | if (section == 0) { 81 | return 1; 82 | } else if (section == 1) { 83 | if (self.shortcutArray.count == 0) { 84 | return 1; 85 | } else { 86 | if (self.shortcutArray.count > 3) { 87 | return self.shortcutArray.count - 2; 88 | } else { 89 | return self.shortcutArray.count - 1; 90 | } 91 | } 92 | } else if (section == 2) { 93 | return ((NSMutableArray *)self.shortcutArray[3]).count; 94 | } 95 | return 0; 96 | } 97 | 98 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 99 | if (section == 0) { 100 | if (self.shortcutArray.count == 0) { 101 | return @"Shortcut"; 102 | } else { 103 | return @"Title"; 104 | } 105 | } else if (section == 1) { 106 | return @"Shortcut"; 107 | } else if (section == 2) { 108 | return @"Parameters"; 109 | } 110 | return @""; 111 | } 112 | 113 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 114 | return 45; 115 | } 116 | 117 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 118 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 119 | cell.selectionStyle = UITableViewCellSelectionStyleNone; 120 | 121 | if (indexPath.section == 0) { 122 | if (indexPath.row == 0) { 123 | if (self.shortcutArray.count == 0) { 124 | cell.textLabel.text = @"+"; 125 | cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin" size:30]; 126 | cell.textLabel.textColor = [UIColor darkGrayColor]; 127 | cell.textLabel.textAlignment = NSTextAlignmentCenter; 128 | cell.textLabel.tag = -10; 129 | cell.selectionStyle = UITableViewCellSelectionStyleDefault; 130 | } else { 131 | UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 5, cell.frame.size.width-40, 35)]; 132 | 133 | textField.autocapitalizationType = UITextAutocapitalizationTypeWords; 134 | textField.placeholder = @"Your Title"; 135 | textField.delegate = self; 136 | textField.tag = -1; 137 | [cell.contentView addSubview:textField]; 138 | 139 | cell.textLabel.text = @""; 140 | 141 | if (self.shortcutArray.count != 0) { 142 | textField.text = self.shortcutArray[0][@"Title"]; 143 | } 144 | } 145 | } 146 | } else if (indexPath.section == 1) { 147 | if (indexPath.row == 0) { 148 | cell.textLabel.text = /*[[self.shortcutArray[1] allKeys] firstObject]*/@"App"; 149 | cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:17]; 150 | cell.textLabel.textColor = [UIColor blackColor]; 151 | cell.textLabel.textAlignment = NSTextAlignmentLeft; 152 | 153 | UIImageView *imageIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.shortcutArray[1][@"Type"]]]; 154 | imageIcon.frame = CGRectMake(0, 0, 35, 35); 155 | cell.accessoryView = imageIcon; 156 | 157 | if ([self.shortcutArray[1][@"Type"] isEqualToString:@"Custom"]) { 158 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, cell.frame.size.width-190, 40)]; 159 | label.text = @"Custom"; 160 | label.textAlignment = NSTextAlignmentRight; 161 | cell.accessoryView = label; 162 | } 163 | 164 | } else if (indexPath.row == 1) { 165 | cell.textLabel.text = [[self.shortcutArray[2] allKeys] firstObject]; 166 | 167 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, 150, 35)]; 168 | label.text = [self.shortcutArray[2] valueForKey:cell.textLabel.text]; 169 | label.textAlignment = NSTextAlignmentRight; 170 | label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:18]; 171 | cell.accessoryView = label; 172 | 173 | if ([self.shortcutArray[1][@"Type"] isEqualToString:@"Custom"]) { 174 | UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, cell.frame.size.width-190, 40)]; 175 | textField.placeholder = @"Custom URL"; 176 | textField.tag = -2; 177 | textField.delegate = self; 178 | textField.textAlignment = NSTextAlignmentRight; 179 | textField.text = self.shortcutArray[2][@"URL"]; 180 | cell.accessoryView = textField; 181 | } 182 | } 183 | } else if (indexPath.section == 2) { 184 | NSArray *parameters = self.shortcutArray[3]; 185 | 186 | if (parameters.count == 1 && [parameters[0][@"type"] isEqualToString:@"Multiple"] && ![parameters[0][@"Value"] isEqualToString:@""]) { 187 | // Set right cell title 188 | cell.textLabel.text = parameters[0][@"placeholder"]; 189 | // Add Button to accessory view to then pop up Action Sheet 190 | UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 150, 35)]; 191 | button.layer.borderColor = [UIColor colorWithRed:0.8745 green:0.0784 blue:0.0745 alpha:1.0000].CGColor; 192 | button.layer.borderWidth = 1.0; 193 | button.layer.cornerRadius = 7.0; 194 | [button setTitleColor:[UIColor colorWithRed:0.8745 green:0.0784 blue:0.0745 alpha:1.0000] forState:UIControlStateNormal]; 195 | [button setTitle:parameters[0][@"placeholder"] forState:UIControlStateNormal]; 196 | [button addTarget:self action:@selector(presentActionSheet:) forControlEvents:UIControlEventTouchUpInside]; 197 | cell.accessoryView = button; 198 | return cell; 199 | } 200 | 201 | [parameters enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL *stop) { 202 | obj = parameters[indexPath.row]; 203 | cell.textLabel.text = obj[@"placeholder"]; 204 | 205 | UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 5, cell.frame.size.width-190, 35)]; 206 | textField.textAlignment = NSTextAlignmentRight; 207 | textField.tag = idx; 208 | textField.delegate = self; 209 | textField.autocapitalizationType = UITextAutocapitalizationTypeNone; 210 | textField.placeholder = obj[@"placeholder"]; 211 | textField.text = obj[@"value"]; 212 | 213 | if ([obj[@"type"] isEqualToString:@"Number"]) { 214 | [textField setKeyboardType:UIKeyboardTypeNumberPad]; 215 | } else if ([obj[@"type"] isEqualToString:@"String"]) { 216 | 217 | } else { 218 | textField.keyboardType = UIKeyboardTypeDefault; 219 | } 220 | 221 | cell.accessoryView = textField; 222 | }]; 223 | 224 | } 225 | 226 | return cell; 227 | } 228 | 229 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 230 | if (indexPath.section == 0 && self.shortcutArray.count == 0) { 231 | [self presentViewController:[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"NewAction"] animated:YES completion:nil]; 232 | } 233 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 234 | } 235 | 236 | - (void)presentActionSheet:(UIButton *)button { 237 | UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; 238 | // TODO: load dynamically items 239 | [actionSheet addAction:[UIAlertAction actionWithTitle:@"App" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 240 | [actionSheet dismissViewControllerAnimated:YES completion:nil]; 241 | }]]; 242 | [actionSheet addAction:[UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 243 | [actionSheet dismissViewControllerAnimated:YES completion:nil]; 244 | }]]; 245 | UIPopoverPresentationController *popOver = [actionSheet popoverPresentationController]; 246 | popOver.sourceView = button; 247 | popOver.sourceRect = button.bounds; 248 | [self presentViewController:actionSheet animated:YES completion:nil]; 249 | } 250 | 251 | # pragma UITextField 252 | 253 | - (BOOL)textFieldShouldReturn:(UITextField *)textField { 254 | [textField resignFirstResponder]; 255 | return YES; 256 | } 257 | 258 | - (void)textFieldDidEndEditing:(UITextField *)textField { 259 | if (textField.tag == -1) { 260 | // Save title at first index 261 | NSMutableDictionary *mutableDictionary = [self.shortcutArray[0] mutableCopy]; 262 | [mutableDictionary setObject:textField.text forKey:@"Title"]; 263 | self.shortcutArray[0] = [mutableDictionary mutableCopy]; 264 | } else if (textField.tag == -2) { 265 | // Custom action 266 | NSMutableDictionary *mutableDictionary = [self.shortcutArray[2] mutableCopy]; 267 | [mutableDictionary setObject:textField.text forKey:@"URL"]; 268 | self.shortcutArray[2] = [mutableDictionary mutableCopy]; 269 | } else { 270 | // Save parameters 271 | NSMutableArray *arrayOfParameters = [self.shortcutArray[3] mutableCopy]; 272 | NSMutableDictionary *dictionaryOfParameter = [arrayOfParameters[textField.tag] mutableCopy]; 273 | NSUInteger index = [arrayOfParameters indexOfObject:dictionaryOfParameter]; 274 | [dictionaryOfParameter setValue:textField.text forKey:@"value"]; 275 | [arrayOfParameters setObject:dictionaryOfParameter atIndexedSubscript:index]; 276 | self.shortcutArray[3] = [arrayOfParameters mutableCopy]; 277 | } 278 | } 279 | 280 | @end -------------------------------------------------------------------------------- /Icons/Clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Clear.png -------------------------------------------------------------------------------- /Icons/Dropbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Dropbox.png -------------------------------------------------------------------------------- /Icons/FaceTime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/FaceTime.png -------------------------------------------------------------------------------- /Icons/Facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Facebook.png -------------------------------------------------------------------------------- /Icons/Fantastical 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Fantastical 2.png -------------------------------------------------------------------------------- /Icons/Foursquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Foursquare.png -------------------------------------------------------------------------------- /Icons/IFTTT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/IFTTT.png -------------------------------------------------------------------------------- /Icons/Instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Instagram.png -------------------------------------------------------------------------------- /Icons/Launch Center Pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Launch Center Pro.png -------------------------------------------------------------------------------- /Icons/Lyft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Lyft.png -------------------------------------------------------------------------------- /Icons/Messenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Messenger.png -------------------------------------------------------------------------------- /Icons/Music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Music.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/CustomAction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/CustomAction.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/icon-7-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/icon-7-1024.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/icon-7-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/icon-7-120.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/icon-7-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/icon-7-152.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/icon-7-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/icon-7-58.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/icon-7-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/icon-7-76.png -------------------------------------------------------------------------------- /Icons/OpenItIcons/icon-7-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/OpenItIcons/icon-7-80.png -------------------------------------------------------------------------------- /Icons/Pebble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Pebble.png -------------------------------------------------------------------------------- /Icons/Phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Phone.png -------------------------------------------------------------------------------- /Icons/Photos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Photos.png -------------------------------------------------------------------------------- /Icons/Pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Pocket.png -------------------------------------------------------------------------------- /Icons/Safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Safari.png -------------------------------------------------------------------------------- /Icons/Skype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Skype.png -------------------------------------------------------------------------------- /Icons/Spotify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Spotify.png -------------------------------------------------------------------------------- /Icons/Starbucks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Starbucks.png -------------------------------------------------------------------------------- /Icons/Swarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Swarm.png -------------------------------------------------------------------------------- /Icons/TodoMovies 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/TodoMovies 3.png -------------------------------------------------------------------------------- /Icons/Tweetbot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Tweetbot.png -------------------------------------------------------------------------------- /Icons/Twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Twitter.png -------------------------------------------------------------------------------- /Icons/Uber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/Uber.png -------------------------------------------------------------------------------- /Icons/WhatsApp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/WhatsApp.png -------------------------------------------------------------------------------- /Icons/YouTube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/YouTube.png -------------------------------------------------------------------------------- /Icons/iBooks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/iBooks.png -------------------------------------------------------------------------------- /Icons/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/mail.png -------------------------------------------------------------------------------- /Icons/messages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/Icons/messages.png -------------------------------------------------------------------------------- /Launch Screen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /OpenIt.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | AE0C66F119A339B2004B3345 /* Dropbox.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66F019A339B2004B3345 /* Dropbox.png */; }; 11 | AE0C66F419A33A5D004B3345 /* Fantastical 2.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66F219A33A5D004B3345 /* Fantastical 2.png */; }; 12 | AE0C66F519A33A5D004B3345 /* Foursquare.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66F319A33A5D004B3345 /* Foursquare.png */; }; 13 | AE0C66F719A33A8F004B3345 /* IFTTT.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66F619A33A8F004B3345 /* IFTTT.png */; }; 14 | AE0C66F919A33AFE004B3345 /* Launch Center Pro.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66F819A33AFE004B3345 /* Launch Center Pro.png */; }; 15 | AE0C66FD19A33C17004B3345 /* Lyft.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66FC19A33C17004B3345 /* Lyft.png */; }; 16 | AE0C66FF19A33C49004B3345 /* Swarm.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C66FE19A33C49004B3345 /* Swarm.png */; }; 17 | AE0C670119A33CAB004B3345 /* Pebble.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C670019A33CAB004B3345 /* Pebble.png */; }; 18 | AE0C670319A33CC5004B3345 /* Skype.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C670219A33CC5004B3345 /* Skype.png */; }; 19 | AE0C670519A33D31004B3345 /* Spotify.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C670419A33D31004B3345 /* Spotify.png */; }; 20 | AE0C670719A33D4E004B3345 /* Starbucks.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C670619A33D4E004B3345 /* Starbucks.png */; }; 21 | AE0C670919A33D99004B3345 /* TodoMovies 3.png in Resources */ = {isa = PBXBuildFile; fileRef = AE0C670819A33D99004B3345 /* TodoMovies 3.png */; }; 22 | AE29FB59199A4B8A00AF4567 /* Custom.png in Resources */ = {isa = PBXBuildFile; fileRef = AE29FB58199A4B8A00AF4567 /* Custom.png */; }; 23 | AE3544AF199A12C9003A70F5 /* Clear.png in Resources */ = {isa = PBXBuildFile; fileRef = AE3544AE199A12C9003A70F5 /* Clear.png */; }; 24 | AE3544B1199A1325003A70F5 /* Pocket.png in Resources */ = {isa = PBXBuildFile; fileRef = AE3544B0199A1325003A70F5 /* Pocket.png */; }; 25 | AE3544B5199A13E1003A70F5 /* Uber.png in Resources */ = {isa = PBXBuildFile; fileRef = AE3544B4199A13E1003A70F5 /* Uber.png */; }; 26 | AE3544B7199A1901003A70F5 /* Messenger.png in Resources */ = {isa = PBXBuildFile; fileRef = AE3544B6199A1901003A70F5 /* Messenger.png */; }; 27 | AE440B0E1A0828E6008BDC18 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = AE440B0D1A0828E6008BDC18 /* Launch Screen.xib */; }; 28 | AE5EC7A2198B974C0040CF0A /* Settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AE5EC7A1198B974C0040CF0A /* Settings@2x.png */; }; 29 | AE5EC7A4198B982D0040CF0A /* Add@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AE5EC7A3198B982D0040CF0A /* Add@2x.png */; }; 30 | AE6A6D301994CDC600ABC6C7 /* Maps.png in Resources */ = {isa = PBXBuildFile; fileRef = AE6A6D2F1994CDC600ABC6C7 /* Maps.png */; }; 31 | AE6A6D321994CF2B00ABC6C7 /* Calendar.png in Resources */ = {isa = PBXBuildFile; fileRef = AE6A6D311994CF2B00ABC6C7 /* Calendar.png */; }; 32 | AEA2267C1998F3FA009AF1DF /* Instagram.png in Resources */ = {isa = PBXBuildFile; fileRef = AEA2267B1998F3FA009AF1DF /* Instagram.png */; }; 33 | AEA2267E1998F3FD009AF1DF /* WhatsApp.png in Resources */ = {isa = PBXBuildFile; fileRef = AEA2267D1998F3FD009AF1DF /* WhatsApp.png */; }; 34 | AEA226801998F400009AF1DF /* Tweetbot.png in Resources */ = {isa = PBXBuildFile; fileRef = AEA2267F1998F400009AF1DF /* Tweetbot.png */; }; 35 | AEA226821999003D009AF1DF /* Safari.png in Resources */ = {isa = PBXBuildFile; fileRef = AEA226811999003D009AF1DF /* Safari.png */; }; 36 | AEA25F7119798B5B009A21AB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = AEA25F7019798B5B009A21AB /* main.m */; }; 37 | AEA25F7419798B5B009A21AB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AEA25F7319798B5B009A21AB /* AppDelegate.m */; }; 38 | AEA25F7A19798B5B009A21AB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AEA25F7819798B5B009A21AB /* Main.storyboard */; }; 39 | AEA25F7C19798B5B009A21AB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEA25F7B19798B5B009A21AB /* Images.xcassets */; }; 40 | AEA25F9819798B6F009A21AB /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEA25F9719798B6F009A21AB /* NotificationCenter.framework */; }; 41 | AEA25F9E19798B6F009A21AB /* TodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AEA25F9D19798B6F009A21AB /* TodayViewController.m */; }; 42 | AEA25FA019798B6F009A21AB /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AEA25F9F19798B6F009A21AB /* MainInterface.storyboard */; }; 43 | AEA25FA319798B6F009A21AB /* TodayViewWidget.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = AEA25F9519798B6F009A21AB /* TodayViewWidget.appex */; }; 44 | AEAA8C1B198130E300DCF69C /* ActionDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AEAA8C1A198130E300DCF69C /* ActionDetailViewController.m */; }; 45 | AEAA8C231981854E00DCF69C /* ChooseActionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AEAA8C221981854E00DCF69C /* ChooseActionViewController.m */; }; 46 | AEAA8C251981A47C00DCF69C /* SystemActions.plist in Resources */ = {isa = PBXBuildFile; fileRef = AEAA8C241981A47C00DCF69C /* SystemActions.plist */; }; 47 | AECC32AB1986CB7000F52ACE /* FaceTime.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32AA1986CB7000F52ACE /* FaceTime.png */; }; 48 | AECC32AD1986CC5200F52ACE /* YouTube.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32AC1986CC5200F52ACE /* YouTube.png */; }; 49 | AECC32B01986CFF100F52ACE /* Music.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32AE1986CFF100F52ACE /* Music.png */; }; 50 | AECC32B11986CFF100F52ACE /* iBooks.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32AF1986CFF100F52ACE /* iBooks.png */; }; 51 | AECC32B41986D1CC00F52ACE /* Facebook.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32B21986D1CC00F52ACE /* Facebook.png */; }; 52 | AECC32B51986D1CC00F52ACE /* Twitter.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32B31986D1CC00F52ACE /* Twitter.png */; }; 53 | AECC32B71986E9EB00F52ACE /* Photos.png in Resources */ = {isa = PBXBuildFile; fileRef = AECC32B61986E9EB00F52ACE /* Photos.png */; }; 54 | AEE2CD0B197E93F1006DA67A /* YourActionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AEE2CD0A197E93F1006DA67A /* YourActionsViewController.m */; }; 55 | AEE3670C1997E69100030C00 /* OtherActions.plist in Resources */ = {isa = PBXBuildFile; fileRef = AEE3670B1997E69100030C00 /* OtherActions.plist */; }; 56 | AEEFD6D31983BFE10039EBDC /* SchemeBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = AEEFD6D21983BFE10039EBDC /* SchemeBuilder.m */; }; 57 | AEEFD6D71983F2E60039EBDC /* Mail.png in Resources */ = {isa = PBXBuildFile; fileRef = AEEFD6D41983F2E60039EBDC /* Mail.png */; }; 58 | AEEFD6D91983F2E60039EBDC /* Messages.png in Resources */ = {isa = PBXBuildFile; fileRef = AEEFD6D61983F2E60039EBDC /* Messages.png */; }; 59 | AEEFD6DB1983F4360039EBDC /* Phone.png in Resources */ = {isa = PBXBuildFile; fileRef = AEEFD6DA1983F4360039EBDC /* Phone.png */; }; 60 | /* End PBXBuildFile section */ 61 | 62 | /* Begin PBXContainerItemProxy section */ 63 | AEA25FA119798B6F009A21AB /* PBXContainerItemProxy */ = { 64 | isa = PBXContainerItemProxy; 65 | containerPortal = AEA25F6319798B5B009A21AB /* Project object */; 66 | proxyType = 1; 67 | remoteGlobalIDString = AEA25F9419798B6F009A21AB; 68 | remoteInfo = TodayViewWidget; 69 | }; 70 | AEA25FA419798B6F009A21AB /* PBXContainerItemProxy */ = { 71 | isa = PBXContainerItemProxy; 72 | containerPortal = AEA25F6319798B5B009A21AB /* Project object */; 73 | proxyType = 1; 74 | remoteGlobalIDString = AEA25F9419798B6F009A21AB; 75 | remoteInfo = TodayViewWidget; 76 | }; 77 | /* End PBXContainerItemProxy section */ 78 | 79 | /* Begin PBXCopyFilesBuildPhase section */ 80 | AEA25FA919798B6F009A21AB /* Embed App Extensions */ = { 81 | isa = PBXCopyFilesBuildPhase; 82 | buildActionMask = 2147483647; 83 | dstPath = ""; 84 | dstSubfolderSpec = 13; 85 | files = ( 86 | AEA25FA319798B6F009A21AB /* TodayViewWidget.appex in Embed App Extensions */, 87 | ); 88 | name = "Embed App Extensions"; 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | /* End PBXCopyFilesBuildPhase section */ 92 | 93 | /* Begin PBXFileReference section */ 94 | AE0C66F019A339B2004B3345 /* Dropbox.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Dropbox.png; sourceTree = ""; }; 95 | AE0C66F219A33A5D004B3345 /* Fantastical 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Fantastical 2.png"; sourceTree = ""; }; 96 | AE0C66F319A33A5D004B3345 /* Foursquare.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Foursquare.png; sourceTree = ""; }; 97 | AE0C66F619A33A8F004B3345 /* IFTTT.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = IFTTT.png; sourceTree = ""; }; 98 | AE0C66F819A33AFE004B3345 /* Launch Center Pro.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Launch Center Pro.png"; sourceTree = ""; }; 99 | AE0C66FC19A33C17004B3345 /* Lyft.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Lyft.png; sourceTree = ""; }; 100 | AE0C66FE19A33C49004B3345 /* Swarm.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Swarm.png; sourceTree = ""; }; 101 | AE0C670019A33CAB004B3345 /* Pebble.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Pebble.png; sourceTree = ""; }; 102 | AE0C670219A33CC5004B3345 /* Skype.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Skype.png; sourceTree = ""; }; 103 | AE0C670419A33D31004B3345 /* Spotify.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Spotify.png; sourceTree = ""; }; 104 | AE0C670619A33D4E004B3345 /* Starbucks.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Starbucks.png; sourceTree = ""; }; 105 | AE0C670819A33D99004B3345 /* TodoMovies 3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "TodoMovies 3.png"; sourceTree = ""; }; 106 | AE29FB58199A4B8A00AF4567 /* Custom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Custom.png; sourceTree = ""; }; 107 | AE3544AE199A12C9003A70F5 /* Clear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Clear.png; sourceTree = ""; }; 108 | AE3544B0199A1325003A70F5 /* Pocket.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Pocket.png; sourceTree = ""; }; 109 | AE3544B4199A13E1003A70F5 /* Uber.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Uber.png; sourceTree = ""; }; 110 | AE3544B6199A1901003A70F5 /* Messenger.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Messenger.png; sourceTree = ""; }; 111 | AE440B0D1A0828E6008BDC18 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "Launch Screen.xib"; path = "../Launch Screen.xib"; sourceTree = ""; }; 112 | AE5EC7A1198B974C0040CF0A /* Settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Settings@2x.png"; sourceTree = ""; }; 113 | AE5EC7A3198B982D0040CF0A /* Add@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Add@2x.png"; sourceTree = ""; }; 114 | AE6A6D2F1994CDC600ABC6C7 /* Maps.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Maps.png; sourceTree = ""; }; 115 | AE6A6D311994CF2B00ABC6C7 /* Calendar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Calendar.png; sourceTree = ""; }; 116 | AEA2267B1998F3FA009AF1DF /* Instagram.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Instagram.png; sourceTree = ""; }; 117 | AEA2267D1998F3FD009AF1DF /* WhatsApp.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WhatsApp.png; sourceTree = ""; }; 118 | AEA2267F1998F400009AF1DF /* Tweetbot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Tweetbot.png; sourceTree = ""; }; 119 | AEA226811999003D009AF1DF /* Safari.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Safari.png; sourceTree = ""; }; 120 | AEA25F6B19798B5B009A21AB /* OpenIt.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenIt.app; sourceTree = BUILT_PRODUCTS_DIR; }; 121 | AEA25F6F19798B5B009A21AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 122 | AEA25F7019798B5B009A21AB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 123 | AEA25F7219798B5B009A21AB /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 124 | AEA25F7319798B5B009A21AB /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 125 | AEA25F7919798B5B009A21AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 126 | AEA25F7B19798B5B009A21AB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 127 | AEA25F9519798B6F009A21AB /* TodayViewWidget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TodayViewWidget.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 128 | AEA25F9719798B6F009A21AB /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; 129 | AEA25F9B19798B6F009A21AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 130 | AEA25F9C19798B6F009A21AB /* TodayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TodayViewController.h; sourceTree = ""; }; 131 | AEA25F9D19798B6F009A21AB /* TodayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TodayViewController.m; sourceTree = ""; }; 132 | AEA25F9F19798B6F009A21AB /* MainInterface.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainInterface.storyboard; sourceTree = ""; }; 133 | AEA25FAA19798B81009A21AB /* OpenIt.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = OpenIt.entitlements; sourceTree = ""; }; 134 | AEA25FAF19798BB5009A21AB /* TodayViewWidget.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = TodayViewWidget.entitlements; sourceTree = ""; }; 135 | AEAA8C19198130E300DCF69C /* ActionDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ActionDetailViewController.h; path = ../ActionDetailViewController.h; sourceTree = ""; }; 136 | AEAA8C1A198130E300DCF69C /* ActionDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ActionDetailViewController.m; path = ../ActionDetailViewController.m; sourceTree = ""; }; 137 | AEAA8C211981854E00DCF69C /* ChooseActionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChooseActionViewController.h; sourceTree = ""; }; 138 | AEAA8C221981854E00DCF69C /* ChooseActionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChooseActionViewController.m; sourceTree = ""; }; 139 | AEAA8C241981A47C00DCF69C /* SystemActions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = SystemActions.plist; sourceTree = ""; }; 140 | AECC32AA1986CB7000F52ACE /* FaceTime.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = FaceTime.png; sourceTree = ""; }; 141 | AECC32AC1986CC5200F52ACE /* YouTube.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = YouTube.png; sourceTree = ""; }; 142 | AECC32AE1986CFF100F52ACE /* Music.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Music.png; sourceTree = ""; }; 143 | AECC32AF1986CFF100F52ACE /* iBooks.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iBooks.png; sourceTree = ""; }; 144 | AECC32B21986D1CC00F52ACE /* Facebook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Facebook.png; sourceTree = ""; }; 145 | AECC32B31986D1CC00F52ACE /* Twitter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Twitter.png; sourceTree = ""; }; 146 | AECC32B61986E9EB00F52ACE /* Photos.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Photos.png; sourceTree = ""; }; 147 | AEE2CD09197E93F1006DA67A /* YourActionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YourActionsViewController.h; sourceTree = ""; }; 148 | AEE2CD0A197E93F1006DA67A /* YourActionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YourActionsViewController.m; sourceTree = ""; }; 149 | AEE3670B1997E69100030C00 /* OtherActions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OtherActions.plist; sourceTree = ""; }; 150 | AEEFD6D11983BFE10039EBDC /* SchemeBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SchemeBuilder.h; sourceTree = ""; }; 151 | AEEFD6D21983BFE10039EBDC /* SchemeBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SchemeBuilder.m; sourceTree = ""; }; 152 | AEEFD6D41983F2E60039EBDC /* Mail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Mail.png; sourceTree = ""; }; 153 | AEEFD6D61983F2E60039EBDC /* Messages.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Messages.png; sourceTree = ""; }; 154 | AEEFD6DA1983F4360039EBDC /* Phone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Phone.png; sourceTree = ""; }; 155 | /* End PBXFileReference section */ 156 | 157 | /* Begin PBXFrameworksBuildPhase section */ 158 | AEA25F6819798B5B009A21AB /* Frameworks */ = { 159 | isa = PBXFrameworksBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | ); 163 | runOnlyForDeploymentPostprocessing = 0; 164 | }; 165 | AEA25F9219798B6F009A21AB /* Frameworks */ = { 166 | isa = PBXFrameworksBuildPhase; 167 | buildActionMask = 2147483647; 168 | files = ( 169 | AEA25F9819798B6F009A21AB /* NotificationCenter.framework in Frameworks */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXFrameworksBuildPhase section */ 174 | 175 | /* Begin PBXGroup section */ 176 | AEA25F6219798B5B009A21AB = { 177 | isa = PBXGroup; 178 | children = ( 179 | AEA25F6D19798B5B009A21AB /* OpenIt */, 180 | AEA25F9919798B6F009A21AB /* TodayViewWidget */, 181 | AEA25F9619798B6F009A21AB /* Frameworks */, 182 | AEA25F6C19798B5B009A21AB /* Products */, 183 | ); 184 | sourceTree = ""; 185 | }; 186 | AEA25F6C19798B5B009A21AB /* Products */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | AEA25F6B19798B5B009A21AB /* OpenIt.app */, 190 | AEA25F9519798B6F009A21AB /* TodayViewWidget.appex */, 191 | ); 192 | name = Products; 193 | sourceTree = ""; 194 | }; 195 | AEA25F6D19798B5B009A21AB /* OpenIt */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | AEA25FAA19798B81009A21AB /* OpenIt.entitlements */, 199 | AEA25F7819798B5B009A21AB /* Main.storyboard */, 200 | AEA25F7219798B5B009A21AB /* AppDelegate.h */, 201 | AEA25F7319798B5B009A21AB /* AppDelegate.m */, 202 | AEE2CD09197E93F1006DA67A /* YourActionsViewController.h */, 203 | AEE2CD0A197E93F1006DA67A /* YourActionsViewController.m */, 204 | AEAA8C19198130E300DCF69C /* ActionDetailViewController.h */, 205 | AEAA8C1A198130E300DCF69C /* ActionDetailViewController.m */, 206 | AEAA8C211981854E00DCF69C /* ChooseActionViewController.h */, 207 | AEAA8C221981854E00DCF69C /* ChooseActionViewController.m */, 208 | AEEFD6D11983BFE10039EBDC /* SchemeBuilder.h */, 209 | AEEFD6D21983BFE10039EBDC /* SchemeBuilder.m */, 210 | AE440B0D1A0828E6008BDC18 /* Launch Screen.xib */, 211 | AEA25F6E19798B5B009A21AB /* Supporting Files */, 212 | ); 213 | path = OpenIt; 214 | sourceTree = ""; 215 | }; 216 | AEA25F6E19798B5B009A21AB /* Supporting Files */ = { 217 | isa = PBXGroup; 218 | children = ( 219 | AEA25F7B19798B5B009A21AB /* Images.xcassets */, 220 | AEAA8C241981A47C00DCF69C /* SystemActions.plist */, 221 | AEE3670B1997E69100030C00 /* OtherActions.plist */, 222 | AEEFD6D41983F2E60039EBDC /* Mail.png */, 223 | AEEFD6DA1983F4360039EBDC /* Phone.png */, 224 | AEEFD6D61983F2E60039EBDC /* Messages.png */, 225 | AECC32AA1986CB7000F52ACE /* FaceTime.png */, 226 | AECC32AC1986CC5200F52ACE /* YouTube.png */, 227 | AE6A6D2F1994CDC600ABC6C7 /* Maps.png */, 228 | AE6A6D311994CF2B00ABC6C7 /* Calendar.png */, 229 | AECC32AE1986CFF100F52ACE /* Music.png */, 230 | AECC32AF1986CFF100F52ACE /* iBooks.png */, 231 | AECC32B21986D1CC00F52ACE /* Facebook.png */, 232 | AECC32B31986D1CC00F52ACE /* Twitter.png */, 233 | AECC32B61986E9EB00F52ACE /* Photos.png */, 234 | AEA2267B1998F3FA009AF1DF /* Instagram.png */, 235 | AE3544B0199A1325003A70F5 /* Pocket.png */, 236 | AE3544B4199A13E1003A70F5 /* Uber.png */, 237 | AEA226811999003D009AF1DF /* Safari.png */, 238 | AE3544AE199A12C9003A70F5 /* Clear.png */, 239 | AE3544B6199A1901003A70F5 /* Messenger.png */, 240 | AE0C66F219A33A5D004B3345 /* Fantastical 2.png */, 241 | AE0C66F319A33A5D004B3345 /* Foursquare.png */, 242 | AE0C66F019A339B2004B3345 /* Dropbox.png */, 243 | AE0C66F619A33A8F004B3345 /* IFTTT.png */, 244 | AE0C66F819A33AFE004B3345 /* Launch Center Pro.png */, 245 | AE29FB58199A4B8A00AF4567 /* Custom.png */, 246 | AEA2267D1998F3FD009AF1DF /* WhatsApp.png */, 247 | AEA2267F1998F400009AF1DF /* Tweetbot.png */, 248 | AE0C66FC19A33C17004B3345 /* Lyft.png */, 249 | AE0C670219A33CC5004B3345 /* Skype.png */, 250 | AE0C66FE19A33C49004B3345 /* Swarm.png */, 251 | AE0C670019A33CAB004B3345 /* Pebble.png */, 252 | AE0C670419A33D31004B3345 /* Spotify.png */, 253 | AE0C670619A33D4E004B3345 /* Starbucks.png */, 254 | AE0C670819A33D99004B3345 /* TodoMovies 3.png */, 255 | AE5EC7A3198B982D0040CF0A /* Add@2x.png */, 256 | AE5EC7A1198B974C0040CF0A /* Settings@2x.png */, 257 | AEA25F6F19798B5B009A21AB /* Info.plist */, 258 | AEA25F7019798B5B009A21AB /* main.m */, 259 | ); 260 | name = "Supporting Files"; 261 | sourceTree = ""; 262 | }; 263 | AEA25F9619798B6F009A21AB /* Frameworks */ = { 264 | isa = PBXGroup; 265 | children = ( 266 | AEA25F9719798B6F009A21AB /* NotificationCenter.framework */, 267 | ); 268 | name = Frameworks; 269 | sourceTree = ""; 270 | }; 271 | AEA25F9919798B6F009A21AB /* TodayViewWidget */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | AEA25FAF19798BB5009A21AB /* TodayViewWidget.entitlements */, 275 | AEA25F9C19798B6F009A21AB /* TodayViewController.h */, 276 | AEA25F9D19798B6F009A21AB /* TodayViewController.m */, 277 | AEA25F9F19798B6F009A21AB /* MainInterface.storyboard */, 278 | AEA25F9A19798B6F009A21AB /* Supporting Files */, 279 | ); 280 | path = TodayViewWidget; 281 | sourceTree = ""; 282 | }; 283 | AEA25F9A19798B6F009A21AB /* Supporting Files */ = { 284 | isa = PBXGroup; 285 | children = ( 286 | AEA25F9B19798B6F009A21AB /* Info.plist */, 287 | ); 288 | name = "Supporting Files"; 289 | sourceTree = ""; 290 | }; 291 | /* End PBXGroup section */ 292 | 293 | /* Begin PBXNativeTarget section */ 294 | AEA25F6A19798B5B009A21AB /* OpenIt */ = { 295 | isa = PBXNativeTarget; 296 | buildConfigurationList = AEA25F8B19798B5B009A21AB /* Build configuration list for PBXNativeTarget "OpenIt" */; 297 | buildPhases = ( 298 | AEA25F6719798B5B009A21AB /* Sources */, 299 | AEA25F6819798B5B009A21AB /* Frameworks */, 300 | AEA25F6919798B5B009A21AB /* Resources */, 301 | AEA25FA919798B6F009A21AB /* Embed App Extensions */, 302 | ); 303 | buildRules = ( 304 | ); 305 | dependencies = ( 306 | AEA25FA219798B6F009A21AB /* PBXTargetDependency */, 307 | AEA25FA519798B6F009A21AB /* PBXTargetDependency */, 308 | ); 309 | name = OpenIt; 310 | productName = OpenIt; 311 | productReference = AEA25F6B19798B5B009A21AB /* OpenIt.app */; 312 | productType = "com.apple.product-type.application"; 313 | }; 314 | AEA25F9419798B6F009A21AB /* TodayViewWidget */ = { 315 | isa = PBXNativeTarget; 316 | buildConfigurationList = AEA25FA619798B6F009A21AB /* Build configuration list for PBXNativeTarget "TodayViewWidget" */; 317 | buildPhases = ( 318 | AEA25F9119798B6F009A21AB /* Sources */, 319 | AEA25F9219798B6F009A21AB /* Frameworks */, 320 | AEA25F9319798B6F009A21AB /* Resources */, 321 | ); 322 | buildRules = ( 323 | ); 324 | dependencies = ( 325 | ); 326 | name = TodayViewWidget; 327 | productName = TodayViewWidget; 328 | productReference = AEA25F9519798B6F009A21AB /* TodayViewWidget.appex */; 329 | productType = "com.apple.product-type.app-extension"; 330 | }; 331 | /* End PBXNativeTarget section */ 332 | 333 | /* Begin PBXProject section */ 334 | AEA25F6319798B5B009A21AB /* Project object */ = { 335 | isa = PBXProject; 336 | attributes = { 337 | LastUpgradeCheck = 0600; 338 | ORGANIZATIONNAME = "Patrick Balestra"; 339 | TargetAttributes = { 340 | AEA25F6A19798B5B009A21AB = { 341 | CreatedOnToolsVersion = 6.0; 342 | DevelopmentTeam = VKVDVFQ5UA; 343 | SystemCapabilities = { 344 | com.apple.ApplicationGroups.iOS = { 345 | enabled = 1; 346 | }; 347 | }; 348 | }; 349 | AEA25F9419798B6F009A21AB = { 350 | CreatedOnToolsVersion = 6.0; 351 | DevelopmentTeam = VKVDVFQ5UA; 352 | SystemCapabilities = { 353 | com.apple.ApplicationGroups.iOS = { 354 | enabled = 1; 355 | }; 356 | }; 357 | }; 358 | }; 359 | }; 360 | buildConfigurationList = AEA25F6619798B5B009A21AB /* Build configuration list for PBXProject "OpenIt" */; 361 | compatibilityVersion = "Xcode 3.2"; 362 | developmentRegion = English; 363 | hasScannedForEncodings = 0; 364 | knownRegions = ( 365 | en, 366 | Base, 367 | ); 368 | mainGroup = AEA25F6219798B5B009A21AB; 369 | productRefGroup = AEA25F6C19798B5B009A21AB /* Products */; 370 | projectDirPath = ""; 371 | projectRoot = ""; 372 | targets = ( 373 | AEA25F6A19798B5B009A21AB /* OpenIt */, 374 | AEA25F9419798B6F009A21AB /* TodayViewWidget */, 375 | ); 376 | }; 377 | /* End PBXProject section */ 378 | 379 | /* Begin PBXResourcesBuildPhase section */ 380 | AEA25F6919798B5B009A21AB /* Resources */ = { 381 | isa = PBXResourcesBuildPhase; 382 | buildActionMask = 2147483647; 383 | files = ( 384 | AE3544B5199A13E1003A70F5 /* Uber.png in Resources */, 385 | AE3544B1199A1325003A70F5 /* Pocket.png in Resources */, 386 | AEAA8C251981A47C00DCF69C /* SystemActions.plist in Resources */, 387 | AEA2267C1998F3FA009AF1DF /* Instagram.png in Resources */, 388 | AEE3670C1997E69100030C00 /* OtherActions.plist in Resources */, 389 | AEA2267E1998F3FD009AF1DF /* WhatsApp.png in Resources */, 390 | AE0C670519A33D31004B3345 /* Spotify.png in Resources */, 391 | AECC32AD1986CC5200F52ACE /* YouTube.png in Resources */, 392 | AE0C66F719A33A8F004B3345 /* IFTTT.png in Resources */, 393 | AE0C66FD19A33C17004B3345 /* Lyft.png in Resources */, 394 | AE0C66F119A339B2004B3345 /* Dropbox.png in Resources */, 395 | AE0C66F519A33A5D004B3345 /* Foursquare.png in Resources */, 396 | AE3544B7199A1901003A70F5 /* Messenger.png in Resources */, 397 | AEEFD6D71983F2E60039EBDC /* Mail.png in Resources */, 398 | AE29FB59199A4B8A00AF4567 /* Custom.png in Resources */, 399 | AE5EC7A2198B974C0040CF0A /* Settings@2x.png in Resources */, 400 | AEEFD6D91983F2E60039EBDC /* Messages.png in Resources */, 401 | AECC32B71986E9EB00F52ACE /* Photos.png in Resources */, 402 | AECC32B11986CFF100F52ACE /* iBooks.png in Resources */, 403 | AEA25F7A19798B5B009A21AB /* Main.storyboard in Resources */, 404 | AEA226821999003D009AF1DF /* Safari.png in Resources */, 405 | AE6A6D321994CF2B00ABC6C7 /* Calendar.png in Resources */, 406 | AEA226801998F400009AF1DF /* Tweetbot.png in Resources */, 407 | AECC32B51986D1CC00F52ACE /* Twitter.png in Resources */, 408 | AEA25F7C19798B5B009A21AB /* Images.xcassets in Resources */, 409 | AE0C66F919A33AFE004B3345 /* Launch Center Pro.png in Resources */, 410 | AECC32AB1986CB7000F52ACE /* FaceTime.png in Resources */, 411 | AECC32B01986CFF100F52ACE /* Music.png in Resources */, 412 | AE0C66FF19A33C49004B3345 /* Swarm.png in Resources */, 413 | AE3544AF199A12C9003A70F5 /* Clear.png in Resources */, 414 | AE0C670919A33D99004B3345 /* TodoMovies 3.png in Resources */, 415 | AE6A6D301994CDC600ABC6C7 /* Maps.png in Resources */, 416 | AE0C670319A33CC5004B3345 /* Skype.png in Resources */, 417 | AE0C66F419A33A5D004B3345 /* Fantastical 2.png in Resources */, 418 | AE0C670719A33D4E004B3345 /* Starbucks.png in Resources */, 419 | AECC32B41986D1CC00F52ACE /* Facebook.png in Resources */, 420 | AEEFD6DB1983F4360039EBDC /* Phone.png in Resources */, 421 | AE5EC7A4198B982D0040CF0A /* Add@2x.png in Resources */, 422 | AE0C670119A33CAB004B3345 /* Pebble.png in Resources */, 423 | AE440B0E1A0828E6008BDC18 /* Launch Screen.xib in Resources */, 424 | ); 425 | runOnlyForDeploymentPostprocessing = 0; 426 | }; 427 | AEA25F9319798B6F009A21AB /* Resources */ = { 428 | isa = PBXResourcesBuildPhase; 429 | buildActionMask = 2147483647; 430 | files = ( 431 | AEA25FA019798B6F009A21AB /* MainInterface.storyboard in Resources */, 432 | ); 433 | runOnlyForDeploymentPostprocessing = 0; 434 | }; 435 | /* End PBXResourcesBuildPhase section */ 436 | 437 | /* Begin PBXSourcesBuildPhase section */ 438 | AEA25F6719798B5B009A21AB /* Sources */ = { 439 | isa = PBXSourcesBuildPhase; 440 | buildActionMask = 2147483647; 441 | files = ( 442 | AEAA8C231981854E00DCF69C /* ChooseActionViewController.m in Sources */, 443 | AEE2CD0B197E93F1006DA67A /* YourActionsViewController.m in Sources */, 444 | AEA25F7419798B5B009A21AB /* AppDelegate.m in Sources */, 445 | AEEFD6D31983BFE10039EBDC /* SchemeBuilder.m in Sources */, 446 | AEA25F7119798B5B009A21AB /* main.m in Sources */, 447 | AEAA8C1B198130E300DCF69C /* ActionDetailViewController.m in Sources */, 448 | ); 449 | runOnlyForDeploymentPostprocessing = 0; 450 | }; 451 | AEA25F9119798B6F009A21AB /* Sources */ = { 452 | isa = PBXSourcesBuildPhase; 453 | buildActionMask = 2147483647; 454 | files = ( 455 | AEA25F9E19798B6F009A21AB /* TodayViewController.m in Sources */, 456 | ); 457 | runOnlyForDeploymentPostprocessing = 0; 458 | }; 459 | /* End PBXSourcesBuildPhase section */ 460 | 461 | /* Begin PBXTargetDependency section */ 462 | AEA25FA219798B6F009A21AB /* PBXTargetDependency */ = { 463 | isa = PBXTargetDependency; 464 | target = AEA25F9419798B6F009A21AB /* TodayViewWidget */; 465 | targetProxy = AEA25FA119798B6F009A21AB /* PBXContainerItemProxy */; 466 | }; 467 | AEA25FA519798B6F009A21AB /* PBXTargetDependency */ = { 468 | isa = PBXTargetDependency; 469 | target = AEA25F9419798B6F009A21AB /* TodayViewWidget */; 470 | targetProxy = AEA25FA419798B6F009A21AB /* PBXContainerItemProxy */; 471 | }; 472 | /* End PBXTargetDependency section */ 473 | 474 | /* Begin PBXVariantGroup section */ 475 | AEA25F7819798B5B009A21AB /* Main.storyboard */ = { 476 | isa = PBXVariantGroup; 477 | children = ( 478 | AEA25F7919798B5B009A21AB /* Base */, 479 | ); 480 | name = Main.storyboard; 481 | sourceTree = ""; 482 | }; 483 | /* End PBXVariantGroup section */ 484 | 485 | /* Begin XCBuildConfiguration section */ 486 | AEA25F8919798B5B009A21AB /* Debug */ = { 487 | isa = XCBuildConfiguration; 488 | buildSettings = { 489 | ALWAYS_SEARCH_USER_PATHS = NO; 490 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 491 | CLANG_CXX_LIBRARY = "libc++"; 492 | CLANG_ENABLE_MODULES = YES; 493 | CLANG_ENABLE_OBJC_ARC = YES; 494 | CLANG_WARN_BOOL_CONVERSION = YES; 495 | CLANG_WARN_CONSTANT_CONVERSION = YES; 496 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 497 | CLANG_WARN_EMPTY_BODY = YES; 498 | CLANG_WARN_ENUM_CONVERSION = YES; 499 | CLANG_WARN_INT_CONVERSION = YES; 500 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 501 | CLANG_WARN_UNREACHABLE_CODE = YES; 502 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 503 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 504 | COPY_PHASE_STRIP = NO; 505 | ENABLE_STRICT_OBJC_MSGSEND = YES; 506 | GCC_C_LANGUAGE_STANDARD = gnu99; 507 | GCC_DYNAMIC_NO_PIC = NO; 508 | GCC_OPTIMIZATION_LEVEL = 0; 509 | GCC_PREPROCESSOR_DEFINITIONS = ( 510 | "DEBUG=1", 511 | "$(inherited)", 512 | ); 513 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 514 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 515 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 516 | GCC_WARN_UNDECLARED_SELECTOR = YES; 517 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 518 | GCC_WARN_UNUSED_FUNCTION = YES; 519 | GCC_WARN_UNUSED_VARIABLE = YES; 520 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 521 | MTL_ENABLE_DEBUG_INFO = YES; 522 | ONLY_ACTIVE_ARCH = YES; 523 | SDKROOT = iphoneos; 524 | }; 525 | name = Debug; 526 | }; 527 | AEA25F8A19798B5B009A21AB /* Release */ = { 528 | isa = XCBuildConfiguration; 529 | buildSettings = { 530 | ALWAYS_SEARCH_USER_PATHS = NO; 531 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 532 | CLANG_CXX_LIBRARY = "libc++"; 533 | CLANG_ENABLE_MODULES = YES; 534 | CLANG_ENABLE_OBJC_ARC = YES; 535 | CLANG_WARN_BOOL_CONVERSION = YES; 536 | CLANG_WARN_CONSTANT_CONVERSION = YES; 537 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 538 | CLANG_WARN_EMPTY_BODY = YES; 539 | CLANG_WARN_ENUM_CONVERSION = YES; 540 | CLANG_WARN_INT_CONVERSION = YES; 541 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 542 | CLANG_WARN_UNREACHABLE_CODE = YES; 543 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 544 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 545 | COPY_PHASE_STRIP = YES; 546 | ENABLE_NS_ASSERTIONS = NO; 547 | ENABLE_STRICT_OBJC_MSGSEND = YES; 548 | GCC_C_LANGUAGE_STANDARD = gnu99; 549 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 550 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 551 | GCC_WARN_UNDECLARED_SELECTOR = YES; 552 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 553 | GCC_WARN_UNUSED_FUNCTION = YES; 554 | GCC_WARN_UNUSED_VARIABLE = YES; 555 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 556 | MTL_ENABLE_DEBUG_INFO = NO; 557 | SDKROOT = iphoneos; 558 | VALIDATE_PRODUCT = YES; 559 | }; 560 | name = Release; 561 | }; 562 | AEA25F8C19798B5B009A21AB /* Debug */ = { 563 | isa = XCBuildConfiguration; 564 | buildSettings = { 565 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 566 | CODE_SIGN_ENTITLEMENTS = OpenIt/OpenIt.entitlements; 567 | CODE_SIGN_IDENTITY = "iPhone Developer"; 568 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 569 | FRAMEWORK_SEARCH_PATHS = ( 570 | "$(inherited)", 571 | "$(PROJECT_DIR)", 572 | ); 573 | INFOPLIST_FILE = OpenIt/Info.plist; 574 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 575 | PRODUCT_NAME = "$(TARGET_NAME)"; 576 | PROVISIONING_PROFILE = ""; 577 | TARGETED_DEVICE_FAMILY = "1,2"; 578 | }; 579 | name = Debug; 580 | }; 581 | AEA25F8D19798B5B009A21AB /* Release */ = { 582 | isa = XCBuildConfiguration; 583 | buildSettings = { 584 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 585 | CODE_SIGN_ENTITLEMENTS = OpenIt/OpenIt.entitlements; 586 | CODE_SIGN_IDENTITY = "iPhone Developer"; 587 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 588 | FRAMEWORK_SEARCH_PATHS = ( 589 | "$(inherited)", 590 | "$(PROJECT_DIR)", 591 | ); 592 | INFOPLIST_FILE = OpenIt/Info.plist; 593 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 594 | PRODUCT_NAME = "$(TARGET_NAME)"; 595 | PROVISIONING_PROFILE = ""; 596 | TARGETED_DEVICE_FAMILY = "1,2"; 597 | }; 598 | name = Release; 599 | }; 600 | AEA25FA719798B6F009A21AB /* Debug */ = { 601 | isa = XCBuildConfiguration; 602 | buildSettings = { 603 | ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-2"; 604 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "LaunchImage-2"; 605 | CODE_SIGN_ENTITLEMENTS = TodayViewWidget/TodayViewWidget.entitlements; 606 | CODE_SIGN_IDENTITY = "iPhone Developer"; 607 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 608 | GCC_PREPROCESSOR_DEFINITIONS = ( 609 | "DEBUG=1", 610 | "$(inherited)", 611 | ); 612 | INFOPLIST_FILE = TodayViewWidget/Info.plist; 613 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 614 | PRODUCT_NAME = "$(TARGET_NAME)"; 615 | PROVISIONING_PROFILE = ""; 616 | SKIP_INSTALL = YES; 617 | }; 618 | name = Debug; 619 | }; 620 | AEA25FA819798B6F009A21AB /* Release */ = { 621 | isa = XCBuildConfiguration; 622 | buildSettings = { 623 | ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-2"; 624 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "LaunchImage-2"; 625 | CODE_SIGN_ENTITLEMENTS = TodayViewWidget/TodayViewWidget.entitlements; 626 | CODE_SIGN_IDENTITY = "iPhone Developer"; 627 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 628 | INFOPLIST_FILE = TodayViewWidget/Info.plist; 629 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; 630 | PRODUCT_NAME = "$(TARGET_NAME)"; 631 | PROVISIONING_PROFILE = ""; 632 | SKIP_INSTALL = YES; 633 | }; 634 | name = Release; 635 | }; 636 | /* End XCBuildConfiguration section */ 637 | 638 | /* Begin XCConfigurationList section */ 639 | AEA25F6619798B5B009A21AB /* Build configuration list for PBXProject "OpenIt" */ = { 640 | isa = XCConfigurationList; 641 | buildConfigurations = ( 642 | AEA25F8919798B5B009A21AB /* Debug */, 643 | AEA25F8A19798B5B009A21AB /* Release */, 644 | ); 645 | defaultConfigurationIsVisible = 0; 646 | defaultConfigurationName = Release; 647 | }; 648 | AEA25F8B19798B5B009A21AB /* Build configuration list for PBXNativeTarget "OpenIt" */ = { 649 | isa = XCConfigurationList; 650 | buildConfigurations = ( 651 | AEA25F8C19798B5B009A21AB /* Debug */, 652 | AEA25F8D19798B5B009A21AB /* Release */, 653 | ); 654 | defaultConfigurationIsVisible = 0; 655 | defaultConfigurationName = Release; 656 | }; 657 | AEA25FA619798B6F009A21AB /* Build configuration list for PBXNativeTarget "TodayViewWidget" */ = { 658 | isa = XCConfigurationList; 659 | buildConfigurations = ( 660 | AEA25FA719798B6F009A21AB /* Debug */, 661 | AEA25FA819798B6F009A21AB /* Release */, 662 | ); 663 | defaultConfigurationIsVisible = 0; 664 | defaultConfigurationName = Release; 665 | }; 666 | /* End XCConfigurationList section */ 667 | }; 668 | rootObject = AEA25F6319798B5B009A21AB /* Project object */; 669 | } 670 | -------------------------------------------------------------------------------- /OpenIt.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /OpenIt.xcodeproj/xcuserdata/PatrickBalestra.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /OpenIt.xcodeproj/xcuserdata/PatrickBalestra.xcuserdatad/xcschemes/OpenIt.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /OpenIt.xcodeproj/xcuserdata/PatrickBalestra.xcuserdatad/xcschemes/TodayViewWidget.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 6 | 9 | 10 | 16 | 22 | 23 | 24 | 30 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 57 | 67 | 68 | 74 | 75 | 76 | 77 | 78 | 79 | 86 | 87 | 93 | 94 | 95 | 96 | 98 | 99 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /OpenIt.xcodeproj/xcuserdata/PatrickBalestra.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | OpenIt.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | TodayViewWidget.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | AEA25F6A19798B5B009A21AB 21 | 22 | primary 23 | 24 | 25 | AEA25F8019798B5B009A21AB 26 | 27 | primary 28 | 29 | 30 | AEA25F9419798B6F009A21AB 31 | 32 | primary 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /OpenIt/Add@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Add@2x.png -------------------------------------------------------------------------------- /OpenIt/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 18/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class Mixpanel; 12 | 13 | @interface AppDelegate : UIResponder 14 | 15 | @property (strong, nonatomic) UIWindow *window; 16 | 17 | 18 | @end 19 | 20 | -------------------------------------------------------------------------------- /OpenIt/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 18/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /OpenIt/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | -------------------------------------------------------------------------------- /OpenIt/Calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Calendar.png -------------------------------------------------------------------------------- /OpenIt/ChooseActionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ChooseActionViewController.h 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 24/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ChooseActionViewController : UITableViewController 12 | 13 | - (IBAction)dismiss:(id)sender; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /OpenIt/ChooseActionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ChooseActionViewController.m 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 24/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import "ChooseActionViewController.h" 10 | #import "ActionDetailViewController.h" 11 | 12 | @interface ChooseActionViewController () 13 | 14 | @property (strong, nonatomic) NSArray *actions; 15 | @property (strong, nonatomic) NSArray *otherActions; 16 | 17 | @end 18 | 19 | @implementation ChooseActionViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; 25 | self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0.8745 green:0.0784 blue:0.0745 alpha:1.0000]; 26 | [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:20], NSForegroundColorAttributeName : [UIColor whiteColor]}]; 27 | 28 | self.actions = [NSArray new]; 29 | self.actions = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"SystemActions" ofType:@"plist"]]; 30 | 31 | NSArray *sortedActions = [self.actions sortedArrayUsingComparator:^NSComparisonResult(NSArray *obj1, NSArray *obj2) { 32 | return [obj1[1][@"Type"] compare:obj2[1][@"Type"] options:NSCaseInsensitiveSearch]; 33 | }]; 34 | self.actions = sortedActions; 35 | 36 | self.otherActions = [NSArray new]; 37 | self.otherActions = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"OtherActions" ofType:@"plist"]]; 38 | 39 | NSArray *sortedActions2 = [self.otherActions sortedArrayUsingComparator:^NSComparisonResult(NSArray *obj1, NSArray *obj2) { 40 | return [obj1[1][@"Type"] compare:obj2[1][@"Type"] options:NSCaseInsensitiveSearch]; 41 | }]; 42 | self.otherActions = sortedActions2; 43 | 44 | } 45 | 46 | - (IBAction)dismiss:(id)sender { 47 | [self dismissViewControllerAnimated:YES completion:nil]; 48 | } 49 | 50 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 51 | return 3; 52 | } 53 | 54 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 55 | if (section == 0) { 56 | return 1; 57 | } else if (section == 1) { 58 | return self.actions.count; 59 | } else { 60 | return self.otherActions.count; 61 | } 62 | } 63 | 64 | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 65 | return 40; 66 | } 67 | 68 | - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 69 | if (section == 0) { 70 | return @"Custom Action"; 71 | } else if (section == 1) { 72 | return @"Default Apps"; 73 | } else if (section == 2) { 74 | return @"Other Apps"; 75 | } 76 | return @""; 77 | } 78 | 79 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 80 | 81 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 82 | 83 | if (indexPath.section == 0) { 84 | cell.textLabel.text = @"Custom Action"; 85 | cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"Custom"]]; 86 | } else if (indexPath.section == 1) { 87 | cell.textLabel.text = self.actions[indexPath.row][1][@"Type"]; 88 | cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", self.actions[indexPath.row][1][@"Type"]]]; 89 | } else if (indexPath.section == 2) { 90 | cell.textLabel.text = self.otherActions[indexPath.row][1][@"Type"]; 91 | cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", self.otherActions[indexPath.row][1][@"Type"]]]; 92 | } 93 | 94 | CGSize itemSize = CGSizeMake(35, 35); 95 | UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale); 96 | CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 97 | [cell.imageView.image drawInRect:imageRect]; 98 | cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 99 | UIGraphicsEndImageContext(); 100 | 101 | return cell; 102 | } 103 | 104 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 105 | if ([segue.identifier isEqualToString:@"CustomizeAction"]) { 106 | ActionDetailViewController *actionDetail = (ActionDetailViewController *)segue.destinationViewController; 107 | NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 108 | if (indexPath.section == 0) { 109 | NSArray *custom = @[ 110 | @{@"Title" : @""}, 111 | @{@"Type": @"Custom"}, 112 | @{@"URL" : @""} 113 | ]; 114 | actionDetail.shortcutArray = [custom mutableCopy]; 115 | } else if (indexPath.section == 1) { 116 | actionDetail.shortcutArray = [self.actions[indexPath.row] mutableCopy]; 117 | } else if (indexPath.section == 2) { 118 | actionDetail.shortcutArray = [self.otherActions[indexPath.row] mutableCopy]; 119 | } 120 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 121 | } 122 | } 123 | 124 | @end 125 | -------------------------------------------------------------------------------- /OpenIt/Clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Clear.png -------------------------------------------------------------------------------- /OpenIt/Custom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Custom.png -------------------------------------------------------------------------------- /OpenIt/Dropbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Dropbox.png -------------------------------------------------------------------------------- /OpenIt/FaceTime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/FaceTime.png -------------------------------------------------------------------------------- /OpenIt/Facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Facebook.png -------------------------------------------------------------------------------- /OpenIt/Fantastical 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Fantastical 2.png -------------------------------------------------------------------------------- /OpenIt/Foursquare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Foursquare.png -------------------------------------------------------------------------------- /OpenIt/IFTTT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/IFTTT.png -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon-2.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "60x60" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "2x", 11 | "size" : "40x40" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "size" : "40x40", 15 | "idiom" : "iphone", 16 | "filename" : "icon-7-80.png", 17 | "scale" : "2x" 18 | }, 19 | { 20 | "idiom" : "iphone", 21 | "size" : "57x57", 22 | "scale" : "1x" 23 | }, 24 | { 25 | "idiom" : "iphone", 26 | "size" : "57x57", 27 | "scale" : "2x" 28 | }, 29 | { 30 | "size" : "60x60", 31 | "idiom" : "iphone", 32 | "filename" : "icon-7-120.png", 33 | "scale" : "2x" 34 | }, 35 | { 36 | "idiom" : "ipad", 37 | "size" : "29x29", 38 | "scale" : "1x" 39 | }, 40 | { 41 | "idiom" : "ipad", 42 | "size" : "29x29", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "idiom" : "ipad", 47 | "size" : "40x40", 48 | "scale" : "1x" 49 | }, 50 | { 51 | "size" : "40x40", 52 | "idiom" : "ipad", 53 | "filename" : "icon-7-80-1.png", 54 | "scale" : "2x" 55 | }, 56 | { 57 | "idiom" : "ipad", 58 | "size" : "50x50", 59 | "scale" : "1x" 60 | }, 61 | { 62 | "idiom" : "ipad", 63 | "size" : "50x50", 64 | "scale" : "2x" 65 | }, 66 | { 67 | "idiom" : "ipad", 68 | "size" : "72x72", 69 | "scale" : "1x" 70 | }, 71 | { 72 | "idiom" : "ipad", 73 | "size" : "72x72", 74 | "scale" : "2x" 75 | }, 76 | { 77 | "size" : "76x76", 78 | "idiom" : "ipad", 79 | "filename" : "icon-7-76.png", 80 | "scale" : "1x" 81 | }, 82 | { 83 | "size" : "76x76", 84 | "idiom" : "ipad", 85 | "filename" : "icon-7-152.png", 86 | "scale" : "2x" 87 | } 88 | ], 89 | "info" : { 90 | "version" : 1, 91 | "author" : "xcode" 92 | } 93 | } -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-120.png -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-152.png -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-76.png -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-80-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-80-1.png -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Images.xcassets/AppIcon.appiconset/icon-7-80.png -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/LaunchImage-2.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "minimum-system-version" : "7.0", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "orientation" : "portrait", 11 | "idiom" : "iphone", 12 | "minimum-system-version" : "7.0", 13 | "subtype" : "retina4", 14 | "scale" : "2x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /OpenIt/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /OpenIt/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.giovannibalestra.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | Open It 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleURLTypes 22 | 23 | 24 | CFBundleTypeRole 25 | Editor 26 | CFBundleURLName 27 | com.giovannibalestra.openit 28 | CFBundleURLSchemes 29 | 30 | openit 31 | 32 | 33 | 34 | CFBundleVersion 35 | 5 36 | LSRequiresIPhoneOS 37 | 38 | UILaunchStoryboardName 39 | Launch Screen 40 | UIMainStoryboardFile 41 | Main 42 | UIRequiredDeviceCapabilities 43 | 44 | armv7 45 | 46 | UIStatusBarStyle 47 | UIStatusBarStyleBlackTranslucent 48 | UIViewControllerBasedStatusBarAppearance 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /OpenIt/Instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Instagram.png -------------------------------------------------------------------------------- /OpenIt/Launch Center Pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Launch Center Pro.png -------------------------------------------------------------------------------- /OpenIt/Lyft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Lyft.png -------------------------------------------------------------------------------- /OpenIt/Mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Mail.png -------------------------------------------------------------------------------- /OpenIt/Maps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Maps.png -------------------------------------------------------------------------------- /OpenIt/Messages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Messages.png -------------------------------------------------------------------------------- /OpenIt/Messenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Messenger.png -------------------------------------------------------------------------------- /OpenIt/Music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Music.png -------------------------------------------------------------------------------- /OpenIt/OpenIt.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.actions 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /OpenIt/OtherActions.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Title 8 | 9 | 10 | 11 | Type 12 | YouTube 13 | 14 | 15 | URL 16 | youtube:// 17 | 18 | 19 | 20 | 21 | Title 22 | 23 | 24 | 25 | Type 26 | Facebook 27 | 28 | 29 | URL 30 | fb:// 31 | 32 | 33 | 34 | 35 | Title 36 | 37 | 38 | 39 | Type 40 | Twitter 41 | 42 | 43 | URL 44 | twitter:// 45 | 46 | 47 | 48 | 49 | Title 50 | 51 | 52 | 53 | Type 54 | WhatsApp 55 | 56 | 57 | URL 58 | whatsapp:// 59 | 60 | 61 | 62 | 63 | Title 64 | 65 | 66 | 67 | Type 68 | Instagram 69 | 70 | 71 | URL 72 | instagram:// 73 | 74 | 75 | 76 | name 77 | Action 78 | value 79 | 80 | placeholder 81 | Choose Action 82 | type 83 | Multiple 84 | 85 | 86 | 87 | 88 | 89 | Title 90 | 91 | 92 | 93 | Type 94 | Tweetbot 95 | 96 | 97 | URL 98 | tweetbot:// 99 | 100 | 101 | 102 | 103 | Title 104 | 105 | 106 | 107 | Type 108 | Pocket 109 | 110 | 111 | URL 112 | pocket:// 113 | 114 | 115 | 116 | 117 | Title 118 | 119 | 120 | 121 | Type 122 | Uber 123 | 124 | 125 | URL 126 | uber:// 127 | 128 | 129 | 130 | 131 | Title 132 | 133 | 134 | 135 | Type 136 | Clear 137 | 138 | 139 | URL 140 | clearapp:// 141 | 142 | 143 | 144 | 145 | Title 146 | 147 | 148 | 149 | Type 150 | Messenger 151 | 152 | 153 | URL 154 | fb-messenger:// 155 | 156 | 157 | 158 | 159 | Title 160 | 161 | 162 | 163 | Type 164 | Fantastical 2 165 | 166 | 167 | URL 168 | fantastical2:// 169 | 170 | 171 | 172 | 173 | Title 174 | 175 | 176 | 177 | Type 178 | Lyft 179 | 180 | 181 | URL 182 | lyft:// 183 | 184 | 185 | 186 | 187 | Title 188 | 189 | 190 | 191 | Type 192 | Dropbox 193 | 194 | 195 | URL 196 | dbapi-1:// 197 | 198 | 199 | 200 | 201 | Title 202 | 203 | 204 | 205 | Type 206 | Foursquare 207 | 208 | 209 | URL 210 | foursquare:// 211 | 212 | 213 | 214 | 215 | Title 216 | 217 | 218 | 219 | Type 220 | Swarm 221 | 222 | 223 | URL 224 | swarm:// 225 | 226 | 227 | 228 | 229 | Title 230 | 231 | 232 | 233 | Type 234 | IFTTT 235 | 236 | 237 | URL 238 | ifttt:// 239 | 240 | 241 | 242 | 243 | Title 244 | 245 | 246 | 247 | Type 248 | Launch Center Pro 249 | 250 | 251 | URL 252 | launch:// 253 | 254 | 255 | 256 | 257 | Title 258 | 259 | 260 | 261 | Type 262 | Pebble 263 | 264 | 265 | URL 266 | pebble:// 267 | 268 | 269 | 270 | 271 | Title 272 | 273 | 274 | 275 | Type 276 | Skype 277 | 278 | 279 | URL 280 | skype:// 281 | 282 | 283 | 284 | 285 | Title 286 | 287 | 288 | 289 | Type 290 | Spotify 291 | 292 | 293 | URL 294 | spotify:// 295 | 296 | 297 | 298 | 299 | Title 300 | 301 | 302 | 303 | Type 304 | Starbucks 305 | 306 | 307 | URL 308 | starbucks:// 309 | 310 | 311 | 312 | 313 | Title 314 | 315 | 316 | 317 | Type 318 | TodoMovies 3 319 | 320 | 321 | URL 322 | todomovies3:// 323 | 324 | 325 | 326 | 327 | -------------------------------------------------------------------------------- /OpenIt/Pebble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Pebble.png -------------------------------------------------------------------------------- /OpenIt/Phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Phone.png -------------------------------------------------------------------------------- /OpenIt/Photos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Photos.png -------------------------------------------------------------------------------- /OpenIt/Pocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Pocket.png -------------------------------------------------------------------------------- /OpenIt/Safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Safari.png -------------------------------------------------------------------------------- /OpenIt/SchemeBuilder.h: -------------------------------------------------------------------------------- 1 | // 2 | // SchemeBuilder.h 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 26/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SchemeBuilder : NSObject 12 | 13 | - (NSString *)buildSchemeWithArray:(NSArray *)array; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /OpenIt/SchemeBuilder.m: -------------------------------------------------------------------------------- 1 | // 2 | // SchemeBuilder.m 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 26/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import "SchemeBuilder.h" 10 | 11 | @implementation SchemeBuilder 12 | 13 | - (NSString *)buildSchemeWithArray:(NSArray *)array { 14 | 15 | NSString *type = array[1][@"Type"]; 16 | NSString *URLScheme = array[2][@"URL"]; 17 | NSMutableDictionary *parameters = [NSMutableDictionary new]; 18 | if (array.count > 3) { 19 | [array[3] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 20 | [parameters addEntriesFromDictionary:@{obj[@"type"] : obj[@"value"]}]; 21 | }]; 22 | } 23 | 24 | if (array.count == 3) { 25 | // It's a simple scheme without any parameters, just skip the building of the URL 26 | return URLScheme; 27 | } else if ([type isEqualToString:@"Mail"]) { 28 | NSString *scheme = [NSString stringWithFormat:@"%@%@?cc=%@&subject=%@&body=%@", URLScheme, parameters[@"To"], parameters[@"Cc"], parameters[@"Subject"], parameters[@"Body"]]; 29 | [scheme stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 30 | return scheme; 31 | } else if ([type isEqualToString:@"Phone"]) { 32 | return [NSString stringWithFormat:@"%@%@", URLScheme, parameters[@"Number"]]; 33 | } else if ([type isEqualToString:@"Messages"]) { 34 | return [NSString stringWithFormat:@"%@%@", URLScheme, parameters[@"Number"]]; 35 | } else if ([type isEqualToString:@"FaceTime"]) { 36 | return [NSString stringWithFormat:@"%@%@", URLScheme, parameters[@"Email Address"]]; 37 | } else if ([type isEqualToString:@"Twitter"]) { 38 | return URLScheme; 39 | } else if ([type isEqualToString:@"Maps"]) { 40 | return URLScheme; 41 | } else if ([type isEqualToString:@"Instagram"]) { 42 | return URLScheme; 43 | } else if ([type isEqualToString:@"Tweetbot"]) { 44 | return URLScheme; 45 | } else if ([type isEqualToString:@"Safari"]) { 46 | return [NSString stringWithFormat:@"%@%@", URLScheme, parameters[@"URL"]]; 47 | } else if ([type isEqualToString:@"Custom"]) { 48 | NSLog(@"%@", URLScheme); 49 | return URLScheme; 50 | } 51 | return @""; 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /OpenIt/Settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Settings@2x.png -------------------------------------------------------------------------------- /OpenIt/Skype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Skype.png -------------------------------------------------------------------------------- /OpenIt/Spotify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Spotify.png -------------------------------------------------------------------------------- /OpenIt/Starbucks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Starbucks.png -------------------------------------------------------------------------------- /OpenIt/Swarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Swarm.png -------------------------------------------------------------------------------- /OpenIt/SystemActions.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Title 8 | 9 | 10 | 11 | Type 12 | Mail 13 | 14 | 15 | URL 16 | mailto: 17 | 18 | 19 | 20 | name 21 | to 22 | value 23 | 24 | placeholder 25 | To 26 | type 27 | email 28 | 29 | 30 | name 31 | cc 32 | value 33 | 34 | placeholder 35 | Cc 36 | type 37 | email 38 | 39 | 40 | name 41 | subject 42 | value 43 | 44 | placeholder 45 | Subject 46 | type 47 | string 48 | 49 | 50 | name 51 | body 52 | value 53 | 54 | placeholder 55 | Body 56 | type 57 | string 58 | 59 | 60 | 61 | 62 | 63 | Title 64 | 65 | 66 | 67 | Type 68 | Phone 69 | 70 | 71 | URL 72 | tel: 73 | 74 | 75 | 76 | name 77 | Phone Number 78 | value 79 | 80 | placeholder 81 | Phone Number 82 | type 83 | Number 84 | 85 | 86 | 87 | 88 | 89 | Title 90 | 91 | 92 | 93 | Type 94 | Messages 95 | 96 | 97 | URL 98 | sms: 99 | 100 | 101 | 102 | name 103 | Phone Number 104 | value 105 | 106 | placeholder 107 | Phone Number 108 | type 109 | Number 110 | 111 | 112 | 113 | 114 | 115 | Title 116 | 117 | 118 | 119 | Type 120 | FaceTime 121 | 122 | 123 | URL 124 | facetime:// 125 | 126 | 127 | 128 | name 129 | Email Address 130 | value 131 | 132 | placeholder 133 | Email Address 134 | type 135 | email 136 | 137 | 138 | 139 | 140 | 141 | Title 142 | 143 | 144 | 145 | Type 146 | Maps 147 | 148 | 149 | URL 150 | maps:// 151 | 152 | 153 | 154 | name 155 | Query 156 | value 157 | 158 | placeholder 159 | Query 160 | type 161 | String 162 | 163 | 164 | name 165 | Source Address 166 | value 167 | 168 | placeholder 169 | Source Address 170 | type 171 | String 172 | 173 | 174 | name 175 | Destination Address 176 | value 177 | 178 | placeholder 179 | Destination Address 180 | type 181 | String 182 | 183 | 184 | 185 | 186 | 187 | Title 188 | 189 | 190 | 191 | Type 192 | Music 193 | 194 | 195 | URL 196 | music:// 197 | 198 | 199 | 200 | 201 | Title 202 | 203 | 204 | 205 | Type 206 | Photos 207 | 208 | 209 | URL 210 | photos-redirect:// 211 | 212 | 213 | 214 | 215 | Title 216 | 217 | 218 | 219 | Type 220 | iBooks 221 | 222 | 223 | URL 224 | itms-books:// 225 | 226 | 227 | 228 | 229 | Title 230 | 231 | 232 | 233 | Type 234 | Calendar 235 | 236 | 237 | URL 238 | calshow:// 239 | 240 | 241 | 242 | 243 | Title 244 | 245 | 246 | 247 | Type 248 | Safari 249 | 250 | 251 | URL 252 | http:// 253 | 254 | 255 | 256 | name 257 | Address 258 | value 259 | 260 | placeholder 261 | Address 262 | type 263 | URL 264 | 265 | 266 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /OpenIt/TodoMovies 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/TodoMovies 3.png -------------------------------------------------------------------------------- /OpenIt/Tweetbot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Tweetbot.png -------------------------------------------------------------------------------- /OpenIt/Twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Twitter.png -------------------------------------------------------------------------------- /OpenIt/Uber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/Uber.png -------------------------------------------------------------------------------- /OpenIt/WhatsApp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/WhatsApp.png -------------------------------------------------------------------------------- /OpenIt/YouTube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/YouTube.png -------------------------------------------------------------------------------- /OpenIt/YourActionsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // YourActionsViewController.h 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 22/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface YourActionsViewController : UITableViewController 12 | 13 | @property (weak, nonatomic) IBOutlet UIBarButtonItem *editButton; 14 | 15 | - (IBAction)edit:(id)sender; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /OpenIt/YourActionsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // YourActionsViewController.m 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 22/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import "YourActionsViewController.h" 10 | #import "ActionDetailViewController.h" 11 | #import "SchemeBuilder.h" 12 | 13 | 14 | @interface YourActionsViewController () 15 | 16 | @property (strong, nonatomic) NSMutableArray *actions; 17 | 18 | @property (nonatomic) BOOL presentedDebug; 19 | 20 | @end 21 | 22 | @implementation YourActionsViewController 23 | 24 | - (void)viewDidLoad { 25 | [super viewDidLoad]; 26 | 27 | self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; 28 | self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0.8745 green:0.0784 blue:0.0745 alpha:1.0000]; 29 | [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:20], NSForegroundColorAttributeName : [UIColor whiteColor]}]; 30 | 31 | self.actions = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"actions"]]; 32 | 33 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addNewAction:) name:@"AddNewAction" object:nil]; 34 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editAction:) name:@"EditAction" object:nil]; 35 | 36 | [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 37 | 38 | } 39 | 40 | - (void)saveActions { 41 | // Save locally 42 | [[NSUserDefaults standardUserDefaults] setObject:[self.actions mutableCopy] forKey:@"actions"]; 43 | [[NSUserDefaults standardUserDefaults] synchronize]; 44 | 45 | // Save to extension 46 | SchemeBuilder *builder = [SchemeBuilder new]; 47 | NSMutableArray *extensionActions = [NSMutableArray new]; 48 | 49 | [self.actions enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 50 | 51 | NSString *scheme = [builder buildSchemeWithArray:obj]; 52 | [extensionActions addObject:@{@"Title" : obj[0][@"Title"], @"Scheme" : scheme}]; 53 | }]; 54 | 55 | NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.actions"]; 56 | [sharedDefaults setObject:[extensionActions mutableCopy] forKey:@"actions"]; 57 | [sharedDefaults synchronize]; 58 | } 59 | 60 | - (void)addNewAction:(NSNotification *)notification { 61 | [self.actions addObject:notification.object]; 62 | [self.tableView reloadData]; 63 | [self saveActions]; 64 | [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 65 | } 66 | 67 | - (void)editAction:(NSNotification *)notification { 68 | [self.actions replaceObjectAtIndex:[self.tableView indexPathForSelectedRow].row withObject:[notification.object mutableCopy]]; 69 | [self.tableView reloadData]; 70 | [self saveActions]; 71 | [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 72 | } 73 | 74 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 75 | return 1; 76 | } 77 | 78 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 79 | return self.actions.count; 80 | } 81 | 82 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 83 | 84 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 85 | 86 | cell.textLabel.text = self.actions[indexPath.row][0][@"Title"]; 87 | cell.detailTextLabel.text = self.actions[indexPath.row][1][@"Type"]; 88 | cell.imageView.image = [UIImage imageNamed:self.actions[indexPath.row][1][@"Type"]]; 89 | 90 | CGSize itemSize = CGSizeMake(35, 35); 91 | UIGraphicsBeginImageContextWithOptions(itemSize, NO, UIScreen.mainScreen.scale); 92 | CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 93 | [cell.imageView.image drawInRect:imageRect]; 94 | cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 95 | UIGraphicsEndImageContext(); 96 | 97 | return cell; 98 | } 99 | 100 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 101 | if (editingStyle == UITableViewCellEditingStyleDelete) { 102 | [self.actions removeObjectAtIndex:indexPath.row]; 103 | [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 104 | [self saveActions]; 105 | } 106 | } 107 | 108 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 109 | return YES; 110 | } 111 | 112 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath { 113 | id objectToMove = [self.actions objectAtIndex:sourceIndexPath.row]; 114 | [self.actions removeObjectAtIndex:sourceIndexPath.row]; 115 | [self.actions insertObject:objectToMove atIndex:destinationIndexPath.row]; 116 | [self.tableView reloadData]; 117 | [self saveActions]; 118 | } 119 | 120 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 121 | if ([segue.identifier isEqualToString:@"DetailAction"]) { 122 | ActionDetailViewController *actionDetail = (ActionDetailViewController *)segue.destinationViewController; 123 | actionDetail.shortcutArray = [self.actions[[self.tableView indexPathForSelectedRow].row] mutableCopy]; 124 | actionDetail.newAction = YES; 125 | } 126 | } 127 | 128 | - (IBAction)edit:(id)sender { 129 | if (self.tableView.isEditing) { 130 | [self.tableView setEditing:NO animated:YES]; 131 | [self.editButton setTitle:@"Edit"]; 132 | } else { 133 | [self.tableView setEditing:YES animated:YES]; 134 | [self.editButton setTitle:@"Done"]; 135 | } 136 | } 137 | 138 | @end 139 | -------------------------------------------------------------------------------- /OpenIt/iBooks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenIt/iBooks.png -------------------------------------------------------------------------------- /OpenIt/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // OpenIt 4 | // 5 | // Created by Patrick Balestra on 18/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /OpenItDemo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BalestraPatrick/OpenIt/fcd423fe29e3e4155e49bde25a7843853b513a9a/OpenItDemo.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | OpenIt 2 | ====== 3 | 4 | 5 | TL:DR: This is bad code. I wrote it a long time ago and never really improved it. 6 | 7 | This was an app I started to develop just after attending WWDC 2014. I was super excited about the endless possibilities to create widgets and so I had this idea where you could add buttons to the notification center to launch other apps. The plan was to submit the app to the App Store but after seeing other launcher apps being rejected (or approved and then removed), I decided to open source the project. So here it is. 8 | The app uses URL schemes to open other apps. I already added some Apple defaults URL scheme (with parameters too) but you can choose to create a custom action and write your own scheme. 9 | 10 | I never fully tested the app so you could find some bugs here and there :) 11 | 12 | Feel free to download the project and install it on your device or use the code as you prefer (but please don't try to submit the project on the App Store as it is). 13 | -------------------------------------------------------------------------------- /TodayViewWidget/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Open It 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIcons 12 | 13 | CFBundleIcons~ipad 14 | 15 | CFBundleIdentifier 16 | com.giovannibalestra.OpenIt.TodayView 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | ${PRODUCT_NAME} 21 | CFBundlePackageType 22 | XPC! 23 | CFBundleShortVersionString 24 | 1.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 1 29 | NSExtension 30 | 31 | NSExtensionMainStoryboard 32 | MainInterface 33 | NSExtensionPointIdentifier 34 | com.apple.widget-extension 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /TodayViewWidget/MainInterface.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /TodayViewWidget/TodayViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TodayViewController.h 3 | // TodayViewWidget 4 | // 5 | // Created by Patrick Balestra on 18/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TodayViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TodayViewWidget/TodayViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TodayViewController.m 3 | // TodayViewWidget 4 | // 5 | // Created by Patrick Balestra on 18/07/14. 6 | // Copyright (c) 2014 Patrick Balestra. All rights reserved. 7 | // 8 | 9 | #import "TodayViewController.h" 10 | #import 11 | @import QuartzCore; 12 | 13 | @interface TodayViewController () 14 | 15 | @property (strong, nonatomic) NSArray *actions; 16 | @property (nonatomic) CGFloat screenWidth; 17 | @property (nonatomic) CGFloat edgesPadding; 18 | @property (nonatomic) CGFloat buttonsPadding; 19 | 20 | @end 21 | 22 | @implementation TodayViewController 23 | 24 | - (id)initWithCoder:(NSCoder *)aDecoder { 25 | if (self = [super initWithCoder:aDecoder]) { 26 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefaultsDidChange:) name:NSUserDefaultsDidChangeNotification object:nil]; 27 | } 28 | return self; 29 | } 30 | 31 | - (void)viewDidLoad { 32 | [super viewDidLoad]; 33 | 34 | [self setPreferredContentSize:CGSizeMake(0, 45)]; 35 | 36 | self.actions = [NSArray new]; 37 | 38 | self.edgesPadding = 15.0; 39 | self.buttonsPadding = 10.0; 40 | 41 | } 42 | 43 | - (void)viewWillAppear:(BOOL)animated { 44 | self.screenWidth = self.view.frame.size.width; 45 | [self updateUI]; 46 | } 47 | - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { 48 | defaultMarginInsets.bottom = 0; 49 | defaultMarginInsets.left = 0; 50 | return defaultMarginInsets; 51 | } 52 | 53 | - (void)userDefaultsDidChange:(NSNotification *)notification { 54 | [self updateUI]; 55 | } 56 | 57 | - (void)updateUI { 58 | 59 | NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.actions"]; 60 | self.actions = [defaults objectForKey:@"actions"]; 61 | 62 | if (self.actions.count > 0) { 63 | 64 | __block CGRect frame = CGRectMake(0, 10, 0, 25); 65 | 66 | CGFloat spaceAvailable = self.screenWidth - (2 * self.edgesPadding); 67 | NSInteger numberOfButtonsInARow = 3; 68 | if (spaceAvailable > 400.0) { 69 | numberOfButtonsInARow = 4; 70 | } 71 | CGFloat buttonWidth = (spaceAvailable - ((numberOfButtonsInARow - 1) * self.buttonsPadding)) / numberOfButtonsInARow; 72 | frame.size.width = buttonWidth; 73 | 74 | NSInteger numberOfRows = (self.actions.count % numberOfButtonsInARow) == 0 ? (self.actions.count / numberOfButtonsInARow) : (self.actions.count / numberOfButtonsInARow) + 1; 75 | 76 | [self setPreferredContentSize:CGSizeMake(0, 10 + (numberOfRows * 35))]; 77 | 78 | // Add buttons 79 | [self.actions enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 80 | 81 | // High math to calculate position of the buttons :) 82 | if (idx < numberOfButtonsInARow) { 83 | frame.origin.x = self.edgesPadding + (idx * self.buttonsPadding) + (idx * buttonWidth); 84 | } else { 85 | NSInteger row = (idx / numberOfButtonsInARow); 86 | NSInteger newIdx = idx - (numberOfButtonsInARow * row); 87 | frame.origin.y = 10 + (row * 35); 88 | frame.origin.x = self.edgesPadding + (newIdx * self.buttonsPadding) + (newIdx * buttonWidth); 89 | } 90 | 91 | UIButton *button = [[UIButton alloc] initWithFrame:frame]; 92 | button.layer.cornerRadius = 5.0; 93 | [button setTitle:self.actions[idx][@"Title"] forState:UIControlStateNormal]; 94 | [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 95 | [button setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted]; 96 | button.backgroundColor = [UIColor whiteColor]; 97 | button.titleLabel.textAlignment = NSTextAlignmentCenter; 98 | button.tintColor = [UIColor whiteColor]; 99 | button.tag = idx; 100 | [button.layer setMasksToBounds:YES]; 101 | 102 | [button addTarget:self action:@selector(open:) forControlEvents:UIControlEventTouchUpInside]; 103 | [self.view addSubview:button]; 104 | 105 | }]; 106 | 107 | // Add Visual Effect View with the standard notification center vibrancy effect 108 | UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:[UIVibrancyEffect notificationCenterVibrancyEffect]]; 109 | effectView.frame = self.view.bounds; 110 | effectView.autoresizingMask = self.view.autoresizingMask; 111 | __strong UIView *oldView = self.view; 112 | self.view = effectView; 113 | [effectView.contentView addSubview:oldView]; 114 | self.view.tintColor = [UIColor clearColor]; 115 | 116 | } else { 117 | // Show instructions label to show 118 | UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(self.edgesPadding, 0, self.screenWidth - self.edgesPadding, 45)]; 119 | label.text = @"Add your shortcuts in the Open It app."; 120 | label.numberOfLines = 0; 121 | label.textColor = [UIColor whiteColor]; 122 | label.tintColor = [UIColor whiteColor]; 123 | label.textAlignment = NSTextAlignmentCenter; 124 | [self.view addSubview:label]; 125 | } 126 | 127 | } 128 | 129 | - (void)open:(UIButton *)button { 130 | // Open action 131 | [[self extensionContext] openURL:[NSURL URLWithString:self.actions[button.tag][@"Scheme"]] completionHandler:nil]; 132 | } 133 | 134 | @end 135 | -------------------------------------------------------------------------------- /TodayViewWidget/TodayViewWidget.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.actions 8 | 9 | 10 | 11 | --------------------------------------------------------------------------------