diff --git a/.gitignore b/.gitignore index 0ef0d4a..29d7d9b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,12 @@ -# OSX files -.DS_Store - -# API & Secret files -*.sh -HackTX/ApiKeys.plist -GoogleService-Info.plist - # Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated build/ +DerivedData/ + +## Various settings *.pbxuser !default.pbxuser *.mode1v3 @@ -16,13 +15,52 @@ build/ !default.mode2v3 *.perspectivev3 !default.perspectivev3 -*.xcworkspace -!default.xcworkspace -xcuserdata -profile +xcuserdata/ + +## Other *.moved-aside -DerivedData -.idea/ +*.xcuserstate + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode -# Pods -Pods +iOSInjectionProject/ +HackTX/GoogleService-Info.plist +HackTX/HTXConstants.h +HackTX/HTXConstants.m +HackTX/APIKeys.plist diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 7df3410..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Alamofire"] - path = Alamofire - url = https://github.com/Alamofire/Alamofire.git diff --git a/Bolts.framework/Bolts b/Bolts.framework/Bolts deleted file mode 100644 index acc8664..0000000 Binary files a/Bolts.framework/Bolts and /dev/null differ diff --git a/Bolts.framework/Headers/BFAppLink.h b/Bolts.framework/Headers/BFAppLink.h deleted file mode 100644 index aa89efc..0000000 --- a/Bolts.framework/Headers/BFAppLink.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -/*! The version of the App Link protocol that this library supports */ -FOUNDATION_EXPORT NSString *const BFAppLinkVersion; - -/*! - Contains App Link metadata relevant for navigation on this device - derived from the HTML at a given URL. - */ -@interface BFAppLink : NSObject - -/*! - Creates a BFAppLink with the given list of BFAppLinkTargets and target URL. - - Generally, this will only be used by implementers of the BFAppLinkResolving protocol, - as these implementers will produce App Link metadata for a given URL. - - @param sourceURL the URL from which this App Link is derived - @param targets an ordered list of BFAppLinkTargets for this platform derived - from App Link metadata. - @param webURL the fallback web URL, if any, for the app link. - */ -+ (instancetype)appLinkWithSourceURL:(NSURL *)sourceURL - targets:(NSArray *)targets - webURL:(NSURL *)webURL; - -/*! The URL from which this BFAppLink was derived */ -@property (nonatomic, strong, readonly) NSURL *sourceURL; - -/*! - The ordered list of targets applicable to this platform that will be used - for navigation. - */ -@property (nonatomic, copy, readonly) NSArray *targets; - -/*! The fallback web URL to use if no targets are installed on this device. */ -@property (nonatomic, strong, readonly) NSURL *webURL; - -@end diff --git a/Bolts.framework/Headers/BFAppLinkNavigation.h b/Bolts.framework/Headers/BFAppLinkNavigation.h deleted file mode 100644 index d459f72..0000000 --- a/Bolts.framework/Headers/BFAppLinkNavigation.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -#import - -/*! - The result of calling navigate on a BFAppLinkNavigation - */ -typedef NS_ENUM(NSInteger, BFAppLinkNavigationType) { - /*! Indicates that the navigation failed and no app was opened */ - BFAppLinkNavigationTypeFailure, - /*! Indicates that the navigation succeeded by opening the URL in the browser */ - BFAppLinkNavigationTypeBrowser, - /*! Indicates that the navigation succeeded by opening the URL in an app on the device */ - BFAppLinkNavigationTypeApp -}; - -@protocol BFAppLinkResolving; -@class BFTask; - -/*! - Represents a pending request to navigate to an App Link. Most developers will - simply use navigateToURLInBackground: to open a URL, but developers can build - custom requests with additional navigation and app data attached to them by - creating BFAppLinkNavigations themselves. - */ -@interface BFAppLinkNavigation : NSObject - -/*! - The extras for the AppLinkNavigation. This will generally contain application-specific - data that should be passed along with the request, such as advertiser or affiliate IDs or - other such metadata relevant on this device. - */ -@property (nonatomic, copy, readonly) NSDictionary *extras; - -/*! - The al_applink_data for the AppLinkNavigation. This will generally contain data common to - navigation attempts such as back-links, user agents, and other information that may be used - in routing and handling an App Link request. - */ -@property (nonatomic, copy, readonly) NSDictionary *appLinkData; - -/*! The AppLink to navigate to */ -@property (nonatomic, strong, readonly) BFAppLink *appLink; - -/*! Creates an AppLinkNavigation with the given link, extras, and App Link data */ -+ (instancetype)navigationWithAppLink:(BFAppLink *)appLink - extras:(NSDictionary *)extras - appLinkData:(NSDictionary *)appLinkData; - -/*! Performs the navigation */ -- (BFAppLinkNavigationType)navigate:(NSError **)error; - -/*! Returns a BFAppLink for the given URL */ -+ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination; - -/*! Returns a BFAppLink for the given URL using the given App Link resolution strategy */ -+ (BFTask *)resolveAppLinkInBackground:(NSURL *)destination resolver:(id)resolver; - -/*! Navigates to a BFAppLink and returns whether it opened in-app or in-browser */ -+ (BFAppLinkNavigationType)navigateToAppLink:(BFAppLink *)link error:(NSError **)error; - -/*! Navigates to a URL (an asynchronous action) and returns a BFNavigationType */ -+ (BFTask *)navigateToURLInBackground:(NSURL *)destination; - -/*! - Navigates to a URL (an asynchronous action) using the given App Link resolution - strategy and returns a BFNavigationType - */ -+ (BFTask *)navigateToURLInBackground:(NSURL *)destination resolver:(id)resolver; - -/*! - Gets the default resolver to be used for App Link resolution. If the developer has not set one explicitly, - a basic, built-in resolver will be used. - */ -+ (id)defaultResolver; - -/*! - Sets the default resolver to be used for App Link resolution. Setting this to nil will revert the - default resolver to the basic, built-in resolver provided by Bolts. - */ -+ (void)setDefaultResolver:(id)resolver; - -@end diff --git a/Bolts.framework/Headers/BFAppLinkResolving.h b/Bolts.framework/Headers/BFAppLinkResolving.h deleted file mode 100644 index b67bdba..0000000 --- a/Bolts.framework/Headers/BFAppLinkResolving.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -@class BFTask; - -/*! - Implement this protocol to provide an alternate strategy for resolving - App Links that may include pre-fetching, caching, or querying for App Link - data from an index provided by a service provider. - */ -@protocol BFAppLinkResolving - -/*! - Asynchronously resolves App Link data for a given URL. - - @param url The URL to resolve into an App Link. - @returns A BFTask that will return a BFAppLink for the given URL. - */ -- (BFTask *)appLinkFromURLInBackground:(NSURL *)url; - -@end diff --git a/Bolts.framework/Headers/BFAppLinkReturnToRefererController.h b/Bolts.framework/Headers/BFAppLinkReturnToRefererController.h deleted file mode 100644 index d19465e..0000000 --- a/Bolts.framework/Headers/BFAppLinkReturnToRefererController.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import -#import - -#import - -@class BFAppLink; -@class BFAppLinkReturnToRefererController; - -/*! - Protocol that a class can implement in order to be notified when the user has navigated back - to the referer of an App Link. - */ -@protocol BFAppLinkReturnToRefererControllerDelegate - -@optional - -/*! Called when the user has tapped to navigate, but before the navigation has been performed. */ -- (void)returnToRefererController:(BFAppLinkReturnToRefererController *)controller - willNavigateToAppLink:(BFAppLink *)appLink; - -/*! Called after the navigation has been attempted, with an indication of whether the referer - app link was successfully opened. */ -- (void)returnToRefererController:(BFAppLinkReturnToRefererController *)controller - didNavigateToAppLink:(BFAppLink *)url - type:(BFAppLinkNavigationType)type; - -@end - -/*! - A controller class that implements default behavior for a BFAppLinkReturnToRefererView, including - the ability to display the view above the navigation bar for navigation-based apps. - */ -@interface BFAppLinkReturnToRefererController : NSObject - -/*! - The delegate that will be notified when the user navigates back to the referer. - */ -@property (nonatomic, weak) id delegate; - -/*! - The BFAppLinkReturnToRefererView this controller is controlling. - */ -@property (nonatomic, strong) BFAppLinkReturnToRefererView *view; - -/*! - Initializes a controller suitable for controlling a BFAppLinkReturnToRefererView that is to be displayed - contained within another UIView (i.e., not displayed above the navigation bar). - */ -- (instancetype)init; - -/*! - Initializes a controller suitable for controlling a BFAppLinkReturnToRefererView that is to be displayed - displayed above the navigation bar. - */ -- (instancetype)initForDisplayAboveNavController:(UINavigationController *)navController; - -/*! - Removes the view entirely from the navigation controller it is currently displayed in. - */ -- (void)removeFromNavController; - -/*! - Shows the BFAppLinkReturnToRefererView with the specified referer information. If nil or missing data, - the view will not be displayed. */ -- (void)showViewForRefererAppLink:(BFAppLink *)refererAppLink; - -/*! - Shows the BFAppLinkReturnToRefererView with referer information extracted from the specified URL. - If nil or missing referer App Link data, the view will not be displayed. */ -- (void)showViewForRefererURL:(NSURL *)url; - -/*! - Closes the view, possibly animating it. - */ -- (void)closeViewAnimated:(BOOL)animated; - -@end diff --git a/Bolts.framework/Headers/BFAppLinkReturnToRefererView.h b/Bolts.framework/Headers/BFAppLinkReturnToRefererView.h deleted file mode 100644 index d20f73a..0000000 --- a/Bolts.framework/Headers/BFAppLinkReturnToRefererView.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import -#import - -#import - -@class BFAppLinkReturnToRefererView; -@class BFURL; - -typedef NS_ENUM(NSUInteger, BFIncludeStatusBarInSize) { - BFIncludeStatusBarInSizeNever, - BFIncludeStatusBarInSizeIOS7AndLater, - BFIncludeStatusBarInSizeAlways, -}; - -/*! - Protocol that a class can implement in order to be notified when the user has navigated back - to the referer of an App Link. - */ -@protocol BFAppLinkReturnToRefererViewDelegate - -/*! - Called when the user has tapped inside the close button. - */ -- (void)returnToRefererViewDidTapInsideCloseButton:(BFAppLinkReturnToRefererView *)view; - -/*! - Called when the user has tapped inside the App Link portion of the view. - */ -- (void)returnToRefererViewDidTapInsideLink:(BFAppLinkReturnToRefererView *)view - link:(BFAppLink *)link; - -@end - -/*! - Provides a UIView that displays a button allowing users to navigate back to the - application that launched the App Link currently being handled, if the App Link - contained referer data. The user can also close the view by clicking a close button - rather than navigating away. If the view is provided an App Link that does not contain - referer data, it will have zero size and no UI will be displayed. - */ -@interface BFAppLinkReturnToRefererView : UIView - -/*! - The delegate that will be notified when the user navigates back to the referer. - */ -@property (nonatomic, weak) id delegate; - -/*! - The color of the text label and close button. - */ -@property (nonatomic, strong) UIColor *textColor; - -@property (nonatomic, strong) BFAppLink *refererAppLink; - -/*! - Indicates whether to extend the size of the view to include the current status bar - size, for use in scenarios where the view might extend under the status bar on iOS 7 and - above; this property has no effect on earlier versions of iOS. - */ -@property (nonatomic, assign) BFIncludeStatusBarInSize includeStatusBarInSize; - -/*! - Indicates whether the user has closed the view by clicking the close button. - */ -@property (nonatomic, assign) BOOL closed; - -@end diff --git a/Bolts.framework/Headers/BFAppLinkTarget.h b/Bolts.framework/Headers/BFAppLinkTarget.h deleted file mode 100644 index 6172126..0000000 --- a/Bolts.framework/Headers/BFAppLinkTarget.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -/*! - Represents a target defined in App Link metadata, consisting of at least - a URL, and optionally an App Store ID and name. - */ -@interface BFAppLinkTarget : NSObject - -/*! Creates a BFAppLinkTarget with the given app site and target URL. */ -+ (instancetype)appLinkTargetWithURL:(NSURL *)url - appStoreId:(NSString *)appStoreId - appName:(NSString *)appName; - -/*! The URL prefix for this app link target */ -@property (nonatomic, strong, readonly) NSURL *URL; - -/*! The app ID for the app store */ -@property (nonatomic, copy, readonly) NSString *appStoreId; - -/*! The name of the app */ -@property (nonatomic, copy, readonly) NSString *appName; - -@end diff --git a/Bolts.framework/Headers/BFCancellationToken.h b/Bolts.framework/Headers/BFCancellationToken.h deleted file mode 100644 index 90a20d7..0000000 --- a/Bolts.framework/Headers/BFCancellationToken.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -#import - -/*! - A block that will be called when a token is cancelled. - */ -typedef void(^BFCancellationBlock)(); - -/*! - The consumer view of a CancellationToken. - Propagates notification that operations should be canceled. - A BFCancellationToken has methods to inspect whether the token has been cancelled. - */ -@interface BFCancellationToken : NSObject - -/*! - Whether cancellation has been requested for this token source. - */ -@property (nonatomic, assign, readonly, getter=isCancellationRequested) BOOL cancellationRequested; - -/*! - Register a block to be notified when the token is cancelled. - If the token is already cancelled the delegate will be notified immediately. - */ -- (BFCancellationTokenRegistration *)registerCancellationObserverWithBlock:(BFCancellationBlock)block; - -@end diff --git a/Bolts.framework/Headers/BFCancellationTokenRegistration.h b/Bolts.framework/Headers/BFCancellationTokenRegistration.h deleted file mode 100644 index 3e7b711..0000000 --- a/Bolts.framework/Headers/BFCancellationTokenRegistration.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -/*! - Represents the registration of a cancellation observer with a cancellation token. - Can be used to unregister the observer at a later time. - */ -@interface BFCancellationTokenRegistration : NSObject - -/*! - Removes the cancellation observer registered with the token - and releases all resources associated with this registration. - */ -- (void)dispose; - -@end diff --git a/Bolts.framework/Headers/BFCancellationTokenSource.h b/Bolts.framework/Headers/BFCancellationTokenSource.h deleted file mode 100644 index bd6e7a1..0000000 --- a/Bolts.framework/Headers/BFCancellationTokenSource.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -@class BFCancellationToken; - -/*! - BFCancellationTokenSource represents the producer side of a CancellationToken. - Signals to a CancellationToken that it should be canceled. - It is a cancellation token that also has methods - for changing the state of a token by cancelling it. - */ -@interface BFCancellationTokenSource : NSObject - -/*! - Creates a new cancellation token source. - */ -+ (instancetype)cancellationTokenSource; - -/*! - The cancellation token associated with this CancellationTokenSource. - */ -@property (nonatomic, strong, readonly) BFCancellationToken *token; - -/*! - Whether cancellation has been requested for this token source. - */ -@property (nonatomic, assign, readonly, getter=isCancellationRequested) BOOL cancellationRequested; - -/*! - Cancels the token if it has not already been cancelled. - */ -- (void)cancel; - -/*! - Schedules a cancel operation on this CancellationTokenSource after the specified number of milliseconds. - @param millis The number of milliseconds to wait before completing the returned task. - If delay is `0` the cancel is executed immediately. If delay is `-1` any scheduled cancellation is stopped. - */ -- (void)cancelAfterDelay:(int)millis; - -/*! - Releases all resources associated with this token source, - including disposing of all registrations. - */ -- (void)dispose; - -@end diff --git a/Bolts.framework/Headers/BFExecutor.h b/Bolts.framework/Headers/BFExecutor.h deleted file mode 100644 index 02af9ba..0000000 --- a/Bolts.framework/Headers/BFExecutor.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -/*! - An object that can run a given block. - */ -@interface BFExecutor : NSObject - -/*! - Returns a default executor, which runs continuations immediately until the call stack gets too - deep, then dispatches to a new GCD queue. - */ -+ (instancetype)defaultExecutor; - -/*! - Returns an executor that runs continuations on the thread where the previous task was completed. - */ -+ (instancetype)immediateExecutor; - -/*! - Returns an executor that runs continuations on the main thread. - */ -+ (instancetype)mainThreadExecutor; - -/*! - Returns a new executor that uses the given block to execute continuations. - @param block The block to use. - */ -+ (instancetype)executorWithBlock:(void(^)(void(^block)()))block; - -/*! - Returns a new executor that runs continuations on the given queue. - @param queue The instance of `dispatch_queue_t` to dispatch all continuations onto. - */ -+ (instancetype)executorWithDispatchQueue:(dispatch_queue_t)queue; - -/*! - Returns a new executor that runs continuations on the given queue. - @param queue The instance of `NSOperationQueue` to run all continuations on. - */ -+ (instancetype)executorWithOperationQueue:(NSOperationQueue *)queue; - -/*! - Runs the given block using this executor's particular strategy. - @param block The block to execute. - */ -- (void)execute:(void(^)())block; - -@end diff --git a/Bolts.framework/Headers/BFMeasurementEvent.h b/Bolts.framework/Headers/BFMeasurementEvent.h deleted file mode 100644 index b3173fc..0000000 --- a/Bolts.framework/Headers/BFMeasurementEvent.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -/*! The name of the notification posted by BFMeasurementEvent */ -FOUNDATION_EXPORT NSString *const BFMeasurementEventNotificationName; - -/*! Defines keys in the userInfo object for the notification named BFMeasurementEventNotificationName */ -/*! The string field for the name of the event */ -FOUNDATION_EXPORT NSString *const BFMeasurementEventNameKey; -/*! The dictionary field for the arguments of the event */ -FOUNDATION_EXPORT NSString *const BFMeasurementEventArgsKey; - -/*! Bolts Events raised by BFMeasurementEvent for Applink */ -/*! - The name of the event posted when [BFURL URLWithURL:] is called successfully. This represents the successful parsing of an app link URL. - */ -FOUNDATION_EXPORT NSString *const BFAppLinkParseEventName; - -/*! - The name of the event posted when [BFURL URLWithInboundURL:] is called successfully. - This represents parsing an inbound app link URL from a different application - */ -FOUNDATION_EXPORT NSString *const BFAppLinkNavigateInEventName; - -/*! The event raised when the user navigates from your app to other apps */ -FOUNDATION_EXPORT NSString *const BFAppLinkNavigateOutEventName; - -/*! - The event raised when the user navigates out from your app and back to the referrer app. - e.g when the user leaves your app after tapping the back-to-referrer navigation bar - */ -FOUNDATION_EXPORT NSString *const BFAppLinkNavigateBackToReferrerEventName; - -@interface BFMeasurementEvent : NSObject - -@end diff --git a/Bolts.framework/Headers/BFTask.h b/Bolts.framework/Headers/BFTask.h deleted file mode 100644 index dee1137..0000000 --- a/Bolts.framework/Headers/BFTask.h +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -#import - -/*! - Error domain used if there was multiple errors on . - */ -extern NSString *const BFTaskErrorDomain; - -/*! - An exception that is thrown if there was multiple exceptions on . - */ -extern NSString *const BFTaskMultipleExceptionsException; - -@class BFExecutor; -@class BFTask; - -/*! - A block that can act as a continuation for a task. - */ -typedef id(^BFContinuationBlock)(BFTask *task); - -/*! - The consumer view of a Task. A BFTask has methods to - inspect the state of the task, and to add continuations to - be run once the task is complete. - */ -@interface BFTask : NSObject - -/*! - Creates a task that is already completed with the given result. - @param result The result for the task. - */ -+ (instancetype)taskWithResult:(id)result; - -/*! - Creates a task that is already completed with the given error. - @param error The error for the task. - */ -+ (instancetype)taskWithError:(NSError *)error; - -/*! - Creates a task that is already completed with the given exception. - @param exception The exception for the task. - */ -+ (instancetype)taskWithException:(NSException *)exception; - -/*! - Creates a task that is already cancelled. - */ -+ (instancetype)cancelledTask; - -/*! - Returns a task that will be completed (with result == nil) once - all of the input tasks have completed. - @param tasks An `NSArray` of the tasks to use as an input. - */ -+ (instancetype)taskForCompletionOfAllTasks:(NSArray *)tasks; - -/*! - Returns a task that will be completed once all of the input tasks have completed. - If all tasks complete successfully without being faulted or cancelled the result will be - an `NSArray` of all task results in the order they were provided. - @param tasks An `NSArray` of the tasks to use as an input. - */ -+ (instancetype)taskForCompletionOfAllTasksWithResults:(NSArray *)tasks; - -/*! - Returns a task that will be completed a certain amount of time in the future. - @param millis The approximate number of milliseconds to wait before the - task will be finished (with result == nil). - */ -+ (instancetype)taskWithDelay:(int)millis; - -/*! - Returns a task that will be completed a certain amount of time in the future. - @param millis The approximate number of milliseconds to wait before the - task will be finished (with result == nil). - @param token The cancellation token (optional). - */ -+ (instancetype)taskWithDelay:(int)millis - cancellationToken:(BFCancellationToken *)token; - -/*! - Returns a task that will be completed after the given block completes with - the specified executor. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to immediately schedule to run with the given executor. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -+ (instancetype)taskFromExecutor:(BFExecutor *)executor - withBlock:(id (^)())block; - -// Properties that will be set on the task once it is completed. - -/*! - The result of a successful task. - */ -@property (nonatomic, strong, readonly) id result; - -/*! - The error of a failed task. - */ -@property (nonatomic, strong, readonly) NSError *error; - -/*! - The exception of a failed task. - */ -@property (nonatomic, strong, readonly) NSException *exception; - -/*! - Whether this task has been cancelled. - */ -@property (nonatomic, assign, readonly, getter=isCancelled) BOOL cancelled; - -/*! - Whether this task has completed due to an error or exception. - */ -@property (nonatomic, assign, readonly, getter=isFaulted) BOOL faulted; - -/*! - Whether this task has completed. - */ -@property (nonatomic, assign, readonly, getter=isCompleted) BOOL completed; - -/*! - Enqueues the given block to be run once this task is complete. - This method uses a default execution strategy. The block will be - run on the thread where the previous task completes, unless the - the stack depth is too deep, in which case it will be run on a - dispatch queue with default priority. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithBlock:(BFContinuationBlock)block; - -/*! - Enqueues the given block to be run once this task is complete. - This method uses a default execution strategy. The block will be - run on the thread where the previous task completes, unless the - the stack depth is too deep, in which case it will be run on a - dispatch queue with default priority. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithBlock:(BFContinuationBlock)block - cancellationToken:(BFCancellationToken *)cancellationToken; - -/*! - Enqueues the given block to be run once this task is complete. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithExecutor:(BFExecutor *)executor - withBlock:(BFContinuationBlock)block; -/*! - Enqueues the given block to be run once this task is complete. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - his method will not be completed until that task is completed. - */ -- (instancetype)continueWithExecutor:(BFExecutor *)executor - block:(BFContinuationBlock)block - cancellationToken:(BFCancellationToken *)cancellationToken; - -/*! - Identical to continueWithBlock:, except that the block is only run - if this task did not produce a cancellation, error, or exception. - If it did, then the failure will be propagated to the returned - task. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithSuccessBlock:(BFContinuationBlock)block; - -/*! - Identical to continueWithBlock:, except that the block is only run - if this task did not produce a cancellation, error, or exception. - If it did, then the failure will be propagated to the returned - task. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithSuccessBlock:(BFContinuationBlock)block - cancellationToken:(BFCancellationToken *)cancellationToken; - -/*! - Identical to continueWithExecutor:withBlock:, except that the block - is only run if this task did not produce a cancellation, error, or - exception. If it did, then the failure will be propagated to the - returned task. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithExecutor:(BFExecutor *)executor - withSuccessBlock:(BFContinuationBlock)block; - -/*! - Identical to continueWithExecutor:withBlock:, except that the block - is only run if this task did not produce a cancellation, error, or - exception. If it did, then the failure will be propagated to the - returned task. - @param executor A BFExecutor responsible for determining how the - continuation block will be run. - @param block The block to be run once this task is complete. - @param cancellationToken The cancellation token (optional). - @returns A task that will be completed after block has run. - If block returns a BFTask, then the task returned from - this method will not be completed until that task is completed. - */ -- (instancetype)continueWithExecutor:(BFExecutor *)executor - successBlock:(BFContinuationBlock)block - cancellationToken:(BFCancellationToken *)cancellationToken; - -/*! - Waits until this operation is completed. - This method is inefficient and consumes a thread resource while - it's running. It should be avoided. This method logs a warning - message if it is used on the main thread. - */ -- (void)waitUntilFinished; - -@end diff --git a/Bolts.framework/Headers/BFTaskCompletionSource.h b/Bolts.framework/Headers/BFTaskCompletionSource.h deleted file mode 100644 index be2fbdb..0000000 --- a/Bolts.framework/Headers/BFTaskCompletionSource.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -@class BFTask; - -/*! - A BFTaskCompletionSource represents the producer side of tasks. - It is a task that also has methods for changing the state of the - task by settings its completion values. - */ -@interface BFTaskCompletionSource : NSObject - -/*! - Creates a new unfinished task. - */ -+ (instancetype)taskCompletionSource; - -/*! - The task associated with this TaskCompletionSource. - */ -@property (nonatomic, strong, readonly) BFTask *task; - -/*! - Completes the task by setting the result. - Attempting to set this for a completed task will raise an exception. - @param result The result of the task. - */ -- (void)setResult:(id)result; - -/*! - Completes the task by setting the error. - Attempting to set this for a completed task will raise an exception. - @param error The error for the task. - */ -- (void)setError:(NSError *)error; - -/*! - Completes the task by setting an exception. - Attempting to set this for a completed task will raise an exception. - @param exception The exception for the task. - */ -- (void)setException:(NSException *)exception; - -/*! - Completes the task by marking it as cancelled. - Attempting to set this for a completed task will raise an exception. - */ -- (void)cancel; - -/*! - Sets the result of the task if it wasn't already completed. - @returns whether the new value was set. - */ -- (BOOL)trySetResult:(id)result; - -/*! - Sets the error of the task if it wasn't already completed. - @param error The error for the task. - @returns whether the new value was set. - */ -- (BOOL)trySetError:(NSError *)error; - -/*! - Sets the exception of the task if it wasn't already completed. - @param exception The exception for the task. - @returns whether the new value was set. - */ -- (BOOL)trySetException:(NSException *)exception; - -/*! - Sets the cancellation state of the task if it wasn't already completed. - @returns whether the new value was set. - */ -- (BOOL)trySetCancelled; - -@end diff --git a/Bolts.framework/Headers/BFURL.h b/Bolts.framework/Headers/BFURL.h deleted file mode 100644 index 924c91d..0000000 --- a/Bolts.framework/Headers/BFURL.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -@class BFAppLink; - -/*! - Provides a set of utilities for working with NSURLs, such as parsing of query parameters - and handling for App Link requests. - */ -@interface BFURL : NSObject - -/*! - Creates a link target from a raw URL. - On success, this posts the BFAppLinkParseEventName measurement event. If you are constructing the BFURL within your application delegate's - application:openURL:sourceApplication:annotation:, you should instead use URLWithInboundURL:sourceApplication: - to support better BFMeasurementEvent notifications - @param url The instance of `NSURL` to create BFURL from. - */ -+ (BFURL *)URLWithURL:(NSURL *)url; - -/*! - Creates a link target from a raw URL received from an external application. This is typically called from the app delegate's - application:openURL:sourceApplication:annotation: and will post the BFAppLinkNavigateInEventName measurement event. - @param url The instance of `NSURL` to create BFURL from. - @param sourceApplication the bundle ID of the app that is requesting your app to open the URL. The same sourceApplication in application:openURL:sourceApplication:annotation: - */ -+ (BFURL *)URLWithInboundURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication; - -/*! - Gets the target URL. If the link is an App Link, this is the target of the App Link. - Otherwise, it is the url that created the target. - */ -@property (nonatomic, strong, readonly) NSURL *targetURL; - -/*! - Gets the query parameters for the target, parsed into an NSDictionary. - */ -@property (nonatomic, strong, readonly) NSDictionary *targetQueryParameters; - -/*! - If this link target is an App Link, this is the data found in al_applink_data. - Otherwise, it is nil. - */ -@property (nonatomic, strong, readonly) NSDictionary *appLinkData; - -/*! - If this link target is an App Link, this is the data found in extras. - */ -@property (nonatomic, strong, readonly) NSDictionary *appLinkExtras; - -/*! - The App Link indicating how to navigate back to the referer app, if any. - */ -@property (nonatomic, strong, readonly) BFAppLink *appLinkReferer; - -/*! - The URL that was used to create this BFURL. - */ -@property (nonatomic, strong, readonly) NSURL *inputURL; - -/*! - The query parameters of the inputURL, parsed into an NSDictionary. - */ -@property (nonatomic, strong, readonly) NSDictionary *inputQueryParameters; - -@end diff --git a/Bolts.framework/Headers/BFWebViewAppLinkResolver.h b/Bolts.framework/Headers/BFWebViewAppLinkResolver.h deleted file mode 100644 index 3782ae2..0000000 --- a/Bolts.framework/Headers/BFWebViewAppLinkResolver.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import - -#import - -/*! - A reference implementation for an App Link resolver that uses a hidden UIWebView - to parse the HTML containing App Link metadata. - */ -@interface BFWebViewAppLinkResolver : NSObject - -/*! - Gets the instance of a BFWebViewAppLinkResolver. - */ -+ (instancetype)sharedInstance; - -@end diff --git a/Bolts.framework/Headers/Bolts.h b/Bolts.framework/Headers/Bolts.h deleted file mode 100644 index ca48a16..0000000 --- a/Bolts.framework/Headers/Bolts.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2014, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import -#import -#import -#import -#import -#import -#import - -#if __has_include() && TARGET_OS_IPHONE -#import -#import -#import -#import -#import -#import -#import -#import -#import -#endif - -/*! @abstract 80175001: There were multiple errors. */ -extern NSInteger const kBFMultipleErrorsError; - -@interface Bolts : NSObject - -/*! - Returns the version of the Bolts Framework as an NSString. - @returns The NSString representation of the current version. - */ -+ (NSString *)version; - -@end diff --git a/Bolts.framework/Headers/BoltsVersion.h b/Bolts.framework/Headers/BoltsVersion.h deleted file mode 100644 index 6719301..0000000 --- a/Bolts.framework/Headers/BoltsVersion.h +++ /dev/null @@ -1 +0,0 @@ -#define BOLTS_VERSION @"1.2.1" diff --git a/Bolts.framework/Info.plist b/Bolts.framework/Info.plist deleted file mode 100644 index 007ef92..0000000 Binary files a/Bolts.framework/Info.plist and /dev/null differ diff --git a/Bolts.framework/Modules/module.modulemap b/Bolts.framework/Modules/module.modulemap deleted file mode 100644 index 3c92a17..0000000 --- a/Bolts.framework/Modules/module.modulemap +++ /dev/null @@ -1,15 +0,0 @@ -framework module Bolts { - umbrella header "Bolts.h" - - export * - module * { export * } - - explicit module BFAppLinkResolving { - header "BFAppLinkResolving.h" - export * - } - explicit module BFWebViewAppLinkResolver { - header "BFWebViewAppLinkResolver.h" - export * - } -} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index fcaf027..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,21 +0,0 @@ -# How to contribute -This document will outline how to contribute to the further development of the HackTX iOS. While this app has been specifically designed for use at HackTX, it can easily be adapted for use by any hackathon, so we appreciate any contributions to help us further our support back to the community. We have a few guidelines that we need contributors from the community to follow in order to keep things running smoothly. - -## Getting Started - -Fork then clone the repo replacing `your_username` with your actual GitHub username - - git clone git@github.com:your_username/iOS-HackTX-2015.git - - -## Making Changes - -1. Create a branch with an appropriate name - 1. Branch off from where you want to base your work (usually the master branch) - 2. Please don't target release branches - 3. Do not work directly on master. If you submit a pull request directly on the master branch it will be closed. -2. Make your commits in logical units. There should not be tiny changes in all commits, nor should all your work be condensed in one commit. -3. Make sure you continue to follow the whitespace formatting. Remove extraneous whitespace using `git diff --check` - -## Submitting Changes -Once you have pushed all changes to your fork, you can submit a pull request to the HackTX repo. A member from the HackTX iOS team will review your changes. If it all looks good, we'll merge it, otherwise we'll make suggestions how to fix it. diff --git a/Fabric.framework/Fabric b/Fabric.framework/Fabric deleted file mode 100755 index 7ef9378..0000000 Binary files a/Fabric.framework/Fabric and /dev/null differ diff --git a/Fabric.framework/Headers/FABAttributes.h b/Fabric.framework/Headers/FABAttributes.h deleted file mode 100644 index 7200ea4..0000000 --- a/Fabric.framework/Headers/FABAttributes.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// FABAttributes.h -// Fabric -// -// Created by Priyanka Joshi on 3/3/15. -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#pragma once - -#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) - -#if __has_feature(nullability) -#define FAB_NONNULL __nonnull -#define FAB_NULLABLE __nullable -#define FAB_START_NONNULL _Pragma("clang assume_nonnull begin") -#define FAB_END_NONNULL _Pragma("clang assume_nonnull end") -#else -#define FAB_NONNULL -#define FAB_NULLABLE -#define FAB_START_NONNULL -#define FAB_END_NONNULL -#endif diff --git a/Fabric.framework/Headers/Fabric.h b/Fabric.framework/Headers/Fabric.h deleted file mode 100644 index 7b1b31a..0000000 --- a/Fabric.framework/Headers/Fabric.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// Fabric.h -// -// Copyright (c) 2014 Twitter. All rights reserved. -// - -#import -#import "FABAttributes.h" - -FAB_START_NONNULL - -/** - * Fabric Base. Coordinates configuration and starts all provided kits. - */ -@interface Fabric : NSObject - -/** - * Initialize Fabric and all provided kits. Call this method within your App Delegate's - * `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. - * - * For example, in Objective-C: - * - * `[Fabric with:@[TwitterKit, CrashlyticsKit, MoPubKit]];` - * - * Swift: - * - * `Fabric.with([Twitter(), Crashlytics(), MoPub()])` - * - * Only the first call to this method is honored. Subsequent calls are no-ops. - * - * @param kits An array of kit instances. Kits may provide a macro such as CrashlyticsKit which can be passed in as array elements in objective-c. - * - * @return Returns the shared Fabric instance. In most cases this can be ignored. - */ -+ (instancetype)with:(NSArray *)kits; - -/** - * Returns the Fabric singleton object. - */ -+ (instancetype)sharedSDK; - -/** - * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. - */ -@property (nonatomic, assign) BOOL debug; - -/** - * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. - */ -- (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); - -/** - * Returns Fabrics's instance of the specified kit. - * - * @param klass The class of the kit. - * - * @return The kit instance of class klass which was provided to with: or nil. - */ -- (id FAB_NULLABLE)kitForClass:(Class)klass; - -/** - * Returns a dictionary containing the kit configuration info for the provided kit. - * The configuration information is parsed from the application's Info.plist. This - * method is primarily intended to be used by kits to retrieve their configuration. - * - * @param kitInstance An instance of the kit whose configuration should be returned. - * - * @return A dictionary containing kit specific configuration information or nil if none exists. - */ -- (NSDictionary * FAB_NULLABLE)configurationDictionaryForKit:(id)kitInstance; - -@end - -FAB_END_NONNULL - diff --git a/Fabric.framework/Info.plist b/Fabric.framework/Info.plist deleted file mode 100644 index bf020d8..0000000 --- a/Fabric.framework/Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleExecutable - Fabric - CFBundleIdentifier - io.fabric.sdk.ios - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Fabric - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.2.8 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 20 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12B411 - DTPlatformName - iphoneos - DTPlatformVersion - 8.1 - DTSDKBuild - 12B411 - DTSDKName - iphoneos8.1 - DTXcode - 0611 - DTXcodeBuild - 6A2008a - MinimumOSVersion - 5.0 - NSHumanReadableCopyright - Copyright © 2015 Twitter. All rights reserved. - UIDeviceFamily - - 1 - 2 - - - diff --git a/Fabric.framework/run b/Fabric.framework/run deleted file mode 100755 index b3ca4de..0000000 Binary files a/Fabric.framework/run and /dev/null differ diff --git a/HackTX-Bridging-Header.h b/HackTX-Bridging-Header.h deleted file mode 100644 index 2c0c617..0000000 --- a/HackTX-Bridging-Header.h +++ /dev/null @@ -1,9 +0,0 @@ -// -// HackTX-Bridging-Header.h -// HackTX -// -// Created by Drew Romanyk on 9/5/15. -// Copyright (c) 2015 HackTX. All rights reserved. -// - -#import diff --git a/HackTX.xcodeproj/project.pbxproj b/HackTX.xcodeproj/project.pbxproj index 4fdced1..f48fdb4 100644 --- a/HackTX.xcodeproj/project.pbxproj +++ b/HackTX.xcodeproj/project.pbxproj @@ -7,804 +7,324 @@ objects = { /* Begin PBXBuildFile section */ - 0EEBD4D4183683D7099C95B8 /* Pods_HackTX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 715158D3DB02FD4CF82662A4 /* Pods_HackTX.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 3A192BA01B9EBE2C008AA3BA /* EventFeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A192B9F1B9EBE2C008AA3BA /* EventFeedbackViewController.swift */; }; - 3A21566E1B8A430C00BCA241 /* PartnersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A21566D1B8A430C00BCA241 /* PartnersViewController.swift */; }; - 3A2156731B8A436100BCA241 /* PartnersViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A2156711B8A436100BCA241 /* PartnersViewCell.swift */; }; - 3A2156741B8A436100BCA241 /* PartnersViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3A2156721B8A436100BCA241 /* PartnersViewCell.xib */; }; - 3A2156761B8A44CC00BCA241 /* Sponsor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A2156751B8A44CC00BCA241 /* Sponsor.swift */; }; - 3A21567A1B8A577100BCA241 /* ScheduleDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A2156791B8A577100BCA241 /* ScheduleDetailViewController.swift */; }; - 3A21567C1B8A5D3D00BCA241 /* ScheduleCluster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A21567B1B8A5D3D00BCA241 /* ScheduleCluster.swift */; }; - 3A21567E1B8A5D5400BCA241 /* Day.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A21567D1B8A5D5400BCA241 /* Day.swift */; }; - 3A2156801B8A5D6A00BCA241 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A21567F1B8A5D6A00BCA241 /* Event.swift */; }; - 3A2156821B8A5D8900BCA241 /* Speaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A2156811B8A5D8900BCA241 /* Speaker.swift */; }; - 3A3666581B9CD8350028BA91 /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3666571B9CD8350028BA91 /* Router.swift */; }; - 3A806E291B9A895D00E29A0F /* CheckInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A806E281B9A895D00E29A0F /* CheckInViewController.swift */; }; - 3A806E511B9A9E4B00E29A0F /* UserPrefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A806E501B9A9E4B00E29A0F /* UserPrefs.swift */; }; - 3A806E5F1B9ACDE100E29A0F /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A806E5E1B9ACDE100E29A0F /* CoreData.framework */; }; - 3AEB82341B7F107F00224BC3 /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AEB82301B7F107F00224BC3 /* Fabric.framework */; }; - 3AEB82351B7F107F00224BC3 /* TwitterKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AEB82311B7F107F00224BC3 /* TwitterKit.framework */; }; - 3AEB82361B7F107F00224BC3 /* TwitterKitResources.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 3AEB82321B7F107F00224BC3 /* TwitterKitResources.bundle */; }; - 3AEB82371B7F107F00224BC3 /* TwitterCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AEB82331B7F107F00224BC3 /* TwitterCore.framework */; }; - 3AEB82391B7F14E300224BC3 /* AnnouncementsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AEB82381B7F14E300224BC3 /* AnnouncementsViewController.swift */; }; - 3AEB823B1B7F14F400224BC3 /* Announcement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AEB823A1B7F14F400224BC3 /* Announcement.swift */; }; - F91C84341BAD2A57006E2D8F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F91C84331BAD2A57006E2D8F /* GoogleService-Info.plist */; settings = {ASSET_TAGS = (); }; }; - F91C84381BAD2A74006E2D8F /* ApiKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = F91C84371BAD2A74006E2D8F /* ApiKeys.plist */; settings = {ASSET_TAGS = (); }; }; - F91C843A1BAD2A81006E2D8F /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F91C84391BAD2A81006E2D8F /* GoogleService-Info.plist */; settings = {ASSET_TAGS = (); }; }; - F91C843C1BAD2AED006E2D8F /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91C843B1BAD2AED006E2D8F /* Reachability.swift */; settings = {ASSET_TAGS = (); }; }; - F96AB7931B97D14B00394217 /* Parse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB7921B97D14B00394217 /* Parse.framework */; }; - F96AB7951B97D18F00394217 /* Bolts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB7941B97D18F00394217 /* Bolts.framework */; }; - F96AB7A01B97D25C00394217 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB7961B97D25C00394217 /* AudioToolbox.framework */; }; - F96AB7A11B97D25C00394217 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB7971B97D25C00394217 /* CFNetwork.framework */; }; - F96AB7A21B97D25C00394217 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB7981B97D25C00394217 /* CoreGraphics.framework */; }; - F96AB7A31B97D25C00394217 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB7991B97D25C00394217 /* CoreLocation.framework */; }; - F96AB7A41B97D25C00394217 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB79A1B97D25C00394217 /* libsqlite3.dylib */; }; - F96AB7A51B97D25C00394217 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB79B1B97D25C00394217 /* libz.dylib */; }; - F96AB7A61B97D25C00394217 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB79C1B97D25C00394217 /* QuartzCore.framework */; }; - F96AB7A71B97D25C00394217 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB79D1B97D25C00394217 /* Security.framework */; }; - F96AB7A81B97D25C00394217 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB79E1B97D25C00394217 /* StoreKit.framework */; }; - F96AB7A91B97D25C00394217 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96AB79F1B97D25C00394217 /* SystemConfiguration.framework */; }; - F96AB7AB1B97D40600394217 /* ApiKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = F96AB7AA1B97D40600394217 /* ApiKeys.plist */; }; - F96AB7AD1B97E01200394217 /* MapsPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F96AB7AC1B97E01200394217 /* MapsPageViewController.swift */; }; - F9C42ACA1B979B7200A21CF8 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C42AC91B979B7200A21CF8 /* Location.swift */; }; - F9E990381B50EBBA00057823 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E990371B50EBBA00057823 /* AppDelegate.swift */; }; - F9E9903A1B50EBBA00057823 /* ScheduleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E990391B50EBBA00057823 /* ScheduleViewController.swift */; }; - F9E9903F1B50EBBA00057823 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F9E9903D1B50EBBA00057823 /* Main.storyboard */; }; - F9E990411B50EBBA00057823 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F9E990401B50EBBA00057823 /* Images.xcassets */; }; - F9E990441B50EBBA00057823 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F9E990421B50EBBA00057823 /* LaunchScreen.xib */; }; - F9E990651B50FFFF00057823 /* TwitterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E990641B50FFFF00057823 /* TwitterViewController.swift */; }; - F9E990671B51001000057823 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9E990661B51001000057823 /* MapViewController.swift */; }; - F9EE70221B912EE300B493A8 /* PageItemViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9EE70211B912EE300B493A8 /* PageItemViewController.swift */; }; + 4E5410941E35FEC803EA8E2D /* libPods-HackTX.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B67A442663439B9AD415E5F6 /* libPods-HackTX.a */; }; + 8200AD711DB3577400D4EE11 /* AnnouncementTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8200AD6F1DB3577400D4EE11 /* AnnouncementTableViewCell.m */; }; + 8200AD721DB3577400D4EE11 /* AnnouncementTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8200AD701DB3577400D4EE11 /* AnnouncementTableViewCell.xib */; }; + 820B450C1D9624B1002A26BA /* SponsorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 820B450A1D9624B1002A26BA /* SponsorTableViewCell.m */; }; + 820B450D1D9624B1002A26BA /* SponsorTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 820B450B1D9624B1002A26BA /* SponsorTableViewCell.xib */; }; + 8215AD7F1D8DBE3700377370 /* Sponsor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD7E1D8DBE3700377370 /* Sponsor.m */; }; + 8215AD831D8DC49F00377370 /* Announcement.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD821D8DC49F00377370 /* Announcement.m */; }; + 8215AD861D8DC53D00377370 /* Location.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD851D8DC53D00377370 /* Location.m */; }; + 8215AD891D8DC63F00377370 /* Event.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD881D8DC63F00377370 /* Event.m */; }; + 8215AD8C1D8DC70F00377370 /* Speaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD8B1D8DC70F00377370 /* Speaker.m */; }; + 8215AD8F1D8DC88100377370 /* HTXAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD8E1D8DC88100377370 /* HTXAPI.m */; }; + 8215AD921D8DD26C00377370 /* SponsorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215AD911D8DD26C00377370 /* SponsorViewController.m */; }; + 8215ADAF1D8E27F800377370 /* NSString+MD5.m in Sources */ = {isa = PBXBuildFile; fileRef = 8215ADAE1D8E27F800377370 /* NSString+MD5.m */; }; + 8221B2071DAEF9D900FB1BE1 /* ScheduleTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8221B2051DAEF9D900FB1BE1 /* ScheduleTableViewCell.m */; }; + 8221B2081DAEF9D900FB1BE1 /* ScheduleTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8221B2061DAEF9D900FB1BE1 /* ScheduleTableViewCell.xib */; }; + 8221B20B1DAF109B00FB1BE1 /* HTXAPIKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 8221B20A1DAF109B00FB1BE1 /* HTXAPIKeyStore.m */; }; + 8221B20F1DAF11FF00FB1BE1 /* APIKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8221B20E1DAF11FF00FB1BE1 /* APIKeys.plist */; }; + 822A4D981D779BCD00C65761 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 822A4D971D779BCD00C65761 /* main.m */; }; + 822A4D9B1D779BCD00C65761 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 822A4D9A1D779BCD00C65761 /* AppDelegate.m */; }; + 822A4DA41D779BCD00C65761 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 822A4DA21D779BCD00C65761 /* Main.storyboard */; }; + 822A4DA61D779BCD00C65761 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 822A4DA51D779BCD00C65761 /* Assets.xcassets */; }; + 822A4DA91D779BCD00C65761 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 822A4DA71D779BCD00C65761 /* LaunchScreen.storyboard */; }; + 822A4DB41D779DBD00C65761 /* ScheduleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 822A4DB31D779DBD00C65761 /* ScheduleViewController.m */; }; + 822A4DB71D779DD100C65761 /* AnnouncementsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 822A4DB61D779DD100C65761 /* AnnouncementsViewController.m */; }; + 822A4DC01D779DF100C65761 /* MapViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 822A4DBF1D779DF100C65761 /* MapViewController.m */; }; + 822E95191D7FF4EE00C0402E /* HTXConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 822E95181D7FF4EE00C0402E /* HTXConstants.m */; }; + 82BA003A1D81492F006CA2C6 /* AutolayoutHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 82BA00391D81492F006CA2C6 /* AutolayoutHelper.m */; }; + 82BA003D1D8149B1006CA2C6 /* UIColor+Palette.m in Sources */ = {isa = PBXBuildFile; fileRef = 82BA003C1D8149B1006CA2C6 /* UIColor+Palette.m */; }; + 82BAC6D21D9D1FC000BF62C0 /* JosefinSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6C81D9D1FC000BF62C0 /* JosefinSans-Bold.ttf */; }; + 82BAC6D31D9D1FC000BF62C0 /* JosefinSans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6C91D9D1FC000BF62C0 /* JosefinSans-BoldItalic.ttf */; }; + 82BAC6D41D9D1FC000BF62C0 /* JosefinSans-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6CA1D9D1FC000BF62C0 /* JosefinSans-Italic.ttf */; }; + 82BAC6D51D9D1FC000BF62C0 /* JosefinSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6CB1D9D1FC000BF62C0 /* JosefinSans-Light.ttf */; }; + 82BAC6D61D9D1FC000BF62C0 /* JosefinSans-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6CC1D9D1FC000BF62C0 /* JosefinSans-LightItalic.ttf */; }; + 82BAC6D71D9D1FC000BF62C0 /* JosefinSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6CD1D9D1FC000BF62C0 /* JosefinSans-Regular.ttf */; }; + 82BAC6D81D9D1FC000BF62C0 /* JosefinSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6CE1D9D1FC000BF62C0 /* JosefinSans-SemiBold.ttf */; }; + 82BAC6D91D9D1FC000BF62C0 /* JosefinSans-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6CF1D9D1FC000BF62C0 /* JosefinSans-SemiBoldItalic.ttf */; }; + 82BAC6DA1D9D1FC000BF62C0 /* JosefinSans-Thin.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6D01D9D1FC000BF62C0 /* JosefinSans-Thin.ttf */; }; + 82BAC6DB1D9D1FC000BF62C0 /* JosefinSans-ThinItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 82BAC6D11D9D1FC000BF62C0 /* JosefinSans-ThinItalic.ttf */; }; + 82BFF6D71D9E662600DB2543 /* partners.json in Resources */ = {isa = PBXBuildFile; fileRef = 82BFF6D61D9E662600DB2543 /* partners.json */; }; + 82D303C91DB23BB2003C98ED /* PassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82D303C81DB23BB2003C98ED /* PassKit.framework */; }; + 82D303D11DB24084003C98ED /* Hacker.m in Sources */ = {isa = PBXBuildFile; fileRef = 82D303D01DB24084003C98ED /* Hacker.m */; }; + 82EAFC871DB200D50061C449 /* CheckInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 82EAFC851DB200D50061C449 /* CheckInViewController.m */; }; + 82EAFC881DB200D50061C449 /* CheckInViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 82EAFC861DB200D50061C449 /* CheckInViewController.xib */; }; + 82F3C16B1DB71BAC004F96FC /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82F3C16A1DB71BAC004F96FC /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 3A806EF01B9AD92E00E29A0F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = C08F031FB69E7F1318E303AE8858C9AA; - remoteInfo = "Pods-HackTX"; - }; - 3ADDC0601B9CC2A500D0ECD2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 354BEE9D235DF8157E8AB34827ECD658; - remoteInfo = Alamofire; - }; - 3ADDC0621B9CC2A500D0ECD2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 1A677D45179CEC1F17E608D4F6CC0821; - remoteInfo = RSBarcodes_Swift; - }; - 3ADDC0641B9CC2A500D0ECD2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = EB4CB50B42FA0112BD3CB968CB68AC93; - remoteInfo = SwiftyJSON; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 3A806E2C1B9A8E6500E29A0F /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 7; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ - 163274BAD693C35C1B0222A5 /* Pods-HackTX.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackTX.release.xcconfig"; path = "Pods/Target Support Files/Pods-HackTX/Pods-HackTX.release.xcconfig"; sourceTree = ""; }; - 3A192B9F1B9EBE2C008AA3BA /* EventFeedbackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventFeedbackViewController.swift; sourceTree = ""; }; - 3A21566D1B8A430C00BCA241 /* PartnersViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartnersViewController.swift; sourceTree = ""; }; - 3A2156711B8A436100BCA241 /* PartnersViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PartnersViewCell.swift; sourceTree = ""; }; - 3A2156721B8A436100BCA241 /* PartnersViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PartnersViewCell.xib; sourceTree = ""; }; - 3A2156751B8A44CC00BCA241 /* Sponsor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sponsor.swift; sourceTree = ""; }; - 3A2156791B8A577100BCA241 /* ScheduleDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduleDetailViewController.swift; sourceTree = ""; }; - 3A21567B1B8A5D3D00BCA241 /* ScheduleCluster.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScheduleCluster.swift; sourceTree = ""; }; - 3A21567D1B8A5D5400BCA241 /* Day.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Day.swift; sourceTree = ""; }; - 3A21567F1B8A5D6A00BCA241 /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = ""; }; - 3A2156811B8A5D8900BCA241 /* Speaker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Speaker.swift; sourceTree = ""; }; - 3A3666571B9CD8350028BA91 /* Router.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Router.swift; sourceTree = ""; }; - 3A806E281B9A895D00E29A0F /* CheckInViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheckInViewController.swift; sourceTree = ""; }; - 3A806E501B9A9E4B00E29A0F /* UserPrefs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPrefs.swift; sourceTree = ""; }; - 3A806E5E1B9ACDE100E29A0F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; - 3A806E801B9AD62800E29A0F /* HackTX-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HackTX-Bridging-Header.h"; sourceTree = SOURCE_ROOT; }; - 3A806E861B9AD92E00E29A0F /* Analytics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Analytics.h; sourceTree = ""; }; - 3A806E871B9AD92E00E29A0F /* GGLContext+Analytics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "GGLContext+Analytics.h"; sourceTree = ""; }; - 3A806E8A1B9AD92E00E29A0F /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; - 3A806E8B1B9AD92E00E29A0F /* GGLConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLConfiguration.h; sourceTree = ""; }; - 3A806E8C1B9AD92E00E29A0F /* GGLContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLContext.h; sourceTree = ""; }; - 3A806E8D1B9AD92E00E29A0F /* GGLErrorCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLErrorCode.h; sourceTree = ""; }; - 3A806E8F1B9AD92E00E29A0F /* libGGLAnalytics.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGGLAnalytics.a; sourceTree = ""; }; - 3A806E901B9AD92E00E29A0F /* libGGLCore.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGGLCore.a; sourceTree = ""; }; - 3A806E941B9AD92E00E29A0F /* GAI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAI.h; sourceTree = ""; }; - 3A806E951B9AD92E00E29A0F /* GAIDictionaryBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIDictionaryBuilder.h; sourceTree = ""; }; - 3A806E961B9AD92E00E29A0F /* GAIEcommerceFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceFields.h; sourceTree = ""; }; - 3A806E971B9AD92E00E29A0F /* GAIEcommerceProduct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceProduct.h; sourceTree = ""; }; - 3A806E981B9AD92E00E29A0F /* GAIEcommerceProductAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceProductAction.h; sourceTree = ""; }; - 3A806E991B9AD92E00E29A0F /* GAIEcommercePromotion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommercePromotion.h; sourceTree = ""; }; - 3A806E9A1B9AD92E00E29A0F /* GAIFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIFields.h; sourceTree = ""; }; - 3A806E9B1B9AD92E00E29A0F /* GAILogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAILogger.h; sourceTree = ""; }; - 3A806E9C1B9AD92E00E29A0F /* GAITrackedViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAITrackedViewController.h; sourceTree = ""; }; - 3A806E9D1B9AD92E00E29A0F /* GAITracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAITracker.h; sourceTree = ""; }; - 3A806E9F1B9AD92E00E29A0F /* libGoogleAnalytics.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGoogleAnalytics.a; sourceTree = ""; }; - 3A806EA21B9AD92E00E29A0F /* libGTMSessionFetcher_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTMSessionFetcher_core.a; sourceTree = ""; }; - 3A806EA31B9AD92E00E29A0F /* libGTMSessionFetcher_full.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTMSessionFetcher_full.a; sourceTree = ""; }; - 3A806EA61B9AD92E00E29A0F /* libGSDK_Overload.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGSDK_Overload.a; sourceTree = ""; }; - 3A806EA91B9AD92E00E29A0F /* libGTM_AddressBook.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_AddressBook.a; sourceTree = ""; }; - 3A806EAA1B9AD92E00E29A0F /* libGTM_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_core.a; sourceTree = ""; }; - 3A806EAB1B9AD92E00E29A0F /* libGTM_DebugUtils.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_DebugUtils.a; sourceTree = ""; }; - 3A806EAC1B9AD92E00E29A0F /* libGTM_GTMURLBuilder.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_GTMURLBuilder.a; sourceTree = ""; }; - 3A806EAD1B9AD92E00E29A0F /* libGTM_iPhone.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_iPhone.a; sourceTree = ""; }; - 3A806EAE1B9AD92E00E29A0F /* libGTM_KVO.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_KVO.a; sourceTree = ""; }; - 3A806EAF1B9AD92E00E29A0F /* libGTM_NSDictionary+URLArguments.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libGTM_NSDictionary+URLArguments.a"; sourceTree = ""; }; - 3A806EB01B9AD92E00E29A0F /* libGTM_NSScannerJSON.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_NSScannerJSON.a; sourceTree = ""; }; - 3A806EB11B9AD92E00E29A0F /* libGTM_NSStringHTML.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_NSStringHTML.a; sourceTree = ""; }; - 3A806EB21B9AD92E00E29A0F /* libGTM_NSStringXML.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_NSStringXML.a; sourceTree = ""; }; - 3A806EB31B9AD92E00E29A0F /* libGTM_Regex.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_Regex.a; sourceTree = ""; }; - 3A806EB41B9AD92E00E29A0F /* libGTM_RoundedRectPath.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_RoundedRectPath.a; sourceTree = ""; }; - 3A806EB51B9AD92E00E29A0F /* libGTM_StringEncoding.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_StringEncoding.a; sourceTree = ""; }; - 3A806EB61B9AD92E00E29A0F /* libGTM_SystemVersion.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTM_SystemVersion.a; sourceTree = ""; }; - 3A806EB71B9AD92E00E29A0F /* libGTM_UIFont+LineHeight.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libGTM_UIFont+LineHeight.a"; sourceTree = ""; }; - 3A806EB81B9AD92E00E29A0F /* libGTMStackTrace.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libGTMStackTrace.a; sourceTree = ""; }; - 3A806EBD1B9AD92E00E29A0F /* Analytics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Analytics.h; sourceTree = ""; }; - 3A806EBE1B9AD92E00E29A0F /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; - 3A806EBF1B9AD92E00E29A0F /* GGLConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLConfiguration.h; sourceTree = ""; }; - 3A806EC01B9AD92E00E29A0F /* GGLContext+Analytics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "GGLContext+Analytics.h"; sourceTree = ""; }; - 3A806EC11B9AD92E00E29A0F /* GGLContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLContext.h; sourceTree = ""; }; - 3A806EC21B9AD92E00E29A0F /* GGLErrorCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLErrorCode.h; sourceTree = ""; }; - 3A806EC41B9AD92E00E29A0F /* GAI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAI.h; sourceTree = ""; }; - 3A806EC51B9AD92E00E29A0F /* GAIDictionaryBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIDictionaryBuilder.h; sourceTree = ""; }; - 3A806EC61B9AD92E00E29A0F /* GAIEcommerceFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceFields.h; sourceTree = ""; }; - 3A806EC71B9AD92E00E29A0F /* GAIEcommerceProduct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceProduct.h; sourceTree = ""; }; - 3A806EC81B9AD92E00E29A0F /* GAIEcommerceProductAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceProductAction.h; sourceTree = ""; }; - 3A806EC91B9AD92E00E29A0F /* GAIEcommercePromotion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommercePromotion.h; sourceTree = ""; }; - 3A806ECA1B9AD92E00E29A0F /* GAIFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIFields.h; sourceTree = ""; }; - 3A806ECB1B9AD92E00E29A0F /* GAILogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAILogger.h; sourceTree = ""; }; - 3A806ECC1B9AD92E00E29A0F /* GAITrackedViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAITrackedViewController.h; sourceTree = ""; }; - 3A806ECD1B9AD92E00E29A0F /* GAITracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAITracker.h; sourceTree = ""; }; - 3A806ED11B9AD92E00E29A0F /* Analytics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Analytics.h; sourceTree = ""; }; - 3A806ED21B9AD92E00E29A0F /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; - 3A806ED31B9AD92E00E29A0F /* GGLConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLConfiguration.h; sourceTree = ""; }; - 3A806ED41B9AD92E00E29A0F /* GGLContext+Analytics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "GGLContext+Analytics.h"; sourceTree = ""; }; - 3A806ED51B9AD92E00E29A0F /* GGLContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLContext.h; sourceTree = ""; }; - 3A806ED61B9AD92E00E29A0F /* GGLErrorCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GGLErrorCode.h; sourceTree = ""; }; - 3A806ED81B9AD92E00E29A0F /* GAI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAI.h; sourceTree = ""; }; - 3A806ED91B9AD92E00E29A0F /* GAIDictionaryBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIDictionaryBuilder.h; sourceTree = ""; }; - 3A806EDA1B9AD92E00E29A0F /* GAIEcommerceFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceFields.h; sourceTree = ""; }; - 3A806EDB1B9AD92E00E29A0F /* GAIEcommerceProduct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceProduct.h; sourceTree = ""; }; - 3A806EDC1B9AD92E00E29A0F /* GAIEcommerceProductAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommerceProductAction.h; sourceTree = ""; }; - 3A806EDD1B9AD92E00E29A0F /* GAIEcommercePromotion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIEcommercePromotion.h; sourceTree = ""; }; - 3A806EDE1B9AD92E00E29A0F /* GAIFields.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAIFields.h; sourceTree = ""; }; - 3A806EDF1B9AD92E00E29A0F /* GAILogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAILogger.h; sourceTree = ""; }; - 3A806EE01B9AD92E00E29A0F /* GAITrackedViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAITrackedViewController.h; sourceTree = ""; }; - 3A806EE11B9AD92E00E29A0F /* GAITracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GAITracker.h; sourceTree = ""; }; - 3A806EE31B9AD92E00E29A0F /* Manifest.lock */ = {isa = PBXFileReference; lastKnownFileType = text; path = Manifest.lock; sourceTree = ""; }; - 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Pods.xcodeproj; sourceTree = ""; }; - 3A806EE91B9AD92E00E29A0F /* Pods-HackTX-acknowledgements.markdown */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "Pods-HackTX-acknowledgements.markdown"; sourceTree = ""; }; - 3A806EEA1B9AD92E00E29A0F /* Pods-HackTX-acknowledgements.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Pods-HackTX-acknowledgements.plist"; sourceTree = ""; }; - 3A806EEB1B9AD92E00E29A0F /* Pods-HackTX-dummy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Pods-HackTX-dummy.m"; sourceTree = ""; }; - 3A806EEC1B9AD92E00E29A0F /* Pods-HackTX-resources.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "Pods-HackTX-resources.sh"; sourceTree = ""; }; - 3A806EED1B9AD92E00E29A0F /* Pods-HackTX.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Pods-HackTX.debug.xcconfig"; sourceTree = ""; }; - 3A806EEE1B9AD92E00E29A0F /* Pods-HackTX.release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Pods-HackTX.release.xcconfig"; sourceTree = ""; }; - 3AEB82301B7F107F00224BC3 /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Fabric.framework; sourceTree = ""; }; - 3AEB82311B7F107F00224BC3 /* TwitterKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TwitterKit.framework; sourceTree = ""; }; - 3AEB82321B7F107F00224BC3 /* TwitterKitResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = TwitterKitResources.bundle; path = TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle; sourceTree = ""; }; - 3AEB82331B7F107F00224BC3 /* TwitterCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = TwitterCore.framework; sourceTree = ""; }; - 3AEB82381B7F14E300224BC3 /* AnnouncementsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnouncementsViewController.swift; sourceTree = ""; }; - 3AEB823A1B7F14F400224BC3 /* Announcement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Announcement.swift; sourceTree = ""; }; - 715158D3DB02FD4CF82662A4 /* Pods_HackTX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HackTX.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 94E240E75C09DEDD03EA913F /* Pods-HackTX.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackTX.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HackTX/Pods-HackTX.debug.xcconfig"; sourceTree = ""; }; - F91C84331BAD2A57006E2D8F /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - F91C84371BAD2A74006E2D8F /* ApiKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ApiKeys.plist; sourceTree = ""; }; - F91C84391BAD2A81006E2D8F /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - F91C843B1BAD2AED006E2D8F /* Reachability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reachability.swift; sourceTree = ""; }; - F96AB7921B97D14B00394217 /* Parse.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Parse.framework; sourceTree = ""; }; - F96AB7941B97D18F00394217 /* Bolts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Bolts.framework; sourceTree = ""; }; - F96AB7961B97D25C00394217 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - F96AB7971B97D25C00394217 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; - F96AB7981B97D25C00394217 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - F96AB7991B97D25C00394217 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; - F96AB79A1B97D25C00394217 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; - F96AB79B1B97D25C00394217 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; - F96AB79C1B97D25C00394217 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - F96AB79D1B97D25C00394217 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; - F96AB79E1B97D25C00394217 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; - F96AB79F1B97D25C00394217 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; - F96AB7AA1B97D40600394217 /* ApiKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ApiKeys.plist; sourceTree = ""; }; - F96AB7AC1B97E01200394217 /* MapsPageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapsPageViewController.swift; sourceTree = ""; }; - F9C42AC91B979B7200A21CF8 /* Location.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = ""; }; - F9E990321B50EBBA00057823 /* HackTX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HackTX.app; sourceTree = BUILT_PRODUCTS_DIR; }; - F9E990361B50EBBA00057823 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F9E990371B50EBBA00057823 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - F9E990391B50EBBA00057823 /* ScheduleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleViewController.swift; sourceTree = ""; }; - F9E9903E1B50EBBA00057823 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - F9E990401B50EBBA00057823 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - F9E990431B50EBBA00057823 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - F9E9904E1B50EBBA00057823 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F9E9904F1B50EBBA00057823 /* HackTXTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HackTXTests.swift; sourceTree = ""; }; - F9E990641B50FFFF00057823 /* TwitterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwitterViewController.swift; sourceTree = ""; }; - F9E990661B51001000057823 /* MapViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = ""; }; - F9EE70211B912EE300B493A8 /* PageItemViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageItemViewController.swift; sourceTree = ""; }; + 099214E83B6739C941439E79 /* Pods-HackTX.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackTX.release.xcconfig"; path = "Pods/Target Support Files/Pods-HackTX/Pods-HackTX.release.xcconfig"; sourceTree = ""; }; + 8200AD6E1DB3577400D4EE11 /* AnnouncementTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnnouncementTableViewCell.h; sourceTree = ""; }; + 8200AD6F1DB3577400D4EE11 /* AnnouncementTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnnouncementTableViewCell.m; sourceTree = ""; }; + 8200AD701DB3577400D4EE11 /* AnnouncementTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AnnouncementTableViewCell.xib; sourceTree = ""; }; + 820B45091D9624B1002A26BA /* SponsorTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SponsorTableViewCell.h; sourceTree = ""; }; + 820B450A1D9624B1002A26BA /* SponsorTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SponsorTableViewCell.m; sourceTree = ""; }; + 820B450B1D9624B1002A26BA /* SponsorTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SponsorTableViewCell.xib; sourceTree = ""; }; + 8215AD7D1D8DBE3700377370 /* Sponsor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sponsor.h; sourceTree = ""; }; + 8215AD7E1D8DBE3700377370 /* Sponsor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sponsor.m; sourceTree = ""; }; + 8215AD811D8DC49F00377370 /* Announcement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Announcement.h; sourceTree = ""; }; + 8215AD821D8DC49F00377370 /* Announcement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Announcement.m; sourceTree = ""; }; + 8215AD841D8DC53D00377370 /* Location.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Location.h; sourceTree = ""; }; + 8215AD851D8DC53D00377370 /* Location.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Location.m; sourceTree = ""; }; + 8215AD871D8DC63F00377370 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = ""; }; + 8215AD881D8DC63F00377370 /* Event.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Event.m; sourceTree = ""; }; + 8215AD8A1D8DC70F00377370 /* Speaker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speaker.h; sourceTree = ""; }; + 8215AD8B1D8DC70F00377370 /* Speaker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Speaker.m; sourceTree = ""; }; + 8215AD8D1D8DC88100377370 /* HTXAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTXAPI.h; sourceTree = ""; }; + 8215AD8E1D8DC88100377370 /* HTXAPI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTXAPI.m; sourceTree = ""; }; + 8215AD901D8DD26C00377370 /* SponsorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SponsorViewController.h; sourceTree = ""; }; + 8215AD911D8DD26C00377370 /* SponsorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SponsorViewController.m; sourceTree = ""; }; + 8215ADAD1D8E27F700377370 /* NSString+MD5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MD5.h"; sourceTree = ""; }; + 8215ADAE1D8E27F800377370 /* NSString+MD5.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+MD5.m"; sourceTree = ""; }; + 8221B2041DAEF9D900FB1BE1 /* ScheduleTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScheduleTableViewCell.h; sourceTree = ""; }; + 8221B2051DAEF9D900FB1BE1 /* ScheduleTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScheduleTableViewCell.m; sourceTree = ""; }; + 8221B2061DAEF9D900FB1BE1 /* ScheduleTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScheduleTableViewCell.xib; sourceTree = ""; }; + 8221B2091DAF109B00FB1BE1 /* HTXAPIKeyStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTXAPIKeyStore.h; sourceTree = ""; }; + 8221B20A1DAF109B00FB1BE1 /* HTXAPIKeyStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTXAPIKeyStore.m; sourceTree = ""; }; + 8221B20E1DAF11FF00FB1BE1 /* APIKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = APIKeys.plist; sourceTree = ""; }; + 822A4D931D779BCD00C65761 /* HackTX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HackTX.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 822A4D971D779BCD00C65761 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 822A4D991D779BCD00C65761 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 822A4D9A1D779BCD00C65761 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 822A4DA31D779BCD00C65761 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 822A4DA51D779BCD00C65761 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 822A4DA81D779BCD00C65761 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 822A4DAA1D779BCD00C65761 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 822A4DB21D779DBD00C65761 /* ScheduleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScheduleViewController.h; sourceTree = ""; }; + 822A4DB31D779DBD00C65761 /* ScheduleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScheduleViewController.m; sourceTree = ""; }; + 822A4DB51D779DD100C65761 /* AnnouncementsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnnouncementsViewController.h; sourceTree = ""; }; + 822A4DB61D779DD100C65761 /* AnnouncementsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnnouncementsViewController.m; sourceTree = ""; }; + 822A4DBE1D779DF100C65761 /* MapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapViewController.h; sourceTree = ""; }; + 822A4DBF1D779DF100C65761 /* MapViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MapViewController.m; sourceTree = ""; }; + 822E95171D7FF4EE00C0402E /* HTXConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTXConstants.h; sourceTree = ""; }; + 822E95181D7FF4EE00C0402E /* HTXConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTXConstants.m; sourceTree = ""; }; + 82BA00381D81492F006CA2C6 /* AutolayoutHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutolayoutHelper.h; sourceTree = ""; }; + 82BA00391D81492F006CA2C6 /* AutolayoutHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AutolayoutHelper.m; sourceTree = ""; }; + 82BA003B1D8149B1006CA2C6 /* UIColor+Palette.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Palette.h"; sourceTree = ""; }; + 82BA003C1D8149B1006CA2C6 /* UIColor+Palette.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Palette.m"; sourceTree = ""; }; + 82BAC6C81D9D1FC000BF62C0 /* JosefinSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-Bold.ttf"; sourceTree = ""; }; + 82BAC6C91D9D1FC000BF62C0 /* JosefinSans-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-BoldItalic.ttf"; sourceTree = ""; }; + 82BAC6CA1D9D1FC000BF62C0 /* JosefinSans-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-Italic.ttf"; sourceTree = ""; }; + 82BAC6CB1D9D1FC000BF62C0 /* JosefinSans-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-Light.ttf"; sourceTree = ""; }; + 82BAC6CC1D9D1FC000BF62C0 /* JosefinSans-LightItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-LightItalic.ttf"; sourceTree = ""; }; + 82BAC6CD1D9D1FC000BF62C0 /* JosefinSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-Regular.ttf"; sourceTree = ""; }; + 82BAC6CE1D9D1FC000BF62C0 /* JosefinSans-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-SemiBold.ttf"; sourceTree = ""; }; + 82BAC6CF1D9D1FC000BF62C0 /* JosefinSans-SemiBoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-SemiBoldItalic.ttf"; sourceTree = ""; }; + 82BAC6D01D9D1FC000BF62C0 /* JosefinSans-Thin.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-Thin.ttf"; sourceTree = ""; }; + 82BAC6D11D9D1FC000BF62C0 /* JosefinSans-ThinItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "JosefinSans-ThinItalic.ttf"; sourceTree = ""; }; + 82BFF6D61D9E662600DB2543 /* partners.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = partners.json; sourceTree = ""; }; + 82D303C71DB23BB2003C98ED /* HackTX.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HackTX.entitlements; sourceTree = ""; }; + 82D303C81DB23BB2003C98ED /* PassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PassKit.framework; path = System/Library/Frameworks/PassKit.framework; sourceTree = SDKROOT; }; + 82D303CF1DB24084003C98ED /* Hacker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Hacker.h; sourceTree = ""; }; + 82D303D01DB24084003C98ED /* Hacker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Hacker.m; sourceTree = ""; }; + 82EAFC841DB200D50061C449 /* CheckInViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CheckInViewController.h; sourceTree = ""; }; + 82EAFC851DB200D50061C449 /* CheckInViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CheckInViewController.m; sourceTree = ""; }; + 82EAFC861DB200D50061C449 /* CheckInViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CheckInViewController.xib; sourceTree = ""; }; + 82F3C16A1DB71BAC004F96FC /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + B67A442663439B9AD415E5F6 /* libPods-HackTX.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-HackTX.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + DDE9620564A4ACF2DB3BFB7E /* Pods-HackTX.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HackTX.debug.xcconfig"; path = "Pods/Target Support Files/Pods-HackTX/Pods-HackTX.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - F9E9902F1B50EBBA00057823 /* Frameworks */ = { + 822A4D901D779BCD00C65761 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3A806E5F1B9ACDE100E29A0F /* CoreData.framework in Frameworks */, - F96AB7A01B97D25C00394217 /* AudioToolbox.framework in Frameworks */, - F96AB7A11B97D25C00394217 /* CFNetwork.framework in Frameworks */, - F96AB7A21B97D25C00394217 /* CoreGraphics.framework in Frameworks */, - F96AB7A31B97D25C00394217 /* CoreLocation.framework in Frameworks */, - F96AB7A41B97D25C00394217 /* libsqlite3.dylib in Frameworks */, - F96AB7A51B97D25C00394217 /* libz.dylib in Frameworks */, - F96AB7A61B97D25C00394217 /* QuartzCore.framework in Frameworks */, - F96AB7A71B97D25C00394217 /* Security.framework in Frameworks */, - F96AB7A81B97D25C00394217 /* StoreKit.framework in Frameworks */, - F96AB7A91B97D25C00394217 /* SystemConfiguration.framework in Frameworks */, - F96AB7951B97D18F00394217 /* Bolts.framework in Frameworks */, - 3AEB82341B7F107F00224BC3 /* Fabric.framework in Frameworks */, - 3AEB82371B7F107F00224BC3 /* TwitterCore.framework in Frameworks */, - F96AB7931B97D14B00394217 /* Parse.framework in Frameworks */, - 3AEB82351B7F107F00224BC3 /* TwitterKit.framework in Frameworks */, - 0EEBD4D4183683D7099C95B8 /* Pods_HackTX.framework in Frameworks */, + 82D303C91DB23BB2003C98ED /* PassKit.framework in Frameworks */, + 4E5410941E35FEC803EA8E2D /* libPods-HackTX.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 3A36664C1B9CCD3B0028BA91 /* Schedule */ = { - isa = PBXGroup; - children = ( - F9E990391B50EBBA00057823 /* ScheduleViewController.swift */, - 3A806E281B9A895D00E29A0F /* CheckInViewController.swift */, - 3A2156791B8A577100BCA241 /* ScheduleDetailViewController.swift */, - 3A192B9F1B9EBE2C008AA3BA /* EventFeedbackViewController.swift */, - ); - name = Schedule; - sourceTree = ""; - }; - 3A36664D1B9CCD480028BA91 /* Announcements */ = { - isa = PBXGroup; - children = ( - 3AEB82381B7F14E300224BC3 /* AnnouncementsViewController.swift */, - ); - name = Announcements; - sourceTree = ""; - }; - 3A36664E1B9CCD5C0028BA91 /* Maps */ = { + 4213B7E075F5C7663EDD6D3D /* Pods */ = { isa = PBXGroup; children = ( - F9E990661B51001000057823 /* MapViewController.swift */, - F96AB7AC1B97E01200394217 /* MapsPageViewController.swift */, - F9EE70211B912EE300B493A8 /* PageItemViewController.swift */, + DDE9620564A4ACF2DB3BFB7E /* Pods-HackTX.debug.xcconfig */, + 099214E83B6739C941439E79 /* Pods-HackTX.release.xcconfig */, ); - name = Maps; + name = Pods; sourceTree = ""; }; - 3A36664F1B9CCD720028BA91 /* Twitter */ = { + 71DC8291476C31865A92A66B /* Frameworks */ = { isa = PBXGroup; children = ( - F9E990641B50FFFF00057823 /* TwitterViewController.swift */, + 82D303C81DB23BB2003C98ED /* PassKit.framework */, + B67A442663439B9AD415E5F6 /* libPods-HackTX.a */, ); - name = Twitter; + name = Frameworks; sourceTree = ""; }; - 3A3666501B9CCD800028BA91 /* Partners */ = { + 8215AD801D8DBE4900377370 /* Models */ = { isa = PBXGroup; children = ( - 3A21566D1B8A430C00BCA241 /* PartnersViewController.swift */, + 8215AD7D1D8DBE3700377370 /* Sponsor.h */, + 8215AD7E1D8DBE3700377370 /* Sponsor.m */, + 8215AD811D8DC49F00377370 /* Announcement.h */, + 8215AD821D8DC49F00377370 /* Announcement.m */, + 8215AD841D8DC53D00377370 /* Location.h */, + 8215AD851D8DC53D00377370 /* Location.m */, + 8215AD871D8DC63F00377370 /* Event.h */, + 8215AD881D8DC63F00377370 /* Event.m */, + 8215AD8A1D8DC70F00377370 /* Speaker.h */, + 8215AD8B1D8DC70F00377370 /* Speaker.m */, + 82D303CF1DB24084003C98ED /* Hacker.h */, + 82D303D01DB24084003C98ED /* Hacker.m */, ); - name = Partners; + name = Models; sourceTree = ""; }; - 3A3666511B9CCDAE0028BA91 /* Schedule */ = { + 8215AD931D8DD2A900377370 /* Schedule */ = { isa = PBXGroup; children = ( - 3A21567D1B8A5D5400BCA241 /* Day.swift */, - 3A21567B1B8A5D3D00BCA241 /* ScheduleCluster.swift */, - 3A21567F1B8A5D6A00BCA241 /* Event.swift */, - F9C42AC91B979B7200A21CF8 /* Location.swift */, - 3A2156811B8A5D8900BCA241 /* Speaker.swift */, + 822A4DB21D779DBD00C65761 /* ScheduleViewController.h */, + 822A4DB31D779DBD00C65761 /* ScheduleViewController.m */, + 8221B2041DAEF9D900FB1BE1 /* ScheduleTableViewCell.h */, + 8221B2051DAEF9D900FB1BE1 /* ScheduleTableViewCell.m */, + 8221B2061DAEF9D900FB1BE1 /* ScheduleTableViewCell.xib */, ); name = Schedule; sourceTree = ""; }; - 3A806E4F1B9A9E3100E29A0F /* Utils */ = { - isa = PBXGroup; - children = ( - 3A806E501B9A9E4B00E29A0F /* UserPrefs.swift */, - 3A3666571B9CD8350028BA91 /* Router.swift */, - ); - name = Utils; - sourceTree = ""; - }; - 3A806E811B9AD92E00E29A0F /* Pods */ = { - isa = PBXGroup; - children = ( - 3A806E821B9AD92E00E29A0F /* Google */, - 3A806E911B9AD92E00E29A0F /* GoogleAnalytics */, - 3A806EA01B9AD92E00E29A0F /* GoogleNetworkingUtilities */, - 3A806EA41B9AD92E00E29A0F /* GoogleSymbolUtilities */, - 3A806EA71B9AD92E00E29A0F /* GoogleUtilities */, - 3A806EB91B9AD92E00E29A0F /* Headers */, - 3A806EE21B9AD92E00E29A0F /* Local Podspecs */, - 3A806EE31B9AD92E00E29A0F /* Manifest.lock */, - 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */, - 3A806EE71B9AD92E00E29A0F /* Target Support Files */, - ); - path = Pods; - sourceTree = ""; - }; - 3A806E821B9AD92E00E29A0F /* Google */ = { - isa = PBXGroup; - children = ( - 3A806E831B9AD92E00E29A0F /* Headers */, - 3A806E8E1B9AD92E00E29A0F /* Libraries */, - ); - path = Google; - sourceTree = ""; - }; - 3A806E831B9AD92E00E29A0F /* Headers */ = { - isa = PBXGroup; - children = ( - 3A806E841B9AD92E00E29A0F /* GGLAnalytics */, - 3A806E881B9AD92E00E29A0F /* GGLCore */, - ); - path = Headers; - sourceTree = ""; - }; - 3A806E841B9AD92E00E29A0F /* GGLAnalytics */ = { - isa = PBXGroup; - children = ( - 3A806E851B9AD92E00E29A0F /* Public */, - ); - path = GGLAnalytics; - sourceTree = ""; - }; - 3A806E851B9AD92E00E29A0F /* Public */ = { - isa = PBXGroup; - children = ( - 3A806E861B9AD92E00E29A0F /* Analytics.h */, - 3A806E871B9AD92E00E29A0F /* GGLContext+Analytics.h */, - ); - path = Public; - sourceTree = ""; - }; - 3A806E881B9AD92E00E29A0F /* GGLCore */ = { - isa = PBXGroup; - children = ( - 3A806E891B9AD92E00E29A0F /* Public */, - ); - path = GGLCore; - sourceTree = ""; - }; - 3A806E891B9AD92E00E29A0F /* Public */ = { - isa = PBXGroup; - children = ( - 3A806E8A1B9AD92E00E29A0F /* Core.h */, - 3A806E8B1B9AD92E00E29A0F /* GGLConfiguration.h */, - 3A806E8C1B9AD92E00E29A0F /* GGLContext.h */, - 3A806E8D1B9AD92E00E29A0F /* GGLErrorCode.h */, - ); - path = Public; - sourceTree = ""; - }; - 3A806E8E1B9AD92E00E29A0F /* Libraries */ = { - isa = PBXGroup; - children = ( - 3A806E8F1B9AD92E00E29A0F /* libGGLAnalytics.a */, - 3A806E901B9AD92E00E29A0F /* libGGLCore.a */, - ); - path = Libraries; - sourceTree = ""; - }; - 3A806E911B9AD92E00E29A0F /* GoogleAnalytics */ = { + 8215AD941D8DD2B300377370 /* Sponsor */ = { isa = PBXGroup; children = ( - 3A806E921B9AD92E00E29A0F /* Headers */, - 3A806E9E1B9AD92E00E29A0F /* Libraries */, + 8215AD901D8DD26C00377370 /* SponsorViewController.h */, + 8215AD911D8DD26C00377370 /* SponsorViewController.m */, + 820B45091D9624B1002A26BA /* SponsorTableViewCell.h */, + 820B450A1D9624B1002A26BA /* SponsorTableViewCell.m */, + 820B450B1D9624B1002A26BA /* SponsorTableViewCell.xib */, ); - path = GoogleAnalytics; + name = Sponsor; sourceTree = ""; }; - 3A806E921B9AD92E00E29A0F /* Headers */ = { + 8215AD951D8DD2BA00377370 /* Map */ = { isa = PBXGroup; children = ( - 3A806E931B9AD92E00E29A0F /* Public */, + 822A4DBE1D779DF100C65761 /* MapViewController.h */, + 822A4DBF1D779DF100C65761 /* MapViewController.m */, ); - path = Headers; + name = Map; sourceTree = ""; }; - 3A806E931B9AD92E00E29A0F /* Public */ = { + 8215AD961D8DD2D100377370 /* Announcement */ = { isa = PBXGroup; children = ( - 3A806E941B9AD92E00E29A0F /* GAI.h */, - 3A806E951B9AD92E00E29A0F /* GAIDictionaryBuilder.h */, - 3A806E961B9AD92E00E29A0F /* GAIEcommerceFields.h */, - 3A806E971B9AD92E00E29A0F /* GAIEcommerceProduct.h */, - 3A806E981B9AD92E00E29A0F /* GAIEcommerceProductAction.h */, - 3A806E991B9AD92E00E29A0F /* GAIEcommercePromotion.h */, - 3A806E9A1B9AD92E00E29A0F /* GAIFields.h */, - 3A806E9B1B9AD92E00E29A0F /* GAILogger.h */, - 3A806E9C1B9AD92E00E29A0F /* GAITrackedViewController.h */, - 3A806E9D1B9AD92E00E29A0F /* GAITracker.h */, + 822A4DB51D779DD100C65761 /* AnnouncementsViewController.h */, + 822A4DB61D779DD100C65761 /* AnnouncementsViewController.m */, + 8200AD6E1DB3577400D4EE11 /* AnnouncementTableViewCell.h */, + 8200AD6F1DB3577400D4EE11 /* AnnouncementTableViewCell.m */, + 8200AD701DB3577400D4EE11 /* AnnouncementTableViewCell.xib */, ); - path = Public; + name = Announcement; sourceTree = ""; }; - 3A806E9E1B9AD92E00E29A0F /* Libraries */ = { + 822A4D8A1D779BCD00C65761 = { isa = PBXGroup; children = ( - 3A806E9F1B9AD92E00E29A0F /* libGoogleAnalytics.a */, + 822A4D951D779BCD00C65761 /* HackTX */, + 822A4D941D779BCD00C65761 /* Products */, + 4213B7E075F5C7663EDD6D3D /* Pods */, + 71DC8291476C31865A92A66B /* Frameworks */, ); - path = Libraries; sourceTree = ""; }; - 3A806EA01B9AD92E00E29A0F /* GoogleNetworkingUtilities */ = { + 822A4D941D779BCD00C65761 /* Products */ = { isa = PBXGroup; children = ( - 3A806EA11B9AD92E00E29A0F /* Libraries */, - ); - path = GoogleNetworkingUtilities; - sourceTree = ""; - }; - 3A806EA11B9AD92E00E29A0F /* Libraries */ = { - isa = PBXGroup; - children = ( - 3A806EA21B9AD92E00E29A0F /* libGTMSessionFetcher_core.a */, - 3A806EA31B9AD92E00E29A0F /* libGTMSessionFetcher_full.a */, - ); - path = Libraries; - sourceTree = ""; - }; - 3A806EA41B9AD92E00E29A0F /* GoogleSymbolUtilities */ = { - isa = PBXGroup; - children = ( - 3A806EA51B9AD92E00E29A0F /* Libraries */, - ); - path = GoogleSymbolUtilities; - sourceTree = ""; - }; - 3A806EA51B9AD92E00E29A0F /* Libraries */ = { - isa = PBXGroup; - children = ( - 3A806EA61B9AD92E00E29A0F /* libGSDK_Overload.a */, - ); - path = Libraries; - sourceTree = ""; - }; - 3A806EA71B9AD92E00E29A0F /* GoogleUtilities */ = { - isa = PBXGroup; - children = ( - 3A806EA81B9AD92E00E29A0F /* Libraries */, - ); - path = GoogleUtilities; - sourceTree = ""; - }; - 3A806EA81B9AD92E00E29A0F /* Libraries */ = { - isa = PBXGroup; - children = ( - 3A806EA91B9AD92E00E29A0F /* libGTM_AddressBook.a */, - 3A806EAA1B9AD92E00E29A0F /* libGTM_core.a */, - 3A806EAB1B9AD92E00E29A0F /* libGTM_DebugUtils.a */, - 3A806EAC1B9AD92E00E29A0F /* libGTM_GTMURLBuilder.a */, - 3A806EAD1B9AD92E00E29A0F /* libGTM_iPhone.a */, - 3A806EAE1B9AD92E00E29A0F /* libGTM_KVO.a */, - 3A806EAF1B9AD92E00E29A0F /* libGTM_NSDictionary+URLArguments.a */, - 3A806EB01B9AD92E00E29A0F /* libGTM_NSScannerJSON.a */, - 3A806EB11B9AD92E00E29A0F /* libGTM_NSStringHTML.a */, - 3A806EB21B9AD92E00E29A0F /* libGTM_NSStringXML.a */, - 3A806EB31B9AD92E00E29A0F /* libGTM_Regex.a */, - 3A806EB41B9AD92E00E29A0F /* libGTM_RoundedRectPath.a */, - 3A806EB51B9AD92E00E29A0F /* libGTM_StringEncoding.a */, - 3A806EB61B9AD92E00E29A0F /* libGTM_SystemVersion.a */, - 3A806EB71B9AD92E00E29A0F /* libGTM_UIFont+LineHeight.a */, - 3A806EB81B9AD92E00E29A0F /* libGTMStackTrace.a */, - ); - path = Libraries; - sourceTree = ""; - }; - 3A806EB91B9AD92E00E29A0F /* Headers */ = { - isa = PBXGroup; - children = ( - 3A806EBA1B9AD92E00E29A0F /* Private */, - 3A806ECE1B9AD92E00E29A0F /* Public */, - ); - path = Headers; - sourceTree = ""; - }; - 3A806EBA1B9AD92E00E29A0F /* Private */ = { - isa = PBXGroup; - children = ( - 3A806EBB1B9AD92E00E29A0F /* Google */, - 3A806EC31B9AD92E00E29A0F /* GoogleAnalytics */, - ); - path = Private; - sourceTree = ""; - }; - 3A806EBB1B9AD92E00E29A0F /* Google */ = { - isa = PBXGroup; - children = ( - 3A806EBC1B9AD92E00E29A0F /* Google */, - ); - path = Google; - sourceTree = ""; - }; - 3A806EBC1B9AD92E00E29A0F /* Google */ = { - isa = PBXGroup; - children = ( - 3A806EBD1B9AD92E00E29A0F /* Analytics.h */, - 3A806EBE1B9AD92E00E29A0F /* Core.h */, - 3A806EBF1B9AD92E00E29A0F /* GGLConfiguration.h */, - 3A806EC01B9AD92E00E29A0F /* GGLContext+Analytics.h */, - 3A806EC11B9AD92E00E29A0F /* GGLContext.h */, - 3A806EC21B9AD92E00E29A0F /* GGLErrorCode.h */, - ); - path = Google; - sourceTree = ""; - }; - 3A806EC31B9AD92E00E29A0F /* GoogleAnalytics */ = { - isa = PBXGroup; - children = ( - 3A806EC41B9AD92E00E29A0F /* GAI.h */, - 3A806EC51B9AD92E00E29A0F /* GAIDictionaryBuilder.h */, - 3A806EC61B9AD92E00E29A0F /* GAIEcommerceFields.h */, - 3A806EC71B9AD92E00E29A0F /* GAIEcommerceProduct.h */, - 3A806EC81B9AD92E00E29A0F /* GAIEcommerceProductAction.h */, - 3A806EC91B9AD92E00E29A0F /* GAIEcommercePromotion.h */, - 3A806ECA1B9AD92E00E29A0F /* GAIFields.h */, - 3A806ECB1B9AD92E00E29A0F /* GAILogger.h */, - 3A806ECC1B9AD92E00E29A0F /* GAITrackedViewController.h */, - 3A806ECD1B9AD92E00E29A0F /* GAITracker.h */, - ); - path = GoogleAnalytics; - sourceTree = ""; - }; - 3A806ECE1B9AD92E00E29A0F /* Public */ = { - isa = PBXGroup; - children = ( - 3A806ECF1B9AD92E00E29A0F /* Google */, - 3A806ED71B9AD92E00E29A0F /* GoogleAnalytics */, - ); - path = Public; - sourceTree = ""; - }; - 3A806ECF1B9AD92E00E29A0F /* Google */ = { - isa = PBXGroup; - children = ( - 3A806ED01B9AD92E00E29A0F /* Google */, - ); - path = Google; - sourceTree = ""; - }; - 3A806ED01B9AD92E00E29A0F /* Google */ = { - isa = PBXGroup; - children = ( - 3A806ED11B9AD92E00E29A0F /* Analytics.h */, - 3A806ED21B9AD92E00E29A0F /* Core.h */, - 3A806ED31B9AD92E00E29A0F /* GGLConfiguration.h */, - 3A806ED41B9AD92E00E29A0F /* GGLContext+Analytics.h */, - 3A806ED51B9AD92E00E29A0F /* GGLContext.h */, - 3A806ED61B9AD92E00E29A0F /* GGLErrorCode.h */, - ); - path = Google; - sourceTree = ""; - }; - 3A806ED71B9AD92E00E29A0F /* GoogleAnalytics */ = { - isa = PBXGroup; - children = ( - 3A806ED81B9AD92E00E29A0F /* GAI.h */, - 3A806ED91B9AD92E00E29A0F /* GAIDictionaryBuilder.h */, - 3A806EDA1B9AD92E00E29A0F /* GAIEcommerceFields.h */, - 3A806EDB1B9AD92E00E29A0F /* GAIEcommerceProduct.h */, - 3A806EDC1B9AD92E00E29A0F /* GAIEcommerceProductAction.h */, - 3A806EDD1B9AD92E00E29A0F /* GAIEcommercePromotion.h */, - 3A806EDE1B9AD92E00E29A0F /* GAIFields.h */, - 3A806EDF1B9AD92E00E29A0F /* GAILogger.h */, - 3A806EE01B9AD92E00E29A0F /* GAITrackedViewController.h */, - 3A806EE11B9AD92E00E29A0F /* GAITracker.h */, - ); - path = GoogleAnalytics; - sourceTree = ""; - }; - 3A806EE21B9AD92E00E29A0F /* Local Podspecs */ = { - isa = PBXGroup; - children = ( - ); - path = "Local Podspecs"; - sourceTree = ""; - }; - 3A806EE51B9AD92E00E29A0F /* Products */ = { - isa = PBXGroup; - children = ( - 3ADDC0611B9CC2A500D0ECD2 /* Alamofire.framework */, - 3A806EF11B9AD92E00E29A0F /* Pods_HackTX.framework */, - 3ADDC0631B9CC2A500D0ECD2 /* RSBarcodes_Swift.framework */, - 3ADDC0651B9CC2A500D0ECD2 /* SwiftyJSON.framework */, + 822A4D931D779BCD00C65761 /* HackTX.app */, ); name = Products; sourceTree = ""; }; - 3A806EE71B9AD92E00E29A0F /* Target Support Files */ = { - isa = PBXGroup; - children = ( - 3A806EE81B9AD92E00E29A0F /* Pods-HackTX */, - ); - path = "Target Support Files"; - sourceTree = ""; - }; - 3A806EE81B9AD92E00E29A0F /* Pods-HackTX */ = { - isa = PBXGroup; - children = ( - 3A806EE91B9AD92E00E29A0F /* Pods-HackTX-acknowledgements.markdown */, - 3A806EEA1B9AD92E00E29A0F /* Pods-HackTX-acknowledgements.plist */, - 3A806EEB1B9AD92E00E29A0F /* Pods-HackTX-dummy.m */, - 3A806EEC1B9AD92E00E29A0F /* Pods-HackTX-resources.sh */, - 3A806EED1B9AD92E00E29A0F /* Pods-HackTX.debug.xcconfig */, - 3A806EEE1B9AD92E00E29A0F /* Pods-HackTX.release.xcconfig */, - ); - path = "Pods-HackTX"; - sourceTree = ""; - }; - 59EAB6531DF07EF91F85AACE /* Frameworks */ = { - isa = PBXGroup; - children = ( - F91C84331BAD2A57006E2D8F /* GoogleService-Info.plist */, - 3A806E5E1B9ACDE100E29A0F /* CoreData.framework */, - F96AB7961B97D25C00394217 /* AudioToolbox.framework */, - F96AB7971B97D25C00394217 /* CFNetwork.framework */, - F96AB7981B97D25C00394217 /* CoreGraphics.framework */, - F96AB7991B97D25C00394217 /* CoreLocation.framework */, - F96AB79A1B97D25C00394217 /* libsqlite3.dylib */, - F96AB79B1B97D25C00394217 /* libz.dylib */, - F96AB79C1B97D25C00394217 /* QuartzCore.framework */, - F96AB79D1B97D25C00394217 /* Security.framework */, - F96AB79E1B97D25C00394217 /* StoreKit.framework */, - F96AB79F1B97D25C00394217 /* SystemConfiguration.framework */, - F96AB7941B97D18F00394217 /* Bolts.framework */, - F96AB7921B97D14B00394217 /* Parse.framework */, - 3AEB82301B7F107F00224BC3 /* Fabric.framework */, - 3AEB82311B7F107F00224BC3 /* TwitterKit.framework */, - 3AEB82321B7F107F00224BC3 /* TwitterKitResources.bundle */, - 3AEB82331B7F107F00224BC3 /* TwitterCore.framework */, - 3A806E811B9AD92E00E29A0F /* Pods */, - 715158D3DB02FD4CF82662A4 /* Pods_HackTX.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 5FC63154830407E9274D0DC2 /* Pods */ = { - isa = PBXGroup; - children = ( - 94E240E75C09DEDD03EA913F /* Pods-HackTX.debug.xcconfig */, - 163274BAD693C35C1B0222A5 /* Pods-HackTX.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - F956D0711B535067001393DE /* Model */ = { - isa = PBXGroup; - children = ( - F91C843B1BAD2AED006E2D8F /* Reachability.swift */, - 3A3666511B9CCDAE0028BA91 /* Schedule */, - 3AEB823A1B7F14F400224BC3 /* Announcement.swift */, - 3A2156751B8A44CC00BCA241 /* Sponsor.swift */, - ); - name = Model; - sourceTree = ""; - }; - F956D0731B53507D001393DE /* View */ = { - isa = PBXGroup; - children = ( - 3A2156711B8A436100BCA241 /* PartnersViewCell.swift */, - 3A2156721B8A436100BCA241 /* PartnersViewCell.xib */, - F9E990421B50EBBA00057823 /* LaunchScreen.xib */, - ); - name = View; - sourceTree = ""; - }; - F956D0741B535081001393DE /* Controller */ = { - isa = PBXGroup; - children = ( - 3A36664C1B9CCD3B0028BA91 /* Schedule */, - 3A36664D1B9CCD480028BA91 /* Announcements */, - 3A36664F1B9CCD720028BA91 /* Twitter */, - 3A36664E1B9CCD5C0028BA91 /* Maps */, - 3A3666501B9CCD800028BA91 /* Partners */, - ); - name = Controller; - sourceTree = ""; - }; - F9E990291B50EBBA00057823 = { - isa = PBXGroup; - children = ( - F9E990341B50EBBA00057823 /* HackTX */, - F9E9904C1B50EBBA00057823 /* HackTXTests */, - F9E990331B50EBBA00057823 /* Products */, - 5FC63154830407E9274D0DC2 /* Pods */, - 59EAB6531DF07EF91F85AACE /* Frameworks */, - ); - sourceTree = ""; - }; - F9E990331B50EBBA00057823 /* Products */ = { - isa = PBXGroup; - children = ( - F9E990321B50EBBA00057823 /* HackTX.app */, - ); - name = Products; - sourceTree = ""; - }; - F9E990341B50EBBA00057823 /* HackTX */ = { - isa = PBXGroup; - children = ( - 3A806E4F1B9A9E3100E29A0F /* Utils */, - F956D0711B535067001393DE /* Model */, - F956D0741B535081001393DE /* Controller */, - F956D0731B53507D001393DE /* View */, - F9E990371B50EBBA00057823 /* AppDelegate.swift */, - F9E9903D1B50EBBA00057823 /* Main.storyboard */, - F91C84391BAD2A81006E2D8F /* GoogleService-Info.plist */, - F91C84371BAD2A74006E2D8F /* ApiKeys.plist */, - F9E990401B50EBBA00057823 /* Images.xcassets */, - F9E990351B50EBBA00057823 /* Supporting Files */, + 822A4D951D779BCD00C65761 /* HackTX */ = { + isa = PBXGroup; + children = ( + 822A4D961D779BCD00C65761 /* Supporting Files */, + 82BAC6DC1D9D1FC400BF62C0 /* Fonts */, + 82D303C71DB23BB2003C98ED /* HackTX.entitlements */, + 82BFF6D61D9E662600DB2543 /* partners.json */, + 8215AD8D1D8DC88100377370 /* HTXAPI.h */, + 8215AD8E1D8DC88100377370 /* HTXAPI.m */, + 8221B2091DAF109B00FB1BE1 /* HTXAPIKeyStore.h */, + 8221B20A1DAF109B00FB1BE1 /* HTXAPIKeyStore.m */, + 8215ADAD1D8E27F700377370 /* NSString+MD5.h */, + 8215ADAE1D8E27F800377370 /* NSString+MD5.m */, + 822A4D991D779BCD00C65761 /* AppDelegate.h */, + 822A4D9A1D779BCD00C65761 /* AppDelegate.m */, + 8215AD801D8DBE4900377370 /* Models */, + 8215AD931D8DD2A900377370 /* Schedule */, + 8215AD941D8DD2B300377370 /* Sponsor */, + 8215AD951D8DD2BA00377370 /* Map */, + 8215AD961D8DD2D100377370 /* Announcement */, + 82EAFC891DB200DB0061C449 /* Check In */, + 82BA003B1D8149B1006CA2C6 /* UIColor+Palette.h */, + 82BA003C1D8149B1006CA2C6 /* UIColor+Palette.m */, + 822A4DA21D779BCD00C65761 /* Main.storyboard */, + 822A4DA51D779BCD00C65761 /* Assets.xcassets */, + 822A4DA71D779BCD00C65761 /* LaunchScreen.storyboard */, + 822A4DAA1D779BCD00C65761 /* Info.plist */, + 82F3C16A1DB71BAC004F96FC /* GoogleService-Info.plist */, ); path = HackTX; sourceTree = ""; }; - F9E990351B50EBBA00057823 /* Supporting Files */ = { + 822A4D961D779BCD00C65761 /* Supporting Files */ = { isa = PBXGroup; children = ( - 3A806E801B9AD62800E29A0F /* HackTX-Bridging-Header.h */, - F9E990361B50EBBA00057823 /* Info.plist */, - F96AB7AA1B97D40600394217 /* ApiKeys.plist */, + 822A4D971D779BCD00C65761 /* main.m */, + 82BA00381D81492F006CA2C6 /* AutolayoutHelper.h */, + 82BA00391D81492F006CA2C6 /* AutolayoutHelper.m */, + 822E95171D7FF4EE00C0402E /* HTXConstants.h */, + 822E95181D7FF4EE00C0402E /* HTXConstants.m */, + 8221B20E1DAF11FF00FB1BE1 /* APIKeys.plist */, ); name = "Supporting Files"; sourceTree = ""; }; - F9E9904C1B50EBBA00057823 /* HackTXTests */ = { + 82BAC6DC1D9D1FC400BF62C0 /* Fonts */ = { isa = PBXGroup; children = ( - F9E9904F1B50EBBA00057823 /* HackTXTests.swift */, - F9E9904D1B50EBBA00057823 /* Supporting Files */, + 82BAC6C81D9D1FC000BF62C0 /* JosefinSans-Bold.ttf */, + 82BAC6C91D9D1FC000BF62C0 /* JosefinSans-BoldItalic.ttf */, + 82BAC6CA1D9D1FC000BF62C0 /* JosefinSans-Italic.ttf */, + 82BAC6CB1D9D1FC000BF62C0 /* JosefinSans-Light.ttf */, + 82BAC6CC1D9D1FC000BF62C0 /* JosefinSans-LightItalic.ttf */, + 82BAC6CD1D9D1FC000BF62C0 /* JosefinSans-Regular.ttf */, + 82BAC6CE1D9D1FC000BF62C0 /* JosefinSans-SemiBold.ttf */, + 82BAC6CF1D9D1FC000BF62C0 /* JosefinSans-SemiBoldItalic.ttf */, + 82BAC6D01D9D1FC000BF62C0 /* JosefinSans-Thin.ttf */, + 82BAC6D11D9D1FC000BF62C0 /* JosefinSans-ThinItalic.ttf */, ); - path = HackTXTests; + name = Fonts; sourceTree = ""; }; - F9E9904D1B50EBBA00057823 /* Supporting Files */ = { + 82EAFC891DB200DB0061C449 /* Check In */ = { isa = PBXGroup; children = ( - F9E9904E1B50EBBA00057823 /* Info.plist */, + 82EAFC841DB200D50061C449 /* CheckInViewController.h */, + 82EAFC851DB200D50061C449 /* CheckInViewController.m */, + 82EAFC861DB200D50061C449 /* CheckInViewController.xib */, ); - name = "Supporting Files"; + name = "Check In"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - F9E990311B50EBBA00057823 /* HackTX */ = { + 822A4D921D779BCD00C65761 /* HackTX */ = { isa = PBXNativeTarget; - buildConfigurationList = F9E990531B50EBBA00057823 /* Build configuration list for PBXNativeTarget "HackTX" */; + buildConfigurationList = 822A4DAD1D779BCD00C65761 /* Build configuration list for PBXNativeTarget "HackTX" */; buildPhases = ( - 738EE24A6DC85B59682A9D4C /* Check Pods Manifest.lock */, - F9E9902E1B50EBBA00057823 /* Sources */, - F9E9902F1B50EBBA00057823 /* Frameworks */, - F9E990301B50EBBA00057823 /* Resources */, - 3AEB822F1B7F104A00224BC3 /* Run Script */, - 3A806E2C1B9A8E6500E29A0F /* CopyFiles */, - 67D896DC6BB7CCEDB6AA1407 /* Copy Pods Resources */, - 4C6724898F618A996523C194 /* Embed Pods Frameworks */, + 548772046E64AF676BEB4EBB /* [CP] Check Pods Manifest.lock */, + 822A4D8F1D779BCD00C65761 /* Sources */, + 822A4D901D779BCD00C65761 /* Frameworks */, + 822A4D911D779BCD00C65761 /* Resources */, + 78E6BCED18D9A22BCA539775 /* [CP] Embed Pods Frameworks */, + C7B6E33EEDB5E5FFC7EE5294 /* [CP] Copy Pods Resources */, + 8221B2101DAF157700FB1BE1 /* Fabric - Run Script */, ); buildRules = ( ); @@ -812,27 +332,34 @@ ); name = HackTX; productName = HackTX; - productReference = F9E990321B50EBBA00057823 /* HackTX.app */; + productReference = 822A4D931D779BCD00C65761 /* HackTX.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - F9E9902A1B50EBBA00057823 /* Project object */ = { + 822A4D8B1D779BCD00C65761 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftMigration = 0700; - LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = HackTX; TargetAttributes = { - F9E990311B50EBBA00057823 = { - CreatedOnToolsVersion = 6.4; - DevelopmentTeam = W2F3CF3EX5; + 822A4D921D779BCD00C65761 = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = 245X4K2U9R; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Push = { + enabled = 1; + }; + com.apple.Wallet = { + enabled = 1; + }; + }; }; }; }; - buildConfigurationList = F9E9902D1B50EBBA00057823 /* Build configuration list for PBXProject "HackTX" */; + buildConfigurationList = 822A4D8E1D779BCD00C65761 /* Build configuration list for PBXProject "HackTX" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -840,95 +367,70 @@ en, Base, ); - mainGroup = F9E990291B50EBBA00057823; - productRefGroup = F9E990331B50EBBA00057823 /* Products */; + mainGroup = 822A4D8A1D779BCD00C65761; + productRefGroup = 822A4D941D779BCD00C65761 /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 3A806EE51B9AD92E00E29A0F /* Products */; - ProjectRef = 3A806EE41B9AD92E00E29A0F /* Pods.xcodeproj */; - }, - ); projectRoot = ""; targets = ( - F9E990311B50EBBA00057823 /* HackTX */, + 822A4D921D779BCD00C65761 /* HackTX */, ); }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - 3A806EF11B9AD92E00E29A0F /* Pods_HackTX.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Pods_HackTX.framework; - remoteRef = 3A806EF01B9AD92E00E29A0F /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3ADDC0611B9CC2A500D0ECD2 /* Alamofire.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = Alamofire.framework; - remoteRef = 3ADDC0601B9CC2A500D0ECD2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3ADDC0631B9CC2A500D0ECD2 /* RSBarcodes_Swift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = RSBarcodes_Swift.framework; - remoteRef = 3ADDC0621B9CC2A500D0ECD2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3ADDC0651B9CC2A500D0ECD2 /* SwiftyJSON.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = SwiftyJSON.framework; - remoteRef = 3ADDC0641B9CC2A500D0ECD2 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ - F9E990301B50EBBA00057823 /* Resources */ = { + 822A4D911D779BCD00C65761 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - F9E9903F1B50EBBA00057823 /* Main.storyboard in Resources */, - 3A2156741B8A436100BCA241 /* PartnersViewCell.xib in Resources */, - F91C843A1BAD2A81006E2D8F /* GoogleService-Info.plist in Resources */, - F96AB7AB1B97D40600394217 /* ApiKeys.plist in Resources */, - F9E990441B50EBBA00057823 /* LaunchScreen.xib in Resources */, - F91C84381BAD2A74006E2D8F /* ApiKeys.plist in Resources */, - F9E990411B50EBBA00057823 /* Images.xcassets in Resources */, - 3AEB82361B7F107F00224BC3 /* TwitterKitResources.bundle in Resources */, - F91C84341BAD2A57006E2D8F /* GoogleService-Info.plist in Resources */, + 820B450D1D9624B1002A26BA /* SponsorTableViewCell.xib in Resources */, + 82BAC6D71D9D1FC000BF62C0 /* JosefinSans-Regular.ttf in Resources */, + 822A4DA91D779BCD00C65761 /* LaunchScreen.storyboard in Resources */, + 82BAC6D51D9D1FC000BF62C0 /* JosefinSans-Light.ttf in Resources */, + 8221B20F1DAF11FF00FB1BE1 /* APIKeys.plist in Resources */, + 82EAFC881DB200D50061C449 /* CheckInViewController.xib in Resources */, + 822A4DA61D779BCD00C65761 /* Assets.xcassets in Resources */, + 8200AD721DB3577400D4EE11 /* AnnouncementTableViewCell.xib in Resources */, + 82BAC6D31D9D1FC000BF62C0 /* JosefinSans-BoldItalic.ttf in Resources */, + 82BAC6D61D9D1FC000BF62C0 /* JosefinSans-LightItalic.ttf in Resources */, + 82BFF6D71D9E662600DB2543 /* partners.json in Resources */, + 82BAC6D81D9D1FC000BF62C0 /* JosefinSans-SemiBold.ttf in Resources */, + 822A4DA41D779BCD00C65761 /* Main.storyboard in Resources */, + 82BAC6D21D9D1FC000BF62C0 /* JosefinSans-Bold.ttf in Resources */, + 82BAC6D41D9D1FC000BF62C0 /* JosefinSans-Italic.ttf in Resources */, + 82BAC6D91D9D1FC000BF62C0 /* JosefinSans-SemiBoldItalic.ttf in Resources */, + 82BAC6DA1D9D1FC000BF62C0 /* JosefinSans-Thin.ttf in Resources */, + 8221B2081DAEF9D900FB1BE1 /* ScheduleTableViewCell.xib in Resources */, + 82BAC6DB1D9D1FC000BF62C0 /* JosefinSans-ThinItalic.ttf in Resources */, + 82F3C16B1DB71BAC004F96FC /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3AEB822F1B7F104A00224BC3 /* Run Script */ = { + 548772046E64AF676BEB4EBB /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Run Script"; + name = "[CP] Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = ""; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; }; - 4C6724898F618A996523C194 /* Embed Pods Frameworks */ = { + 78E6BCED18D9A22BCA539775 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; + name = "[CP] Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -936,94 +438,94 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackTX/Pods-HackTX-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 67D896DC6BB7CCEDB6AA1407 /* Copy Pods Resources */ = { + 8221B2101DAF157700FB1BE1 /* Fabric - Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Copy Pods Resources"; + name = "Fabric - Run Script"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackTX/Pods-HackTX-resources.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"${PODS_ROOT}/Fabric/run\" 867b9bd547cc88317b3ba6c1d23b68632020aca5 c3d584fedb368d508fbc34feb97124a81493de480a85efba4a07dea65eb9b477"; }; - 738EE24A6DC85B59682A9D4C /* Check Pods Manifest.lock */ = { + C7B6E33EEDB5E5FFC7EE5294 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Check Pods Manifest.lock"; + name = "[CP] Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-HackTX/Pods-HackTX-resources.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - F9E9902E1B50EBBA00057823 /* Sources */ = { + 822A4D8F1D779BCD00C65761 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3A2156761B8A44CC00BCA241 /* Sponsor.swift in Sources */, - 3AEB82391B7F14E300224BC3 /* AnnouncementsViewController.swift in Sources */, - F9E990651B50FFFF00057823 /* TwitterViewController.swift in Sources */, - F9E990381B50EBBA00057823 /* AppDelegate.swift in Sources */, - 3A21567A1B8A577100BCA241 /* ScheduleDetailViewController.swift in Sources */, - 3A2156821B8A5D8900BCA241 /* Speaker.swift in Sources */, - 3A21567E1B8A5D5400BCA241 /* Day.swift in Sources */, - 3A806E511B9A9E4B00E29A0F /* UserPrefs.swift in Sources */, - F9C42ACA1B979B7200A21CF8 /* Location.swift in Sources */, - 3A3666581B9CD8350028BA91 /* Router.swift in Sources */, - F9E990671B51001000057823 /* MapViewController.swift in Sources */, - 3A192BA01B9EBE2C008AA3BA /* EventFeedbackViewController.swift in Sources */, - 3A2156731B8A436100BCA241 /* PartnersViewCell.swift in Sources */, - 3A806E291B9A895D00E29A0F /* CheckInViewController.swift in Sources */, - 3A21566E1B8A430C00BCA241 /* PartnersViewController.swift in Sources */, - 3A2156801B8A5D6A00BCA241 /* Event.swift in Sources */, - 3AEB823B1B7F14F400224BC3 /* Announcement.swift in Sources */, - F9E9903A1B50EBBA00057823 /* ScheduleViewController.swift in Sources */, - F91C843C1BAD2AED006E2D8F /* Reachability.swift in Sources */, - F9EE70221B912EE300B493A8 /* PageItemViewController.swift in Sources */, - F96AB7AD1B97E01200394217 /* MapsPageViewController.swift in Sources */, - 3A21567C1B8A5D3D00BCA241 /* ScheduleCluster.swift in Sources */, + 822A4D9B1D779BCD00C65761 /* AppDelegate.m in Sources */, + 822A4DB71D779DD100C65761 /* AnnouncementsViewController.m in Sources */, + 822E95191D7FF4EE00C0402E /* HTXConstants.m in Sources */, + 82BA003A1D81492F006CA2C6 /* AutolayoutHelper.m in Sources */, + 8215AD7F1D8DBE3700377370 /* Sponsor.m in Sources */, + 822A4DB41D779DBD00C65761 /* ScheduleViewController.m in Sources */, + 822A4D981D779BCD00C65761 /* main.m in Sources */, + 8215ADAF1D8E27F800377370 /* NSString+MD5.m in Sources */, + 8215AD861D8DC53D00377370 /* Location.m in Sources */, + 8215AD831D8DC49F00377370 /* Announcement.m in Sources */, + 820B450C1D9624B1002A26BA /* SponsorTableViewCell.m in Sources */, + 8221B20B1DAF109B00FB1BE1 /* HTXAPIKeyStore.m in Sources */, + 8200AD711DB3577400D4EE11 /* AnnouncementTableViewCell.m in Sources */, + 8221B2071DAEF9D900FB1BE1 /* ScheduleTableViewCell.m in Sources */, + 8215AD8F1D8DC88100377370 /* HTXAPI.m in Sources */, + 8215AD891D8DC63F00377370 /* Event.m in Sources */, + 822A4DC01D779DF100C65761 /* MapViewController.m in Sources */, + 82D303D11DB24084003C98ED /* Hacker.m in Sources */, + 82BA003D1D8149B1006CA2C6 /* UIColor+Palette.m in Sources */, + 8215AD8C1D8DC70F00377370 /* Speaker.m in Sources */, + 8215AD921D8DD26C00377370 /* SponsorViewController.m in Sources */, + 82EAFC871DB200D50061C449 /* CheckInViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - F9E9903D1B50EBBA00057823 /* Main.storyboard */ = { + 822A4DA21D779BCD00C65761 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - F9E9903E1B50EBBA00057823 /* Base */, + 822A4DA31D779BCD00C65761 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - F9E990421B50EBBA00057823 /* LaunchScreen.xib */ = { + 822A4DA71D779BCD00C65761 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - F9E990431B50EBBA00057823 /* Base */, + 822A4DA81D779BCD00C65761 /* Base */, ); - name = LaunchScreen.xib; + name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - F9E990511B50EBBA00057823 /* Debug */ = { + 822A4DAB1D779BCD00C65761 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -1031,17 +533,20 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Rohit Datta (7LU2FJSKBU)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Rohit Datta (7LU2FJSKBU)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1050,26 +555,25 @@ "DEBUG=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.4; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - F9E990521B50EBBA00057823 /* Release */ = { + 822A4DAC1D779BCD00C65761 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -1077,14 +581,16 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Rohit Datta (7LU2FJSKBU)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Rohit Datta (7LU2FJSKBU)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -1097,7 +603,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.4; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1105,78 +611,56 @@ }; name = Release; }; - F9E990541B50EBBA00057823 /* Debug */ = { + 822A4DAE1D779BCD00C65761 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 94E240E75C09DEDD03EA913F /* Pods-HackTX.debug.xcconfig */; + baseConfigurationReference = DDE9620564A4ACF2DB3BFB7E /* Pods-HackTX.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Rohit Datta (7LU2FJSKBU)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); + CODE_SIGN_ENTITLEMENTS = HackTX/HackTX.entitlements; + DEVELOPMENT_TEAM = 245X4K2U9R; INFOPLIST_FILE = HackTX/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(PROJECT_DIR)/**", - "$(inherited)/**", - ); + PRODUCT_BUNDLE_IDENTIFIER = com.HackTX.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "8cf0982d-0702-413c-a1c7-755a4ddf84a9"; - SWIFT_OBJC_BRIDGING_HEADER = "HackTX-Bridging-Header.h"; }; name = Debug; }; - F9E990551B50EBBA00057823 /* Release */ = { + 822A4DAF1D779BCD00C65761 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 163274BAD693C35C1B0222A5 /* Pods-HackTX.release.xcconfig */; + baseConfigurationReference = 099214E83B6739C941439E79 /* Pods-HackTX.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Rohit Datta (7LU2FJSKBU)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); + CODE_SIGN_ENTITLEMENTS = HackTX/HackTX.entitlements; + DEVELOPMENT_TEAM = 245X4K2U9R; INFOPLIST_FILE = HackTX/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(PROJECT_DIR)/**", - "$(inherited)/**", - ); + PRODUCT_BUNDLE_IDENTIFIER = com.HackTX.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "8cf0982d-0702-413c-a1c7-755a4ddf84a9"; - SWIFT_OBJC_BRIDGING_HEADER = "HackTX-Bridging-Header.h"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - F9E9902D1B50EBBA00057823 /* Build configuration list for PBXProject "HackTX" */ = { + 822A4D8E1D779BCD00C65761 /* Build configuration list for PBXProject "HackTX" */ = { isa = XCConfigurationList; buildConfigurations = ( - F9E990511B50EBBA00057823 /* Debug */, - F9E990521B50EBBA00057823 /* Release */, + 822A4DAB1D779BCD00C65761 /* Debug */, + 822A4DAC1D779BCD00C65761 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F9E990531B50EBBA00057823 /* Build configuration list for PBXNativeTarget "HackTX" */ = { + 822A4DAD1D779BCD00C65761 /* Build configuration list for PBXNativeTarget "HackTX" */ = { isa = XCConfigurationList; buildConfigurations = ( - F9E990541B50EBBA00057823 /* Debug */, - F9E990551B50EBBA00057823 /* Release */, + 822A4DAE1D779BCD00C65761 /* Debug */, + 822A4DAF1D779BCD00C65761 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = F9E9902A1B50EBBA00057823 /* Project object */; + rootObject = 822A4D8B1D779BCD00C65761 /* Project object */; } diff --git a/HackTX.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/HackTX.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f1f674c --- /dev/null +++ b/HackTX.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/HackTX.xcworkspace/contents.xcworkspacedata b/HackTX.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9f0e426 --- /dev/null +++ b/HackTX.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/HackTX/Announcement.h b/HackTX/Announcement.h new file mode 100644 index 0000000..1171544 --- /dev/null +++ b/HackTX/Announcement.h @@ -0,0 +1,21 @@ +// +// Announcement.h +// HackTX +// +// Created by Jose Bethancourt on 9/17/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import + +@interface Announcement : RLMObject + +@property NSString *serverID; +@property NSString *text; +@property NSDate *timestamp; + +@end + +// This protocol enables typed collections. i.e.: +// RLMArray +RLM_ARRAY_TYPE(Announcement) diff --git a/HackTX/Announcement.m b/HackTX/Announcement.m new file mode 100644 index 0000000..395f93f --- /dev/null +++ b/HackTX/Announcement.m @@ -0,0 +1,31 @@ +// +// Announcement.m +// HackTX +// +// Created by Jose Bethancourt on 9/17/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import "Announcement.h" + +@implementation Announcement + ++ (NSString *)primaryKey { + return @"serverID"; +} + +// Specify default values for properties + +//+ (NSDictionary *)defaultPropertyValues +//{ +// return @{}; +//} + +// Specify properties to ignore (Realm won't persist these) + +//+ (NSArray *)ignoredProperties +//{ +// return @[]; +//} + +@end diff --git a/HackTX/Announcement.swift b/HackTX/Announcement.swift deleted file mode 100644 index 8769203..0000000 --- a/HackTX/Announcement.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// Announcement.swift -// HackTX -// -// Created by Drew Romanyk on 8/15/15. -// Copyright (c) 2015 HackTX. All rights reserved. -// - -import Foundation - -class Announcement: NSObject { - var text = "" - var ts = "" - - init(text: String, ts: String) { - self.text = text - self.ts = ts - } - - func getEnglishTs() -> String { - let dateFormatter = NSDateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - - let jsonDate = dateFormatter.dateFromString(self.ts) - dateFormatter.dateFormat = "MMM d, hh:mm a" - return dateFormatter.stringFromDate(jsonDate!) - } - - func getTsDate() -> NSDate { - let dateFormatter = NSDateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - - return dateFormatter.dateFromString(self.ts)! - } -} diff --git a/HackTX/AnnouncementTableViewCell.h b/HackTX/AnnouncementTableViewCell.h new file mode 100644 index 0000000..ca9ce87 --- /dev/null +++ b/HackTX/AnnouncementTableViewCell.h @@ -0,0 +1,17 @@ +// +// AnnouncementTableViewCell.h +// HackTX +// +// Created by Jose Bethancourt on 10/16/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import + +@interface AnnouncementTableViewCell : UITableViewCell + +@property (weak, nonatomic) IBOutlet UIView *cardView; +@property (weak, nonatomic) IBOutlet UILabel *text; +@property (weak, nonatomic) IBOutlet UILabel *time; + +@end diff --git a/HackTX/AnnouncementTableViewCell.m b/HackTX/AnnouncementTableViewCell.m new file mode 100644 index 0000000..9dcc62d --- /dev/null +++ b/HackTX/AnnouncementTableViewCell.m @@ -0,0 +1,59 @@ +// +// AnnouncementTableViewCell.m +// HackTX +// +// Created by Jose Bethancourt on 10/16/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import "AnnouncementTableViewCell.h" + +#import "UIColor+Palette.h" + +@implementation AnnouncementTableViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + + self.time.textColor = [UIColor htx_red]; + + self.backgroundColor = [UIColor clearColor]; + + self.cardView.backgroundColor = [UIColor whiteColor]; + self.cardView.layer.cornerRadius = 2.5; + self.cardView.layer.masksToBounds = false; + self.cardView.layer.shadowColor = [UIColor blackColor].CGColor; + self.cardView.layer.shadowOffset = CGSizeMake(0.0, .25); + self.cardView.layer.shadowRadius = 1.0; + self.cardView.layer.shadowOpacity = 0.2; + + +} + +//- (void)layoutSubviews { +// [super layoutSubviews]; +// +// self.text.preferredMaxLayoutWidth = self.text.frame.size.width; +// +//} +// +//- (void)viewDidLayoutSubviews { +// dispatch_async(dispatch_get_main_queue(), ^{ +// self.text.preferredMaxLayoutWidth = self.text.frame.size.width; +// }); +//} + +- (void)setFrame:(CGRect)frame { + frame.origin.x += 7.5; + frame.origin.y += 4; + + frame.size.width -= 2 * 7.5; + frame.size.height -= 2 * 4; + [super setFrame:frame]; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; +} + +@end diff --git a/HackTX/AnnouncementTableViewCell.xib b/HackTX/AnnouncementTableViewCell.xib new file mode 100644 index 0000000..404a3f8 --- /dev/null +++ b/HackTX/AnnouncementTableViewCell.xib @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HackTX/AnnouncementsViewController.h b/HackTX/AnnouncementsViewController.h new file mode 100644 index 0000000..f1ba944 --- /dev/null +++ b/HackTX/AnnouncementsViewController.h @@ -0,0 +1,13 @@ +// +// AnnouncementsViewController.h +// HackTX +// +// Created by Jose Bethancourt on 8/31/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import + +@interface AnnouncementsViewController : UIViewController + +@end diff --git a/HackTX/AnnouncementsViewController.m b/HackTX/AnnouncementsViewController.m new file mode 100644 index 0000000..bc04ba3 --- /dev/null +++ b/HackTX/AnnouncementsViewController.m @@ -0,0 +1,168 @@ +// +// AnnouncementsViewController.m +// HackTX +// +// Created by Jose Bethancourt on 8/31/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import "AnnouncementsViewController.h" +#import "AnnouncementTableViewCell.h" + +#import "AutolayoutHelper.h" +#import "UIColor+Palette.h" +#import "SVProgressHUD.h" +#import "Announcement.h" +#import "FCAlertView.h" +#import "HTXAPI.h" + +@interface AnnouncementsViewController () + +@property (nonatomic, strong) UITableView *tableView; +@property (nonatomic, strong) UIRefreshControl *refreshControl; +@property (nonatomic, strong) RLMResults *announcements; + +@end + +static NSString *reuseIdentifier = @"com.HackTX.announcement"; + +@implementation AnnouncementsViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.tableView = [[UITableView alloc] init]; + self.tableView.delegate = self; + self.tableView.dataSource = self; + self.tableView.estimatedRowHeight = 85; + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + self.tableView.tableFooterView = [UIView new]; + self.tableView.allowsSelection = NO; + self.tableView.backgroundColor = [UIColor htx_white]; + + self.refreshControl = [[UIRefreshControl alloc] init]; + [self.tableView setRefreshControl:self.refreshControl]; + [self.refreshControl addTarget:self action:@selector(hardRefresh) forControlEvents:UIControlEventValueChanged]; + + self.edgesForExtendedLayout = UIRectEdgeAll; + self.tableView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, CGRectGetHeight(self.tabBarController.tabBar.frame), 0.0f); + + UINib *nib = [UINib nibWithNibName:@"AnnouncementTableViewCell" bundle:nil]; + [self.tableView registerNib:nib forCellReuseIdentifier:reuseIdentifier]; + + [AutolayoutHelper configureView:self.view fillWithSubView:self.tableView]; + + [self initData]; + [self.tableView layoutIfNeeded]; + [self.tableView reloadData]; + +} + +- (void)hardRefresh { + + [HTXAPI refreshAnnouncements:^(BOOL success) { + if (success) { + [self.refreshControl endRefreshing]; + [self refreshData]; + } else { + [self.refreshControl endRefreshing]; + FCAlertView *alert = [[FCAlertView alloc] init]; + + [alert showAlertInView:self + withTitle:@"Network error" + withSubtitle:@"There was an error fetching the announcements, please try again later. 😥" + withCustomImage:nil + withDoneButtonTitle:@"Okay" + andButtons:nil]; + [alert makeAlertTypeCaution]; + + NSLog(@"[HTX] Announcements refresh failed"); + } + }]; +} + +- (void)refresh { + [HTXAPI refreshAnnouncements:^(BOOL success) { + if (success) { + [self initData]; + } else { + [self.refreshControl endRefreshing]; + [SVProgressHUD dismiss]; + FCAlertView *alert = [[FCAlertView alloc] init]; + + [alert showAlertInView:self + withTitle:@"Network error" + withSubtitle:@"There was an error fetching the announcements, please try again later. 😥" + withCustomImage:nil + withDoneButtonTitle:@"Okay" + andButtons:nil]; + [alert makeAlertTypeCaution]; + + NSLog(@"[HTX] Schedule refresh failed"); + } + }]; +} + +- (void)initData { + self.announcements = [[Announcement allObjects] sortedResultsUsingProperty:@"timestamp" ascending:NO]; + [SVProgressHUD show]; + + if (self.announcements.count > 0) { + self.announcements = [[Announcement allObjects] sortedResultsUsingProperty:@"timestamp" ascending:NO]; + + [SVProgressHUD dismiss]; + [self.tableView reloadData]; + + [HTXAPI refreshAnnouncements:^(BOOL success) { + if (success) { + [self refreshData]; + } + }]; + + } else { + [self refresh]; + } +} + +- (void)refreshData { + self.announcements = [[Announcement allObjects] sortedResultsUsingProperty:@"timestamp" ascending:NO]; + [self.tableView reloadData]; +} + +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { + UIView *headerView = [[UIView alloc] init]; + headerView.backgroundColor = [UIColor clearColor]; + return headerView; +} +- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { + return 40; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + AnnouncementTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; + + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.timeStyle = NSDateFormatterShortStyle; + formatter.dateStyle = NSDateFormatterNoStyle; + + cell.text.text = self.announcements[indexPath.row].text; + cell.time.text = [formatter stringFromDate:self.announcements[indexPath.row].timestamp]; + + [cell updateConstraintsIfNeeded]; + cell.text.preferredMaxLayoutWidth = cell.text.frame.size.width; + + return cell; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return self.announcements.count; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + +@end diff --git a/HackTX/AnnouncementsViewController.swift b/HackTX/AnnouncementsViewController.swift deleted file mode 100644 index bbbe6bd..0000000 --- a/HackTX/AnnouncementsViewController.swift +++ /dev/null @@ -1,120 +0,0 @@ -// -// AnnouncementsViewController.swift -// HackTX -// -// Created by Drew Romanyk on 8/15/15. -// Copyright (c) 2015 HackTX. All rights reserved. -// - -import UIKit -import Alamofire -import SwiftyJSON - -class AnnouncementsViewController: UITableViewController { - - var announcementList = [Announcement]() - - override func viewDidLoad() { - super.viewDidLoad() - - tableView.estimatedRowHeight = 44 - tableView.rowHeight = UITableViewAutomaticDimension - NSNotificationCenter.defaultCenter().addObserver(self, selector: "reloadTable:", name: "reloadTheTable", object: nil) - if Reachability.isConnectedToNetwork() { - print("Internet connection OK") - getAnnouncementData() - } else { - print("Internet connection FAILED") - let alert = UIAlertView(title: "No Internet Connection", message: "The HackTX app requires an internet connection to work. Talk to a volunteer about getting Internet access.", delegate: nil, cancelButtonTitle: "OK") - alert.show() - } - } - - func reloadTable(notification: NSNotification) { - if Reachability.isConnectedToNetwork() { - print("Internet connection OK") - getAnnouncementData() - } else { - print("Internet connection FAILED") - let alert = UIAlertView(title: "No Internet Connection", message: "The HackTX app requires an internet connection to work. Talk to a volunteer about getting Internet access.", delegate: nil, cancelButtonTitle: "OK") - alert.show() - } - } - - - - // Collect announcement data from the api - func getAnnouncementData() { - - Alamofire.request(Router.Announcements()) - .responseJSON{ (request, response, data) in - if data.isFailure { - let errorAlert = UIAlertView() - if errorAlert.title == "" { - errorAlert.title = "Error" - errorAlert.message = "Oops! Looks like there was a problem trying to get the announcements" - errorAlert.addButtonWithTitle("Ok") - errorAlert.show() - } - } else if let data: AnyObject = data.value { - let json = JSON(data) - self.announcementList.removeAll(keepCapacity: true) - - for (_, subJson): (String, JSON) in json { - self.announcementList.insert(Announcement(text: subJson["text"].stringValue, ts: subJson["ts"].stringValue), atIndex: 0) - } - self.tableView.reloadData() - } - - } - } - - // Sort announcement messages by newest to oldest - func sortAnnouncements(this: Announcement, that: Announcement) -> Bool { - return this.getTsDate().compare(that.getTsDate()) == NSComparisonResult.OrderedDescending - } - - // Setup Google Analytics for the controller - override func viewWillAppear(animated: Bool) { - super.viewWillAppear(animated) - - let tracker = GAI.sharedInstance().defaultTracker - tracker.set(kGAIScreenName, value: "Announcements") - - let builder = GAIDictionaryBuilder.createScreenView() - tracker.send(builder.build() as [NSObject : AnyObject]) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - } - - /* - * TABLE VIEW METHODS - */ - - // Refresh the tableview data - @IBAction func refresh(sender: UIRefreshControl) { - getAnnouncementData() - sender.endRefreshing() - } - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - return 1 - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return announcementList.count - } - - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCellWithIdentifier("AnnouncementCell", forIndexPath: indexPath) - let announcement = announcementList[indexPath.row] - - cell.textLabel!.text = announcement.text - cell.detailTextLabel!.text = announcement.getEnglishTs() - cell.selectionStyle = UITableViewCellSelectionStyle.None - return cell - } -} diff --git a/HackTX/ApiKeys.plist b/HackTX/ApiKeys.plist deleted file mode 100644 index 1d448e0..0000000 --- a/HackTX/ApiKeys.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - ClientID - vb13BWJVxT9kPTHNazEf2KN9ev28mk7F0ve7Fvga - ApplicationID - zNIuPOtKnxNAVHekB1yCkgTBlABXiG5OqB4Cv4C5 - - diff --git a/HackTX/AppDelegate.h b/HackTX/AppDelegate.h new file mode 100644 index 0000000..312093c --- /dev/null +++ b/HackTX/AppDelegate.h @@ -0,0 +1,17 @@ +// +// AppDelegate.h +// HackTX +// +// Created by Jose Bethancourt on 8/31/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/HackTX/AppDelegate.m b/HackTX/AppDelegate.m new file mode 100644 index 0000000..b8e62ce --- /dev/null +++ b/HackTX/AppDelegate.m @@ -0,0 +1,186 @@ +// +// AppDelegate.m +// HackTX +// +// Created by Jose Bethancourt on 8/31/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import "AppDelegate.h" + +#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +@import UserNotifications; +#endif + +@import Firebase; +@import FirebaseInstanceID; +@import FirebaseMessaging; +@import GoogleMaps; + +#import "AnnouncementsViewController.h" +#import "CheckInViewController.h" +#import "MapViewController.h" +#import "ScheduleViewController.h" +#import "SponsorViewController.h" +#import "HTXAPIKeyStore.h" +#import "UIColor+Palette.h" + +#import +#import + + +#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +@interface AppDelegate () +#endif + +@property (nonatomic, strong) UITabBarController *tabBarController; + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + + [Fabric with:@[[Crashlytics class]]]; + [GMSServices provideAPIKey:[[HTXAPIKeyStore sharedHTXAPIKeyStore] getGMSKey]]; + + if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { + UIUserNotificationType allNotificationTypes = + (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge); + UIUserNotificationSettings *settings = + [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil]; + [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; + } else { + // iOS 10 or later + #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 + UNAuthorizationOptions authOptions = + UNAuthorizationOptionAlert + | UNAuthorizationOptionSound + | UNAuthorizationOptionBadge; + [[UNUserNotificationCenter currentNotificationCenter] + requestAuthorizationWithOptions:authOptions + completionHandler:^(BOOL granted, NSError * _Nullable error) { + } + ]; + + // For iOS 10 display notification (sent via APNS) + [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self]; +// [[FIRMessaging messaging] setRemoteMessageDelegate:self]; + #endif + } + + [FIRApp configure]; + + + [[UIApplication sharedApplication] registerForRemoteNotifications]; + + ScheduleViewController *vc1 = [[ScheduleViewController alloc] init]; + AnnouncementsViewController *vc2 = [[AnnouncementsViewController alloc] init]; + CheckInViewController *vc3 = [[CheckInViewController alloc] init]; + MapViewController *vc4 = [[MapViewController alloc] init]; + SponsorViewController *vc5 = [[SponsorViewController alloc] init]; + + _tabBarController = [[UITabBarController alloc] init]; + _tabBarController.tabBar.translucent = NO; + + _tabBarController.viewControllers = @[vc1, vc2, vc3, vc4, vc5]; + + vc1.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Schedule" image:[UIImage imageNamed:@"icon_calendar"] selectedImage:nil]; + vc2.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Updates" image:[UIImage imageNamed:@"icon_bell"] selectedImage:nil]; + vc3.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Check-In" image:[UIImage imageNamed:@"icon_profile"] selectedImage:nil]; + vc4.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Map" image:[UIImage imageNamed:@"icon_map"] selectedImage:nil]; + vc5.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Partners" image:[UIImage imageNamed:@"icon_heart"] selectedImage:nil]; + + [[UITabBar appearance] setTintColor:[UIColor htx_red]]; + + _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:_tabBarController]; + + UIImageView *headerImage = [[UIImageView alloc] init]; + headerImage.contentMode = UIViewContentModeScaleAspectFit; + headerImage.frame = CGRectMake(0, 0, 38, 38); + headerImage.image = [UIImage imageNamed:@"htx_logo"]; + + navController.navigationBar.barTintColor = [UIColor htx_lightBlue]; + navController.navigationBar.topItem.titleView = headerImage; + navController.navigationBar.translucent = NO; + + _window.rootViewController = navController; + [_window makeKeyAndVisible]; + + if (launchOptions != nil) { + // Launched from push notification + NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; + if ([notification count] != 0) { + [self.tabBarController setSelectedIndex:1]; + } + } + + return YES; +} + + +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + //[AVOSCloud handleRemoteNotificationsWithDeviceToken:deviceToken]; + dispatch_queue_t myQueue = dispatch_queue_create("firebase_topics", NULL); + + dispatch_async(myQueue, ^{ + NSArray *topics = @[@"/topics/announcements", @"/topics/hacktx", @"/topics/ios", @"/topics/debug"]; + + for (NSString *topic in topics) { + [[FIRMessaging messaging] subscribeToTopic:topic]; + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:4.0]]; + } + + }); + +} +- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { + dispatch_queue_t myQueue = dispatch_queue_create("firebase_topics", NULL); + + dispatch_async(myQueue, ^{ + NSArray *topics = @[@"/topics/announcements", @"/topics/hacktx", @"/topics/ios", @"/topics/debug"]; + + for (NSString *topic in topics) { + [[FIRMessaging messaging] subscribeToTopic:topic]; + [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:4.0]]; + } + + }); + +} + +- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler +{ +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // 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. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. +} + + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +} + + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // 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. +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + + +@end diff --git a/HackTX/AppDelegate.swift b/HackTX/AppDelegate.swift deleted file mode 100644 index edc1cf6..0000000 --- a/HackTX/AppDelegate.swift +++ /dev/null @@ -1,225 +0,0 @@ -// -// AppDelegate.swift -// HackTX -// -// Created by Rohit Datta on 7/11/15. -// Copyright (c) 2015 HackTX. All rights reserved. -// - -import UIKit -import Fabric -import TwitterKit -import Parse - - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - - UserPrefs.shared().registerDefaults() - Fabric.with([Twitter()]) - setNavTabBarLayout() - - setupGoogleAnalytics() - initParse(application, launchOptions: launchOptions) - UIApplication.sharedApplication().applicationIconBadgeNumber = 0 - - return true - } - - func setupGoogleAnalytics() { - // Configure tracker from GoogleService-Info.plist. - var configureError:NSError? - GGLContext.sharedInstance().configureWithError(&configureError) - assert(configureError == nil, "Error configuring Google services: \(configureError)") - - // Optional: configure GAI options. - let gai = GAI.sharedInstance() - gai.trackUncaughtExceptions = true // report uncaught exceptions - } - - func initParse(application: UIApplication, launchOptions: [NSObject: AnyObject]?) { - - - let parseAppID = getParseAppID() - let parseClientID = getParseClientID() - Parse.setApplicationId(parseAppID, - clientKey: parseClientID) - - if application.applicationState != UIApplicationState.Background { - // Track an app open here if we launch with a push, unless - // "content_available" was used to trigger a background push (introduced in iOS 7). - // In that case, we skip tracking here to avoid double counting the app-open. - - let preBackgroundPush = !application.respondsToSelector("backgroundRefreshStatus") - let oldPushHandlerOnly = !self.respondsToSelector("application:didReceiveRemoteNotification:fetchCompletionHandler:") - var pushPayload = false - if let options = launchOptions { - pushPayload = options[UIApplicationLaunchOptionsRemoteNotificationKey] != nil - } - if (preBackgroundPush || oldPushHandlerOnly || pushPayload) { - PFAnalytics.trackAppOpenedWithLaunchOptions(launchOptions) - } - } - if application.respondsToSelector("registerUserNotificationSettings:") { - let userNotificationTypes: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound] - let settings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil) - application.registerUserNotificationSettings(settings) - application.registerForRemoteNotifications() - } else { - application.registerForRemoteNotifications() - } - - let currentInstallation = PFInstallation.currentInstallation() - currentInstallation.addUniqueObject("announcements", forKey: "channels") - currentInstallation.saveInBackground() - - registerCheckInReminder() - } - - func registerCheckInReminder() { - let fireDate = NSDate(timeIntervalSince1970: 1443274200) - - //Remind attendees to check in to the event - if (!UserPrefs.shared().isRegisteredForCheckInNotif() && !eventPassed(fireDate)) { - let notification = UILocalNotification() - notification.alertBody = "Remember to check in for HackTX in the app!" - notification.alertAction = "check in" - notification.fireDate = fireDate - notification.soundName = UILocalNotificationDefaultSoundName - notification.userInfo = ["uid": "check-in-reminder"] - UIApplication.sharedApplication().scheduleLocalNotification(notification) - UserPrefs.shared().setRegisterForCheckInNotif(true) - // let val = UserPrefs.shared().isRegisteredForCheckInNotif() - } - } - - func eventPassed(eventDate: NSDate) -> Bool { - let currentDate = NSDate() - return currentDate.timeIntervalSince1970 > eventDate.timeIntervalSince1970 - } - - func getParseKeyDict() -> NSDictionary { - var parseDict : NSDictionary? - if let path = NSBundle.mainBundle().pathForResource("ApiKeys", ofType: "plist") { - parseDict = NSDictionary(contentsOfFile: path) - } - return parseDict! - } - - func getParseAppID() -> String { - let parseDict = getParseKeyDict() - return parseDict["ApplicationID"] as! String - } - - func getParseClientID() -> String { - let parseDict = getParseKeyDict() - return parseDict["ClientID"] as! String - } - - func setNavTabBarLayout() { -// UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) -// UINavigationBar.appearance().barTintColor = UIColor(red: 10/255.0, green: 166/255.0, blue: 182/255.0, alpha: 1.0) -// UINavigationBar.appearance().tintColor = UIColor.whiteColor() -// UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()] -// -// UITabBar.appearance().barTintColor = UIColor(red: 10/255.0, green: 166/255.0, blue: 182/255.0, alpha: 1.0) - UITabBar.appearance().tintColor = UIColor(red: 125/255.0, green: 211/255.0, blue: 244/255.0, alpha: 1.0) //UIColor.whiteColor() - - - } - - func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { - let installation = PFInstallation.currentInstallation() - installation.setDeviceTokenFromData(deviceToken) - installation.saveInBackground() - } - - func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { - if error.code == 3010 { - print("Push notifications are not supported in the iOS Simulator.") - } else { - print("application:didFailToRegisterForRemoteNotificationsWithError: %@", error) - } - } - - func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { - PFPush.handlePush(userInfo) - if application.applicationState == UIApplicationState.Inactive { - PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo) - } - - self.window?.makeKeyAndVisible() - let rootController = window?.rootViewController as! UITabBarController - rootController.selectedIndex = 1; - NSNotificationCenter.defaultCenter().postNotificationName("reloadTheTable", object: nil) - - } - - @available(iOS 9.0, *) - func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { - print("Application performActionForShortcutItem") - completionHandler(handleShortcut(shortcutItem)) - } - - @available(iOS 9.0, *) - func handleShortcut(shortcutItem: UIApplicationShortcutItem) -> Bool { - print("handling shortcut") - var succeeded = false - - self.window?.makeKeyAndVisible() - let rootController = window?.rootViewController as! UITabBarController - if (shortcutItem.type == "schedule") { - //Debugging code - print("- Handling \(shortcutItem.type)") - - rootController.selectedIndex = 0 - succeeded = true - - } else if (shortcutItem.type == "announcements") { - print("- Handling \(shortcutItem.type)") - - rootController.selectedIndex = 1; - succeeded = true - - } else if (shortcutItem.type == "maps") { - print("- Handling \(shortcutItem.type)") - - rootController.selectedIndex = 3 - succeeded = true - } - - return succeeded - } - - func applicationWillResignActive(application: UIApplication) { - // 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. - // 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. - } - - func applicationDidEnterBackground(application: UIApplication) { - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(application: UIApplication) { - // 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. - UIApplication.sharedApplication().applicationIconBadgeNumber = 0 - - } - - func applicationDidBecomeActive(application: UIApplication) { - // 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. - } - - func applicationWillTerminate(application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Contents.json b/HackTX/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..7a79b23 --- /dev/null +++ b/HackTX/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,110 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-Spotlight-42.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-60.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Spotlight-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Spotlight-40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-Spotlight-41.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Spotlight-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Spotlight-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-iPadPro@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-20.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-20.png new file mode 100644 index 0000000..f9b71b6 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-20.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60.png new file mode 100644 index 0000000..669d420 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000..71b161b Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png new file mode 100644 index 0000000..d58c271 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000..8325c19 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-76.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png new file mode 100644 index 0000000..25fcbd6 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small.png new file mode 100644 index 0000000..cbe6f0b Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png new file mode 100644 index 0000000..b32bcbe Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000..b32bcbe Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png new file mode 100644 index 0000000..014e156 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40.png new file mode 100644 index 0000000..ba5665a Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x-1.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x-1.png new file mode 100644 index 0000000..689f7d4 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x-1.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x.png new file mode 100644 index 0000000..689f7d4 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x.png new file mode 100644 index 0000000..99dfb82 Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-41.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-41.png new file mode 100644 index 0000000..ba5665a Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-41.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-42.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-42.png new file mode 100644 index 0000000..ba5665a Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-42.png differ diff --git a/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png new file mode 100644 index 0000000..987fbae Binary files /dev/null and b/HackTX/Assets.xcassets/AppIcon.appiconset/Icon-iPadPro@2x.png differ diff --git a/HackTX/Assets.xcassets/Contents.json b/HackTX/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/HackTX/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/htx_logo.imageset/Contents.json b/HackTX/Assets.xcassets/htx_logo.imageset/Contents.json new file mode 100644 index 0000000..e970d54 --- /dev/null +++ b/HackTX/Assets.xcassets/htx_logo.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "htx_logo.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/htx_logo.imageset/htx_logo.pdf b/HackTX/Assets.xcassets/htx_logo.imageset/htx_logo.pdf new file mode 100644 index 0000000..72ec370 Binary files /dev/null and b/HackTX/Assets.xcassets/htx_logo.imageset/htx_logo.pdf differ diff --git a/HackTX/Assets.xcassets/icon_bell.imageset/Bell.pdf b/HackTX/Assets.xcassets/icon_bell.imageset/Bell.pdf new file mode 100644 index 0000000..fd7c68e Binary files /dev/null and b/HackTX/Assets.xcassets/icon_bell.imageset/Bell.pdf differ diff --git a/HackTX/Assets.xcassets/icon_bell.imageset/Contents.json b/HackTX/Assets.xcassets/icon_bell.imageset/Contents.json new file mode 100644 index 0000000..ee3fff4 --- /dev/null +++ b/HackTX/Assets.xcassets/icon_bell.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Bell.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_calendar.imageset/Calendar.pdf b/HackTX/Assets.xcassets/icon_calendar.imageset/Calendar.pdf new file mode 100644 index 0000000..f607715 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_calendar.imageset/Calendar.pdf differ diff --git a/HackTX/Assets.xcassets/icon_calendar.imageset/Contents.json b/HackTX/Assets.xcassets/icon_calendar.imageset/Contents.json new file mode 100644 index 0000000..4685f1f --- /dev/null +++ b/HackTX/Assets.xcassets/icon_calendar.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Calendar.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_heart.imageset/Contents.json b/HackTX/Assets.xcassets/icon_heart.imageset/Contents.json new file mode 100644 index 0000000..cf38a9c --- /dev/null +++ b/HackTX/Assets.xcassets/icon_heart.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Heart2.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_heart.imageset/Heart2.pdf b/HackTX/Assets.xcassets/icon_heart.imageset/Heart2.pdf new file mode 100644 index 0000000..82b3729 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_heart.imageset/Heart2.pdf differ diff --git a/HackTX/Assets.xcassets/icon_htx.imageset/Contents.json b/HackTX/Assets.xcassets/icon_htx.imageset/Contents.json new file mode 100644 index 0000000..aa6a47b --- /dev/null +++ b/HackTX/Assets.xcassets/icon_htx.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "app_icon-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "app_icon-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "app_icon.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_htx.imageset/app_icon-1.png b/HackTX/Assets.xcassets/icon_htx.imageset/app_icon-1.png new file mode 100644 index 0000000..5da01c6 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_htx.imageset/app_icon-1.png differ diff --git a/HackTX/Assets.xcassets/icon_htx.imageset/app_icon-2.png b/HackTX/Assets.xcassets/icon_htx.imageset/app_icon-2.png new file mode 100644 index 0000000..5da01c6 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_htx.imageset/app_icon-2.png differ diff --git a/HackTX/Assets.xcassets/icon_htx.imageset/app_icon.png b/HackTX/Assets.xcassets/icon_htx.imageset/app_icon.png new file mode 100644 index 0000000..5da01c6 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_htx.imageset/app_icon.png differ diff --git a/HackTX/Assets.xcassets/icon_htx_not.imageset/Contents.json b/HackTX/Assets.xcassets/icon_htx_not.imageset/Contents.json new file mode 100644 index 0000000..57feea7 --- /dev/null +++ b/HackTX/Assets.xcassets/icon_htx_not.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_launcher-1.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_launcher.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_launcher-2.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher-1.png b/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher-1.png new file mode 100644 index 0000000..6652839 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher-1.png differ diff --git a/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher-2.png b/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher-2.png new file mode 100644 index 0000000..6652839 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher-2.png differ diff --git a/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher.png b/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher.png new file mode 100644 index 0000000..6652839 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_htx_not.imageset/ic_launcher.png differ diff --git a/HackTX/Assets.xcassets/icon_map.imageset/Contents.json b/HackTX/Assets.xcassets/icon_map.imageset/Contents.json new file mode 100644 index 0000000..9a481b8 --- /dev/null +++ b/HackTX/Assets.xcassets/icon_map.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Map.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_map.imageset/Map.pdf b/HackTX/Assets.xcassets/icon_map.imageset/Map.pdf new file mode 100644 index 0000000..e2eed45 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_map.imageset/Map.pdf differ diff --git a/HackTX/Assets.xcassets/icon_profile.imageset/Contents.json b/HackTX/Assets.xcassets/icon_profile.imageset/Contents.json new file mode 100644 index 0000000..2db34cc --- /dev/null +++ b/HackTX/Assets.xcassets/icon_profile.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "profile.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/HackTX/Assets.xcassets/icon_profile.imageset/profile.pdf b/HackTX/Assets.xcassets/icon_profile.imageset/profile.pdf new file mode 100644 index 0000000..ad1ec33 Binary files /dev/null and b/HackTX/Assets.xcassets/icon_profile.imageset/profile.pdf differ diff --git a/HackTX/AutolayoutHelper.h b/HackTX/AutolayoutHelper.h new file mode 100755 index 0000000..e77b464 --- /dev/null +++ b/HackTX/AutolayoutHelper.h @@ -0,0 +1,98 @@ + +// Helper to configure auto layout constraints +// Supports VFL constraints and more extended constraints (see README.md) +// +// Based on this tutorial: http://www.thinkandbuild.it/learn-to-love-auto-layout-programmatically/ +// Also inspired by this: http://stackoverflow.com/a/18066138/1121497 + +#import + +#define VarBindings NSDictionaryOfVariableBindings + +#define PRIORITY_DEFAULT -1 +#define XT_CONSTRAINT_SYMBOL @"X" + + +@interface AutolayoutHelper : NSObject + + +@property(nonatomic, weak) UIView* view; // The view where the subviews and constraints will be added +@property(nonatomic, strong) NSMutableDictionary* subViews; // Dictionary of key:subview (subviews to be added to the view) +@property(nonatomic, strong) NSDictionary* metrics; // Metrics to be used for the constraints + + +// When set to true, subviews will be painted with random semi-transparent backgrounds +// just to better visualize the position and sizes of the subviews. ++ (void)setDisplayBackgroundColorsForDebugging:(BOOL)displayColor; + + +// Convenience class methods +// Arguments: +// subViews: NSDictionary* of (NSString*)key:(UIView*)view with subviews to add and their keys to be referred in constraints +// subViewLayers: NSArray* of NSDictionary* subViews, useful when some views should be added before others +// metrics: NSDictionary* of (NSString*)key:(NSNumber*)value with metrics to be referred in constraints +// constraints: NSArray* of NSString* with VFL constraints (and also other extended constraints; see README.md) + +// Adds subViews and VFL constraints to view ++ (AutolayoutHelper*)configureView:(UIView*)view subViews:(NSDictionary*)subViews constraints:(NSArray*)constraints; + +// Adds subViews and VFL constraints (with given metrics) to view ++ (AutolayoutHelper*)configureView:(UIView*)view subViews:(NSDictionary*)subViews metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints; + +// Adds subViewLayers and VFL constraints (with given metrics) to view ++ (AutolayoutHelper*)configureView:(UIView*)view subViewLayers:(NSArray*)subViewLayers metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints; + +// Adds the subview to the view so it fills it (aligns to edges) ++ (AutolayoutHelper*)configureView:(UIView*)view fillWithSubView:(UIView*)subview; + +// Adds the subview to the controller.view so it fills it (aligns to edges) ++ (AutolayoutHelper*)configureViewController:(UIViewController*)controller fillWithSubView:(UIView*)subview; + +// Adds the subViews and VFL constraints to a new UIView ++ (AutolayoutHelper*)subViews:(NSDictionary*)subViews constraints:(NSArray*)constraints; + +// Adds the subViews and VFL constraints (with given metrics) to a new UIView ++ (AutolayoutHelper*)subViews:(NSDictionary*)subViews metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints; + +// Configures a "vertical" scroll view (see README.md) ++ (void)configureScrollView:(UIScrollView*)scrollView contentView:(UIView*)contentView mainView:(UIView*)mainView; + + +// Initializes this helper to configure subviews of the given view +- (id)initWithView:(UIView*)view; + + +// Adds subViews to self.view +- (void)addViews:(NSDictionary*)subViews; + +// Adds subView to self.view, and uses subViewKey for constraints +- (void)addView:(UIView*)subView withKey:(NSString*)subViewKey; + +// Adds subViews and constraints to self.view +- (void)addViews:(NSDictionary*)subViews constraints:(NSArray*)constraints; + +// Removes subViews from self.view (actually, it uses only the dictionary keys) +- (void)removeViews:(NSDictionary*)subViews; + +// Removes subViews with given viewKeys from self.view +- (void)removeViewsWithKeys:(NSArray*)viewKeys; + +// Adds one constraint and returns an array of the generated NSLayoutConstraint +- (NSArray*)addConstraint:(NSString*)constraint; + +// Adds one constraint with given priority and returns an array of the generated NSLayoutConstraint +- (NSArray*)addConstraint:(NSString*)constraint priority:(UILayoutPriority)priority; + +// Adds constraints +- (void)addConstraints:(NSArray*)constraints; + +// Adds constraints with given priority +- (void)addConstraints:(NSArray*)constraints priority:(UILayoutPriority)priority; + +// Adds constraints, replacing constraints that were added before with the same key +- (void)setConstraints:(NSArray*)constraints forKey:(NSString*)key; + +// Adds constraints with given priority, replacing constraints that were added before with the same key +- (void)setConstraints:(NSArray*)constraints priority:(UILayoutPriority)priority forKey:(NSString*)key; + +@end \ No newline at end of file diff --git a/HackTX/AutolayoutHelper.m b/HackTX/AutolayoutHelper.m new file mode 100755 index 0000000..8472656 --- /dev/null +++ b/HackTX/AutolayoutHelper.m @@ -0,0 +1,462 @@ + +#import "AutolayoutHelper.h" + +#define XT_CONSTRAINT_ERROR @"Invalid extended constraint" + + +@interface AutolayoutHelper () + +@property(nonatomic, strong) NSMutableDictionary* temporalConstraints; +@property(nonatomic, strong) UIView* strongPointerToView; + +@end + + +@implementation AutolayoutHelper + +BOOL displayBackgroundColorsForDebugging = NO; + +NSRegularExpression * xtConstraintRegex; +NSDictionary* attributes; +NSDictionary* relations; + + ++ (void) initialize +{ + [self initializeXtConstraintLogic]; +} + ++ (void)setDisplayBackgroundColorsForDebugging:(BOOL)displayColors { + displayBackgroundColorsForDebugging = displayColors; +} + + ++ (AutolayoutHelper*)configureView:(UIView*)view subViews:(NSDictionary*)subViews constraints:(NSArray*)constraints +{ + return [AutolayoutHelper configureView:view subViews:subViews metrics:nil constraints:constraints]; +} + ++ (AutolayoutHelper*)configureView:(UIView*)view subViews:(NSDictionary*)subViews metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints +{ + return [self configureView:view subViews:subViews metrics:metrics constraints:constraints keepViewStrongly:NO]; +} + ++ (AutolayoutHelper*)configureView:(UIView*)view subViewLayers:(NSArray*)subViewLayers metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints +{ + return [AutolayoutHelper configureView:view subViewLayers:subViewLayers metrics:metrics constraints:constraints keepViewStrongly:NO]; +} + ++ (AutolayoutHelper*)configureView:(UIView*)view fillWithSubView:(UIView*)v +{ + return [self configureView:view subViews:VarBindings(v) constraints:@[@"H:|[v]|", @"V:|[v]|"]]; +} + ++ (AutolayoutHelper*)configureViewController:(UIViewController*)controller fillWithSubView:(UIView*)v +{ + id top = controller.topLayoutGuide; + id bottom = controller.bottomLayoutGuide; + + return [self configureView:controller.view + subViews:VarBindings(top, v, bottom) + constraints:@[@"H:|[v]|", @"V:[top][v][bottom]"]]; +} + ++ (AutolayoutHelper*)subViews:(NSDictionary*)subViews constraints:(NSArray*)constraints +{ + return [AutolayoutHelper subViews:subViews metrics:nil constraints:constraints]; +} + ++ (AutolayoutHelper*)subViews:(NSDictionary*)subViews metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints +{ + // Here we want to keep the view strongly, because the AutolayoutHelper.view property is weak + return [self configureView:[[UIView alloc] init] subViews:subViews metrics:metrics constraints:constraints keepViewStrongly:YES]; +} + ++ (AutolayoutHelper*)configureView:(UIView*)view subViews:(NSDictionary*)subViews metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints keepViewStrongly:(BOOL)keepViewStrongly +{ + return [AutolayoutHelper configureView:view subViewLayers:@[subViews] metrics:metrics constraints:constraints keepViewStrongly:keepViewStrongly]; +} + ++ (void)configureScrollView:(UIScrollView*)scrollView contentView:(UIView*)contentView mainView:(UIView*)mainView { + + [AutolayoutHelper configureView:scrollView fillWithSubView:contentView]; + + [mainView addConstraints:[NSLayoutConstraint + constraintsWithVisualFormat:@"H:[contentView(==mainView)]" + options:(NSLayoutFormatOptions)0 + metrics:nil + views:VarBindings(contentView, mainView)]]; +} + +/** +* The methods above end up calling this one +*/ ++ (AutolayoutHelper*)configureView:(UIView*)view subViewLayers:(NSArray*)subViewLayers metrics:(NSDictionary*)metrics constraints:(NSArray*)constraints keepViewStrongly:(BOOL)keepViewStrongly +{ + AutolayoutHelper* helper = [[AutolayoutHelper alloc] initWithView:view]; + + if (keepViewStrongly) { + helper.strongPointerToView = view; + } + + helper.metrics = metrics; + + for (NSDictionary* subViews in subViewLayers) { + [helper addViews:subViews]; + } + + [helper addConstraints:constraints]; + + return helper; +} + + +- (id)initWithView:(UIView*)view +{ + self = [super init]; + + self.view = view; + self.subViews = [[NSMutableDictionary alloc] init]; + self.temporalConstraints = [[NSMutableDictionary alloc] init]; + + return self; +} + +- (void)addViews:(NSDictionary*)subViews { + + for (NSString* subViewKey in subViews.allKeys) { + + UIView* subView = subViews[subViewKey]; + [self addView:subView withKey:subViewKey]; + } +} + +- (void)addView:(UIView*)subView withKey:(NSString *)subViewKey +{ + self.subViews[subViewKey] = subView; + + // Ignore layout guides, just keep then in subViews dictionary + if ([subView conformsToProtocol:@protocol(UILayoutSupport)]) { + return; + } + + subView.translatesAutoresizingMaskIntoConstraints = NO; + + [self.view addSubview:subView]; + + if (displayBackgroundColorsForDebugging) { + subView.backgroundColor = [AutolayoutHelper getRandomColorWithAlpha:0.4]; + } +} + ++ (UIColor*)getRandomColorWithAlpha:(CGFloat)alpha +{ + u_int32_t red = arc4random_uniform(256); + u_int32_t green = arc4random_uniform(256); + u_int32_t blue = arc4random_uniform(256); + + return [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha]; +} + +- (void)addViews:(NSDictionary*)subViews constraints:(NSArray*)constraints { + + [self addViews:subViews]; + + [self addConstraints:constraints]; +} + +- (void)removeViews:(NSDictionary*)subViews { + + [self removeViewsWithKeys:subViews.allKeys]; +} + +- (void)removeViewsWithKeys:(NSArray*)viewKeys { + + for (NSString* viewKey in viewKeys) { + UIView* subView = self.subViews[viewKey]; + [subView removeFromSuperview]; + [self.subViews removeObjectForKey:viewKey]; + } +} + +- (void)addConstraints:(NSArray*)constraints +{ + [self addConstraints:constraints priority:PRIORITY_DEFAULT]; +} + +- (void)addConstraints:(NSArray*)constraints priority:(UILayoutPriority)priority +{ + for (NSString* constraint in constraints) { + [self addConstraint:constraint priority:priority]; + } +} + +- (NSArray*)addConstraint:(NSString*)constraint +{ + return [self addConstraint:constraint priority:PRIORITY_DEFAULT]; +} + +- (NSArray*)addConstraint:(NSString*)constraint priority:(UILayoutPriority)priority +{ + NSArray *constraints = [self parseConstraint:constraint]; + + if (priority != PRIORITY_DEFAULT) { + for (NSLayoutConstraint* c in constraints) { + c.priority = priority; + } + } + + [self.view addConstraints:constraints]; + + return constraints; +} + +- (NSArray*)parseConstraint:(NSString *)constraint +{ + if ([constraint hasPrefix:XT_CONSTRAINT_SYMBOL]) + { + return [self parseXtConstraint:constraint]; + + } else { + // Normal VFL constraint + return [NSLayoutConstraint constraintsWithVisualFormat:constraint + options:(NSLayoutFormatOptions) 0 + metrics:self.metrics + views:self.subViews]; + } +} + +- (void)setConstraints:(NSArray*)constraints forKey:(NSString*)key { + [self setConstraints:constraints priority:PRIORITY_DEFAULT forKey:key]; +} + +- (void)setConstraints:(NSArray*)constraints priority:(UILayoutPriority)priority forKey:(NSString*)key { + + // Remove previously added constraints for that key + + NSArray* constraintsToRemove = self.temporalConstraints[key]; + + if (constraintsToRemove.count > 0) { + [self.view removeConstraints:constraintsToRemove]; + [self.temporalConstraints removeObjectForKey:key]; + } + + // Add new constraints and store them + + NSMutableArray* addedConstraints = [[NSMutableArray alloc] init]; + + for (NSString* constraint in constraints) { + NSArray* resultingConstraints = [self addConstraint:constraint priority:priority]; + [addedConstraints addObjectsFromArray:resultingConstraints]; + } + + self.temporalConstraints[key] = addedConstraints; +} + + +#pragma mark - xt constaints + ++ (void)initializeXtConstraintLogic +{ + [self initializeXtConstraintRegex]; + + attributes = @{ + @"left" : @(NSLayoutAttributeLeft), + @"right" : @(NSLayoutAttributeRight), + @"top" : @(NSLayoutAttributeTop), + @"bottom" : @(NSLayoutAttributeBottom), + @"leading" : @(NSLayoutAttributeLeading), + @"trailing" : @(NSLayoutAttributeTrailing), + @"width" : @(NSLayoutAttributeWidth), + @"height" : @(NSLayoutAttributeHeight), + @"centerX" : @(NSLayoutAttributeCenterX), + @"centerY" : @(NSLayoutAttributeCenterY), + @"baseline" : @(NSLayoutAttributeBaseline) + }; + + relations = @{ + @"==" : @(NSLayoutRelationEqual), + @">=" : @(NSLayoutRelationGreaterThanOrEqual), + @"<=" : @(NSLayoutRelationLessThanOrEqual) + }; +} + ++ (void)initializeXtConstraintRegex +{ + NSError* error = nil; + // C identifier + NSString* identifier = @"[_a-zA-Z][_a-zA-Z0-9]{0,30}"; + // VIEW_KEY.ATTR or (use "superview" as VIEW_KEY to refer to superview) + NSString* attr = [NSString stringWithFormat:@"(%@)\\.(%@)", identifier, identifier]; + // Relations taken from NSLayoutRelation + NSString* relation = @"([=><]+)"; + // float number e.g. "12", "12.", "2.56" + NSString* number = @"\\d+\\.?\\d*"; + // Value (indentifier or number) + NSString* value = [NSString stringWithFormat:@"(?:(?:%@)|(?:%@))", identifier, number]; + // e.g. "*5" or "/ 27.3" or "* 200" + NSString* multiplier = [NSString stringWithFormat:@"([*/]) *(%@)", value]; + // e.g. "+ 2." or "- 56" or "-7.5" + NSString* constant = [NSString stringWithFormat:@"([+-]) *(%@)", value]; + + NSString* pattern = [NSString stringWithFormat:@"^%@: *%@ *%@ *%@ *(?:%@)? *(?:%@)?$", + XT_CONSTRAINT_SYMBOL, attr, relation, attr, multiplier, constant]; + + xtConstraintRegex = [NSRegularExpression + regularExpressionWithPattern:pattern + options:NSRegularExpressionCaseInsensitive + error:&error]; +} + +- (NSArray*)parseXtConstraint:(NSString*)constraint +{ + NSArray* results = [xtConstraintRegex matchesInString:constraint + options:0 + range:NSMakeRange(0, constraint.length)]; + + if (results.count != 1) { + [self throwInvalidConstraint:constraint]; + } + + NSTextCheckingResult* match = results[0]; + + // I think this won't happen if the regex is right, but check for debugging + if (match.numberOfRanges != 10) { + [self dumpMatch:match forString:constraint]; + [self throwInvalidConstraint:constraint]; + } + + // item1.attr1 relation item2.attr2 factor constant + // e.g. v1.leading == v2.centerX / 2 + 10 + NSString* item1Key = [constraint substringWithRange:[match rangeAtIndex:1]]; + NSString* attr1Str = [constraint substringWithRange:[match rangeAtIndex:2]]; + NSString* relationStr = [constraint substringWithRange:[match rangeAtIndex:3]]; + NSString* item2Key = [constraint substringWithRange:[match rangeAtIndex:4]]; + NSString* attr2Str = [constraint substringWithRange:[match rangeAtIndex:5]]; + + id item1 = [self findViewFromKey:item1Key]; + id item2 = [self findViewFromKey:item2Key]; + + NSLayoutAttribute attr1 = [self parseAttribute:attr1Str]; + NSLayoutAttribute attr2 = [self parseAttribute:attr2Str]; + + NSLayoutRelation relation = [self parseRelation:relationStr]; + + // Default multiplier is 1 + CGFloat multiplier = 1; + if ([match rangeAtIndex:6].location != NSNotFound) + { + NSString* operation = [constraint substringWithRange:[match rangeAtIndex:6]]; + NSString* multiplierValue = [constraint substringWithRange:[match rangeAtIndex:7]]; + multiplier = [self getFloatFromValue:multiplierValue]; + // If division, invert factor + if ([operation isEqualToString:@"/"]) { + multiplier = 1/multiplier; + } + } + + // Default constant is 0 + CGFloat constant = 0; + if ([match rangeAtIndex:8].location != NSNotFound) + { + NSString* operation = [constraint substringWithRange:[match rangeAtIndex:8]]; + NSString* constantValue = [constraint substringWithRange:[match rangeAtIndex:9]]; + constant = [self getFloatFromValue:constantValue]; + // If subtraction, negate constant + if ([operation isEqualToString:@"-"]) { + constant = -constant; + } + } + + NSLayoutConstraint* c = + [NSLayoutConstraint constraintWithItem:item1 + attribute:attr1 + relatedBy:relation + toItem:item2 + attribute:attr2 + multiplier:multiplier + constant:constant]; + + return @[c]; +} + +- (float)getFloatFromValue:(NSString*)value +{ + if ([self stringStartsWithAlphaOrUnderscore:value]) { // if so, must be a metric identifier + NSNumber* metric = self.metrics[value]; + if (metric) { + return [metric floatValue]; + } else { + NSString* reason = [NSString stringWithFormat:@"Metric `%@` was not provided", value]; + @throw([NSException exceptionWithName:XT_CONSTRAINT_ERROR reason:reason userInfo:nil]); + } + } else { + return [value floatValue]; + } +} + +- (BOOL)stringStartsWithAlphaOrUnderscore:(NSString*)value +{ + unichar c = [value characterAtIndex:0]; + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; +} + +- (id)findViewFromKey:(NSString*)key +{ + if ([key isEqualToString:@"superview"]) { + return self.view; + } else { + id view = self.subViews[key]; + if (view) { + return view; + } else { + NSString* reason = [NSString stringWithFormat:@"No view was added with key `%@`", key]; + @throw([NSException exceptionWithName:XT_CONSTRAINT_ERROR reason:reason userInfo:nil]); + } + } +} + +- (NSLayoutAttribute)parseAttribute:(NSString*)attrStr +{ + NSNumber* value = attributes[attrStr]; + + if (value) { + return (NSLayoutAttribute) [value intValue]; + } else { + NSString* reason = [NSString stringWithFormat:@"Attribute `%@` is not valid. Use one of: %@", attrStr, [attributes allKeys]]; + @throw([NSException exceptionWithName:XT_CONSTRAINT_ERROR reason:reason userInfo:nil]); + } +} + +- (NSLayoutRelation)parseRelation:(NSString*)relationStr +{ + NSNumber* value = relations[relationStr]; + + if (value) { + return (NSLayoutRelation) [value intValue]; + } else { + // This won't happen since the regex only matches if the relation is right + NSString* reason = [NSString stringWithFormat:@"Relation `%@` is not valid. Use one of: %@", relationStr, [relations allKeys]]; + @throw([NSException exceptionWithName:XT_CONSTRAINT_ERROR reason:reason userInfo:nil]); + } +} + +- (void)throwInvalidConstraint:(NSString*)constraint +{ + [NSException raise:XT_CONSTRAINT_ERROR + format:@"%@: %@", XT_CONSTRAINT_ERROR, constraint]; +} + +-(void)dumpMatch:(NSTextCheckingResult*)match forString:(NSString*)str +{ + for (NSUInteger i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HackTX/Base.lproj/LaunchScreen.xib b/HackTX/Base.lproj/LaunchScreen.xib deleted file mode 100644 index d54c321..0000000 --- a/HackTX/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/HackTX/Base.lproj/Main.storyboard b/HackTX/Base.lproj/Main.storyboard index a739b64..b56c13e 100644 --- a/HackTX/Base.lproj/Main.storyboard +++ b/HackTX/Base.lproj/Main.storyboard @@ -1,975 +1,8 @@ - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/HackTX/CheckInViewController.h b/HackTX/CheckInViewController.h new file mode 100644 index 0000000..625a8a5 --- /dev/null +++ b/HackTX/CheckInViewController.h @@ -0,0 +1,19 @@ +// +// CheckInViewController.h +// HackTX +// +// Created by Jose Bethancourt on 10/15/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import + +@interface CheckInViewController : UIViewController + +@property (weak, nonatomic) IBOutlet UITextField *emailInput; +@property (weak, nonatomic) IBOutlet UILabel *message; +@property (weak, nonatomic) IBOutlet UILabel *header; + +@property (weak, nonatomic) IBOutlet UIButton *addToWallet; + +@end diff --git a/HackTX/CheckInViewController.m b/HackTX/CheckInViewController.m new file mode 100644 index 0000000..51a9be4 --- /dev/null +++ b/HackTX/CheckInViewController.m @@ -0,0 +1,201 @@ +// +// CheckInViewController.m +// HackTX +// +// Created by Jose Bethancourt on 10/15/16. +// Copyright © 2016 HackTX. All rights reserved. +// + +#import "CheckInViewController.h" +#import "UIColor+Palette.h" +#import "AutolayoutHelper.h" +#import "SVProgressHUD.h" +#import "FCAlertView.h" +#import "Hacker.h" +#import "HTXAPI.h" + +#import + + +@import PassKit; + +@interface CheckInViewController () + +@property (nonatomic, retain) CAGradientLayer *gradient; +@property (nonatomic, retain) NSString *hackerEmail; +@property (nonatomic, retain) Hacker *currentHacker; +@property (nonatomic, retain) UITapGestureRecognizer *tap; + +@end + +@implementation CheckInViewController + +- (void)viewDidLoad { + + [super viewDidLoad]; + + [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]]; + [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault]; + + self.emailInput.delegate = self; + [self setupView]; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + [self dismissKeyboard]; + [SVProgressHUD show]; + self.hackerEmail = textField.text; + + [HTXAPI fetchHacker:self.hackerEmail withCompletion:^(NSDictionary *response) { + if ([response[@"data"][@"email"] isEqualToString:self.hackerEmail]) { + + [Answers logCustomEventWithName:@"Checked In" + customAttributes:@{}]; + + Hacker *newHacker = [[Hacker alloc] init]; + newHacker.name = response[@"data"][@"name"]; + newHacker.email = response[@"data"][@"email"]; + newHacker.school = response[@"data"][@"school"]; + + RLMRealm *realm = [RLMRealm defaultRealm]; + [realm beginWriteTransaction]; + [realm addObject:newHacker]; + [realm commitWriteTransaction]; + [SVProgressHUD dismiss]; + + [self updateView]; + [self showPass]; + } else if (![response[@"response"] boolValue]) { + + [SVProgressHUD dismiss]; + + FCAlertView *alert = [[FCAlertView alloc] init]; + + [alert showAlertInView:self + withTitle:@"Sorry" + withSubtitle:@"We could not find your email. If you believe this is an error, ask a friendly volunteer. 🙂" + withCustomImage:nil + withDoneButtonTitle:@"Okay" + andButtons:nil]; + [alert makeAlertTypeCaution]; + + } else { + [SVProgressHUD dismiss]; + + FCAlertView *alert = [[FCAlertView alloc] init]; + + [alert showAlertInView:self + withTitle:@"Network error" + withSubtitle:@"There was an error checking you in, please try again later. 😥" + withCustomImage:nil + withDoneButtonTitle:@"Okay" + andButtons:nil]; + [alert makeAlertTypeCaution]; + } + }]; + + return YES; +} + + +- (void)showPass { + + [SVProgressHUD show]; + + [HTXAPI fetchPass:self.hackerEmail withPassData:^(NSData *data) { + [SVProgressHUD dismiss]; + + if ([PKAddPassesViewController canAddPasses]) { + PKPass *pass = [[PKPass alloc] initWithData:data error:nil]; + PKAddPassesViewController *passVC = [[[PKAddPassesViewController alloc] init] initWithPass:pass]; + [self presentViewController:passVC animated:YES completion:nil]; + [Answers logCustomEventWithName:@"Added Pass" + customAttributes:@{}]; + } else { + FCAlertView *alert = [[FCAlertView alloc] init]; + + [alert showAlertInView:self + withTitle:@"Sorry" + withSubtitle:@"Apple Wallet is not compatible with this device. Sorry about that. 🙁" + withCustomImage:nil + withDoneButtonTitle:@"Okay" + andButtons:nil]; + [alert makeAlertTypeCaution]; + } + + }]; +} + +- (void)updateView { + RLMResults *hackers = [Hacker allObjects]; + + if (hackers.count > 0) { + self.hackerEmail = hackers[0].email; + + self.header.text = [NSString stringWithFormat:@"You are all set, %@", hackers[0].name]; + self.message.text = @"Add the pass to your wallet and show it to a volunteer when checking in."; + self.addToWallet.hidden = NO; + self.emailInput.hidden = YES; + + [self.addToWallet addTarget:self action:@selector(showPass) forControlEvents:UIControlEventTouchUpInside]; + + [self.view removeGestureRecognizer:self.tap]; + + + } else { + self.header.text = @"Welcome to HackTX!"; + self.message.text = @"Enter the email you used during registration to fetch your ticket."; + + self.message.hidden = NO; + self.emailInput.hidden = NO; + self.addToWallet.hidden = YES; + + self.tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; + + [self.tap setCancelsTouchesInView:NO]; + [self.view addGestureRecognizer:self.tap]; + + + } +} + +- (void)setupView { + self.gradient = [CAGradientLayer layer]; + self.gradient.frame = self.view.bounds; + self.gradient.colors = [NSArray arrayWithObjects:(id)[UIColor htx_lightBlue].CGColor, (id)[UIColor htx_lighterBlue].CGColor, nil]; + + [self.view.layer insertSublayer:self.gradient atIndex:0]; + + self.message.textColor = [UIColor htx_white]; + self.header.textColor = [UIColor htx_white]; + self.emailInput.tintColor = [UIColor htx_white]; + self.emailInput.textColor = [UIColor htx_white]; + + [self updateView]; +} + +- (void)dismissKeyboard { + [self.emailInput resignFirstResponder]; +} + +- (void)viewWillLayoutSubviews { + [super viewWillLayoutSubviews]; + self.gradient.frame = self.view.bounds; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/HackTX/CheckInViewController.swift b/HackTX/CheckInViewController.swift deleted file mode 100644 index 5e511b9..0000000 --- a/HackTX/CheckInViewController.swift +++ /dev/null @@ -1,159 +0,0 @@ -// -// CheckInViewController.swift -// HackTX -// -// Created by Drew Romanyk on 9/4/15. -// Copyright (c) 2015 HackTX. All rights reserved. -// - -import UIKit -import AVFoundation -import RSBarcodes_Swift - -class CheckInViewController: UITableViewController { - - var emailField : UITextField? = nil - - override func viewDidLoad() { - super.viewDidLoad() - - tableView.estimatedRowHeight = 500 - tableView.rowHeight = UITableViewAutomaticDimension - } - - override func viewDidAppear(animated: Bool) { - super.viewDidAppear(animated) - tableView.reloadData() - } - - // Setup Google Analytics for the controller - override func viewWillAppear(animated: Bool) { - super.viewWillAppear(animated) - - let tracker = GAI.sharedInstance().defaultTracker - tracker.set(kGAIScreenName, value: "CheckIn") - - let builder = GAIDictionaryBuilder.createScreenView() - tracker.send(builder.build() as [NSObject : AnyObject]) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - } - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - return 1 - } - - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 2 - } - - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - var cell = tableView.dequeueReusableCellWithIdentifier("TitleCell", forIndexPath: indexPath) - - switch (indexPath.row) { - case 0: - cell = tableView.dequeueReusableCellWithIdentifier("TitleCell", forIndexPath: indexPath) - let desc = cell.viewWithTag(1001) as! UILabel - desc.text = "" - desc.text = "Lets get through the line quick." - desc.preferredMaxLayoutWidth = CGRectGetWidth(desc.frame) - case 1: - if(!UserPrefs.shared().isCheckedIn()){ - cell = tableView.dequeueReusableCellWithIdentifier("AboutCell", forIndexPath: indexPath) - emailField = cell.viewWithTag(1000) as? UITextField - emailField?.keyboardType = UIKeyboardType.EmailAddress - let enterButton = cell.viewWithTag(1001) as! UIButton - enterButton.addTarget(self, action: "enterEmailToQr:", forControlEvents: UIControlEvents.TouchUpInside) - } else { - cell = tableView.dequeueReusableCellWithIdentifier("CheckInCell", forIndexPath: indexPath) - - // Setup email text - let desc = cell.viewWithTag(1000) as! UILabel - let emailLabel = cell.viewWithTag(1001) as! UILabel - let emailPrefix = "Your email is " - let email = "\(UserPrefs.shared().getCheckedEmail())" - - //bold the email - let attributedString = NSMutableAttributedString(string:emailPrefix) - let attrs = [NSFontAttributeName : UIFont.boldSystemFontOfSize(15)] - let boldString = NSMutableAttributedString(string:email, attributes:attrs) - attributedString.appendAttributedString(boldString) - - - emailLabel.attributedText = attributedString - desc.preferredMaxLayoutWidth = CGRectGetWidth(desc.frame) - emailLabel.preferredMaxLayoutWidth = CGRectGetWidth(emailLabel.frame) - - // Setup QR Image - let qrImageView = cell.viewWithTag(1002) as! UIImageView - // RSAbstractCodeGenerator.generateCode(contents, filterName: RSAbstractCodeGenerator.filterName(machineReadableCodeObjectType)) - //let qrr = RSUnifiedCodeGenerator().generateCode(UserPrefs.shared().getCheckedEmail(), machineReadableCodeObjectType: AVMetadataObjectTypeQRCode) - let qrr = RSAbstractCodeGenerator.generateCode(UserPrefs.shared().getCheckedEmail(), filterName: RSAbstractCodeGenerator.filterName(AVMetadataObjectTypeQRCode)) - let qrScale = RSAbstractCodeGenerator.resizeImage(qrr!, scale: 10) - qrImageView.image = qrScale - - // Setup reset button - let resetButton = cell.viewWithTag(1003) as! UIButton - resetButton.addTarget(self, action: "resetQrAccount:", forControlEvents: UIControlEvents.TouchUpInside) - } - default: - cell = tableView.dequeueReusableCellWithIdentifier("TitleCell", forIndexPath: indexPath) - } - - return cell - } - - func enterEmailToQr(sender: UIButton!) { - if (emailField != nil) { - let emailStr = emailField?.text - if ((emailStr!).characters.count != 0 && isValidEmail(emailStr!)) { - UserPrefs.shared().setIsCheckedIn(true) - UserPrefs.shared().setCheckedEmail(emailStr!) - tableView.reloadData() - - //delete the check in reminder notification - let app = UIApplication.sharedApplication() - let uidOfCheckIn = "check-in-reminder" - for event in app.scheduledLocalNotifications! { - let notification = event as UILocalNotification - let notificationInfo = notification.userInfo! as! [String:String] - let uid = notificationInfo["uid"]! - if uid == uidOfCheckIn { - app.cancelLocalNotification(notification) - break; - } - } - - } else { - let error = UIAlertView() - error.title = "Cannot Validate Email" - error.message = "\(emailStr!) does seem to be a valid email. Perhaps you should try again?" - error.addButtonWithTitle("OK") - error.show() - } - } - } - - func isValidEmail(testStr:String) -> Bool { - // println("validate calendar: \(testStr)") - let emailRegEx = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" - - let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) - return emailTest.evaluateWithObject(testStr) - } - - func resetQrAccount(sender: UIButton!) { - UserPrefs.shared().setIsCheckedIn(false) - UserPrefs.shared().setCheckedEmail("") - - //re-register the check in reminder - UserPrefs.shared().setRegisterForCheckInNotif(false) - let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate - appDelegate.registerCheckInReminder() - tableView.reloadData() - } - -} diff --git a/HackTX/CheckInViewController.xib b/HackTX/CheckInViewController.xib new file mode 100644 index 0000000..fec6044 --- /dev/null +++ b/HackTX/CheckInViewController.xib @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +